今回はRAMの動作確認を行っていきます。
今回配置するRAMの論理アドレスと物理アドレスの関係は下記のようになります。

ROMは0x0000~0X7fffまでROM容量に応じてアドレスを占領します。
RAMは、64K論理アドレス空間の0x8000~0xffffを3分割します。
DATA SEGMENTとSTACK SEGMENTは任意の上位4ビットのアドレスを指定できますが、XPCの開始アドレス 0xe000は固定です。
DATA SEGMENTとSTACK SEGMENTの開始アドレスの指定は、SEGSIZEレジスタで指定します。上位4bitがSTACK SEGMENTの開始アドレス上位4ビットを指定し、下位4bitでDATA SEGNENTの開始アドレス上位4bitを指定します。
ここでは、
STACK SEGMENT = 0xa000 なので上位4bitは 0xa
DATA SEGMENT = 0x8000 なので上位4bitは 0x8
したがって、
SEGSIZE = 0xa8 になります。
論理アドレスを物理アドレスに関連付けるには、STACK SEGMENTの物理ベースアドレスSTAKSEGレジスタから論理アドレスを引いたアドレスとDATA SEGMENTの物理ベースアドレスDATASEGレジスタから論理アドレスを引いたアドレスを設定します。
各物理アドレスの上位8bitを指定します。
STACK SEGMENTの物理ベースアドレス 0x4a000-0xa000の上位8bitは 0x40
DATA SEGMENTの物理ベースアドレス 0x48000-0x8000の上位8bitは 0x40
したがって、
STACKSEG =0x40
DATASEG =0x40
XPCも同様に物理アドレスから論理アドレスを引いたアドレスの上位8bitを指定します。
XPCの物理ベースアドレス 0x4e000-0xe000の上位8bitは 0x40
したがって
xpc=0x40
XPCについては、ld xpc命令などでセグメント形式で可変することができるようで、この領域はいろいろ用途が広がっているみたいです。
以上のように、MMU関連のレジスタを設定することでRAMを論理アドレスに割り当てることができそうです。
実際にプログラムしていきます。
各レジスタを定義付けします。(MMIDRは定義付けだけ行っています)
;;MMU: Memory Bank 1 Control Ragister
MB1CR .equ 0x15
;;MMU: MMU Instruction/Data Register
MMIDR .equ 0x10
;;MMU: Data Segment Register(Z180 BBR)
DATASEG .equ 0x12
;;MMU: Segment Size Register(Z180 CBAR)
SEGSIZE .equ 0x13
;;MMU: Stack Segment Register(Z180 CBR)
STACKSEG .equ 0x11
RAMを物理アドレスに関連付けます。
開始アドレス 0x04000(MB1CR) CS1、OE1、WE1で制御
ld a,0b00000101
ioi ld (MB1CR),a ;0x400000 Use /OE1 or /WE1 Use CS1 (RAM)
MMU関連の初期設定を行います。
STACKSEG =0x40
DATASEG =0x40
SEGSIZE = 0xa8
xpc=0x40
ld a,0x40 ;MMU Data Reg Physics address 0x40000 (CS1)
ioi ld (DATASEG),a
ld a,0x40 ;MMU Stack Reg Physics address 0x40000 (CS1)
ioi ld (STACKSEG),a
ld a,0xa8 ;MMU Segsize logic Data address 0x8000 (CS1:0x48000)
ioi ld (SEGSIZE),a ;MMU Segsize logic Stack address 0xa000 (CS1:0x4a000)
ld a,0x40 ;MMU XPC Physics address 0x40000 (CS1:0x4e000)
ld xpc,a
確認プログラムは、0x8000番地に0x80(CLK=Low)を書き込み、再度読み出し、CLK端子をLowにしてLEDを消灯します。
main:
ld a,0x80 ;CLK(1pin) low
ld hl,0x8000 ;ram top address 0x8000
ld (hl),a
ld a,(hl)
ioi ld (GOCR),a
loop:
jr loop
全体的なプログラムは下記のおとりです。
; rabbit2000 ram check
;
; rabbit2000 cpu
; rom 0000h -- 7fffh
; ram 8000h -- ffffh
; External clock 19.6608MHz
; assembler
; program start 0000H
; main 0100H
;
; assemblers ASxxxx and ASlink V5.10
; file name rabbit2000_ram_check.asm
; $ asrab -l -s -o rabbit2000_ram_check.asm
; $ aslink -i rabbit2000_ram_check
; $ rom-writer TL866-2 plus rabbit2000_ram_check.ihx
;
.r2k
.area TEST(ABS)
;;Global Control/Status Register
GCSR .equ 0x00
;;Global Output Control Register
GOCR .equ 0x0e
;;MMU: Memory Bank 0 Control Ragister
MB0CR .equ 0x14
;;MMU: Memory Bank 1 Control Ragister
MB1CR .equ 0x15
;;MMU: MMU Instruction/Data Register
MMIDR .equ 0x10
;;MMU: Data Segment Register(Z180 BBR)
DATASEG .equ 0x12
;;MMU: Segment Size Register(Z180 CBAR)
SEGSIZE .equ 0x13
;;MMU: Stack Segment Register(Z180 CBR)
STACKSEG .equ 0x11
.org 0x0000
jp start
.org 0x0080
start:
ld a,0b00001000 ;proc=OSC,pclk=osc,periodic interrupt=disable
ioi ld (GCSR),a
ld a,0x00
ioi ld (MB0CR),a ;0x000000 Use /OE0 Use CS0 (ROM)
ld a,0b00000101
ioi ld (MB1CR),a ;0x400000 Use /OE1 or /WE1 Use CS1 (RAM)
ld a,0x40 ;MMU Data Reg Physics address 0x40000 (CS1)
ioi ld (DATASEG),a
ld a,0x40 ;MMU Stack Reg Physics address 0x40000 (CS1)
ioi ld (STACKSEG),a
ld a,0xa8 ;MMU Segsize logic Data address 0x8000 (CS1:0x48000)
ioi ld (SEGSIZE),a ;MMU Segsize logic Stack address 0xa000 (CS1:0x4a000)
ld a,0x40 ;MMU XPC Physics address 0x40000 (CS1:0x4e000)
ld xpc,a
jp main
.org 0x0100
main:
ld a,0x80 ;CLK(1pin) low
ld hl,0x8000 ;ram top address 0x8000
ld (hl),a
ld a,(hl)
ioi ld (GOCR),a
loop:
jr loop
.end
HEXファイルです。
:03000000C38000BA
:200080003E08D33200003E00D33214003E05D33215003E40D33212003E40D33211003EA852
:0B00A000D33213003E40ED67C30001A7
:0D0100003E80210080777ED3320E0018FE75
:00000001FF
同じように、スタックを設定し、push、pop命令で確認しました。
main: ld sp,0xe000 ;stack pointer set
ld a,0x80 ;CLK(1pin) low
push af
nop
nop
pop af
ioi ld (GOCR),a
loop:
jr loop
全体のプログラムです。
; rabbit2000 ram check
;
; rabbit2000 cpu
; rom 0000h -- 7fffh
; ram 8000h -- ffffh
; External clock 19.6608MHz
; assembler
; program start 0000H
; main 0100H
;
; assemblers ASxxxx and ASlink V5.10
; file name rabbit2000_ram_sp_check.asm
; $ asrab -l -s -o rabbit2000_ram_sp_check.asm
; $ aslink -i rabbit2000_ram_sp_check
; $ rom-writer TL866-2 plus rabbit2000_ram_sp_check.ihx
;
.r2k
.area TEST(ABS)
;;Global Control/Status Register
GCSR .equ 0x00
;;Global Output Control Register
GOCR .equ 0x0e
;;MMU: Memory Bank 0 Control Ragister
MB0CR .equ 0x14
;;MMU: Memory Bank 1 Control Ragister
MB1CR .equ 0x15
;;MMU: MMU Instruction/Data Register
MMIDR .equ 0x10
;;MMU: Data Segment Register(Z180 BBR)
DATASEG .equ 0x12
;;MMU: Segment Size Register(Z180 CBAR)
SEGSIZE .equ 0x13
;;MMU: Stack Segment Register(Z180 CBR)
STACKSEG .equ 0x11
.org 0x0000
jp start
.org 0x0080
start:
ld a,0b00001000 ;proc=OSC,pclk=osc,periodic interrupt=disable
ioi ld (GCSR),a
ld a,0x00
ioi ld (MB0CR),a ;0x000000 Use /OE0 Use CS0 (ROM)
ld a,0b00000101
ioi ld (MB1CR),a ;0x400000 Use /OE1 or /WE1 Use CS1 (RAM)
ld a,0x40 ;MMU Data Reg Physics address 0x40000 (CS1)
ioi ld (DATASEG),a
ld a,0x40 ;MMU Stack Reg Physics address 0x40000 (CS1)
ioi ld (STACKSEG),a
ld a,0xa8 ;MMU Segsize logic Data address 0x8000 (CS1:0x48000)
ioi ld (SEGSIZE),a ;MMU Segsize logic Stack address 0xa000 (CS1:0x4a000)
ld a,0x40 ;MMU XPC Physics address 0x40000 (CS1:0x4e000)
ld xpc,a
jp main
.org 0x0100
main: ld sp,0xe000 ;stack pointer set
ld a,0x80 ;CLK(1pin) low
push af
nop
nop
pop af
ioi ld (GOCR),a
loop:
jr loop
.end
HEXファイルです。
:03000000C38000BA
:200080003E08D33200003E00D33214003E05D33215003E40D33212003E40D33211003EA852
:0B00A000D33213003E40ED67C30001A7
:0F0100003100E03E80F50000F1D3320E0018FE12
:00000001FF
次回はシリアル通信を確認していきたいと思います。