レベル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