Categories: R10旧型PC

MB-6892 レベル3 マーク5のROMの裏RAMバンク切り換えメモ

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

kabekin