MC6802シングルボードコンピューター その6 ~REV2基板~

MC6802

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のディセーブルのソルダ(ハンダ)ジャンパを作りました。ソルダジャンパの名前もちょっと変えちゃいました。

ジャンパ名呼称機能
JP116k_JPROMを$C000~$FFFFの16kバイトにするジャンパ
JP2A000_JPRAMの$A000~$BFFFを無効化
JP8 (新設)C000_JPRAMの$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ケーブル経由のモニター)対応もできていい感じであります!

コメント