主にMSX関係のコンテンツが置いてあります。

1セクタゲーム作成に挑戦-2

プログラム開始

まず、キャラクタを上記のように設定するプログラムを組んでみました。

薄い青色の数字はキャラクタコードです。

最上段が空白、次が緩衝用キャラクタ、次がループ障害物、一番下が障害物の各パターンとなっています。

ソース(クリックで展開)
org 0100h
;ワークエリア-------------------------------------------------------------------
exptbl: equ 0fcc1h ;main romのスロット
forclr: equ 0f3d9h ;前景色
bakclr: equ 0f3eah ;背景色
bdrclr: equ 0f3ebh ;周辺色

;bios---------------------------------------------------------------------------
calslt: equ 001ch ;スロットの指定アドレスをコール iy,ix
chgmod: equ 005fh ;スクリーンモード変更
;a=モード
;forclr=前景色
;bakclr=背景色
;bdrclr=周辺色
filvrm: equ 0056h ;vramを埋める hl=アドレスbc=長さa=データ
setwrt: equ 0053h ;vramアドレスセット hl=アドレス
wrtvrm: equ 004dh ;vram書き込み hl=アドレス a=データ
rdslt: equ 000ch ;スロットの指定アドレスを読む
;hl=アドレス a=読み込み値
callbios: macro
ld ix,&1
call calslt
endm

start: ;main rom スロットの設定
ld a,(exptbl)
ld h,a
push hl
pop iy ;iy=main romのスロット

ld a,15
ld (forclr),a
ld a,12
ld (bdrclr),a
ld a,1
ld (bakclr),a
callbios chgmod ;screen1:color15,1,12

;vramクリア
ld hl,0
ld bc,25 * 8
xor a
callbios filvrm ;vram0クリア

;vramパターンセット
;緩衝キャラクタ定義
ld hl,0010h
ld b,1
call setchrm

;障害物定義
ld hl,0088h
ld b,8
call setchrm

;ループ障害物定義
ld hl,0048h
ld a,8
l2: push af

ld de,bgpatn
ld c,8

lcnt: ld b,1
ld a,(de)
l0: djnz l1
jr l3
l1: rlca
jr l0
l3: callbios wrtvrm
inc hl
inc de
dec c
jr nz,lcnt
ld a,(lcnt+1)
inc a
ld (lcnt+1),a

pop af
dec a
jr nz,l2
ret

setchrm: ;キャrクタデータセットサブルーチン1
;hl=vram開始アドレス
;b=シフト数,c=転送バイト数
ld c,8
setchrm0: push bc
call setchr
pop bc
inc b
dec c
jr nz,setchrm0
ret

setchr: ;キャラクタデータセットサブルーチン2
;hl=vram開始アドレス
;b=左シフト回数(1以上)
ld de,bgpatn
ld c,8
setchrl1: push bc ;b=シフト数,c=転送バイト数
;データ作成開始
ld c,0
ld a,(de)
setchrl0:
or a
rla
rl c
djnz setchrl0
ld a,c
callbios wrtvrm
inc hl
inc de
pop bc ;シフト数転送バイト数復活
dec c
jr nz,setchrl1:
ret

;障害物グラフィックパターン
bgpatn: db 3ch,42h,8dh,85h,0c1h,0b1h,42h,3ch

な…長い…。

最後のbgpatnを元にちょっとずつずれる画像をキャラクタに定義しているのですが、上手くツボにはまらず長くなってしまいました。

しかもローテーションする09hから10hのキャラクタの処理が異なることで、余計に長くなっています。

ファイルサイズも106バイトでもう1/5も消費しています。まだスプライト定義もしていないのに…。