MC6802シングルボードコンピューターのREV1基板はシリアルクロックに致命的な ^^) 問題があったのと、MC6847 VDGボードのデフォルトVRAMである$C000のあたりのメモリーをディセーブルにできませんでした。どちらもREV2基板で改良しました。
REV2基板の修正ポイント
シリアルクロック部分の問題修正
以前も書きましたが、REV1基板ではシリアルクロックの発振回路のところの抵抗器の挿入方法をミスって発振しませんでした。ハードパッチはわりと容易ですがここは直しておきたいところです。以下の74HC4060の水晶振動子の回路です。本来は並列に1MΩを入れるべきところを、何を思ったか直列に入れています。….orz

こちらが修正版の回路です。水晶振動子の両端に1MΩが入ってます。REV1基板でもがんばればハード的に修正は可能ですが、ちょっとかっこ悪いので修正します。

RAMの$C000を外部基板用にディセーブル可能に
シリアルクロックのバグだけだったら「まぁいいかー」と思っていたのですが….こちらのソルダジャンパを思いついてのREV2基板だったりします。REV1基板では$C000-$DFFFはROM領域かボード上のRAMの排他での切り替えを想定していて、外部基板のVRAMへの転用ができない形でした。
REV1基板で74LS00のNANDゲートが2つ余ってるのに気づきましてAND回路作れるジャンってことで、RAMエリアの$C000のディセーブルのソルダ(ハンダ)ジャンパを作りました。ソルダジャンパの名前もちょっと変えちゃいました。
ジャンパ名 | 呼称 | 機能 |
JP1 | 16k_JP | ROMを$C000~$FFFFの16kバイトにするジャンパ |
JP2 | A000_JP | RAMの$A000~$BFFFを無効化 |
JP8 (新設) | C000_JP | RAMの$C000~$DFFFを無効化 |

基板ができてきてすぐにJP8を短絡したのでしたw

