Код:
;--- drawSprite -----------------------------------------------------------------
drawSprite_x ds 1
drawSprite_y ds 1
drawSprite_s ds 2
drawSprite_v ds 2
drawSprite_a ds 1
drawSprite:
ld (drawSprite_s), hl
; 8 a = (uchar)(x/SPRITE_WIDTH*5);
ld a, (drawSprite_x)
rra
rra
and 3Fh
ld d, 5
call op_mul
ld a, l
ld (drawSprite_a), a
; 9 v = (uchar*)(0xA009 + 94*6 + a + y*94);
ld hl, (drawSprite_a)
ld h, 0
ld de, 41533
add hl, de
push hl
ld d, 94
ld a, (drawSprite_y)
call op_mul
pop de
add hl, de
ld (drawSprite_v), hl
; 11 switch(x % SPRITE_WIDTH) {
ld a, (drawSprite_x)
and 3
cp 0
jp nz, l24
; 12 drawImage (v, CYAN, s); break;
ld hl, (drawSprite_v)
ld (drawImage_to), hl
ld a, 129
ld (drawImage_color), a
ld hl, (drawSprite_s)
call drawImage
; 12 break;
jp l23
l24:
cp 1
jp nz, l25
; 13 drawImage1(v, CYAN, s); break;
ld hl, (drawSprite_v)
ld (drawImage1_to), hl
ld a, 129
ld (drawImage1_color), a
ld hl, (drawSprite_s)
call drawImage1
; 13 break;
jp l23
l25:
cp 2
jp nz, l26
; 14 drawImage2(v, CYAN, s); break;
ld hl, (drawSprite_v)
ld (drawImage2_to), hl
ld a, 129
ld (drawImage2_color), a
ld hl, (drawSprite_s)
call drawImage2
; 14 break;
jp l23
l26:
cp 3
jp nz, l27
; 15 drawImage3(v, CYAN, s); break;
ld hl, (drawSprite_v)
ld (drawImage3_to), hl
ld a, 129
ld (drawImage3_color), a
ld hl, (drawSprite_s)
call drawImage3
; 15 break;
jp l23
l23:
l27:
; 18 a = (uchar)((y/SPRITE_WIDTH)*MAP_WIDTH+(x/SPRITE_HEIGHT));
ld a, (drawSprite_y)
rra
rra
and 3Fh
ld h, 0
ld l, a
add hl, hl
add hl, hl
add hl, hl
add hl, hl
ld a, (drawSprite_x)
rra
rra
and 3Fh
ld e, a
ld d, 0
add hl, de
ld a, l
ld (drawSprite_a), a
; 19 map1[a]=0xFF;
ld hl, (drawSprite_a)
ld h, 0
ld de, map1
add hl, de
ld a, 255
ld (hl), a
; 20 if(x%MAP_WIDTH) {
ld a, (drawSprite_x)
and 0Fh
or a
jp z, l28
; 21 map1[a+1] = 0xFF;
ld a, (drawSprite_a)
add 1
ld h, 0
ld l, a
ld de, map1
add hl, de
ld a, 255
ld (hl), a
; 22 if(y%MAP_WIDTH) {
ld a, (drawSprite_y)
and 0Fh
or a
jp z, l29
; 23 map1[a+MAP_WIDTH]=0xFF;
ld a, (drawSprite_a)
add 16
ld h, 0
ld l, a
ld de, map1
add hl, de
ld a, 255
ld (hl), a
; 24 map1[a+(MAP_WIDTH+1)]=0xFF;
ld a, (drawSprite_a)
add 17
ld h, 0
ld l, a
ld de, map1
add hl, de
ld a, 255
ld (hl), a
l29:
jp l30
l28:
; 27 if(y%MAP_WIDTH) {
ld a, (drawSprite_y)
and 0Fh
or a
jp z, l31
; 28 map1[a+MAP_WIDTH]=0xFF;
ld a, (drawSprite_a)
add 16
ld h, 0
ld l, a
ld de, map1
add hl, de
ld a, 255
ld (hl), a
l31:
l30:
l22:
ret
;--- redrawTiles -----------------------------------------------------------------
redrawTiles_v ds 2
redrawTiles_a ds 1
redrawTiles_addr ds 1
redrawTiles:
push bc
; 39 for(m = map1; m - (map1+MAP_WIDTH*MAP_HEIGHT); ++m) {
ld bc, map1
l33:
ld hl, -((map1)+(208))
add hl, bc
ld a, l
or h
jp z, l34
; 40 if(!*m) continue;
ld a, (bc)
or a
jp nz, l37
; 40 continue;
jp l35
l37:
; 41 *m = 0;
xor a
ld (bc), a
; 43 addr = (uchar)(m - map1);
ld hl, -(map1)
add hl, bc
ld a, l
ld (redrawTiles_addr), a
; 44 a = map[addr];
ld hl, (redrawTiles_addr)
ld h, 0
ld de, map
add hl, de
ld a, (hl)
ld (redrawTiles_a), a
; 45 v = (uchar*)(0xA009 + 94*6 + (addr/MAP_WIDTH)*(94*4) + 5*(addr%MAP_WIDTH));
ld a, (redrawTiles_addr)
rra
rra
rra
rra
and 0Fh
ld de, 376
ld h, 0
ld l, a
call op_mul16
ld de, 41533
add hl, de
ld a, (redrawTiles_addr)
and 0Fh
push hl
ld d, a
ld a, 5
call op_mul
pop de
add hl, de
ld (redrawTiles_v), hl
; 46 if(a==0) {
ld a, (redrawTiles_a)
cp 0
jp nz, l39
; 47 drawEmptyImage(v);
ld hl, (redrawTiles_v)
call drawEmptyImage
jp l40
l39:
; 49 if(a >= 0x80) a=2;
ld a, (redrawTiles_a)
cp 128
jp c, l42
; 49 a=2;
ld a, 2
ld (redrawTiles_a), a
l42:
; 50 a--;
ld hl, redrawTiles_a
ld a, (hl)
dec (hl)
; 51 drawImage(v, tilesColors[a], tiles + a*16);
ld hl, (redrawTiles_v)
ld (drawImage_to), hl
ld hl, (redrawTiles_a)
ld h, 0
ld de, tilesColors
add hl, de
ld a, (hl)
ld (drawImage_color), a
ld hl, (redrawTiles_a)
ld h, 0
add hl, hl
add hl, hl
add hl, hl
add hl, hl
ld de, tiles
add hl, de
call drawImage
l40:
l35:
inc bc
jp l33
l34:
l32:
pop bc
ret
;--- redrawScreen -----------------------------------------------------------------
redrawScreen_i ds 1
redrawScreen_s ds 2
redrawScreen:
push bc
; 61 redrawTiles();
call redrawTiles
; 63 s = enemySprite + enemyAnimation[(ticks/4)%4];
ld a, (ticks)
rra
rra
and 3Fh
and 3
ld h, 0
ld l, a
ld de, enemyAnimation
add hl, de
ld l, (hl)
ld h, 0
ld de, enemySprite
add hl, de
ld (redrawScreen_s), hl
; 64 for(e=enemies, i=0; i<enemyCount; ++i, ++e)
ld bc, enemies
xor a
ld (redrawScreen_i), a
l44:
ld hl, enemyCount
ld a, (redrawScreen_i)
cp (hl)
jp nc, l45
; 65 drawSprite(e->x, e->y, s);
ld a, (bc)
ld (drawSprite_x), a
ld hl, bc
inc hl
ld a, (hl)
ld (drawSprite_y), a
ld hl, (redrawScreen_s)
call drawSprite
l46:
ld hl, redrawScreen_i
inc (hl)
inc bc
inc bc
inc bc
inc bc
jp l44
l45:
; 67 if(playerDir==1 || playerDir==2) s = playerSprite + 16 + 16*(1 + (ticks / 2)&1); else
ld a, (playerDir)
cp 1
ld a, 1
jp z, l48
dec a
l48:
push af
ld a, (playerDir)
cp 2
ld a, 1
jp z, l49
dec a
l49:
ld d, a
pop af
or d
or a
jp z, l50
; 67 s = playerSprite + 16 + 16*(1 + (ticks / 2)&1); else
ld a, (ticks)
cp a
rra
add 1
and 1
ld d, a
ld a, 16
call op_mul
ld de, (playerSprite)+(16)
add hl, de
ld (redrawScreen_s), hl
jp l51
l50:
; 68 if(playerDir==3 || playerDir==4) s = playerSprite + 16*3 + 16*(1 + (ticks / 2)&1);
ld a, (playerDir)
cp 3
ld a, 1
jp z, l52
dec a
l52:
push af
ld a, (playerDir)
cp 4
ld a, 1
jp z, l53
dec a
l53:
ld d, a
pop af
or d
or a
jp z, l54
; 68 s = playerSprite + 16*3 + 16*(1 + (ticks / 2)&1);
ld a, (ticks)
cp a
rra
add 1
and 1
ld d, a
ld a, 16
call op_mul
ld de, (playerSprite)+(48)
add hl, de
ld (redrawScreen_s), hl
jp l55
l54:
; 69 s = playerSprite;
ld hl, playerSprite
ld (redrawScreen_s), hl
l55:
l51:
; 70 drawSprite(playerX, playerY, s);
ld a, (playerX)
ld (drawSprite_x), a
ld a, (playerY)
ld (drawSprite_y), a
ld hl, (redrawScreen_s)
call drawSprite
l43:
pop bc
ret
;--- getKeybFire -----------------------------------------------------------------
getKeybFire:
; 2 *(uchar*)0xED00 = ~(1<<7);
ld a, 127
ld (60672), a
; 3 return !(*(uchar*)0xED01 & 0x80);
ld a, (60673)
and 128
or a
ld a, 0
jp nz, l57
inc a
l57:
jp l56
l56:
ret
;--- getKeybArrows -----------------------------------------------------------------
getKeybArrows:
; 7 *(uchar*)0xED00 = ~(1<<1);
ld a, 253
ld (60672), a
; 8 return ~(*(uchar*)0xED01);
ld a, (60673)
cpl
jp l58
l58:
ret
lvd:
db 35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,32
db 35,32,32,32,55,32,32,50,32,32,32,32,32,32,35,32
db 35,32,35,32,35,32,35,50,35,32,35,32,35,32,35,32
db 35,32,32,32,32,54,50,50,32,32,32,50,32,32,35,32
db 35,32,35,32,35,50,35,32,35,32,35,50,35,32,35,32
db 35,52,50,54,50,50,32,32,32,54,50,50,50,32,35,32
db 35,32,35,64,35,50,35,32,35,50,35,32,35,32,35,32
db 35,32,50,32,32,50,64,32,32,32,50,32,32,32,35,32
db 35,50,35,50,35,50,35,54,35,50,35,32,35,32,35,32
db 35,32,32,32,32,50,32,32,32,50,32,64,54,32,35,32
db 35,50,35,32,35,32,35,50,35,50,35,50,35,32,35,32
db 35,32,50,32,32,32,50,64,32,32,32,32,32,32,35,32
db 35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,32
;--- printKeyb -----------------------------------------------------------------
printKeyb:
push bc
; 52 for(x=0; x<8; x++) {
ld b, 0
l60:
ld a, b
cp 8
jp nc, l61
; 53 *(uchar*)0xED00 = ~(1<<x);
ld d, b
ld a, 1
call op_shl
cpl
ld (60672), a
; 54 for(y=0; y<8; y++)
ld c, 0
l64:
ld a, c
cp 8
jp nc, l65
; 55 ((uchar*)0xA000+94*y)[x] = (*(uchar*)0xED01 >> y) & 1;
ld d, c
ld a, 94
call op_mul
ld de, 40960
add hl, de
ld e, b
ld d, 0
add hl, de
ld d, c
ld a, (60673)
call op_shr
and 1
ld (hl), a
l66:
ld a, c
inc c
jp l64
l65:
l62:
ld a, b
inc b
jp l60
l61:
l59:
pop bc
ret
moveBonus: ds 1
moveExit: ds 1
moveDead: ds 1