Subversion Repositories Kolibri OS

Rev

Rev 2752 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;    MARIO for MENUET
  3. ;
  4. ;    Compile with fasm
  5. ;
  6.    
  7. use32
  8.    
  9.            org     0x0
  10.    
  11.            db      'MENUET00'           ; 8 byte id
  12.            dd      38                   ; required os
  13.            dd      START                ; program start
  14.            dd      I_END                ; image size
  15.            dd      0x100000             ; reguired amount of memory
  16.            dd      0x00000000           ; reserved=no extended header
  17.    
  18.    
  19. empty        equ    0x80000  + 0*3*40*40
  20. build_1      equ    0x80000  + 1*3*40*40
  21. build_2      equ    0x80000  + 2*3*40*40
  22. build_3      equ    0x80000  + 3*3*40*40
  23.    
  24. mario_1      equ    0x90000  + 0*3*70*51
  25. mario_2      equ    0x90000  + 1*3*70*51
  26. mario_3      equ    0x90000  + 2*3*70*51
  27. mario_4      equ    0x90000  + 3*3*70*51
  28. mario_5      equ    0x90000  + 4*3*70*51
  29. mario_6      equ    0x90000  + 5*3*70*51
  30. mario_green  equ    0x90000  + 6*3*70*51
  31. loadp        equ    0x90000  + 7*3*70*51
  32.    
  33.    
  34. START:
  35.    
  36.    
  37.     call load_graph
  38.    
  39.     mov  [marioxy],   dword 300*65536+270
  40.     mov  [leftright], dword 1
  41.     mov  [velocity],  dword 0xff
  42.    
  43.     call draw_window
  44.    
  45.    
  46. sta:
  47.    
  48.     mov  eax,field
  49.     mov  edx,1*65526+30
  50.     mov  [xxyy],dword 1*65536+22
  51.    
  52.   stl:
  53.    
  54.     cmp  [eax],byte ' '
  55.     jnz  noempty
  56.     mov  ebx,empty
  57.   noempty:
  58.    
  59.     cmp  [eax],byte '1'
  60.     jnz  no1
  61.     mov  ebx,build_1
  62.   no1:
  63.    
  64.     cmp  [eax],byte '2'
  65.     jnz  no2
  66.     mov  ebx,build_2
  67.   no2:
  68.    
  69.     cmp  [eax],byte '3'
  70.     jnz  no3
  71.     mov  ebx,build_3
  72.   no3:
  73.    
  74.     pusha
  75.    
  76.     mov  edx,[xxyy]
  77.    
  78.     mov  eax,7           ; display image
  79.     mov  ecx,40*65536+40
  80.     int  0x40
  81.    
  82.     popa
  83.    
  84.     add  word [xxyy+2],word 40
  85.     cmp  word [xxyy+2],word 40*12+1
  86.     jnz  nonewline
  87.     mov  word [xxyy+2],word 1
  88.     add  word [xxyy+0],word 40
  89.   nonewline:
  90.    
  91.     add  eax,1
  92.     cmp  eax,field+12*9
  93.     jz   nodraw
  94.     jmp  stl
  95.    
  96.   nodraw:
  97.    
  98.    
  99. ;  ********* MAIN LOOP ***********
  100.    
  101.    
  102. wait_for_event:
  103.    
  104.     call draw_mario
  105.    
  106.     mov  eax,11                  ; check if os wants to say something
  107.     int  0x40
  108.     cmp  eax,1
  109.     jz   red
  110.     cmp  eax,2
  111.     jz   key
  112.     cmp  eax,3
  113.     jnz  wait_for_event
  114.  
  115.     jmp  button
  116.    
  117.   red:
  118.    
  119.     mov  [mariomem],dword 0x0
  120.    
  121.     call draw_window
  122.     jmp  sta
  123.    
  124.   key:
  125.    
  126.     mov  [mariomem],dword 0x0
  127.    
  128.     mov  eax,2   ; ah <- key
  129.     int  0x40
  130.    
  131.     cmp  ah,176
  132.     jnz  key1
  133.     mov  byte [leftright],byte 1
  134.   key1:
  135.    
  136.     cmp  ah,179
  137.     jnz  key2
  138.     mov  byte [leftright],byte 4
  139.   key2:
  140.    
  141.     cmp  ah,177
  142.     jnz  key3
  143.     mov  al,byte [leftright]
  144.     mov  bl,al
  145.     cmp  al,1
  146.     jnz  key31
  147.     mov  bl,2
  148.   key31:
  149.     cmp  al,4
  150.     jnz  key32
  151.     mov  bl,3
  152.   key32:
  153.     mov  byte [leftright],bl
  154.   key3:
  155.    
  156.     cmp  ah,178
  157.     jnz  key4
  158.     cmp  [velocity],dword 0xff
  159.     jnz  key4
  160.     mov  [velocity],dword 0x110
  161.   key4:
  162.    
  163.    
  164.    
  165.     jmp  wait_for_event
  166.    
  167.   button:
  168.    
  169.     mov  eax,0xffffffff          ; close this program
  170.     int  0x40
  171.    
  172.     ; end of program
  173.    
  174.    
  175. load_graph:
  176.    
  177.     pusha
  178.    
  179.     mov  eax,6        ; 6 = open file
  180.     mov  ebx,filename
  181.     mov  ecx,0
  182.     mov  edx,0xFFFFFF
  183.     mov  esi,loadp
  184.     mov  edi,0                     ; floppy
  185.     int  0x40
  186.    
  187.     ; empty
  188.    
  189.     mov  edi,empty
  190.     mov  ecx,40*40
  191.     mov  eax,0x00500f
  192.     cld
  193.   emptyl:
  194.     mov  [edi],eax
  195.     add  edi,3
  196.     loop emptyl
  197.    
  198.     mov  [width],40*3
  199.     mov  [width_move],20
  200.     mov  [sub_esi],150*3+2
  201.     mov  [add_edi],40*3*2
  202.     mov  [imul_esi],20*3
  203.     mov  [base],loadp+18*3+3*150*34+3*98-1
  204.    
  205.     mov  esi,0
  206.     mov  edi,build_1
  207.     call convert
  208.    
  209.     mov  esi,1
  210.     mov  edi,build_2
  211.     call convert
  212.    
  213.    
  214.    
  215.     ; build_3
  216.    
  217.     mov  edi,build_3
  218.     mov  esi,loadp+18*3+230*3+3*300*69
  219.     mov  ecx,40
  220.   build_3l:
  221.     pusha
  222.     mov  ecx,3*40
  223.     cld
  224.     rep  movsb
  225.     popa
  226.     sub  esi,300*3
  227.     add  edi,40*3
  228.     loop build_3l
  229.    
  230.     mov  [width],50*3
  231.     mov  [width_move],25
  232.     mov  [sub_esi],150*3+2
  233.     mov  [add_edi],50*3*2
  234.     mov  [imul_esi],25*3
  235.     mov  [base],loadp+18*3+3*150*34+68
  236.    
  237.     mov  esi,0
  238.     mov  edi,mario_1
  239.     call convert
  240.    
  241.     mov  esi,1
  242.     mov  edi,mario_2
  243.     call convert
  244.    
  245.     mov  esi,2
  246.     mov  edi,mario_3
  247.     call convert
  248.    
  249.     jmp  mario_mirror
  250.    
  251.    
  252. convert:
  253.    
  254.     imul esi,[imul_esi]
  255.     add  esi,[base] ; loadp+18*3+3*150*34+68
  256.    
  257.     mov  ecx,70
  258.   mario_1l:
  259.     pusha
  260.     mov  ecx,[width_move]
  261.   putpix:
  262.     mov  eax,[esi]
  263.     mov  [edi+00],ax
  264.     mov  [edi+03],ax
  265.     mov  ebx,[width]
  266.     mov  [edi+ebx],ax
  267.     add  ebx,3
  268.     mov  [edi+ebx],ax
  269.     shr  eax,16
  270.     mov  [edi+02],al
  271.     dec  ebx
  272.     mov  [edi+ebx],al
  273.     mov  [edi+05],al
  274.     add  ebx,3
  275.     mov  [edi+ebx],al
  276.     add  esi,3
  277.     add  edi,6
  278.     loop putpix
  279.     popa
  280.     sub  esi,[sub_esi]
  281.     add  edi,[add_edi]
  282.     loop mario_1l
  283.    
  284.     ret
  285.    
  286. sub_esi  dd 0x0
  287. add_edi  dd 0x0
  288. imul_esi dd 0x0
  289. base     dd 0x0
  290. width    dd 0x0
  291. width_move dd 0x0
  292.    
  293.    
  294.    
  295. mario_mirror:
  296.    
  297.    
  298.     ; mario_green
  299.    
  300.     mov  edi,mario_green
  301.     mov  ecx,70*50
  302.   mario_greenl:
  303.     mov  [edi],dword 0x00500f
  304.     add  edi,3
  305.     loop mario_greenl
  306.    
  307.    
  308.    
  309.     ; mario_4
  310.    
  311.     mov  edi,mario_4
  312.     mov  esi,mario_1+49*3
  313.     mov  ecx,70
  314.   m4l1:
  315.     pusha
  316.     mov  ecx,50
  317.   m4l2:
  318.     mov  eax,[esi]
  319.     mov  [edi],ax
  320.     shr  eax,16
  321.     mov  [edi+2],al
  322.     add  edi,3
  323.     sub  esi,3
  324.     loop m4l2
  325.     popa
  326.     add  esi,50*3
  327.     add  edi,50*3
  328.     loop m4l1
  329.    
  330.    
  331.     ; mario_5
  332.    
  333.     mov  edi,mario_5
  334.     mov  esi,mario_2+49*3
  335.     mov  ecx,70
  336.   m5l1:
  337.     pusha
  338.     mov  ecx,50
  339.   m5l2:
  340.     mov  eax,[esi]
  341.     mov  [edi],ax
  342.     shr  eax,16
  343.     mov  [edi+2],al
  344.     add  edi,3
  345.     sub  esi,3
  346.     loop m5l2
  347.     popa
  348.     add  esi,50*3
  349.     add  edi,50*3
  350.     loop m5l1
  351.    
  352.    
  353.     ; mario_6
  354.    
  355.     mov  edi,mario_6
  356.     mov  esi,mario_3+49*3
  357.     mov  ecx,70
  358.   m6l1:
  359.     pusha
  360.     mov  ecx,50
  361.   m6l2:
  362.     mov  eax,[esi]
  363.     mov  [edi],ax
  364.     shr  eax,16
  365.     mov  [edi+2],al
  366.     add  edi,3
  367.     sub  esi,3
  368.     loop m6l2
  369.     popa
  370.     add  esi,50*3
  371.     add  edi,50*3
  372.     loop m6l1
  373.    
  374.    
  375.     popa
  376.    
  377.     ret
  378.    
  379.    
  380.    
  381. advance_mario:
  382.    
  383.     pusha
  384.    
  385.     mov  eax,[marioxy]      ; wherey ?
  386.     and  eax,65535
  387.     add  eax,40+21
  388.     xor  edx,edx
  389.     mov  ebx,40
  390.     div  ebx
  391.     mov  [marioy],eax
  392.    
  393.     mov  eax,[marioxy]      ; wherex ?
  394.     shr  eax,16
  395.     add  eax,20
  396.     xor  edx,edx
  397.     mov  ebx,40
  398.     div  ebx
  399.     mov  [mariox],eax
  400.    
  401.    
  402.    
  403.     cmp  byte [leftright],byte 1    ; go left
  404.     jnz  noleft
  405.     mov  eax,[marioxy]
  406.     xor  edx,edx
  407.     shr  eax,16
  408.     sub  eax,7
  409.     mov  ebx,40
  410.     div  ebx
  411.     add  eax,field+7*12
  412.     cmp  [eax],byte ' '
  413.     jz   mgoleft
  414.     mov  byte [leftright],byte 2
  415.     jmp  noleft
  416.   mgoleft:
  417.     mov  eax,[marioxy]
  418.     sub  eax,6*65536
  419.     mov  [marioxy],eax
  420.   noleft:
  421.    
  422.    
  423.    
  424.     cmp  byte [leftright],byte 4    ; go right
  425.     jnz  noright
  426.     mov  eax,[marioxy]
  427.     xor  edx,edx
  428.     shr  eax,16
  429.     add  eax,54
  430.     mov  ebx,40
  431.     div  ebx
  432.     add  eax,field+7*12
  433.     cmp  byte [eax],byte ' '
  434.     jz   mgoright
  435.     mov  byte [leftright],byte 3
  436.     jmp  noright
  437.   mgoright:
  438.     mov  eax,[marioxy]
  439.     add  eax,6*65536
  440.     mov  [marioxy],eax
  441.   noright:
  442.    
  443.    
  444.    
  445.    
  446.     cmp  [velocity],dword 0x100    ; jump up ?
  447.     jbe  nojumpup
  448.     mov  ebx,[velocity]
  449.     sub  ebx,1
  450.     cmp  ebx,0x100
  451.     jnz  no0x100
  452.     mov  [velocity],dword 0xff
  453.     jmp  nojumpup
  454.   no0x100:
  455.     mov  [velocity],ebx
  456.     sub  ebx,0x100-1
  457.     mov  eax,[marioxy]
  458.     sub  ax,bx
  459.     mov  [marioxy],eax
  460.   nojumpup:
  461.    
  462.     call mario_environment
  463.    
  464.     cmp  [velocity],dword 0x100    ; jump -> down ?
  465.     jge  nojumpdown
  466.     mov  eax,[marioy]
  467.     cmp  eax,[mario_below]
  468.     jb   yesgd
  469.     mov  [velocity],dword 0xff
  470.     mov  eax,[marioxy]
  471.     mov  eax,[mario_below]
  472.     sub  eax,1
  473.     mov  ebx,40
  474.      mul  ebx
  475.      sub  eax,10
  476.     mov  word [marioxy],ax
  477.     jmp  nojumpdown
  478.   yesgd:
  479.     mov  ebx,[velocity]
  480.     sub  ebx,1
  481.     mov  [velocity],ebx
  482.     mov  eax,[marioxy]
  483.     add  ax,0xff
  484.     sub  ax,bx
  485.     mov  [marioxy],eax
  486.   nojumpdown:
  487.    
  488.    
  489.     popa
  490.    
  491.     ret
  492.    
  493.    
  494. marioy dd 0x0
  495.    
  496. mariox dd 0x0
  497.    
  498. mario_below dd 5
  499.    
  500.    
  501. mario_environment:
  502.    
  503.      pusha
  504.    
  505.      mov  eax,[marioy]
  506.      mov  ebx,12
  507.      mul  ebx
  508.      add  eax,[mariox]
  509.      add  eax,field
  510.    
  511.      cmp  [eax],byte ' '
  512.      jz   me_ok
  513.    
  514.      mov  eax,[marioy]
  515.      mov  [mario_below],eax
  516.    
  517.      popa
  518.      ret
  519.  
  520.    me_ok:
  521.    
  522.      mov  [mario_below],dword 100
  523.    
  524.      popa
  525.      ret
  526.    
  527.    
  528. mario_delay:
  529.    
  530.     pusha
  531.    
  532.     mov  eax,5
  533.     mov  ebx,2
  534.     int  0x40
  535.    
  536.     popa
  537.     ret
  538.    
  539.    
  540.    
  541. draw_mario:
  542.    
  543.     pusha
  544.    
  545.     mov  eax,[mariomem]
  546.     cmp  eax,[marioxy]
  547.     jnz  dm1
  548.    
  549.     call mario_delay
  550.    
  551.     popa
  552.    
  553.     ret
  554.    
  555.   dm1:
  556.    
  557.     mov  eax,[marioxy]
  558.     mov  [mariomem],eax
  559.    
  560.    
  561.     cmp  byte [leftright],byte 1   ; go left
  562.     jnz  no_m_left
  563.     jmp  m_left
  564.   no_m_left:
  565.    
  566.     cmp  byte [leftright],byte 4   ; go right
  567.     jnz  no_m_right
  568.     jmp  m_right
  569.   no_m_right:
  570.    
  571.     cmp  byte [leftright],byte 2   ; stand left
  572.     jnz  no_r_still
  573.     mov  eax,7
  574.     mov  ebx,mario_green
  575.     mov  ecx,50*65536+70
  576.     mov  edx,[marioxy]
  577.     int  0x40
  578.     call advance_mario
  579.     mov  eax,7
  580.     mov  ebx,mario_1
  581.     mov  ecx,50*65536+70
  582.     mov  edx,[marioxy]
  583.     int  0x40
  584.     call mario_delay
  585.     popa
  586.     ret
  587.   no_r_still:
  588.    
  589.     cmp  byte [leftright],byte 3   ; stand right
  590.     jnz  no_l_still
  591.     mov  eax,7
  592.     mov  ebx,mario_green
  593.     mov  ecx,50*65536+70
  594.     mov  edx,[marioxy]
  595.     int  0x40
  596.     call advance_mario
  597.     mov  eax,7
  598.     mov  ebx,mario_4
  599.     mov  ecx,50*65536+70
  600.     mov  edx,[marioxy]
  601.     int  0x40
  602.     call mario_delay
  603.    
  604.     popa
  605.     ret
  606.   no_l_still:
  607.    
  608.     popa
  609.     ret
  610.    
  611.    
  612.    
  613.    
  614.   m_left:
  615.    
  616.     mov  eax,7
  617.     mov  ebx,mario_green
  618.     mov  ecx,50*65536+70
  619.     mov  edx,[marioxy]
  620.     int  0x40
  621.     call advance_mario
  622.     mov  eax,7
  623.     mov  ebx,mario_1
  624.     mov  ecx,50*65536+70
  625.     mov  edx,[marioxy]
  626.     int  0x40
  627.     call mario_delay
  628.    
  629.     mov  eax,7
  630.     mov  ebx,mario_green
  631.     mov  ecx,50*65536+70
  632.     mov  edx,[marioxy]
  633.     int  0x40
  634.     call advance_mario
  635.     mov  eax,7
  636.     mov  ebx,mario_2
  637.     mov  ecx,50*65536+70
  638.     mov  edx,[marioxy]
  639.     int  0x40
  640.     call mario_delay
  641.    
  642.     mov  eax,7
  643.     mov  ebx,mario_green
  644.     mov  ecx,50*65536+70
  645.     mov  edx,[marioxy]
  646.     int  0x40
  647.     call advance_mario
  648.     mov  eax,7
  649.     mov  ebx,mario_3
  650.     mov  ecx,50*65536+70
  651.     mov  edx,[marioxy]
  652.     int  0x40
  653.     call mario_delay
  654.    
  655.     mov  eax,7
  656.     mov  ebx,mario_green
  657.     mov  ecx,50*65536+70
  658.     mov  edx,[marioxy]
  659.     int  0x40
  660.     call advance_mario
  661.     mov  eax,7
  662.     mov  ebx,mario_2
  663.     mov  ecx,50*65536+70
  664.     mov  edx,[marioxy]
  665.     int  0x40
  666.     call mario_delay
  667.    
  668.     popa
  669.    
  670.     ret
  671.    
  672.   m_right:
  673.    
  674.    
  675.     mov  eax,7
  676.     mov  ebx,mario_green
  677.     mov  ecx,50*65536+70
  678.     mov  edx,[marioxy]
  679.     int  0x40
  680.     call advance_mario
  681.     mov  eax,7
  682.     mov  ebx,mario_4
  683.     mov  ecx,50*65536+70
  684.     mov  edx,[marioxy]
  685.     int  0x40
  686.     call mario_delay
  687.    
  688.     mov  eax,7
  689.     mov  ebx,mario_green
  690.     mov  ecx,50*65536+70
  691.     mov  edx,[marioxy]
  692.     int  0x40
  693.     call advance_mario
  694.     mov  eax,7
  695.     mov  ebx,mario_5
  696.     mov  ecx,50*65536+70
  697.     mov  edx,[marioxy]
  698.     int  0x40
  699.     call mario_delay
  700.    
  701.     mov  eax,7
  702.     mov  ebx,mario_green
  703.     mov  ecx,50*65536+70
  704.     mov  edx,[marioxy]
  705.     int  0x40
  706.     call advance_mario
  707.     mov  eax,7
  708.     mov  ebx,mario_6
  709.     mov  ecx,50*65536+70
  710.     mov  edx,[marioxy]
  711.     int  0x40
  712.     call mario_delay
  713.    
  714.     mov  eax,7
  715.     mov  ebx,mario_green
  716.     mov  ecx,50*65536+70
  717.     mov  edx,[marioxy]
  718.     int  0x40
  719.     call advance_mario
  720.     mov  eax,7
  721.     mov  ebx,mario_5
  722.     mov  ecx,50*65536+70
  723.     mov  edx,[marioxy]
  724.     int  0x40
  725.     call mario_delay
  726.    
  727.     popa
  728.    
  729.     ret
  730.    
  731.    
  732.    
  733.    
  734.    
  735. draw_window:
  736.    
  737.     pusha
  738.    
  739.     mov       eax,12                    ; tell os about redraw
  740.     mov       ebx,1
  741.     int       0x40
  742.    
  743.     mov       eax,0                     ; define and draw window
  744.     mov       ebx,80*65536+480+1
  745.     mov       ecx,20*65536+382
  746.     mov       edx,0x0000500f
  747.     mov       esi,0x8066AA88
  748.     mov       edi,0x00559977
  749.     int       0x40
  750.    
  751.     mov       eax,dword 0x00000004
  752.     mov       ebx,8*65536+8
  753.     mov       ecx,dword 0x00cccccc
  754.     mov       edx,text
  755.     mov       esi,textlen-text
  756.     int       0x40
  757.    
  758.     mov       eax,8
  759.     mov       ebx,(481-19)*65536+12     ; button start x & size
  760.     mov       ecx,5*65536+12            ; button start y & size
  761.     mov       edx,1                     ; button number
  762.     mov       esi,0x00229911            ; button color
  763.     int       0x40
  764.    
  765.     mov       eax,12                    ; tell os about redraw end
  766.     mov       ebx,2
  767.     int       0x40
  768.    
  769.     popa
  770.    
  771.     ret
  772.    
  773.    
  774. ; DATA SECTION
  775.    
  776.    
  777. filename:
  778.     db  'MARIOALLBMP'
  779.    
  780. text:
  781.     db 'SUPER MARIO - USE ARROW KEYS'
  782. textlen:
  783.    
  784. xx  db 'x'
  785.    
  786. field:
  787.    
  788.     db  '1          1'
  789.     db  '1          1'
  790.     db  '111      111'
  791.     db  '1          1'
  792.     db  '1          1'
  793.     db  '1  111111  1'
  794.     db  '1          1'
  795.     db  '1          1'
  796.     db  '222222222222'
  797.    
  798. xxyy        dd 0x0
  799.    
  800. marioxy     dd 0x0
  801.    
  802. mariomem    dd 0x0
  803.    
  804. leftright   dd 0x0
  805.    
  806. velocity    dd 0x0
  807.    
  808.    
  809. I_END:
  810.    
  811.    
  812.    
  813.    
  814.