前回で回路ができましたので、ROMの動作確認を行っていきたいと思います。

その前に、電源投入後にD-F/F(74HC74)に接続しているLEDのうち、Q(5pin)に接続のLEDが点灯しているか確認します。この状態(QがLow)のときにROMが選択されます。
確認のソフトですが、リセット後、0x0000番地から0x0100へジャンプしてHALT命令を実行します。
HALT命令が実行されたら、HALT端子がLowになり、接続されているLEDが点灯します。

通常はジャンプ先である0x0100にHALT命令が書けば、LEDが点灯する手はずですが、HALT命令だけでは、LEDは点灯しません^^;

原因は、HALT端子(71pin)が汎用ポートP17と兼用になっているためです。
リセット後は、P17の設定になっているので、P17からHALTに切り替える必要があります。

システムコントロールレジスタSCR1(0x3B)のD1を”1”に設定します。
これにより、71pinはHALT端子として機能します。
ここでは、さらにNMI,BREQ,BACK,M1も切り替えています。

; KL5C80  test halt 
;
; KL5C80 cpu

; Clock 10MHz (ext.clock 20MHz)


; assembler
;  program start 0000H
;  main          0100H
;
; assemblers  ASxxxx and ASlink V5.10
; file name KL5C80_halt.asm
; $ asz80 -l -s -o KL5C80_halt.asm
; $ aslink -i KL5C80_halt
; windows10  writer (TL866(2)PLUS KL5C80_halt.ihx
;

        .z80
 
        .area TEST(ABS)

;;KL5C80 System control register

SCR0	.equ	0x3a	
SCR1	.equ	0x3b

        .org    0x0000
        jp      start
 
        .org    0x0100

start:                          ;cold start

	ld	a,0b00000000	;i/o Port set
	out	(SCR0),a
	ld	a,0b00001111	;NMI,BREQ,BACK,HALT,M1 set Active mode : 1 wait set
	out	(SCR1),a
	halt

	.end

次は、内蔵RAM(512byte)を有効にして、内蔵RAMにHALT命令をコピーして、そこにジャンプし、HALTし、LEDを点灯させます。
そのまえに内蔵RAMの設定のためモードの設定、MMUによる設定が必要になります。
モード設定により、メモリマッピングがかわります。

今回の回路図での設定ではM0CS(69pin)、M01CS(68pin)を使用した、ノーマルモードで動作させます。
ノーマルモードの設定は、MODE0(27pin)、MODE1(26pin)ともHレベル(5V)に設定します。

ノーマルモード時のメモリマップは、
   M0CS 物理アドレス 0x00000-0x1ffff ROM領域(RAMに切り替え)
   M1CS 物理アドレス 0xe0000-0xffdff RAM領域
 内部RAM 物理アドレス 0xffe00-0xfffff RAM領域

となっています。

MMUのリセット後の設定は、
    M0CS 0x0000-
    M1CS 設定なし
   内部RAM 未設定

となっています。
MMUによる物理アドレスから論理アドレス(64Kメモリ空間)の生成は
BBR、BRレジスタで設定し、論理アドレスを5ブロックに配置することができます。

内蔵RAMの物理アドレスは、0xffe00で、論理アドレス(64Kメモリ空間)の上位アドレスの0xfe00-0xffffに配置するときのBBR、BRレジスタの設定値を求めてみます。

まずは、論理アドレス(0xfc00)を0x400で割り、0x01引きます。

 0xfc00/0x400-1=0x3e (0b111110)

この値が、BBRレジスタの5-0bitの値となります。

次に物理アドレス(0xffe00)を0x400で割り、先ほどのBBRレジスタに0x01を足した値を引きます。

0xffe00/0x400-(0x3e+0x01)=0x3c0 (10bit= 9-0bit)(0b1111000000)

この値がBRレジスタの7-0bit(計算した結果の9-2bit)、BBRレジスタ7-6bit(計算した結果の1-0bit)の値となります

したがって、BBR、BRの値を2進で表し16進に直すと次のようになります。

BBR=0b00111110 = 0x3e
BR =0b11110000 = 0xf0

ここでBBRとBRの値が決まりました。BBRの値には BBR1<BBR2<BBR3<BBR4の条件ありますので、値が大きい方が優先になります。したがって一番高位のBB4,BR4に設定することになります。

実は、BR4は 0xf0に固定になっています。したがって、BBR4だけ設定することになります。(ここでは、BR4も再設定)
BR3/2/1,BBR3/2/1の設定はコメントアウトしています。

; KL5C80  test halt (Built-in ram)
; KL5C80 cpu
; rom 0000h -- 7fffh
; ram fe00h -- ffffh(MMU setting)
; Clock 10MHz (ext.clock 20MHz)


; assembler
;  program start 0000H
;  main          0100H
;
; assemblers  ASxxxx and ASlink V5.10
; file name KL5C80_halt.asm
; $ asz80 -l -s -o KL5C80_halt.asm
; $ aslink -i KL5C80_halt
; windows10  writer (TL866(2)PLUS KL5C80_halt.ihx
;

        .z80
 
        .area TEST(ABS)

;;KL5C80 System control register

SCR0	.equ	0x3a	
SCR1	.equ	0x3b

;;KL5C80 Memory management unit

BBR1	.equ	0x00
BR1	.equ	0x01
BBR2	.equ	0x02
BR2	.equ	0x03
BBR3	.equ	0x04
BR3	.equ	0x05
BBR4	.equ	0x06
BR4	.equ	0x07



        .org    0x0000
        jp      start
 
        .org    0x0100

start:                          ;cold start

	ld	a,0b0000000	;i/o Port set
	out	(SCR0),a
	ld	a,0b00001111	;NMI,BREQ,BACK,HALT,M1 set Active mode : 1 wait set
	out	(SCR1),a
	ld	a,0x3e
	out	(BBR4),a
;	out	(BBR3),a
;	out	(BBR2),a
;	out	(BBR1),a
	ld	a,0xf0
	out	(BR4),a
;	out	(BR3),a
;	out	(BR2),a
;	out	(BR1),a	

	ld	hl,0xfe00
	ld	a,0x76
	ld	(hl),a

	jp	0xfe00
	

	.end

実行すると、HALT端子に接続したLEDが点灯します。

それでは1番低位の論理アドレス0x0000に設定できるか確認したいと思います。
まずは、論理アドレスを0x400で割り、0x01引きます。

0x0000/0x400-1 >> 計算できません!

では、0x400で割ることのできる 0x0400では、

0x0400/0x400-1=0 

でBBRは0で設定できそうです。
0x0000-0x3ffは0x400で割り切れないため、MMUによる論理アドレスの設定はできないことになり、ROM領域をMMUでのRAMにすることができません。
ということで、0x0000-0x03ffのROM領域をRAMに切り替えるハードが必要になります。今回の回路では、M0CS 物理アドレス 0x00000-0x1ffffの単位で切り替えています。

また、BBRはBRの下位2bitをのぞけば、0x00-3fの値しか(6bitなので)設定できません。

次回は、「最初のモニタ」を実装したいと思います。

おすすめの記事