home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 January (DVD)
/
VPR980100.ISO
/
DRIVER
/
IBM
/
VW200
/
VW200_2.EXE
/
VWSAMPLE
/
VWSAMPLE.S
< prev
Wrap
Text File
|
1995-11-22
|
23KB
|
565 lines
include vw200api.inc
include vwsample.inc
data
WorkArea:
Score: dw [1] ; スコア
Over: db [1] ; ゲームオーバー用フラグ
Wid: db [1] ; コース幅
WChg: db [1] ; コース幅用フラグ
Dir: db [1] ; コースの向き用フラグ
Len: db [1] ; 設定された向きのコースの長さ
BpatX: dw [19] ; 縁石のX座標データ
StoneP: dw [10] ; 石の座標データ
CarX: db [1] ; 車のX座標
CarXo: db [1] ; 車の直前のX座標
LKey: db [1] ; 車の移動キー: 左
RKey: db [1] ; 車の移動キー: 右
code
;
; サンプルプログラム
;
Sample:
API PowerSaveLock ; パワーセーブを行わない
ld a,#0
API WaitState ; ノーウェイトにする
ld a,#SCR_VW200V16
API Screen ; 画面を縦画面, 行間なしにする
ld a,#KBD_NUMLOCK|KBD_SFTCALC
API KeyMode ; キーモードを数字モード,
; 電卓用数字にする
ld ep,#pod WorkArea
ld xp,#pod WorkArea
ld yp,#pod WorkArea
ld br,#high lod WorkArea
; 車の移動キーを設定
ld [br:low LKey],#KSC_LEFT ; 左: 左カーソル
ld [br:low RKey],#KSC_RIGHT ; 右: 右カーソル
GameStart:
car Title ; タイトルの表示
car InitGame ; 初期化
ld ix,#lod GameBGM ; GameBGMのアドレスを得る
1$: ld b,[br:low lod Len] ; コースの長さを得る
2$: cp [br:low lod Over],#0 ; ゲームオーバーならば9$へ
jr nz,9$
ld a,[ix]
cp a,#0ffh ; FFhを読み込むまで
jr nz,21$ ; サウンドを鳴らす
ld ix,#lod GameBGM
ld a,[ix]
21$: inc ix
ld h,b
ld b,#SND_CONTINUE
API Sound ; ゲーム中サウンドを鳴らす
ld b,h
; ld a,#2 ; ウェイトステート=2
; API Wait ; (コメントをはずすと速度が遅く
; なります)
car NewRoad ; コースデータの作成
car NewStone ; 石のデータの作成
car DispRoad ; コースの表示
car MoveCar ; 車の移動
car DispCar ; 車の表示
ld hl,[Score]
inc hl
ld [Score],hl ; スコアのインクリメント
djr nz,2$ ; コースの長さが0になるまで2$へ
car DirChange ; コースの変更
jr 1$ ; 1$へ
9$: ld a,#SND_STOP
ld b,#0
API Sound ; サウンドを止める
car GameOver
jr GameStart
Title:
push all
API ClearScreen ; 画面クリア
ld ix,#lod TitleStr
sub hl,hl ; (X,Y)=(0,0)
API PutStr ; TitleStrの表示
1$: cp [br:low lod LKey],#KSC_LEFT ; 左への移動キーは左カーソルか?
jr nz,2$ ; 違っていたら2$へ
ld ba,#81A9h ; 左矢印のPCコードをセット
ld hl,#0413h ; (X,Y)=(13h,4h)
API PutChar ; 左矢印の表示
ld ba,#81A8h ; 右矢印のPCコードをセット
ld hl,#0513h ; (X,Y)=(13h,5h)
API PutChar ; 右矢印の表示
jr 3$
2$: ld ba,#824Fh ; "0"のPCコードをセット
ld hl,#0413h ; (X,Y)=(13h,4h)
API PutChar ; "0"の表示
ld ba,#8181h ; "="のPCコードをセット
ld hl,#0513h ; (X,Y)=(13h,5h)
API PutChar ; "="の表示
3$: ld ix,#lod Title1 ; Title1を文字列としてセット
4$: ld hl,#1000h ; (X,Y)=(0h,10h)
API PutStr ; 文字列の表示
ld a,#50 ; タイマーを500msに設定
API SetWaitTimer ; 経過時間監視タイマーの設定
5$: API InKey ; キー入力
or a,a
jr nz,7$ ; 何かキーが押されたら7$へ
API GetWaitTimer ; 経過時間の取得
or a,a
jr nz,5$ ; 残り時間が0でなければ5$へ
; (500msごとにTitle1とTitle2
; を切り換える)
cp ix,#lod Title1 ; 表示しているのはTitle1か?
jr nz,6$ ; 違っていたら6$へ
ld ix,#lod Title2 ; Title2を文字列としてセット
jr 4$
6$: ld ix,#lod Title1 ; Title1を文字列としてセット
jr 4$
7$: cp a,#KCD_RM
jr z,9$ ; RMが押されたら9$へ
cp a,#KCD_MPLUS
jr nz,3$ ; M+以外が押されたら3$へ
cp [br:low lod LKey],#KSC_LEFT ; 左への移動キーは左カーソルか?
jr nz,8$ ; 違っていたら8$へ
; 車の移動キーを設定
ld [br:low lod LKey],#KSC_0 ; 左: 0
ld [br:low lod RKey],#KSC_EQUAL ; 右: =
jr 1$ ; 1$へ
8$: ld [br:low lod LKey],#KSC_LEFT ; 左: 左カーソル
ld [br:low lod RKey],#KSC_RIGHT ; 右: 右カーソル
jr 1$ ; 1$へ
9$: pop all ; RMが押されたときのみここに
ret ; くる
GameOver:
push all
ld ix,#lod SouSou
1$: ld a,[ix] ; SouSouのアドレスをセット
cp a,#0ffh ; FFhを読み込むまで
jr z,2$ ; サウンドを鳴らす
inc ix
ld b,[ix]
inc ix
API Sound ; サウンドを鳴らす
jr 1$
2$: API ClearScreen ; 画面クリア
ld b,#3
3$: ld ix,#lod GameOverStr1
ld hl,#0800h ; (X,Y)=(0h,8h)
API PutStr ; GameOverStr1の表示
ld a,#50
API Wait ; 50ms待つ
ld ix,#lod GameOverStr2
ld hl,#0800h ; (X,Y)=(0h,8h)
API PutStr ; GameOverStr2の表示
ld a,#50
API Wait ; 50ms待つ
djr nz,3$ ; Bレジをデクリメントし
; 0になるまで3$へ
pop all
ret
InitGame:
API ClearScreen ; 画面クリア
sub ba,ba
ld [Score],ba ; スコア(Score)=0
ld [br:low lod Over],a ; ゲームオーバー用フラグの
; クリア
ld [br:low lod Wid],#10 ; コース幅=10
ld [br:low lod Dir],#0 ; コースの向き=0(まっすぐ)
ld [br:low lod Len],#1 ; コースの長さ
ld [br:low lod CarX],#10 ; 車のX座標
ld [br:low lod CarXo],#0ffh ; 車の直前のX座標
ld hl,#lod BpatX ; 縁石のX座標データを作成
ld b,#19
1$: ld [hl],#5
inc hl
ld [hl],#15
inc hl
djr nz,1$ ; Bレジをデクリメントし
; 0になるまで1$へ
ld hl,#lod StoneP ; 石の座標データを作成
ld b,#10
2$: ld [hl],#0
inc hl
ld [hl],#0
inc hl
djr nz,2$ ; Bレジをデクリメントし
; 0になるまで2$へ
ret
DispRoad:
push all
ld b,#19 ; 1行目から19行分縁石を表示
ld iy,#lod BpatX ; 縁石のX座標データのアドレス
; をセット
ld ix,#lod RoadChar ; 縁石の文字列のアドレス
ld h,#1 ; をセット
1$: ld l,[iy]
inc iy
API PutStr
ld l,[iy]
inc iy
API PutStr
inc h
djr nz,1$
ld b,#10 ; 10個分石を表示
ld ix,#lod StoneP ; 石の座標データのアドレス
2$: ld hl,[ix] ; をセット
add ix,#2
ex ba,iy ; BAとIYの値を交換する
cp h,#0 ; X座標が0ならば3$へ
jr z,3$
cp h,#20 ; X座標が20ならば21$へ
jr z,21$
ld ba,#'#'
API PutChar ; 石の表示
cp h,#1
jr z,3$
21$: ld ba,#' '
dec h
API PutChar ; ブランクの表示
3$: ex ba,iy
djr nz,2$
sub hl,hl ; (X,Y)=(0,0)
ld ix,[Score]
ld b,#PNM_ZEROFILL ; 表示を0で埋める
ld a,#5
API PutNum ; スコアの表示
pop all
ret
DispCar:
push ba
push hl
ld l,[br:low lod CarX] ; 車のX座標を得る
ld h,#17 ; 車のY座標を17にする
ld ba,#'@' ; 車のキャラクターをセット
API PutChar ; 車の表示
ld l,[br:low lod CarXo]
cp l,#0ffh ; 直前の車のX座標がFFhならば
jr z,9$ ; 9$へ
ld ba,#' '
API PutChar ; ブランクの表示
9$: pop hl
pop ba
ret
NewRoad:
push all
ld b,#36
ld ix,#lod BpatX+37
ld iy,#lod BpatX+35
1$: ld [ix],[iy]
dec ix
dec iy
djr nz,1$
cp [br:low lod Dir],#1 ; コースの向きは左か?
jr nz,2$ ; 左でなければ2$へ
cp [br:low lod BpatX],#0 ; 左の縁石のX座標が0ならば9$へ
jr z,9$
dec [br:low lod BpatX] ; 左の縁石のX座標をデクリメント
dec [br:low lod BpatX+1] ; 右の縁石のX座標をデクリメント
jr 9$
2$: cp [br:low lod Dir],#2 ; コースの向きは右か?
jr nz,3$ ; 右でなければ3$へ
cp [br:low lod BpatX+1],#21 ; 右の縁石のX座標が21ならば9$へ
jr z,9$
inc [br:low lod BpatX] ; 左の縁石のX座標をインクリメント
inc [br:low lod BpatX+1] ; 右の縁石のX座標をインクリメント
jr 9$
3$: ld b,[br:low lod Wid] ; コース幅を得る
cp [br:low lod WChg],#1 ; コース幅を狭くする(1)ので
jr nz,31$ ; なければ31$へ
cp b,#5
jr z,4$ ; コース幅が5ならば4$へ
dec b ; コース幅をデクリメント
jr 32$ ; 32$へ
31$: cp [br:low lod WChg],#2 ; コース幅を広くする(2)ので
jr nz,4$ ; なければ4$へ
cp b,#15
jr z,4$ ; コース幅が15ならば4$へ
cp [br:low lod BpatX+1],#21
jr z,4$ ; 右の縁石のX座標が21ならば4$へ
inc b ; コース幅をインクリメント
32$: ld [br:low lod Wid],b ; コース幅を保存
jr 4$ ; 4$へ
4$: ld a,[br:low lod BpatX] ; 左の縁石のX座標を得る
add a,b ; コース幅を加えて
ld [br:low lod BpatX+1],a ; 右の縁石のX座標に保存
9$: pop all
ret
NewStone:
push all
ld ix,#0
ld hl,#lod StoneP ; 石の座標データのアドレスを得る
ld b,#10
1$: ex ba,iy
ld ba,[hl]
cp ba,#0 ; 石の座標データが0でなければ
jr nz,2$ ; 2$へ
ld ix,hl
jr 5$
2$: cp b,#20
jr nz,3$ ; 石のX座標が20でなければ3$へ
ld ba,#0 ; 石の座標を(0,0)にする
jr 4$ ; 4$へ
3$: inc b
4$: ld [hl],ba
5$: add hl,#2
ex ba,iy
djr nz,1$
cp ix,#0
jr z,9$
API Random ; 乱数を得る
cp a,#200
jr c,9$ ; 乱数が200より小さいならば9$へ
ld l,a
ld h,#0
ld a,[br:low lod Wid] ; コース幅を得る
sub a,#4
div
ld a,h
ld b,[br:low lod BpatX] ; 車のX座標を得る
add a,b
add a,#3
ld [ix],a
inc ix
ld [ix],#1
9$: pop all
ret
MoveCar:
push all
ld b,[br:low lod CarX] ; 車のX座標を得る
ld [br:low lod CarXo],#0ffh ; 車の直前のX座標をFFhにする
push b
API ReadKey ; キーの読み込み
pop b
cp a,#KSC_NONE ; キー入力がなければ9$へ
jr z,9$
cp a,[br:low lod LKey] ; 左方向への移動?
jr nz,1$ ; 違っていたら1$へ
cp b,#1
jr z,8$ ; 車のX座標が1ならば8$へ
ld [br:low lod CarXo],b ; 直前のX座標に今のX座標を入れる
dec [br:low lod CarX] ; 車のX座標をデクリメント
jr 8$
1$: cp a,[br:low lod RKey] ; 右方向への移動?
jr nz,8$ ; 違っていたら8$へ
cp b,#22
jr z,8$ ; 車のX座標が22ならば8$へ
ld [br:low lod CarXo],b ; 直前のX座標に今のX座標を入れる
inc [br:low lod CarX] ; 車のX座標をインクリメント
8$: API InKey
9$: ld l,[br:low lod CarX] ; 車のX座標を得る
ld h,#17 ; 車のY座標を17にする
API GetChar ; 車の座標の文字コードを得る
cp a,#'@' ; 文字コードが車のキャラクター
jr z,99$ ; ならば99$へ
cp a,#' ' ; ブランクならば99$へ
jr z,99$
ld [br:low lod Over],#1 ; それ以外ならばゲームオーバー
99$: pop all
ret
DirChange:
push all
API Random ; 乱数を得る
ld l,a
ld h,#0
ld a,#7
div
inc h
inc h
inc h
ld [br:low lod Len],h ; コース方向の長さに保存
API Random ; 乱数を得る
ld l,a
ld h,#0
ld a,#3
div
ld [br:low lod Dir],h ; コースの向き用フラグに保存
cp h,#0 ; コースの向きがまっすぐで
jr nz,9$ ; なければ9$へ
API Random ; 乱数を得る
and a,#3
ld [br:low lod WChg],a ; コース幅用フラグに保存
9$: pop all
ret
TitleStr:
; VW-200サンプル
; ミニレースゲーム
;
; ┏操作━━━━━━┓
; ┃左移動 [ ]┃
; ┃右移動 [ ]┃
; ┗━━━━━━━━┛
;
; ┏説明━━━━━━━━┓
; ┃縁石(|)や石(#)に衝突┃
; ┃しないように貴方の車┃
; ┃(@)を操作します。 ┃
; ┗━━━━━━━━━━┛
;
; ┏━━━━━━━━━┓
; ┃[↑]キーでスタート┃
; ┗━━━━━━━━━┛┓
; ┃[↓]キーでキー変更┃
; ┗━━━━━━━━━┛
db 56h,57h,2Dh,32h,30h,30h,83h,54h,83h,93h,83h,76h,83h,8Bh,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h
db 83h,7Eh,83h,6Ah,83h,8Ch,81h,5Bh,83h,58h,83h,51h,81h,5Bh,83h,80h,81h,40h,81h,40h,81h,40h,81h,40h
db 81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h
db 81h,40h,81h,40h,84h,0ACh,91h,80h,8Dh,0ECh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0ADh
db 81h,40h,81h,40h,84h,0ABh,8Dh,0B6h,88h,0DAh,93h,0AEh,81h,40h,81h,40h,81h,40h,5Bh,81h,40h,5Dh,84h,0ABh
db 81h,40h,81h,40h,84h,0ABh,89h,45h,88h,0DAh,93h,0AEh,81h,40h,81h,40h,81h,40h,5Bh,81h,40h,5Dh,84h,0ABh
db 81h,40h,81h,40h,84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh
db 81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h
db 84h,0ACh,90h,0E0h,96h,0BEh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0ADh
db 84h,0ABh,89h,8Fh,90h,0CEh,28h,7Ch,29h,82h,0E2h,90h,0CEh,28h,23h,29h,82h,0C9h,8Fh,0D5h,93h,0CBh,84h,0ABh
; ( | ) ( # )
db 84h,0ABh,82h,0B5h,82h,0C8h,82h,0A2h,82h,0E6h,82h,0A4h,82h,0C9h,8Bh,4Dh,95h,0FBh,82h,0CCh,8Eh,0D4h,84h,0ABh
db 84h,0ABh,28h,40h,29h,82h,0F0h,91h,80h,8Dh,0ECh,82h,0B5h,82h,0DCh,82h,0B7h,81h,42h,81h,40h,20h,84h,0ABh
; ( @ )
db 84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh
db 81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h
db 84h,0ACh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0ADh,81h,40h
db 84h,0ABh,5Bh,81h,0AAh,5Dh,83h,4Ch,81h,5Bh,82h,0C5h,83h,58h,83h,5Eh,81h,5Bh,83h,67h,84h,0ABh,81h,40h
db 84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh,84h,0ADh
db 81h,40h,84h,0ABh,5Bh,81h,0ABh,5Dh,83h,4Ch,81h,5Bh,82h,0C5h,83h,4Ch,81h,5Bh,95h,0CFh,8Dh,58h,84h,0ABh
db 81h,40h,84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh
db 0
Title1:
; ┗┏━━━━━━━━━┓
db 84h,0AFh,84h,0ACh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0ADh
db 0
Title2:
; ┗━━━━━━━━━┛┓
db 84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh,84h,0ADh
db 0
GameOverStr1:
; ┏━━━━━━━━┓
; ┃ ゲームオーバー ┃
; ┗━━━━━━━━┛
db 81h,40h,84h,0ACh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0ADh,81h,40h
db 81h,40h,84h,0ABh,20h,83h,51h,81h,5Bh,83h,80h,83h,49h,81h,5Bh,83h,6Fh,81h,5Bh,20h,84h,0ABh,81h,40h
db 81h,40h,84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh,81h,40h
db 0
GameOverStr2:
; ┏━━━━━━━━┓
; ┃ ┃
; ┗━━━━━━━━┛
db 81h,40h,84h,0ACh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0ADh,81h,40h
db 81h,40h,84h,0ABh,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,81h,40h,84h,0ABh,81h,40h
db 81h,40h,84h,0AFh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AAh,84h,0AEh,81h,40h
db 0
RoadChar:
ascii " | "
db 0
GameBGM:
db SND_O2+SND_C,SND_O2+SND_G,SND_O2+SND_F,SND_O2+SND_E,0ffh
SouSou:
db SND_O3+SND_C,30,SND_REST,2,SND_O3+SND_C,30,SND_REST,2,SND_O3+SND_C,14,SND_REST,2,SND_O3+SND_C,46,SND_REST,2
db SND_O3+SND_D_,30,SND_REST,2,SND_O3+SND_D,14,SND_REST,2,SND_O3+SND_D,30,SND_REST,2,SND_O3+SND_C,14,SND_REST,2
db SND_O3+SND_C,30,SND_REST,2,SND_O2+SND_B,14,SND_REST,2,SND_O3+SND_C,62,SND_REST,2
db 0ffh
end