MAP equ $9000
WIDTH equ 160
HEIGHT equ 100
;-------+-------+-------+-------+-------+
org $d000
start proc
local L1
call init
L1:
call update
call check
jp L1
endp
;-------+-------+-------+-------+-------+
init proc
local L1,L2,L3,L4
; MAP 0クリア
ld hl, MAP
ld (hl), $00
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
jr z, L3 ; if (x == 0) break
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), $03
pop hl
jp L1
L3:
; セミグラフィック
ld hl, $f300+81
ld de, 120
ld b, 25
L4:
ld (hl), $80
add hl, de
djnz L4
ret
endp
;-------+-------+-------+-------+-------+
check proc
local L1,L2,L9
ld hl, MAP+WIDTH*2+2
ld c, HEIGHT-4
L1:
ld b, WIDTH-4
L2:
bit 7, (hl)
jr z, L9
push hl
; ld de, -WIDTH-1
ld de, -(WIDTH+1)
add hl, de
inc (hl)
inc hl
inc (hl)
inc hl
inc (hl)
ld de, WIDTH-2
add hl, de
inc (hl)
inc hl
inc hl
inc (hl)
add hl, de
inc (hl)
inc hl
inc (hl)
inc hl
inc (hl)
pop hl
L9:
inc hl
djnz L2
ld de, 4
add hl, de
dec c
jp nz, L1
ret
endp
;-------+-------+-------+-------+-------+
update proc
local L1,L2,L3,L4,L5,L6,L7
ld hl, $f300
ld (pline), hl
ld hl, MAP
ld b, 0
L1:
ld c, 0
L2:
ld a, (hl)
or a
jp m, L4
; if (a >= 0)
cp 3
jr z, L3
; count != 3
ld (hl), $00
jp L6
L3: ; count == 3
call pset
ld (hl), $80
jp L6
L4: ; if (a < 0)
and $0e
cp $02
jr z, L5
; count != 2or3
call preset
ld (hl), $00
jp L6
L5: ; count == 2or3
ld (hl), $80
L6:
inc hl
inc c
ld a, c
cp WIDTH
jp nz, L2
inc b
ld a, b
and $03
jr nz, L7
exx
ld hl, (pline)
ld de, 120
add hl, de
ld (pline), hl
exx
L7:
ld a, b
cp HEIGHT
jp nz, L1
ret
endp
;-------+-------+-------+-------+-------+
pset proc
push hl
; a = ((x&1)<<2) | (y&3)
call point
; (hl) |= a
or (hl)
ld (hl), a
pop hl
ret
endp
;-------+-------+-------+-------+-------+
preset proc
push hl
call point
; (hl) &= !a
cpl
and (hl)
ld (hl), a
pop hl
ret
endp
;-------+-------+-------+-------+-------+
; in c x
; b y
; out hl vram
; a mask
point proc
; a = ((x&1)<<2) | (y&3)
ld a, c
and $01
rlca
rlca
ld e, a
ld a, b
and $03
or e
; a = (mask + a)
ld hl, mask
ld e, a
ld d, 0
add hl, de
ld a, (hl)
; hl = pline + x/2
ld hl, (pline)
ld e, c
srl e
; ld d, 0
add hl, de
ret
endp
;-------+-------+-------+-------+-------+
mask db $01,$02,$04,$08,$10,$20,$40,$80
pline ds 2 ; 行頭アドレス
data db 36,12
db 34,13, 36,13
db 24,14, 25,14, 32,14, 33,14, 46,14, 47,14
db 23,15, 27,15, 32,15, 33,15, 46,15, 47,15
db 12,16, 13,16, 22,16, 28,16, 32,16, 33,16
db 12,17, 13,17, 22,17, 26,17, 28,17, 29,17, 34,17, 36,17
db 22,18, 28,18, 36,18
db 23,19, 27,19
db 24,20, 25,20
db 24,75, 27,75
db 23,76, 25,76, 26,76, 28,76
db 24,77, 27,77
db 24,78, 27,78
db 23,79, 25,79, 26,79, 28,79
db 24,80, 27,80
db 130,30, 131,30, 132,30, 133,30, 134,30, 135,30, 136,30, 137,30, 138,30, 139,30
db 150,90, 151,90, 152,90
db 0,0
end start
10 ' life game
20 defint a-z:width 80,25:console ,,0,0:print chr$(12);
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,0C,D0,CD,77,D0,CD,47,D0,C3,03,D0,21,00,90,36
1010 data 00,11,01,90,01,7F,3E,ED,B0,21,00,D1,4E,23,46,23
1020 data 79,B7,28,15,E5,21,00,00,11,A0,00,19,10,FD,09,11
1030 data 00,90,19,36,03,E1,C3,1C,D0,21,51,F3,11,78,00,06
1040 data 19,36,80,19,10,FB,C9,21,42,91,0E,60,06,9C,CB,7E
1050 data 28,19,E5,11,5F,FF,19,34,23,34,23,34,11,9E,00,19
1060 data 34,23,23,34,19,34,23,34,23,34,E1,23,10,E0,11,04
1070 data 00,19,0D,C2,4C,D0,C9,21,00,F3,22,FE,D0,21,00,90
1080 data 06,00,0E,00,7E,B7,FA,9A,D0,FE,03,28,05,36,00,C3
1090 data AA,D0,CD,CB,D0,36,80,C3,AA,D0,E6,0E,FE,02,28,08
1100 data CD,D3,D0,36,00,C3,AA,D0,36,80,23,0C,79,FE,A0,C2
1110 data 84,D0,04,78,E6,03,20,0C,D9,2A,FE,D0,11,78,00,19
1120 data 22,FE,D0,D9,78,FE,64,C2,82,D0,C9,E5,CD,DC,D0,B6
1130 data 77,E1,C9,E5,CD,DC,D0,2F,A6,77,E1,C9,79,E6,01,07
1140 data 07,5F,78,E6,03,B3,21,F6,D0,5F,16,00,19,7E,2A,FE
1150 data D0,59,CB,3B,19,C9,01,02,04,08,10,20,40,80,00,00
1200 data 24,0C,22,0D,24,0D,18,0E,19,0E,20,0E,21,0E,2E,0E
1210 data 2F,0E,17,0F,1B,0F,20,0F,21,0F,2E,0F,2F,0F,0C,10
1220 data 0D,10,16,10,1C,10,20,10,21,10,0C,11,0D,11,16,11
1230 data 1A,11,1C,11,1D,11,22,11,24,11,16,12,1C,12,24,12
1240 data 17,13,1B,13,18,14,19,14,18,4B,1B,4B,17,4C,19,4C
1250 data 1A,4C,1C,4C,18,4D,1B,4D,18,4E,1B,4E,17,4F,19,4F
1260 data 1A,4F,1C,4F,18,50,1B,50,82,1E,83,1E,84,1E,85,1E
1270 data 86,1E,87,1E,88,1E,89,1E,8A,1E,8B,1E,96,5A,97,5A
1280 data 98,5A,00,00,*