Last Updated on 2021年12月29日 by kabekin
レベル3マーク5やS1のBモードで使えるROMの裏RAMをバンク切り換えで使うためのメモ。
MB-6890やMB-6891で使用する拡張バンクメモリMP-9818の使い方とは違うようなので整理しておきます。
▼PIA-BANK機能($FFD0, $FFC1)
| PIA-A BANK | PA7 | PA6 | PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
| 0 | $C000~ $EFFFは 書込専用 | $A000~ $BFFFは 書込専用 | N/A | N/A | $E000~ $EFFFの RAM選択 | $C000~ $DFFFの RAM選択 | $A000~ $BFFFの RAM選択 | $8000~ $9FFFの RAM選択 |
| 1 | $C000~ $EFFFは 読書モード*1 | $A000~ $BFFFは 読書モード | N/A | N/A | $E000~ $EFFFの ROM選択 | $C000~ $DFFFの ROM選択 | $A000~ $BFFFの ROM選択 | $8000~ $9FFFの ROM選択 |
| *1 PA1=1のときは$C000~$DFFFは無効、PA2=1のときは$E000~$EFFFは無効→ROM選択時は無効ということ 電源投入時はPA0,PA1,PA2,PA3は0(ROM選択中)、且つ$8000~$EFFFは書込専用モード(RAM未選択の書込専用モード) バンクレジスタはPIA-Aの初期化後$FFC1のD2=1(ORA選択)した後に使用可能 書込専用モードはROMが見える状態で扱えるのでメモリにプログラムやデータを一括ロードするときに便利かも バンクに切替中に割込みが発生した場合、ROMの割込みルーチンが使えないので切替中は割込み禁止等の工夫が必要 裏RAM領域のデータは直接外部記憶装置にLOADM,SAVEMできないので、標準RAMに転送して操作する必要がある ROMの機能を使う場合、裏RAM領域とROM領域からも両方から見える$7FFF以下に切替プログラムを置く必要がある ROMの裏RAMの$F000~$FEFF、及び$FFF0~$FFFFは$FFE8はBANK-REGレジスタ($FFE8)のD0,D1と組み合せで指定 $F000~FEFFが別エリアに分かれているのでモニタとBASICが分離しているのかと思うとそうでもなさそうな感じ | ||||||||
▼PIA-BANKレジスタの初期化
電源オンの状態そのままではバンクスイッチによるカードの機能とエリアの設定変更はできないので、バンクレジスタの初期化をしてから機能とエリアを設定する。
(リセットスイッチを押した後もバンクレジスタの初期化が必要)
; 日立 MP-9718取扱説明書 P.13より引用
ORA EQU $FFC0
DDRA EQU ORA
CRA EQU ORA+1
INIT CLR CRA ;DDRAを選択
LDA #$FF
STA DDRA ;ORAを出力に設定
LDA #$04
STA CRA ;ORAを選択
TST ORA ;フラグクリア用のダミーリード
LDA #$30
STA ORA ;バンクメモリの機能とエリアのを1バイトのデータで指定
RTS
▼PIA-BANKレジスタによる裏RAMの使用方法メモ
ROMのサブルーチンを使うプログラムの場合は普段は標準RAM/ROMエリアで処理&待機して、必要な時に裏RAMでプログラムを動作させ、ROMのサブルーチンを呼ぶ際は割込み禁止状態でROMにを使用し使い終わったら割込みを戻してROM側で待機させる必要がありそう。
→ROMのサブルーチンを使わない場合は裏RAMだけで完結できそう。
MP-9718のサンプルプログラムに入出力用ROMサブルーチンを追加する実験。
取説のサンプルプログラムに文字列出力とキーボードからの1行入力を追加。
引数の必要ないサブルーチン、引数の必要なサブルーチン、戻り値のあるサブルーチンの実験。
バンクで切り替わらないエリア $7000~ こちらをロードして裏RAMエリアにもプログラムをロード後にTOBANKから実行。
# ;バンクRAM領域のプログラムからROMのサブルーチンを使用する実験
ORA EQU $FFC0 ;BANK用PIA-A ORA REG
DDRA EQU ORA ;BANK用PIA-A DDRA REG
CRA EQU ORA+1 ;BANK用PIA-A CRA REG
ORG $7000 ;バンク切替サブルーチン集 格納アドレス
#; バンク切替で共有する変数
ENTADR FDB $B000 ;裏RAM内のジャンプ先アドレス
SBRADR RMB 2 ;ROMのジャンプ先アドレス
#; バンク用PIAイニシャライズ
#; 一度バンクレジスタをイニシャライズすればあとは$FFC0のORAの指定のみの操作でいつでもバンク切替可能
BANKINI: PSHS A ;PIA-A バンクレジスタ初期化
CLR CRA ;DDRA選択
LDA #$FF
STA DDRA ;Aポートは8点出力に設定
LDA #$04
STA CRA ;ORAを選択
TST ORA ;フラグクリア用の空読み
LDA #$30 ;W/Oモード
STA ORA ;モード設定
PULS A,PC
#; 裏RAMに切替
TOBANK: ORCC #$50 ;割込禁止
PSHS A
LDA #$F0 ;$F0=裏RAM ALLエリア R/Wモード
STA ORA ;バンク切替実行
PULS A
JSR [ENTADR,PCR] ;裏RAM内の指定アドレスに分岐→※ジャンプ先はサブルーチン?
#; 裏RAMからの戻り
FROMBANK: PSHS A
LDA #$0F ;$0F=裏RAM ALLエリア 非選択モード
STA ORA
PULS A
ANDCC #$AF ;割込許可
JMP $DCF4 ;出口は L3 MON へ
#; バンク切替
BANKSW: PSHS A
LDA #$0F ;$0F=裏RAM ALLエリア 非選択モード → ROM選択
STA ORA
PULS A
JSR [SBRADR,PCR] ;ROMサブルーチンのアドレスに分岐
#; ROMからの戻り
FROMPROM: PSHS A,CC
LDA #$C0 ;$C0=裏RAM ALLエリア R/Wモード
STA ORA
PULS A,CC,PC
裏RAMエリアの$B000~ こちらをロード。
エミュのデバッガ操作メモ。
E FFC1 00
E FFC0 FF
E FFC1 04
E FFC0 F0
D B000
DN DEBUG.MOT
DL 0
D B000
R PC B000
T
G
SCROUT EQU $F0D8 ;1文字出力ROM-Sub.
CLRSCR EQU $F160 ;画面消去 ROM-Sub.
BELL EQU $F7A7 ;BELL ROM-Sub.
CROUT EQU $F180 ;CROUT ROM-Sub.
LFOUT EQU $F124 ;LFOUT ROM-Sub.
CHROUT EQU $F0F0 ;CHROUT ROM-Sub.
CHRIN EQU $DD50 ;CHRIN ROM-Sub.
KEYBUF EQU $00BC ;キーボードバッファポインタ(BFP)
CURSXY EQU $0238 ;カーソル位置指定 ワークエリア.
#; 共通エリアの変数やポインタ等
ENTADR EQU $7000
SBRADR EQU $7002
BANKSW EQU $7039
ORG $B000 ;裏RAM用のプログラム配置先頭アドレス
#; 全文字表示テスト
ALLCHR: PSHS D,X
LDX #CLRSCR
STX SBRADR ;使いたいROMのサブルーチンアドレスをSBRADRにセット
JSR BANKSW ;バンク切り換え実行→JSR CLRSCR と同意
LDX #BELL
STX SBRADR
JSR BANKSW ;引数の無いサブルーチンの呼び出し実験 → BELL
LDD #$000A
STD CURSXY
LDA #$20
NEXT: PSHS A
LDX #SCROUT
STX SBRADR ;使いたいROMのサブルーチンアドレスをSBRADRにセット
JSR BANKSW ;バンク切り換え実行→JSR CLRSCR と同意
PULS A
INCA
JSR TIMER,PCR
CMPA #$FF
BNE NEXT
LDX #CROUT
STX SBRADR
JSR BANKSW ;引数の無いサブルーチンの呼び出し実験 → CROUT
LEAY MSG1,PCR
BSR STROUT ;文字列出力
LDX #LFOUT
STX SBRADR
JSR BANKSW
BSR KEYIN
TFR X,Y
BSR STROUT ;文字列出力
PULS D,X
RTS ;FROMBANK経由でBASICへ
TIMER: PSHS X
LDX #$0300
LOOP: LEAX -1,X
BNE LOOP
PULS X,PC
#; 文字列出力Sub.
#; 引数 IY=文字列ポインタ
STROUT: LDX #CHROUT
STX SBRADR
STROUTLP: LDA ,Y+
CMPA #0
BEQ STROUTFIN
JSR BANKSW
BRA STROUTLP
STROUTFIN: RTS
#; 文字入力Sub.(キー入力されるまで待つ)
#; 戻り値 IX=キーボードバッファのポインタ
KEYIN: EQU *
LDX #CHRIN
STX SBRADR
JSR BANKSW
LDX KEYBUF
LEAX 1,X ;INC
RTS
#; 定数
MSG1: FCC /KABEKIN MB-6892A/
FCB 0
動作確認
文字を表示した後、文字列を出力し、キーボードから入力した文字列を表示してL3のモニタに戻る。
▼$F000~$FEFFのROMはモニターROMというわけではなさそう
バンク切り換えの必要ない$F000~$FEFFに1文字入力($F82C)、と1文字出力($F0D8)があったのでROMエリアのバンク切り換えをしないプログラムで確認したところ1文字出力の$F0D8は使えるものの(最下部行のスクロールなし)
1文字入力はBASIC-ROMを使っているようで使用不可でした。
1文字出力($F0D8)も最下部行のスクロールなしで画面からはみ出て文字を出力すると暴走する!?
せっかくなら$F000~$FEFFが分かれているのならこのエリアは汎用で使えるモニタROMにしてほしかった^^;;;
実験プログラム
裏RAMの$B000~ ロード
SCROUT EQU $F0D8 ;1文字出力ROM-Sub.
CLRSCR EQU $F160 ;画面消去 ROM-Sub.
BELL EQU $F7A7 ;BELL ROM-Sub.
ORG $B000 ;裏RAM用のプログラム配置先頭アドレス
#; $F000以降のROMエリアにあるサブルーチンを裏RAMからアクセスする実験
PROG2 JSR CLRSCR ;$F000以降のROMエリアなのでバンクを切替えなくても使える
JSR BELL ;$F000以降のROMエリアなのでバンクを切替えなくても使える
PROG22 LDA #$41
JSR SCROUT ;$F000以降のROMエリアなのでバンクを切替えなくても使える
BSR TIMER
BRA PROG22
TIMER PSHS X
LDX #$0300
LOOP LEAX -1,X
BNE LOOP
PULS X,PC
1文字入力($F82C)を使うと割込が発生し結局は$E131にジャンプするためROMにバンク切換しないと使えない^^;;
動作確認
ROMに切り替えていないがAが出力される。
▼標準RAMを経由した外部記憶へのLOAD/SAVE方法
裏RAMにはFDDやCMTは直接アクセスできないので標準RAM領域に転送してからLOAD/SAVEする
ベーシックマスタの情報をお探しの方は是非こちらからどうぞ → Amazon