8,29 → 8,44 |
|
org 0x0 |
|
db 'MENUET00' ; 8 byte id |
dd 38 ; required os |
db 'MENUET01' ; header |
dd 1 ; version |
dd START ; program start |
dd I_END ; image size |
dd 0x100000 ; reguired amount of memory |
dd 0x00000000 ; reserved=no extended header |
dd MEM ; size memory program |
dd STACKTOP ; pointer to begin stack pos |
dd 0 |
dd 0 |
|
res_base = loadp + 0x36 ; offset on array pixel in BMP file |
res_width_px = 150 |
res_height_px = 35 |
res_line_size = (res_width_px*3 + 11b) and not 11b ; 150*3 + 2 |
|
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 |
block_width = 40 |
block_height = 40 |
block_line_size = block_width * 3 |
block_img_size = block_width * block_height * 3 |
block_draw_size = (block_width shl 16) + block_height ; for sysfn 7 |
block_count_pixel = block_width * block_height |
|
mario_width = 50 |
mario_height = 70 |
mario_line_size = mario_width * 3 |
mario_img_size = mario_width * mario_height * 3 |
mario_draw_size = (mario_width shl 16) + mario_height |
mario_count_pixel = mario_width * mario_height |
|
|
wnd_pos_x = 80 |
wnd_pos_y = 20 |
|
wnd_header_size = 0x16 |
wnd_height = 9*block_height + wnd_header_size |
wnd_width = 12*block_width + 1 |
|
|
START: |
|
|
46,30 → 61,29 |
sta: |
|
mov eax,field |
mov edx,1*65526+30 |
mov [xxyy],dword 1*65536+22 |
mov dword[xxyy], 1*65536 + wnd_header_size |
|
stl: |
|
cmp [eax],byte ' ' |
jnz noempty |
cmp byte[eax], ' ' |
jnz @f |
mov ebx,empty |
noempty: |
@@: |
|
cmp [eax],byte '1' |
jnz no1 |
cmp byte[eax], '1' |
jnz @f |
mov ebx,build_1 |
no1: |
@@: |
|
cmp [eax],byte '2' |
jnz no2 |
cmp byte[eax], '2' |
jnz @f |
mov ebx,build_2 |
no2: |
@@: |
|
cmp [eax],byte '3' |
jnz no3 |
cmp byte[eax], '3' |
jnz @f |
mov ebx,build_3 |
no3: |
@@: |
|
pusha |
|
76,26 → 90,23 |
mov edx,[xxyy] |
|
mov eax,7 ; display image |
mov ecx,40*65536+40 |
mov ecx, block_draw_size |
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 word [xxyy+2], block_width |
cmp word [xxyy+2], block_width*12+1 |
jnz .nonewline |
|
mov word [xxyy+2], 1 |
add word [xxyy+0], block_height |
.nonewline: |
|
add eax,1 |
cmp eax,field+12*9 |
jz nodraw |
jmp stl |
cmp eax, field.end |
jnz stl |
|
nodraw: |
|
|
; ********* MAIN LOOP *********** |
|
|
105,14 → 116,16 |
|
mov eax,11 ; check for event |
int 0x40 |
|
cmp eax,1 |
jz red |
cmp eax,2 |
jz key |
cmp eax,3 |
cmp eax,3 ; check pressed button |
jnz wait_for_event |
|
jmp button |
mov eax, -1 ; close this program |
int 0x40 |
|
red: |
|
128,17 → 141,17 |
mov eax,2 ; ah <- key |
int 0x40 |
|
cmp ah,176 |
cmp ah,176 ; 'left' |
jnz key1 |
mov byte [leftright],byte 1 |
key1: |
|
cmp ah,179 |
cmp ah,179 ; 'right' |
jnz key2 |
mov byte [leftright],byte 4 |
key2: |
|
cmp ah,177 |
cmp ah,177 ; 'down' |
jnz key3 |
mov al,byte [leftright] |
mov bl,al |
153,7 → 166,7 |
mov byte [leftright],bl |
key3: |
|
cmp ah,178 |
cmp ah,178 ; 'up' |
jnz key4 |
cmp [velocity],dword 0xff |
jnz key4 |
160,6 → 173,7 |
mov [velocity],dword 0x110 |
key4: |
|
; this code using for fix defects drawing(draw in caption area) |
mov eax,71 ;draw caption |
mov ebx,1 |
mov ecx,title |
169,41 → 183,25 |
|
;jmp wait_for_event |
|
button: |
|
mov eax,0xffffffff ; close this program |
int 0x40 |
|
|
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 |
|
; empty block init - set in 0x00500f color |
mov edi,empty |
mov ecx,40*40 |
mov ecx, block_count_pixel |
mov eax,0x00500f |
cld |
emptyl: |
@@: |
mov [edi],eax |
add edi,3 |
loop emptyl |
loop @b |
|
mov [width],40*3 |
mov [width_move],20 |
mov [sub_esi],150*3+2 |
mov [add_edi],40*3*2 |
mov [width], block_line_size |
mov [width_move], block_width/2 |
mov [height_move], block_height/2 |
mov [imul_esi],20*3 |
mov [base],loadp+18*3+3*150*34+3*98-1 |
mov [base], res_base + 3*res_width_px * 34 +3*98-1 |
|
mov esi,0 |
mov edi,build_1 |
216,26 → 214,24 |
|
|
; build_3 |
|
mov edi,build_3 |
mov esi,loadp+18*3+230*3+3*300*69 |
mov ecx,40 |
mov esi, res_base + 230*3+3*300*69 |
mov ecx, block_height |
build_3l: |
pusha |
mov ecx,3*40 |
mov ecx, block_line_size |
cld |
rep movsb |
popa |
sub esi,300*3 |
add edi,40*3 |
add edi, block_line_size |
loop build_3l |
|
mov [width],50*3 |
mov [width_move],25 |
mov [sub_esi],150*3+2 |
mov [add_edi],50*3*2 |
mov [width], mario_line_size |
mov [width_move], mario_width/2 |
mov [height_move], mario_height/2 |
mov [imul_esi],25*3 |
mov [base],loadp+18*3+3*150*34+68 |
mov [base], res_base + 3*res_width_px*34 + 68 |
|
mov esi,0 |
mov edi,mario_1 |
252,16 → 248,21 |
jmp mario_mirror |
|
|
; copy in [edi], image x2 |
convert: |
|
imul esi,[imul_esi] |
add esi,[base] ; loadp+18*3+3*150*34+68 |
|
mov ecx,70 |
mario_1l: |
mov eax, [width] |
shl eax, 1 ; *2 |
mov ecx, [height_move] ;? |
|
.new_line: |
pusha |
mov ecx,[width_move] |
putpix: |
|
.putpix: ; set 4 pixel: edi, edi+3, edi+width, edi+width+3 |
mov eax,[esi] |
mov [edi+00],ax |
mov [edi+03],ax |
278,45 → 279,41 |
mov [edi+ebx],al |
add esi,3 |
add edi,6 |
loop putpix |
loop .putpix |
popa |
sub esi,[sub_esi] |
add edi,[add_edi] |
loop mario_1l |
|
sub esi,res_line_size |
add edi, eax |
loop .new_line |
|
ret |
|
sub_esi dd 0x0 |
add_edi dd 0x0 |
imul_esi dd 0x0 |
base dd 0x0 |
width dd 0x0 |
width_move dd 0x0 |
imul_esi dd 0 |
base dd 0 |
width dd 0 |
width_move dd 0 |
height_move dd 0 |
|
|
|
mario_mirror: |
|
|
; mario_green |
|
mov edi,mario_green |
mov ecx,70*50 |
mario_greenl: |
mov ecx, mario_count_pixel |
@@: |
mov [edi],dword 0x00500f |
add edi,3 |
loop mario_greenl |
loop @b |
|
; mario_4 - reverse mario_1 |
|
|
; mario_4 |
|
mov edi,mario_4 |
mov esi,mario_1+49*3 |
mov ecx,70 |
mov esi, mario_1 + (mario_width - 1)*3 |
mov ecx, mario_height |
m4l1: |
pusha |
mov ecx,50 |
mov ecx, mario_width |
m4l2: |
mov eax,[esi] |
mov [edi],ax |
326,19 → 323,20 |
sub esi,3 |
loop m4l2 |
popa |
add esi,50*3 |
add edi,50*3 |
|
add esi, mario_width*3 |
add edi, mario_width*3 |
loop m4l1 |
|
|
; mario_5 |
; mario_5 - reverse mario_2 |
|
mov edi,mario_5 |
mov esi,mario_2+49*3 |
mov ecx,70 |
mov esi, mario_2 + (mario_width - 1)*3 |
mov ecx, mario_height |
m5l1: |
pusha |
mov ecx,50 |
mov ecx, mario_width |
m5l2: |
mov eax,[esi] |
mov [edi],ax |
348,19 → 346,20 |
sub esi,3 |
loop m5l2 |
popa |
add esi,50*3 |
add edi,50*3 |
|
add esi, mario_width*3 |
add edi, mario_width*3 |
loop m5l1 |
|
|
; mario_6 |
; mario_6 - reverse mario_3 |
|
mov edi,mario_6 |
mov esi,mario_3+49*3 |
mov ecx,70 |
mov esi, mario_3 + (mario_width - 1)*3 |
mov ecx, mario_height |
m6l1: |
pusha |
mov ecx,50 |
mov ecx, mario_width |
m6l2: |
mov eax,[esi] |
mov [edi],ax |
370,13 → 369,13 |
sub esi,3 |
loop m6l2 |
popa |
add esi,50*3 |
add edi,50*3 |
|
add esi, mario_width*3 |
add edi, mario_width*3 |
loop m6l1 |
|
|
popa |
|
ret |
|
|
547,129 → 546,132 |
|
mov eax,[mariomem] |
cmp eax,[marioxy] |
jnz dm1 |
jnz @f |
|
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], 1 ; go left |
jz m_left |
|
cmp byte [leftright],byte 4 ; go right |
jnz no_m_right |
jmp m_right |
no_m_right: |
cmp byte [leftright], 4 ; go right |
jz m_right |
|
cmp byte [leftright],byte 2 ; stand left |
cmp byte [leftright], 2 ; stand left |
jnz no_r_still |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_1 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
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 ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_4 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
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 ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_1 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_2 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_3 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_2 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
popa |
|
ret |
|
m_right: |
677,64 → 679,67 |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_4 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_5 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_6 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
mov eax,7 |
mov ebx,mario_green |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call advance_mario |
mov eax,7 |
mov ebx,mario_5 |
mov ecx,50*65536+70 |
mov ecx, mario_draw_size |
mov edx,[marioxy] |
int 0x40 |
|
call mario_delay |
|
popa |
|
ret |
|
|
|
|
|
draw_window: |
|
pusha |
744,9 → 749,9 |
int 0x40 |
|
mov eax,0 ; define and draw window |
mov ebx,80*65536+480+1 |
mov ecx,20*65536+382 |
mov edx,0x5466AA88 |
mov ebx, (wnd_pos_x shl 16) + wnd_width ;80*65536+480+1 |
mov ecx, (wnd_pos_y shl 16) + wnd_height ;20*65536+382 |
mov edx,0x5466AA88 ; 4 type window + title + no draw work space |
mov edi,title |
int 0x40 |
|
761,9 → 766,6 |
|
; DATA SECTION |
|
filename: |
db 'MARIOALLBMP' |
|
title: |
db 'SUPER MARIO - USE ARROW KEYS', 0 |
|
778,6 → 780,7 |
db '1 1' |
db '1 1' |
db '222222222222' |
.end: |
|
xxyy dd 0x0 |
|
789,9 → 792,33 |
|
velocity dd 0x0 |
|
align 16 |
loadp: |
file 'MARIOALL.BMP' |
|
I_END: |
|
align 0x1000 |
|
empty: rb block_img_size |
build_1: rb block_img_size |
build_2: rb block_img_size |
build_3: rb block_img_size |
|
align 0x1000 |
|
mario_1: rb mario_img_size |
mario_2: rb mario_img_size |
mario_3: rb mario_img_size |
mario_4: rb mario_img_size |
mario_5: rb mario_img_size |
mario_6: rb mario_img_size |
mario_green: rb mario_img_size |
|
|
rb 4096 |
STACKTOP: |
MEM: |
|
|
|