3MHz
3MHz
3MHz
MSX BASIC version 4.0
Copyright 1990 by Microsoft
25277 Bytes free
Disk BASIC version 2.01
主にMSX関係のコンテンツが置いてあります。

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

で、動作させてみたのが以下の動画です。

ぐぬぬ、BASICを思わせる遅さ…。このスピードでは思い描くゲームにはなりません。

しかもこの時点で容量が322バイト。512バイトに収めるのは厳しい…。

次回は改良点を考えて行きます。