Subversion Repositories Kolibri OS

Rev

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