ORG 0100H SAMPLE: CALL BGCOPY ; BGVRAMからVRAMへ転送 ※背景使うなら、こちらをコール ; CALL VRAMCLS ; VRAMクリア ※背景使わないなら、こちらをコール LD A,(COUNT) INC A LD (COUNT),A LD IX,CHRDT LD B,0 LD C,16 LD D,20 SAM_L1: PUSH DE PUSH BC LD A,(IX+0) LD (CHRNO),A LD L,(IX+1) ; L=X下位 (小数部) LD H,(IX+2) ; H=X上位   (整数部) LD E,(IX+5) ; E=X増加下位 (小数部) LD D,(IX+6) ; D=X増加上位 (整数部) LD A,87 ; MAX値 (判定値) ※横描画範囲により値は変動する LD B,A ; MAX値 CALL SA_SB1 ; HL=HL+DE:IF H<8 OR H>MAX THEN DE=-DE LD (IX+1),L LD (IX+2),H LD (IX+5),E LD (IX+6),D LD A,H LD (XG),A LD L,(IX+3) ; L=Y下位 (小数部) LD H,(IX+4) ; H=Y上位 (整数部) LD E,(IX+7) ; E=Y増加下位 (小数部) LD D,(IX+8) ; D=Y増加上位 (整数部) LD A,50 ; MAX値 (判定値) LD B,A ; MAX値 CALL SA_SB1 ; HL=HL+DE:IF H<8 OR H>MAX THEN DE=-DE LD (IX+3),L LD (IX+4),H LD (IX+7),E LD (IX+8),D LD A,H LD (YG),A CALL SPRITE ;スプライトルーチン (IN:CHRNO,XG,YG) POP BC POP DE ADD IX,BC DEC D JP NZ,SAM_L1 CALL VRAMWRT ;仮想VRAMから実VRAMへ転送 CALL BE53h ;BIOS リアルタイムキー入力 RET C ;キーが押されたら終了 JP SAMPLE RET ; ------------- ; IN B(判定値) ; HL=HL+DE:IF H<8 OR H>MAX THEN DE=-DE SA_SB1: ADD HL,DE LD A,H ;A=上位8ビット CP 08 JP NC,SA_J ;IF A>=8 THEN SA_J LD HL,0800H CALL SA_SB2 ;DE=-DE RET SA_J: CP B RET C ;IF AB THEN 転送しない(行によってスクロールする頻度が異なる) CALL BGC_SB ;転送する JP BGC_J2 ;転送しない(スクロールしない) BGC_J1: LD BC,96 ADD HL,BC LD D,H LD E,L DEC DE BGC_J2: POP BC SRL B JP NZ,BGC_J0 ;背景スクロール(5行目〜6行目) CALL BGC_SB ;5行目のスクロール CALL BGC_SB ;6行目のスクロール RET ;転送する(スクロールする) BGC_SB: LD BC,95 ; 96-1 ※横描画範囲により値は変動する LD A,(DE) ;左端の値をバックアップ LDIR LD (DE),A ;左端を右端にセット INC DE INC HL RET ;--------------------------------------------- ;疑似スプライト ;入力 アドレス(XG,YG,CHRNO)に値を代入しておく ;結果は仮想VRAMへ出力 SPRITE: PUSH IX PUSH BC PUSH DE PUSH HL LD A,(YG) SRL A ;→シフト(Bit7は0) SRL A SRL A LD (YAD),A ;YAD=Int(YG/8) SLA A ;←シフト(Bit0は0) SLA A SLA A LD E,A LD A,(YG) SUB E LD (YOFF),A ;YOFF=YG-Int(YG/8)*8 (余りを求める) LD A,(YAD) LD H,A LD L,96 ;VRAMの横ドット数 ※横描画範囲により値は変動する CALL CAL_X ;戻りIX=H*L PUSH IX POP DE ; DE=IX LD HL,VRAM ADD HL,DE ; HL=アドレスVRAM+YG*96 LD D,0 LD A,(XG) LD E,A ADD HL,DE ; HL=HL+XG LD (V_AD),HL ;V_AD=HL LD A,(CHRNO) SLA A ;←シフト(Bit0は0) SLA A ;←シフト(Bit0は0) SLA A ;←シフト(Bit0は0) LD D,0 LD E,A LD HL,CHR ADD HL,DE LD (CHRAD),HL ;CHRAD==アドレスCHR+CHRNO*8 LD HL,MSK ADD HL,DE LD (MSKAD),HL ;MASAD=アドレスMSK+CHRNO*8 LD HL,(V_AD) LD IX,(CHRAD) LD IY,(MSKAD) LD A,0 LD (CHRCT),A SP_J1: LD A,(IY+0) ;マスク LD C,A LD B,FFH CALL SP_SB1 LD A,(IX+0) LD E,A LD D,00H CALL SP_SB2 LD A,(HL) ;VRAM内容 AND C ;VRAM AND マスク OR E LD (HL),A PUSH HL PUSH BC LD B,0 LD C,96 ;VRAMの横ドット数 ※横描画範囲により値は変動する ADD HL,BC POP BC LD A,(HL) AND B OR D LD (HL),A POP HL INC HL INC IX INC IY LD A,(CHRCT) INC A LD (CHRCT),A LD B,A LD A,(CHRWD) CP B JP NZ,SP_J1 POP HL POP DE POP BC POP IX RET ;------------------------ ;YOFF分シフトさせる ;マスク用 ;入力 Cレジスタ (シフトする)下位8ビット/Bレジスタ 上位8ビット側 SP_SB1: LD A,(YOFF) SB1_J CP 00 RET Z SLA C RL B SET 0,C DEC A JP SB1_J ;キャラ用 ;入力 Cレジスタ (シフトする)下位8ビット/Bレジスタ 上位8ビット側 SP_SB2: LD A,(YOFF) SB2_J CP 00 RET Z SLA E RL D DEC A JP SB2_J ;--------------------------------------------- ;乗算 ; 入力 HL ; 戻りは IX = H×L の計算結果 CAL_X: PUSH HL PUSH DE LD IX,0 ;IX 計算結果を代入 LD E,L LD D,0 ;DE=L C_J1: BIT 0,H ;ビット0を確認 JP Z,C_J2 ;ビットが立っていなければスキップ ADD IX,DE ;IX=IX+DE C_J2: SLA E ;下位を左シフト。ビット7はCyへセットされる。 RL D ;上位を左シフト。ビット0はCyからセット SRL H ;Hを右シフト ビット7には0が入る JP NZ,C_J1 ;IF H<>0 THEN C_J1 POP DE POP HL RET ;************************************************************* ;秋日和さんの「G850の仮想VRAMから実VRAM転送ルーチン」です。 ; ※一部 変更しています。(コメントR2部分) ;************************************************************* VRAMCLS:LD A,00H LD HL,VRAM LD DE,VRAM+1 LD BC,767 ; 767=96*8-1 ※横描画範囲により値は変動する LD (HL),A LDIR RET VRAMWRT:LD A,(790DH) ;実行時縦アドレスを取得 LD D,A ;D=実行時縦アドレス LD E,6 ;ループ数 LD C,41H ;出力ポート 41H ; LD HL,VRAM LD HL,VRAMS-8 ; R2(追加・↑から変更) VR_1: PUSH BC ; R2(追加) LD BC,0010H ; R2(追加) 16=見えないエリア分をVRAMに足す ADD HL,BC ; R2(追加) POP BC ; R2(追加) TATEAD: LD A,0B0H ;縦アドレス(基本値)※ココが書き換わる ADD A,D ;実行時縦アドレスと足す AND 0B7H ;下位3ビットが縦アドレス B7H=10110111 OUT (40H),A ;縦アドレス指定・出力 LD A,010H ;横アドレス上位4ビットを0 10H=00010000 OUT (40H),A ;横アドレス上位指定・出力 XOR A ;横アドレス下位 OUT (40H),A ;横アドレス下位指定・出力 LD B,80 ;横方向へ何個転送するかの指定 (全部なら144) ※横描画範囲により値は変動する OTIR ;Cレジスタ41HにBレジスタ回転送 LD A,(TATEAD+1) INC A LD (TATEAD+1),A ;縦アドレス+1 DEC E ; JR NZ,TATEAD ;IF E<>0 THEN TATEAD JR NZ,VR_1 ; R2(追加・↑から変更) LD A,0B0H LD (TATEAD+1),A RET STPKEN: IN A,(1FH) RLC A RET C JP VRAMWRT ;************************************************************* VAL1: DB 00H,00H ;汎用 COUNT: DB 00H ;カウンタ(1ループ毎に1加算) CHRNO: DB 02H ;キャラクタNo. XG: DB 08H ;X座標 YG: DB 08H ;Y座標 YAD: DB 00H ;Int (Y座標/8) YOFF: DB 00H ;Y-YAD*8 (※上の計算の余り) V_AD: DB 00H,00H ;VRAM書込み開始アドレス CHRAD: DB 00H,00H MSKAD: DB 00H,00H CHRCT: DB 00 ;キャラ描画のカウンタ用 CHRWD: DB 05 ;キャラデータ(CHR)の幅 ;描画するグラフィックデータ CHR: DB 00H,00H,00H,00H,00H,00H,00H,00H DB 0EH,11H,11H,11H,0EH,00H,00H,00H DB 0EH,1FH,1FH,1FH,0EH,00H,00H,00H ;上記のマスクデータ MSK: DB E0H,E0H,E0H,E0H,E0H,FFH,FFH,FFH DB F1H,E0H,E0H,E0H,F1H,FFH,FFH,FFH DB F1H,E0H,E0H,E0H,F1H,FFH,FFH,FFH ;描画キャラクタの情報 ;以下 上位を整数部、下位を小数部として取り扱う。 ; CHRNO|----X----|----Y----|--X増加--|--Y増加--|→以降予備 ; |下位,上位|下位,上位|下位,上位|下位,上位| ; 0 1 2 3 4 5 6 7 8 CHRDT: DB 00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ;1 ;以降 2〜20 DS 16*19 ;仮想VRAM X座標:0〜95 Y座標:0〜63 ;うち描画範囲 X座標:8〜87 Y座標:8〜55 VRAM: DS 96 ; 見えない範囲 VRAMS: DS 96*6 ; 見えない範囲8 +描画範囲80 +見えない範囲8 DS 96 ; 見えない範囲 ;背景用RAM ; ; 見えない範囲8 +描画範囲80 +見えない範囲8 BGVRAM: DB 00H,00H,00H,00H,00H,04H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,80H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,02H,00H,00H,00H,00H,00H,00H,40H,00H,00H,00H,00H,80H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,04H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,20H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,40H,00H,00H,00H,00H,00H,00H,00H,00H,00H BGVRAM1:DB 00H,80H,00H,80H,80H,80H,80H,80H,80H,80H,80H,80H,80H,C0H,C0H,E0H DB E0H,C0H,40H,C0H,C0H,C0H,40H,C0H,00H,80H,00H,80H,80H,C0H,E0H,E0H DB C0H,C0H,60H,E0H,60H,C0H,00H,C0H,00H,80H,00H,80H,00H,80H,00H,80H DB 00H,80H,00H,80H,00H,80H,80H,80H,C0H,C0H,C0H,C0H,E0H,E0H,F0H,F0H DB 70H,E0H,60H,E0H,40H,80H,40H,80H,40H,80H,00H,80H,00H,80H,80H,80H DB 80H,80H,C0H,C0H,C0H,C0H,40H,C0H,C0H,40H,C0H,00H,C0H,00H,C0H,80H DB 06H,89H,20H,57H,00H,8BH,00H,57H,08H,A3H,15H,49H,02H,B5H,0AH,61H DB 36H,89H,20H,77H,30H,ABH,10H,77H,38H,BBH,3CH,D5H,3EH,1FH,3CH,57H DB 1CH,2FH,1EH,0DH,12H,2DH,16H,0FH,36H,4FH,02H,15H,20H,4DH,90H,01H DB ABH,11H,81H,47H,11H,03H,21H,47H,09H,83H,35H,49H,03H,94H,0BH,40H DB 17H,A8H,01H,56H,01H,ABH,00H,57H,09H,A3H,15H,49H,03H,B5H,0BH,61H DB 37H,89H,21H,76H,31H,AAH,11H,77H,39H,BAH,3DH,55H,3FH,9FH,3CH,57H DB 38H,46H,62H,C1H,A3H,D5H,EBH,F5H,7EH,FEH,38H,0DH,40H,1AH,0CH,A5H DB 0CH,0EH,4CH,1DH,06H,AEH,0CH,4FH,1FH,87H,2FH,0CH,4FH,1FH,06H,ACH DB 0EH,02H,4EH,16H,00H,AAH,04H,42H,1CH,82H,20H,0EH,43H,14H,01H,ADH DB 3AH,44H,63H,C1H,A3H,D5H,EBH,F5H,7EH,FCH,38H,01H,44H,1AH,00H,A1H DB 00H,0AH,40H,15H,00H,AAH,00H,45H,10H,82H,20H,05H,40H,1AH,00H,A5H DB 00H,0AH,40H,15H,00H,A2H,00H,4DH,10H,82H,20H,05H,40H,1AH,00H,A5H DB 20H,0AH,01H,40H,10H,84H,28H,00H,C1H,52H,A0H,58H,A9H,54H,AAH,55H DB FFH,FEH,FDH,F8H,F0H,E4H,E8H,80H,41H,12H,80H,08H,41H,04H,90H,00H DB 20H,0AH,01H,40H,10H,84H,28H,00H,41H,12H,80H,08H,41H,04H,90H,00H DB 20H,0AH,01H,40H,10H,84H,28H,00H,41H,12H,80H,08H,41H,04H,90H,00H DB 20H,0AH,01H,40H,10H,84H,28H,00H,41H,12H,80H,08H,41H,04H,90H,00H DB 20H,0AH,01H,40H,10H,84H,28H,00H,41H,12H,80H,08H,41H,04H,90H,00H DB 90H,00H,01H,00H,20H,08H,06H,05H,4AH,0DH,1AH,15H,2AH,35H,6AH,55H DB FFH,7FH,3FH,3FH,3FH,1FH,0FH,0FH,47H,06H,00H,00H,21H,08H,02H,00H DB 90H,00H,01H,00H,20H,08H,02H,01H,40H,04H,00H,00H,21H,08H,02H,00H DB 90H,00H,01H,00H,20H,08H,02H,01H,40H,04H,00H,00H,21H,08H,02H,00H DB 90H,00H,01H,00H,20H,08H,02H,01H,40H,04H,00H,00H,21H,08H,02H,00H DB 90H,00H,01H,00H,20H,08H,02H,01H,40H,04H,00H,00H,21H,08H,02H,00H EOF: DB 00H