Subversion Repositories Kolibri OS

Rev

Rev 1806 | 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 for event
  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.         mov eax,71                                      ;draw caption
  164.         mov ebx,1
  165.         mov ecx,title
  166.         int 0x40
  167.        
  168.         jmp sta                                         ;draw field
  169.        
  170.     ;jmp  wait_for_event
  171.    
  172.   button:
  173.    
  174.     mov  eax,0xffffffff          ; close this program
  175.     int  0x40
  176.    
  177.    
  178. load_graph:
  179.    
  180.     pusha
  181.    
  182.     mov  eax,6        ; 6 = open file
  183.     mov  ebx,filename
  184.     mov  ecx,0
  185.     mov  edx,0xFFFFFF
  186.     mov  esi,loadp
  187.     mov  edi,0                     ; floppy
  188.     int  0x40
  189.    
  190.     ; empty
  191.    
  192.     mov  edi,empty
  193.     mov  ecx,40*40
  194.     mov  eax,0x00500f
  195.     cld
  196.   emptyl:
  197.     mov  [edi],eax
  198.     add  edi,3
  199.     loop emptyl
  200.    
  201.     mov  [width],40*3
  202.     mov  [width_move],20
  203.     mov  [sub_esi],150*3+2
  204.     mov  [add_edi],40*3*2
  205.     mov  [imul_esi],20*3
  206.     mov  [base],loadp+18*3+3*150*34+3*98-1
  207.    
  208.     mov  esi,0
  209.     mov  edi,build_1
  210.     call convert
  211.    
  212.     mov  esi,1
  213.     mov  edi,build_2
  214.     call convert
  215.    
  216.    
  217.    
  218.     ; build_3
  219.    
  220.     mov  edi,build_3
  221.     mov  esi,loadp+18*3+230*3+3*300*69
  222.     mov  ecx,40
  223.   build_3l:
  224.     pusha
  225.     mov  ecx,3*40
  226.     cld
  227.     rep  movsb
  228.     popa
  229.     sub  esi,300*3
  230.     add  edi,40*3
  231.     loop build_3l
  232.    
  233.     mov  [width],50*3
  234.     mov  [width_move],25
  235.     mov  [sub_esi],150*3+2
  236.     mov  [add_edi],50*3*2
  237.     mov  [imul_esi],25*3
  238.     mov  [base],loadp+18*3+3*150*34+68
  239.    
  240.     mov  esi,0
  241.     mov  edi,mario_1
  242.     call convert
  243.    
  244.     mov  esi,1
  245.     mov  edi,mario_2
  246.     call convert
  247.    
  248.     mov  esi,2
  249.     mov  edi,mario_3
  250.     call convert
  251.    
  252.     jmp  mario_mirror
  253.    
  254.    
  255. convert:
  256.    
  257.     imul esi,[imul_esi]
  258.     add  esi,[base] ; loadp+18*3+3*150*34+68
  259.    
  260.     mov  ecx,70
  261.   mario_1l:
  262.     pusha
  263.     mov  ecx,[width_move]
  264.   putpix:
  265.     mov  eax,[esi]
  266.     mov  [edi+00],ax
  267.     mov  [edi+03],ax
  268.     mov  ebx,[width]
  269.     mov  [edi+ebx],ax
  270.     add  ebx,3
  271.     mov  [edi+ebx],ax
  272.     shr  eax,16
  273.     mov  [edi+02],al
  274.     dec  ebx
  275.     mov  [edi+ebx],al
  276.     mov  [edi+05],al
  277.     add  ebx,3
  278.     mov  [edi+ebx],al
  279.     add  esi,3
  280.     add  edi,6
  281.     loop putpix
  282.     popa
  283.     sub  esi,[sub_esi]
  284.     add  edi,[add_edi]
  285.     loop mario_1l
  286.    
  287.     ret
  288.    
  289. sub_esi  dd 0x0
  290. add_edi  dd 0x0
  291. imul_esi dd 0x0
  292. base     dd 0x0
  293. width    dd 0x0
  294. width_move dd 0x0
  295.    
  296.    
  297.    
  298. mario_mirror:
  299.    
  300.    
  301.     ; mario_green
  302.    
  303.     mov  edi,mario_green
  304.     mov  ecx,70*50
  305.   mario_greenl:
  306.     mov  [edi],dword 0x00500f
  307.     add  edi,3
  308.     loop mario_greenl
  309.    
  310.    
  311.    
  312.     ; mario_4
  313.    
  314.     mov  edi,mario_4
  315.     mov  esi,mario_1+49*3
  316.     mov  ecx,70
  317.   m4l1:
  318.     pusha
  319.     mov  ecx,50
  320.   m4l2:
  321.     mov  eax,[esi]
  322.     mov  [edi],ax
  323.     shr  eax,16
  324.     mov  [edi+2],al
  325.     add  edi,3
  326.     sub  esi,3
  327.     loop m4l2
  328.     popa
  329.     add  esi,50*3
  330.     add  edi,50*3
  331.     loop m4l1
  332.    
  333.    
  334.     ; mario_5
  335.    
  336.     mov  edi,mario_5
  337.     mov  esi,mario_2+49*3
  338.     mov  ecx,70
  339.   m5l1:
  340.     pusha
  341.     mov  ecx,50
  342.   m5l2:
  343.     mov  eax,[esi]
  344.     mov  [edi],ax
  345.     shr  eax,16
  346.     mov  [edi+2],al
  347.     add  edi,3
  348.     sub  esi,3
  349.     loop m5l2
  350.     popa
  351.     add  esi,50*3
  352.     add  edi,50*3
  353.     loop m5l1
  354.    
  355.    
  356.     ; mario_6
  357.    
  358.     mov  edi,mario_6
  359.     mov  esi,mario_3+49*3
  360.     mov  ecx,70
  361.   m6l1:
  362.     pusha
  363.     mov  ecx,50
  364.   m6l2:
  365.     mov  eax,[esi]
  366.     mov  [edi],ax
  367.     shr  eax,16
  368.     mov  [edi+2],al
  369.     add  edi,3
  370.     sub  esi,3
  371.     loop m6l2
  372.     popa
  373.     add  esi,50*3
  374.     add  edi,50*3
  375.     loop m6l1
  376.    
  377.    
  378.     popa
  379.    
  380.     ret
  381.    
  382.    
  383.    
  384. advance_mario:
  385.    
  386.     pusha
  387.    
  388.     mov  eax,[marioxy]      ; wherey ?
  389.     and  eax,65535
  390.     add  eax,40+21
  391.     xor  edx,edx
  392.     mov  ebx,40
  393.     div  ebx
  394.     mov  [marioy],eax
  395.    
  396.     mov  eax,[marioxy]      ; wherex ?
  397.     shr  eax,16
  398.     add  eax,20
  399.     xor  edx,edx
  400.     mov  ebx,40
  401.     div  ebx
  402.     mov  [mariox],eax
  403.    
  404.    
  405.    
  406.     cmp  byte [leftright],byte 1    ; go left
  407.     jnz  noleft
  408.     mov  eax,[marioxy]
  409.     xor  edx,edx
  410.     shr  eax,16
  411.     sub  eax,7
  412.     mov  ebx,40
  413.     div  ebx
  414.     add  eax,field+7*12
  415.     cmp  [eax],byte ' '
  416.     jz   mgoleft
  417.     mov  byte [leftright],byte 2
  418.     jmp  noleft
  419.   mgoleft:
  420.     mov  eax,[marioxy]
  421.     sub  eax,6*65536
  422.     mov  [marioxy],eax
  423.   noleft:
  424.    
  425.    
  426.    
  427.     cmp  byte [leftright],byte 4    ; go right
  428.     jnz  noright
  429.     mov  eax,[marioxy]
  430.     xor  edx,edx
  431.     shr  eax,16
  432.     add  eax,54
  433.     mov  ebx,40
  434.     div  ebx
  435.     add  eax,field+7*12
  436.     cmp  byte [eax],byte ' '
  437.     jz   mgoright
  438.     mov  byte [leftright],byte 3
  439.     jmp  noright
  440.   mgoright:
  441.     mov  eax,[marioxy]
  442.     add  eax,6*65536
  443.     mov  [marioxy],eax
  444.   noright:
  445.    
  446.    
  447.    
  448.    
  449.     cmp  [velocity],dword 0x100    ; jump up ?
  450.     jbe  nojumpup
  451.     mov  ebx,[velocity]
  452.     sub  ebx,1
  453.     cmp  ebx,0x100
  454.     jnz  no0x100
  455.     mov  [velocity],dword 0xff
  456.     jmp  nojumpup
  457.   no0x100:
  458.     mov  [velocity],ebx
  459.     sub  ebx,0x100-1
  460.     mov  eax,[marioxy]
  461.     sub  ax,bx
  462.     mov  [marioxy],eax
  463.   nojumpup:
  464.    
  465.     call mario_environment
  466.    
  467.     cmp  [velocity],dword 0x100    ; jump -> down ?
  468.     jge  nojumpdown
  469.     mov  eax,[marioy]
  470.     cmp  eax,[mario_below]
  471.     jb   yesgd
  472.     mov  [velocity],dword 0xff
  473.     mov  eax,[marioxy]
  474.     mov  eax,[mario_below]
  475.     sub  eax,1
  476.     mov  ebx,40
  477.      mul  ebx
  478.      sub  eax,10
  479.     mov  word [marioxy],ax
  480.     jmp  nojumpdown
  481.   yesgd:
  482.     mov  ebx,[velocity]
  483.     sub  ebx,1
  484.     mov  [velocity],ebx
  485.     mov  eax,[marioxy]
  486.     add  ax,0xff
  487.     sub  ax,bx
  488.     mov  [marioxy],eax
  489.   nojumpdown:
  490.    
  491.    
  492.     popa
  493.    
  494.     ret
  495.    
  496.    
  497. marioy dd 0x0
  498.    
  499. mariox dd 0x0
  500.    
  501. mario_below dd 5
  502.    
  503.    
  504. mario_environment:
  505.    
  506.      pusha
  507.    
  508.      mov  eax,[marioy]
  509.      mov  ebx,12
  510.      mul  ebx
  511.      add  eax,[mariox]
  512.      add  eax,field
  513.    
  514.      cmp  [eax],byte ' '
  515.      jz   me_ok
  516.    
  517.      mov  eax,[marioy]
  518.      mov  [mario_below],eax
  519.    
  520.      popa
  521.      ret
  522.  
  523.    me_ok:
  524.    
  525.      mov  [mario_below],dword 100
  526.    
  527.      popa
  528.      ret
  529.    
  530.    
  531. mario_delay:
  532.    
  533.     pusha
  534.    
  535.     mov  eax,5          ;pause
  536.     mov  ebx,2
  537.     int  0x40
  538.    
  539.     popa
  540.     ret
  541.    
  542.    
  543.    
  544. draw_mario:
  545.    
  546.     pusha
  547.    
  548.     mov  eax,[mariomem]
  549.     cmp  eax,[marioxy]
  550.     jnz  dm1
  551.        
  552.     call mario_delay
  553.  
  554.     popa
  555.    
  556.     ret
  557.    
  558.   dm1:
  559.    
  560.     mov  eax,[marioxy]
  561.     mov  [mariomem],eax
  562.    
  563.    
  564.     cmp  byte [leftright],byte 1   ; go left
  565.     jnz  no_m_left
  566.     jmp  m_left
  567.   no_m_left:
  568.    
  569.     cmp  byte [leftright],byte 4   ; go right
  570.     jnz  no_m_right
  571.     jmp  m_right
  572.   no_m_right:
  573.    
  574.     cmp  byte [leftright],byte 2   ; stand left
  575.     jnz  no_r_still
  576.     mov  eax,7
  577.     mov  ebx,mario_green
  578.     mov  ecx,50*65536+70
  579.     mov  edx,[marioxy]
  580.     int  0x40
  581.     call advance_mario
  582.     mov  eax,7
  583.     mov  ebx,mario_1
  584.     mov  ecx,50*65536+70
  585.     mov  edx,[marioxy]
  586.     int  0x40
  587.     call mario_delay
  588.     popa
  589.     ret
  590.   no_r_still:
  591.    
  592.     cmp  byte [leftright],byte 3   ; stand right
  593.     jnz  no_l_still
  594.     mov  eax,7
  595.     mov  ebx,mario_green
  596.     mov  ecx,50*65536+70
  597.     mov  edx,[marioxy]
  598.     int  0x40
  599.     call advance_mario
  600.     mov  eax,7
  601.     mov  ebx,mario_4
  602.     mov  ecx,50*65536+70
  603.     mov  edx,[marioxy]
  604.     int  0x40
  605.     call mario_delay
  606.    
  607.     popa
  608.     ret
  609.   no_l_still:
  610.    
  611.     popa
  612.     ret
  613.    
  614.    
  615.    
  616.    
  617.   m_left:
  618.    
  619.     mov  eax,7
  620.     mov  ebx,mario_green
  621.     mov  ecx,50*65536+70
  622.     mov  edx,[marioxy]
  623.     int  0x40
  624.     call advance_mario
  625.     mov  eax,7
  626.     mov  ebx,mario_1
  627.     mov  ecx,50*65536+70
  628.     mov  edx,[marioxy]
  629.     int  0x40
  630.     call mario_delay
  631.    
  632.     mov  eax,7
  633.     mov  ebx,mario_green
  634.     mov  ecx,50*65536+70
  635.     mov  edx,[marioxy]
  636.     int  0x40
  637.     call advance_mario
  638.     mov  eax,7
  639.     mov  ebx,mario_2
  640.     mov  ecx,50*65536+70
  641.     mov  edx,[marioxy]
  642.     int  0x40
  643.     call mario_delay
  644.    
  645.     mov  eax,7
  646.     mov  ebx,mario_green
  647.     mov  ecx,50*65536+70
  648.     mov  edx,[marioxy]
  649.     int  0x40
  650.     call advance_mario
  651.     mov  eax,7
  652.     mov  ebx,mario_3
  653.     mov  ecx,50*65536+70
  654.     mov  edx,[marioxy]
  655.     int  0x40
  656.     call mario_delay
  657.    
  658.     mov  eax,7
  659.     mov  ebx,mario_green
  660.     mov  ecx,50*65536+70
  661.     mov  edx,[marioxy]
  662.     int  0x40
  663.     call advance_mario
  664.     mov  eax,7
  665.     mov  ebx,mario_2
  666.     mov  ecx,50*65536+70
  667.     mov  edx,[marioxy]
  668.     int  0x40
  669.     call mario_delay
  670.    
  671.     popa
  672.    
  673.     ret
  674.    
  675.   m_right:
  676.    
  677.    
  678.     mov  eax,7
  679.     mov  ebx,mario_green
  680.     mov  ecx,50*65536+70
  681.     mov  edx,[marioxy]
  682.     int  0x40
  683.     call advance_mario
  684.     mov  eax,7
  685.     mov  ebx,mario_4
  686.     mov  ecx,50*65536+70
  687.     mov  edx,[marioxy]
  688.     int  0x40
  689.     call mario_delay
  690.    
  691.     mov  eax,7
  692.     mov  ebx,mario_green
  693.     mov  ecx,50*65536+70
  694.     mov  edx,[marioxy]
  695.     int  0x40
  696.     call advance_mario
  697.     mov  eax,7
  698.     mov  ebx,mario_5
  699.     mov  ecx,50*65536+70
  700.     mov  edx,[marioxy]
  701.     int  0x40
  702.     call mario_delay
  703.    
  704.     mov  eax,7
  705.     mov  ebx,mario_green
  706.     mov  ecx,50*65536+70
  707.     mov  edx,[marioxy]
  708.     int  0x40
  709.     call advance_mario
  710.     mov  eax,7
  711.     mov  ebx,mario_6
  712.     mov  ecx,50*65536+70
  713.     mov  edx,[marioxy]
  714.     int  0x40
  715.     call mario_delay
  716.    
  717.     mov  eax,7
  718.     mov  ebx,mario_green
  719.     mov  ecx,50*65536+70
  720.     mov  edx,[marioxy]
  721.     int  0x40
  722.     call advance_mario
  723.     mov  eax,7
  724.     mov  ebx,mario_5
  725.     mov  ecx,50*65536+70
  726.     mov  edx,[marioxy]
  727.     int  0x40
  728.     call mario_delay
  729.    
  730.     popa
  731.    
  732.     ret
  733.    
  734.    
  735.    
  736.    
  737.    
  738. draw_window:
  739.    
  740.     pusha
  741.    
  742.     mov       eax,12                    ; tell os about redraw
  743.     mov       ebx,1
  744.     int       0x40
  745.    
  746.     mov       eax,0                     ; define and draw window
  747.     mov       ebx,80*65536+480+1
  748.     mov       ecx,20*65536+382
  749.     mov       edx,0x5466AA88
  750.     mov       edi,title
  751.     int       0x40
  752.    
  753.     mov       eax,12                    ; tell os about redraw end
  754.     mov       ebx,2
  755.     int       0x40
  756.    
  757.     popa
  758.    
  759.     ret
  760.    
  761.    
  762. ; DATA SECTION
  763.    
  764. filename:
  765.     db  'MARIOALLBMP'
  766.    
  767. title:
  768.     db 'SUPER MARIO - USE ARROW KEYS', 0
  769.    
  770. field:
  771.    
  772.     db  '1          1'
  773.     db  '1          1'
  774.     db  '111      111'
  775.     db  '1          1'
  776.     db  '1          1'
  777.     db  '1  111111  1'
  778.     db  '1          1'
  779.     db  '1          1'
  780.     db  '222222222222'
  781.    
  782. xxyy        dd 0x0
  783.    
  784. marioxy     dd 0x0
  785.    
  786. mariomem    dd 0x0
  787.    
  788. leftright   dd 0x0
  789.    
  790. velocity    dd 0x0
  791.    
  792.    
  793. I_END:
  794.    
  795.    
  796.    
  797.    
  798.