メモリマップはこんな感じになります。
TV対応ドライバの変更
前回のUniversal MonitorのドライバでVRAM $A000対応で画面表示できてましたので、$C000対応したいと思います。
実は元にしたエコーバックプログラムで、VRAM $A000決めうちのロジックがのこってまして、そこも変更します。おもいっきし$A2で比較してます。$C2にするのも汎用性が無いのでbitテスト命令に変えてみました。
Universal Monitorのコンソールドライバーソース(Unimon_6800\dev\dev_6850_VRAM.asm)の全体はこんな感じです。(ちょっと長いです)
;;;
;;; MC6850 (ACIA) & K68-VDG Console Driver
;;;
INIT:
LDAA #$FF
INIT_LOOP1:
LDAB #$FF
INIT_LOOP2:
DECB
BNE INIT_LOOP2
DECA
BNE INIT_LOOP1
JSR VRAM_INIT
LDAB MC6850_AD_CNT
LDX #MC6850_AD_TBL
.LOOP
STX WK_X
LDX ,X
STX WK_SERADD
JSR INI_6850
LDX WK_X
INX
INX
INX
INX
DECB
TSTB
BNE .LOOP
;
CLRA
STAA WK_SERNO
LDX MC6850_AD_TBL
STX WK_SERADD
RTS
;
; VRAM関係初期化
;
VRAM_INIT:
VRAM_SCREND: EQU VRAM_END-$20
;
SPC: EQU $60
ESC: EQU $1B
;CR EQU $0D
CURSOR: EQU $CF
;BS EQU $08
;
CHAR_A: EQU $40
CHAR_UNS: EQU $5F
;
CHAR_S_A: EQU $60
CHAR_END: EQU $7F
;
VDG_MODE: EQU %00000000
VDG_CTL_AD: EQU $8110
;
LDX #VRAM_TOP
STX WK_VRAM
;
JSR VDG_INIT
JSR VRAM_CLR
JSR DISP_CURSOR
RTS
;
; MC6850初期化
;
INI_6850
LDX WK_SERADD
LDAA #$03 ; Master reset
STAA ,X
NOP
NOP
LDAA #ACCR_V
STAA ,X
RTS
;
; 1文字入力
;
CONIN:
STX WK_X
LDX WK_SERADD
CONIN_L:
LDAA ,X
ANDA #$01
BEQ CONIN_L
LDAA 1,X
LDX WK_X
RTS
;
; 文字入力チェック
;
CONST:
STX WK_X
LDX WK_SERADD
LDAA ,X
LDX WK_X
ANDA #$01
RTS
;
; 1文字出力
;
CONOUT:
PSHA
STX WK_X
;
LDX WK_SERADD
CO0:
LDAA ,X
ANDA #$02
BEQ CO0
;
PULA
STAA 1,X
;
;
; 内部CGにあわせて キャラクターコード変換
;
; 英小文字は大文字変換
CMPA #$60
BGE SUB20
; 英大文字はそのまま出力
CMPA #$40
BGE ECHO1
; 特殊記号はリバースキャラへ変更
CMPA #$20
BGE ADD40
BRA ECHO1
SUB20:
SUBA #$20
BRA ECHO1
ADD40:
ADDA #$40
BRA ECHO1
ECHO1:
JSR VRAM_OUT
;
LDX WK_X
RTS
;
; VRAM SUB
;
;
; MC6747初期化
;
VDG_INIT:
LDAA #VDG_MODE
STAA VDG_CTL_AD
RTS
;
; VRAMクリア
;
VRAM_CLR:
LDX #VRAM_TOP
LDAA #SPC
VRAM_CLR_LOOP:
STAA 0,X
INX
CPX #VRAM_END
BNE VRAM_CLR_LOOP
RTS
;
; VRAM出力ルーチン
;
VRAM_OUT:
PSHB
CMPA #CR
BEQ VRAM_OUT_END
CMPA #LF
BEQ VRAM_CR
CMPA #BS
BEQ BS_RTN
;
LDX WK_VRAM
STAA 0,X
LDAA #CURSOR
STAA 1,X
INX
STX WK_VRAM
CPX #VRAM_END ; 画面右下まできた?
BNE VRAM_OUT_END
;
; スクロール処理
;
VRAM_SCR1:
LDX #VRAM_TOP
STX WK_VRAM
VRAM_SCR:
LDAA $20,X
STAA 0,X
INX
CPX #VRAM_SCREND
BNE VRAM_SCR
;
LDAA #SPC
LINE_CLR:
STAA 0,X
INX
CPX #VRAM_END
BNE LINE_CLR
LDX #VRAM_SCREND
STX WK_VRAM
JSR DISP_CURSOR
BRA VRAM_OUT_END
;
; CR($0D)が押されたら改行処理
;
VRAM_CR:
JSR CLR_CURSOR
;
LDAA WK_VRAM+1
ANDA #$E0
LDAB WK_VRAM
ADDA #$20
ADCB #0
BITB #$02 ; VRAMはみ出す?
BNE VRAM_SCR1 ; スクロール処理へ
STAB WK_VRAM
STAA WK_VRAM+1
JSR DISP_CURSOR
BRA VRAM_OUT_END
;
VRAM_OUT_END:
PULB
RTS
;
; カーソル表示
;
DISP_CURSOR:
LDAA #CURSOR
LDX WK_VRAM
STAA 0,X
RTS
;
; カーソル消去
;
CLR_CURSOR:
LDAA #SPC
LDX WK_VRAM
STAA 0,X
RTS
;
; BS処理
;
BS_RTN:
CPX #VRAM_TOP
BEQ VRAM_OUT_END
;
JSR CLR_CURSOR
LDX WK_VRAM
DEX
STX WK_VRAM
JSR DISP_CURSOR
BRA VRAM_OUT_END
あと、以前も書きましたがconfig.incにVRAMのTOPとENDアドレスを定義してありましたので、それぞれ $C000
と$C200
へ変更します。
※本来はここの変更だけで済むようにしてあるつもりでした…^^)>
;;;
;;; Motorola MC6850 & VRAM
;;;
USE_DEV_6850_VRAM = 1
IF USE_DEV_6850_VRAM
;; ACIA
ACIAC_SBC6800: equ $8018 ; Control / Status Register
ACIAD_SBC6800: equ $8019 ; Data Register
ACIAC_SBCIO: equ $8094 ; Control / Status Register
ACIAD_SBCIO: equ $8095 ; Data Register
ACIAC_MIKBUG2_0: equ $8008 ; Control / Status Register
ACIAD_MIKBUG2_0: equ $8009 ; Data Register
ACCR_V: EQU $15 ; Control: x16, 8-bit, N, 1
;
VRAM_TOP EQU $C000
VRAM_END EQU $C200
ENDIF
以上を修正したら makeでMakefileを起動してIntelHexファイルをつくりなおしてROMに焼きましょう。
稼働確認!!・・・OK!
ROMを装着してスイッチオン!

無事以下のようにVRAM変更した状態で 画面表示も出ましてスクロールもOKでした!!

まとめ
REV2基板のソルダジャンパ増設のおかげで$A000~をRAM領域に使えて、$C000をVRAMにできましたので、MIKBUG2.0などを動かすのが容易になりました。
わたしの愛読書「マイコンの作り方・使い方」のMC6800/MC6802マイコンの回路もそうですが、$A000にMC6810とかを配置してるパターンが多いので、むかしのプログラムの移植がラクチンになりつつ、ちゃんとTV(RCAケーブル経由のモニター)対応もできていい感じであります!
コメント