MAP equ $c000
WIDTH equ 40
HEIGHT equ 24
;-------+-------+-------+-------+-------+
org $d000
start proc
local L1
call init
L1:
call disp
call count
call check
jp L1
endp
;-------+-------+-------+-------+-------+
init proc
local L1,L2
; MAP 0クリア
ld hl, MAP
ld (hl), 0
ld de, MAP+1
ld bc, WIDTH*HEIGHT-1
ldir
; 初期配置
ld hl, data
L1:
ld c, (hl) ; x
inc hl
ld b, (hl) ; y
inc hl
ld a, c
or a
ret z ; if (x == 0) return
push hl
ld hl, 0
ld de, WIDTH
L2:
add hl, de
djnz L2
add hl, bc
ld de, MAP
add hl, de ; hl = MAP + (WIDTH * y + x)
ld (hl), $80
pop hl
jp L1
endp
;-------+-------+-------+-------+-------+
disp proc
local L1,L2
ld hl, $f300
ld de, MAP
ld c, HEIGHT
L1:
ld b, WIDTH
L2:
ld a, (de)
or a
ld a, ' '
jr z, L3
ld a, '*'
L3:
ld (hl), a
inc hl
inc hl
inc de
djnz L2
push de
ld de, 40
add hl, de
pop de
dec c
jp nz, L1
ret
endp
;-------+-------+-------+-------+-------+
count proc
ld de, MAP
call count2
ld de, MAP+1
call count2
ld de, MAP+2
call count2
ld de, MAP+WIDTH
call count2
ld de, MAP+WIDTH+2
call count2
ld de, MAP+WIDTH*2
call count2
ld de, MAP+WIDTH*2+1
call count2
ld de, MAP+WIDTH*2+2
call count2
ret
endp
;-------+-------+-------+-------+-------+
count2 proc
local L1,L2,L3
ld hl, MAP+WIDTH+1
ld c, HEIGHT-2
L1:
ld b, WIDTH-2
L2:
ld a, (de)
or a
jp p, L3
inc (hl)
L3:
inc hl
inc de
djnz L2
inc hl
inc hl
inc de
inc de
dec c
jp nz, L1
ret
endp
;-------+-------+-------+-------+-------+
check proc
local L1,L2,L3,L4,L5
ld hl, MAP+WIDTH+1
ld de, 0
ld c, HEIGHT-2
L1:
ld b, WIDTH-2
L2:
ld a, (hl)
ld (hl), 0
or a
jp m, L3
; if (a >= 0)
cp 3 ; count == 3
jr z, L4
jp L5
L3: ; if (a < 0)
and $0f
cp 2 ; count == 2or3
jr z, L4
cp 3
jp nz, L5
L4:
ld (hl), $80
; inc de ; life++
L5:
inc hl
djnz L2
inc hl
inc hl
dec c
jp nz, L1
ret
endp
;-------+-------+-------+-------+-------+
data db 26,2
db 24,3, 26,3
db 14,4, 15,4, 22,4, 23,4, 36,4, 37,4
db 13,5, 17,5, 22,5, 23,5, 36,5, 37,5
db 2,6, 3,6, 12,6, 18,6, 22,6, 23,6
db 2,7, 3,7, 12,7, 16,7, 18,7, 19,7, 24,7, 26,7
db 12,8, 18,8, 26,8
db 13,9, 17,9
db 14,10, 15,10
db 4,15, 7,15
db 3,16, 5,16, 6,16, 8,16
db 4,17, 7,17
db 4,18, 7,18
db 3,19, 5,19, 6,19, 8,19
db 4,20, 7,20
db 16,20, 17,20, 18,20
db 0,0
end start
10 ' life game
20 defint a-z:width 40,25
30 p=&hd000:def usr=p
40 read d$:if d$<>"*" then poke p,val("&h"+d$):p=p+1:goto 40
50 a=usr(0)
1000 data CD,0F,D0,CD,3B,D0,CD,5E,D0,CD,A9,D0,C3,03,D0,21
1010 data 00,C0,36,00,11,01,C0,01,BF,03,ED,B0,21,D8,D0,4E
1020 data 23,46,23,79,B7,C8,E5,21,00,00,11,28,00,19,10,FD
1030 data 09,11,00,C0,19,36,80,E1,C3,1F,D0,21,00,F3,11,00
1040 data C0,0E,18,06,28,1A,B7,3E,20,28,02,3E,2A,77,23,23
1050 data 13,10,F2,D5,11,28,00,19,D1,0D,C2,43,D0,C9,11,00
1060 data C0,CD,8F,D0,11,01,C0,CD,8F,D0,11,02,C0,CD,8F,D0
1070 data 11,28,C0,CD,8F,D0,11,2A,C0,CD,8F,D0,11,50,C0,CD
1080 data 8F,D0,11,51,C0,CD,8F,D0,11,52,C0,CD,8F,D0,C9,21
1090 data 29,C0,0E,16,06,26,1A,B7,F2,9C,D0,34,23,13,10,F6
1100 data 23,23,13,13,0D,C2,94,D0,C9,21,29,C0,11,00,00,0E
1110 data 16,06,26,7E,36,00,B7,FA,C1,D0,FE,03,28,0E,C3,CE
1120 data D0,E6,0F,FE,02,28,05,FE,03,C2,CE,D0,36,80,23,10
1130 data E2,23,23,0D,C2,B1,D0,C9,1A,02,18,03,1A,03,0E,04
1140 data 0F,04,16,04,17,04,24,04,25,04,0D,05,11,05,16,05
1150 data 17,05,24,05,25,05,02,06,03,06,0C,06,12,06,16,06
1200 data 17,06,02,07,03,07,0C,07,10,07,12,07,13,07,18,07
1210 data 1A,07,0C,08,12,08,1A,08,0D,09,11,09,0E,0A,0F,0A
1220 data 04,0F,07,0F,03,10,05,10,06,10,08,10,04,11,07,11
1230 data 04,12,07,12,03,13,05,13,06,13,08,13,04,14,07,14
1240 data 10,14,11,14,12,14,00,00,*