;■mkII用(N60m BASIC PAGES:1) ;メモリマップ ;E000-EFFF:仮想画面 (64 x 64) ;F000-F07F:方向データ1Byte x (縦V, 縦W, 横V, 横W) x 32方向 ;F080- :表示ルーチン ;F200- :ワーク AdrVecDataH EQU F0H ;方向データ上位バイト AdrX EQU F200H ;F200-F201:X座標(下位8ビットは小数点未満) AdrY EQU F202H ;F202-F203:Y座標(下位8ビットは小数点未満) AdrVector EQU F204H ;F204 :方向(0-31) AdrXaddW EQU F210H ;F210-F211:X座標縦加算値ワーク AdrYaddW EQU F212H ;F212-F213:Y座標縦加算値ワーク ORG F080H ;▼ 方向番号(A:0-127)から移動量(HL:Lは小数部分)を算出 Sub2: LD D, AdrVecDataH LD E, A LD A, (DE) ;A:逆縦方向(V/W) 移動値(符号付小数) LD H, 00H ADD A, A JR NC, Point1 DEC H ;H:マイナス(FFH) Point1: LD L, A ;HL:逆縦方向(V/W) 移動値 RET ;▼ 基準位置から左上への V,W 移動量計算 Sub1: LD B, A ;逆縦方向(V/W) 番号 退避 ;逆縦方向(V/W) x 12の計算 CALL Sub2 ;A:方向番号→HL:逆縦方向(V/W) 移動値 ;逆縦方向(V/W) 移動値をx12する ADD HL, HL ADD HL, HL LD D, H LD E, L ADD HL, HL ADD HL, DE ;HL:逆縦方向(V/W) x12移動値 PUSH HL ;逆縦方向(V/W) x12移動値 を退避 ;逆横方向(V/W) x 20の計算 LD A, B ;A:逆縦方向(V/W)番号 ADD 02H ;A:逆横方向(V/W)番号 CALL Sub2 ;A:方向番号→HL:逆横方向(V/W) 移動値 ;逆横方向(V/W) 移動値をx20する ADD HL, HL ADD HL, HL LD D, H LD E, L ADD HL, HL ADD HL, HL ADD HL, DE ;HL:逆横方向(V/W)(x20)移動値 POP DE ;DE:逆縦方向(V/W)(x12)移動値 ADD HL, DE ;HL:逆横方向(V/W)(x20)+逆縦方向(V/W)(x12)移動値 EX DE, HL RET ;DE:逆横方向(V/W)(x20)+逆縦方向(V/W)(x12)移動値 ;■ 方向を考慮した左上座標(仮想画面)の算出 LD A, (AdrVector) XOR 10H ;逆方向にする ADD A, A ADD A, A ;A:逆縦方向V 番号 PUSH AF ;方向番号退避 EXX CALL Sub1 ;基準位置から左上へのV移動量計算 LD HL, (AdrX) ;HL:基準X座標 ADD HL, DE ;HL:左上端X座標 EXX ;HL':左上端X座標 POP AF ;A:逆縦方向V 番号 INC A ;A:逆縦方向W 番号 CALL Sub1 ;基準位置から左上へのW移動量計算 LD HL, (AdrY) ADD HL, DE ;HL:左上端Y座標 ;★ HL:左上端Y座標, HL':左上端X座標 が確定 EXX PUSH HL ;HL'(左上端X座標)退避 EXX PUSH HL ;HL (左上端Y座標)退避 ;■ X座標縦加算値の算出 LD A, (AdrVector) ADD A, A ADD A, A ;A:縦方向V 番号 CALL Sub2 ;A:方向番号→HL:縦方向V 移動値 LD (AdrXaddW), HL ;■ Y座標縦加算値の算出 LD A, (AdrVector) ADD A, A ADD A, A INC A ;A:縦方向W 番号 CALL Sub2 ;A:方向番号→HL:縦方向W 移動値 LD (AdrYaddW), HL ;■ X座標横加算値の算出 LD A, (AdrVector) ADD A, A ADD A, A ADD 02H ;A:横方向V 番号 CALL Sub2 ;A:方向番号→HL:横方向V 移動値 EX DE, HL EXX ;■ Y座標横加算値の算出 LD A, (AdrVector) ADD A, A ADD A, A ADD 03H ;A:横方向W 番号 CALL Sub2 ;A:方向番号→HL:横方向W 移動値 EX DE, HL EXX ;DE':横方向W 移動値 ;DE:横方向V 移動値, DE':横方向W 移動値 ;■ 左上端座標をHLに戻す EXX POP HL ;HL':左上端Y座標 LD BC, 0000H ;BC':表示画面開始番地 EXX POP HL ;HL :左上端X座標 ;■描画開始 LD B, 14H ;表示画面縦幅(20) LoopTate: PUSH BC ;縦ループ 退避 PUSH HL ;HL 退避(左端X座標) EXX PUSH HL ;HL'退避(左端Y座標) EXX LD A, 28H ;表示画面横幅(40) LoopYoko: EX AF, AF' ;Aを裏に退避 ; 4 ;横へ1キャラ分移動と仮想画面の座標割出し(E000H + Yx64 + X) ; HL :X座標, DE :X座標横加算値 ; HL':Y座標, DE':Y座標横加算値 EXX ;Y座標へ (DE',HL') ; 4 ADD HL, DE ;Y座標の加算 ;11 LD A, H ;A:Y座標整数部分 ; 4 EXX ;X座標へ (DE, HL) ; 4 ;Y座標整数部分x64 (A:Y座標,有効部分下位6ビット) RRCA ; 4 RRCA ; 4 LD B, A ;B:Y座標整数部分x64(下位バイト分は上位2ビット) ; 4 AND A, C0H ; 7 LD C, A ;C:Y座標x64下位バイト ; 4 LD A, B ;Y座標整数部x64 のゴミ付き ; 4 AND 0FH ;上位バイト分だけ取り出し ; 7 ADD A, E0H ;仮想画面開始番を加算 ; 7 LD B, A ;BC:仮想画面番地 ; 4 ;X座標整数部分をBCに加算 ADD HL, DE ;X座標の加算 ;11 LD A, H ;A:X座標整数部分 ; 4 AND 3FH ;X座標を0-63に丸める ; 7 ADD A, C ;Y座標の値を足す ; 4 LD C, A ; 4 ;仮想画面から表示画面へと描画 ; BC:仮想画面アドレス ; BC':表示画面アドレス LD A, (BC) ; 7 EXX ;BC':表示画面アドレス ; 4 LD (BC), A ; 7 INC BC ; 6 EXX ; 4 EX AF, AF' ;Aを裏から戻す ; 4 DEC A ; 4 JP NZ, LoopYoko ;10 EXX POP HL ;HL':Y座標 PUSH BC ;BC'の表示画面アドレスを壊さないよう退避 LD BC, (AdrYaddW) ;Y座標縦加算値 ADD HL, BC POP BC EXX POP HL ;HL:X座標 LD BC, (AdrXaddW) ;X座標縦加算値 ADD HL, BC POP BC ;BC:縦ループカウンタ DJNZ LoopTate RET