1セクタゲーム作成に挑戦-3
スクロールルーチン
ああ、もう嫌な予感しかしませんが、スクロールルーチンを詰めていきます。
スクロールするマップデータは入りそうにないので、MSXのメモリを流用します。ROM等に書かれたデータをマップデータとして勝手に解釈する寸法です。
ただしキャラクタの配置に一定のルールが必要なので、ROMデータを加工して任意のデータを作成するのが良いでしょう。
作成するマップサイズは、1000H~1FFFHの4KiBとします。
スクロールポイントは画面左上に相当するアドレス1つで管理し、1000Hのマップデータをループして使用します。
細かい終端部分はとりあえず放置で様子を見ます。
データはメインROMから読みだした値を適当な数値で空白と障害物に分岐させ、連続何個続くかも取得し、それを1000Hから書き込みます。
表示はscpointのアドレス(1000H~1FFFHの値が格納される)から読み出し画面の左上から読みだした値をキャラクタコードとしてVRAMに書き込むことで表示しました。
その際、キャラクタコード01H,09H,11Hのものはdotpointの値(0~7)を加算して書き込みます。
これにより、ドット単位でスクロールしたパターンが描画されるという仕掛けです。
追加分コード
ソース(クリックで展開)
;マップデータ作成
ld hl,0
ld de,map
maps2: call sltrd
cp 40
jr nc,mapsp ;空白設定
;障害物設定
call sltrd
and 00011111b ;a=ループキャラクタ数
ex de,hl ;hl=マップアドレス de=読み込みアドレス
ld (hl),1 ;緩衝キャラクタ
inc hl
maps1: or a
jr z,maps0 ;障害物
dec a
ld (hl),9 ;ループキャラクタ
inc hl
jr maps1
mapsp: call sltrd
and 00011111b
ex de,hl
mapsp0: ld (hl),0
inc hl
or a
jr z,maps3
dec a
jr mapsp0
maps0: ld (hl),11h ;障害物
inc hl
maps3: ex de,hl ;hl=読み込みアドレス, de=マップアドレス
push hl
ld hl,1fffh
or a
sbc hl,de
pop hl
jr nc,maps2
ld hl,1000h
ld (scpoint),hl
xor a
ld (dotpoint),a
ld b,255
ml1: push bc
ld de,(scpoint)
ld a,(dotpoint)
ld c,a
ld b,8
ml0: push bc
push de
call putsc
pop de
pop bc
inc c
djnz ml0
ld de,(scpoint)
inc de
ld (scpoint),de
pop bc
djnz ml1
ret
putsc: ;画面表示
;de=スクロールアドレス
;c=ドットポイント
ld a,24
ld (putsc1+1),a
ld hl,1800h
putsc2: ld b,32
putsc0: ld a,(de)
or a
jr z,putsc3
add a,c
putsc3: callbios wrtvrm
inc hl
inc de
djnz putsc0
ex de,hl ;hl=スクロールアドレス
push de
ld de,1000h
or a
sbc hl,de
ld a,00011111b
and h
ld h,a
add hl,de
pop de
ex de,hl
putsc1: ld a,0
dec a
ld (putsc1+1),a
jr nz,putsc2
ret
sltrd: ;スロット読み込み
ld a,(exptbl)
push de
call rdslt
pop de
inc hl
ret
scpoint: dw 0
dotpoint: db 0
map: equ 1000h
ld hl,0
ld de,map
maps2: call sltrd
cp 40
jr nc,mapsp ;空白設定
;障害物設定
call sltrd
and 00011111b ;a=ループキャラクタ数
ex de,hl ;hl=マップアドレス de=読み込みアドレス
ld (hl),1 ;緩衝キャラクタ
inc hl
maps1: or a
jr z,maps0 ;障害物
dec a
ld (hl),9 ;ループキャラクタ
inc hl
jr maps1
mapsp: call sltrd
and 00011111b
ex de,hl
mapsp0: ld (hl),0
inc hl
or a
jr z,maps3
dec a
jr mapsp0
maps0: ld (hl),11h ;障害物
inc hl
maps3: ex de,hl ;hl=読み込みアドレス, de=マップアドレス
push hl
ld hl,1fffh
or a
sbc hl,de
pop hl
jr nc,maps2
ld hl,1000h
ld (scpoint),hl
xor a
ld (dotpoint),a
ld b,255
ml1: push bc
ld de,(scpoint)
ld a,(dotpoint)
ld c,a
ld b,8
ml0: push bc
push de
call putsc
pop de
pop bc
inc c
djnz ml0
ld de,(scpoint)
inc de
ld (scpoint),de
pop bc
djnz ml1
ret
putsc: ;画面表示
;de=スクロールアドレス
;c=ドットポイント
ld a,24
ld (putsc1+1),a
ld hl,1800h
putsc2: ld b,32
putsc0: ld a,(de)
or a
jr z,putsc3
add a,c
putsc3: callbios wrtvrm
inc hl
inc de
djnz putsc0
ex de,hl ;hl=スクロールアドレス
push de
ld de,1000h
or a
sbc hl,de
ld a,00011111b
and h
ld h,a
add hl,de
pop de
ex de,hl
putsc1: ld a,0
dec a
ld (putsc1+1),a
jr nz,putsc2
ret
sltrd: ;スロット読み込み
ld a,(exptbl)
push de
call rdslt
pop de
inc hl
ret
scpoint: dw 0
dotpoint: db 0
map: equ 1000h
で、動作させてみたのが以下の動画です。
ぐぬぬ、BASICを思わせる遅さ…。このスピードでは思い描くゲームにはなりません。
しかもこの時点で容量が322バイト。512バイトに収めるのは厳しい…。
次回は改良点を考えて行きます。