kolibrios-fun/programs/games/mario2/trunk/MARIO.ASM

814 lines
14 KiB
NASM
Raw Normal View History

;
; MARIO for MENUET
;
; Compile with fasm
;
use32
org 0x0
db 'MENUET00' ; 8 byte id
dd 38 ; required os
dd START ; program start
dd I_END ; image size
dd 0x100000 ; reguired amount of memory
dd 0x00000000 ; reserved=no extended header
empty equ 0x80000 + 0*3*40*40
build_1 equ 0x80000 + 1*3*40*40
build_2 equ 0x80000 + 2*3*40*40
build_3 equ 0x80000 + 3*3*40*40
mario_1 equ 0x90000 + 0*3*70*51
mario_2 equ 0x90000 + 1*3*70*51
mario_3 equ 0x90000 + 2*3*70*51
mario_4 equ 0x90000 + 3*3*70*51
mario_5 equ 0x90000 + 4*3*70*51
mario_6 equ 0x90000 + 5*3*70*51
mario_green equ 0x90000 + 6*3*70*51
loadp equ 0x90000 + 7*3*70*51
START:
call load_graph
mov [marioxy], dword 300*65536+270
mov [leftright], dword 1
mov [velocity], dword 0xff
call draw_window
sta:
mov eax,field
mov edx,1*65526+30
mov [xxyy],dword 1*65536+22
stl:
cmp [eax],byte ' '
jnz noempty
mov ebx,empty
noempty:
cmp [eax],byte '1'
jnz no1
mov ebx,build_1
no1:
cmp [eax],byte '2'
jnz no2
mov ebx,build_2
no2:
cmp [eax],byte '3'
jnz no3
mov ebx,build_3
no3:
pusha
mov edx,[xxyy]
mov eax,7 ; display image
mov ecx,40*65536+40
int 0x40
popa
add word [xxyy+2],word 40
cmp word [xxyy+2],word 40*12+1
jnz nonewline
mov word [xxyy+2],word 1
add word [xxyy+0],word 40
nonewline:
add eax,1
cmp eax,field+12*9
jz nodraw
jmp stl
nodraw:
; ********* MAIN LOOP ***********
wait_for_event:
call draw_mario
mov eax,11 ; check if os wants to say something
int 0x40
cmp eax,1
jz red
cmp eax,2
jz key
cmp eax,3
jnz wait_for_event
jmp button
red:
mov [mariomem],dword 0x0
call draw_window
jmp sta
key:
mov [mariomem],dword 0x0
mov eax,2 ; ah <- key
int 0x40
cmp ah,176
jnz key1
mov byte [leftright],byte 1
key1:
cmp ah,179
jnz key2
mov byte [leftright],byte 4
key2:
cmp ah,177
jnz key3
mov al,byte [leftright]
mov bl,al
cmp al,1
jnz key31
mov bl,2
key31:
cmp al,4
jnz key32
mov bl,3
key32:
mov byte [leftright],bl
key3:
cmp ah,178
jnz key4
cmp [velocity],dword 0xff
jnz key4
mov [velocity],dword 0x110
key4:
jmp wait_for_event
button:
mov eax,0xffffffff ; close this program
int 0x40
; end of program
load_graph:
pusha
mov eax,6 ; 6 = open file
mov ebx,filename
mov ecx,0
mov edx,0xFFFFFF
mov esi,loadp
mov edi,0 ; floppy
int 0x40
; empty
mov edi,empty
mov ecx,40*40
mov eax,0x00500f
cld
emptyl:
mov [edi],eax
add edi,3
loop emptyl
mov [width],40*3
mov [width_move],20
mov [sub_esi],150*3+2
mov [add_edi],40*3*2
mov [imul_esi],20*3
mov [base],loadp+18*3+3*150*34+3*98-1
mov esi,0
mov edi,build_1
call convert
mov esi,1
mov edi,build_2
call convert
; build_3
mov edi,build_3
mov esi,loadp+18*3+230*3+3*300*69
mov ecx,40
build_3l:
pusha
mov ecx,3*40
cld
rep movsb
popa
sub esi,300*3
add edi,40*3
loop build_3l
mov [width],50*3
mov [width_move],25
mov [sub_esi],150*3+2
mov [add_edi],50*3*2
mov [imul_esi],25*3
mov [base],loadp+18*3+3*150*34+68
mov esi,0
mov edi,mario_1
call convert
mov esi,1
mov edi,mario_2
call convert
mov esi,2
mov edi,mario_3
call convert
jmp mario_mirror
convert:
imul esi,[imul_esi]
add esi,[base] ; loadp+18*3+3*150*34+68
mov ecx,70
mario_1l:
pusha
mov ecx,[width_move]
putpix:
mov eax,[esi]
mov [edi+00],ax
mov [edi+03],ax
mov ebx,[width]
mov [edi+ebx],ax
add ebx,3
mov [edi+ebx],ax
shr eax,16
mov [edi+02],al
dec ebx
mov [edi+ebx],al
mov [edi+05],al
add ebx,3
mov [edi+ebx],al
add esi,3
add edi,6
loop putpix
popa
sub esi,[sub_esi]
add edi,[add_edi]
loop mario_1l
ret
sub_esi dd 0x0
add_edi dd 0x0
imul_esi dd 0x0
base dd 0x0
width dd 0x0
width_move dd 0x0
mario_mirror:
; mario_green
mov edi,mario_green
mov ecx,70*50
mario_greenl:
mov [edi],dword 0x00500f
add edi,3
loop mario_greenl
; mario_4
mov edi,mario_4
mov esi,mario_1+49*3
mov ecx,70
m4l1:
pusha
mov ecx,50
m4l2:
mov eax,[esi]
mov [edi],ax
shr eax,16
mov [edi+2],al
add edi,3
sub esi,3
loop m4l2
popa
add esi,50*3
add edi,50*3
loop m4l1
; mario_5
mov edi,mario_5
mov esi,mario_2+49*3
mov ecx,70
m5l1:
pusha
mov ecx,50
m5l2:
mov eax,[esi]
mov [edi],ax
shr eax,16
mov [edi+2],al
add edi,3
sub esi,3
loop m5l2
popa
add esi,50*3
add edi,50*3
loop m5l1
; mario_6
mov edi,mario_6
mov esi,mario_3+49*3
mov ecx,70
m6l1:
pusha
mov ecx,50
m6l2:
mov eax,[esi]
mov [edi],ax
shr eax,16
mov [edi+2],al
add edi,3
sub esi,3
loop m6l2
popa
add esi,50*3
add edi,50*3
loop m6l1
popa
ret
advance_mario:
pusha
mov eax,[marioxy] ; wherey ?
and eax,65535
add eax,40+21
xor edx,edx
mov ebx,40
div ebx
mov [marioy],eax
mov eax,[marioxy] ; wherex ?
shr eax,16
add eax,20
xor edx,edx
mov ebx,40
div ebx
mov [mariox],eax
cmp byte [leftright],byte 1 ; go left
jnz noleft
mov eax,[marioxy]
xor edx,edx
shr eax,16
sub eax,7
mov ebx,40
div ebx
add eax,field+7*12
cmp [eax],byte ' '
jz mgoleft
mov byte [leftright],byte 2
jmp noleft
mgoleft:
mov eax,[marioxy]
sub eax,6*65536
mov [marioxy],eax
noleft:
cmp byte [leftright],byte 4 ; go right
jnz noright
mov eax,[marioxy]
xor edx,edx
shr eax,16
add eax,54
mov ebx,40
div ebx
add eax,field+7*12
cmp byte [eax],byte ' '
jz mgoright
mov byte [leftright],byte 3
jmp noright
mgoright:
mov eax,[marioxy]
add eax,6*65536
mov [marioxy],eax
noright:
cmp [velocity],dword 0x100 ; jump up ?
jbe nojumpup
mov ebx,[velocity]
sub ebx,1
cmp ebx,0x100
jnz no0x100
mov [velocity],dword 0xff
jmp nojumpup
no0x100:
mov [velocity],ebx
sub ebx,0x100-1
mov eax,[marioxy]
sub ax,bx
mov [marioxy],eax
nojumpup:
call mario_environment
cmp [velocity],dword 0x100 ; jump -> down ?
jge nojumpdown
mov eax,[marioy]
cmp eax,[mario_below]
jb yesgd
mov [velocity],dword 0xff
mov eax,[marioxy]
mov eax,[mario_below]
sub eax,1
mov ebx,40
mul ebx
sub eax,10
mov word [marioxy],ax
jmp nojumpdown
yesgd:
mov ebx,[velocity]
sub ebx,1
mov [velocity],ebx
mov eax,[marioxy]
add ax,0xff
sub ax,bx
mov [marioxy],eax
nojumpdown:
popa
ret
marioy dd 0x0
mariox dd 0x0
mario_below dd 5
mario_environment:
pusha
mov eax,[marioy]
mov ebx,12
mul ebx
add eax,[mariox]
add eax,field
cmp [eax],byte ' '
jz me_ok
mov eax,[marioy]
mov [mario_below],eax
popa
ret
me_ok:
mov [mario_below],dword 100
popa
ret
mario_delay:
pusha
mov eax,5
mov ebx,2
int 0x40
popa
ret
draw_mario:
pusha
mov eax,[mariomem]
cmp eax,[marioxy]
jnz dm1
call mario_delay
popa
ret
dm1:
mov eax,[marioxy]
mov [mariomem],eax
cmp byte [leftright],byte 1 ; go left
jnz no_m_left
jmp m_left
no_m_left:
cmp byte [leftright],byte 4 ; go right
jnz no_m_right
jmp m_right
no_m_right:
cmp byte [leftright],byte 2 ; stand left
jnz no_r_still
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_1
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
popa
ret
no_r_still:
cmp byte [leftright],byte 3 ; stand right
jnz no_l_still
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_4
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
popa
ret
no_l_still:
popa
ret
m_left:
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_1
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_2
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_3
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_2
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
popa
ret
m_right:
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_4
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_5
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_6
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
mov eax,7
mov ebx,mario_green
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call advance_mario
mov eax,7
mov ebx,mario_5
mov ecx,50*65536+70
mov edx,[marioxy]
int 0x40
call mario_delay
popa
ret
draw_window:
pusha
mov eax,12 ; tell os about redraw
mov ebx,1
int 0x40
mov eax,0 ; define and draw window
mov ebx,80*65536+480+1
mov ecx,20*65536+382
mov edx,0x0000500f
mov esi,0x8066AA88
mov edi,0x00559977
int 0x40
mov eax,dword 0x00000004
mov ebx,8*65536+8
mov ecx,dword 0x00cccccc
mov edx,text
mov esi,textlen-text
int 0x40
mov eax,8
mov ebx,(481-19)*65536+12 ; button start x & size
mov ecx,5*65536+12 ; button start y & size
mov edx,1 ; button number
mov esi,0x00229911 ; button color
int 0x40
mov eax,12 ; tell os about redraw end
mov ebx,2
int 0x40
popa
ret
; DATA SECTION
filename:
db 'MARIOALLBMP'
text:
db 'SUPER MARIO - USE ARROW KEYS'
textlen:
xx db 'x'
field:
db '1 1'
db '1 1'
db '111 111'
db '1 1'
db '1 1'
db '1 111111 1'
db '1 1'
db '1 1'
db '222222222222'
xxyy dd 0x0
marioxy dd 0x0
mariomem dd 0x0
leftright dd 0x0
velocity dd 0x0
I_END: