0,0 → 1,813 |
; |
; 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: |
|
|
|
|