最初のモニタでHEXファイルをダウンロードするとエラーが発生してうまくダウンロードできない状況が発生していました。
原因を探るべく、rabbit2000に萌えてみました^^。
原因は、シリアルクロックが微妙に合っていないことのようです。シリアルクロックはメインクロックから分周しているので、メインクロックが微妙にずれているためのようです。
ここでは、水晶発振子を使っているので、問題にしていなかったのですが、これが落とし穴でした^^。
参考の回路図では、メインクロックの水晶発振子に接続されているコンデンサーC1、C2は、33pFですが、この値は大きいようで、手持ちの水晶発振子19.6608MHzでは、C1,C2とも10pFすることで、文字化けが発生しにくいようになりました。(なぜか時間がたつとまれに発生する。Rabbit2000のシリアルは手ごわいです^^;)
モニタのソフト面では、HEXファイルのデータブロックを受信処理しているときにエコーバックしていましたが、この部分をエコーバックせずに、新たにソフトを作り直しました。
下記は作り直した変更部分を抜粋しました。
data_hex_load:
call getchar ;read hex 1byte in Lreg(hex)
call ascii_hex
cp 0xff
jr z,loadhexlineerr
sla a
sla a
sla a
sla a
ld (ix+0),a ;offset address < hex data
call getchar ;read hex 1byte in Lreg(hex)
call ascii_hex
cp 0xff
jr z,loadhexlineerr
and a,0x0f
or a,(ix+0)
ld (ix+0),a ;offset address < hex data
ld a,d
add a,(ix+0) ;cheksum Dreg = Dreg + Lreg
ld d,a
inc ix ;offset address +1
djnz data_hex_load ;Breg(data size) == 0?
rabbit2000は、製造バージョンが4種類あり、GREVレジスタを読むことでrabbit2000、rabbit2000A、rabbit2000B、rabbit2000Cのように確認することができます。
モニタの起動時に表記するように、プログラムを追加しました。
cpu_msg0:
ld hl,cpu_msg_revision ;Revision disply
call msgout
ioi ld a,(GREV)
and 0x0f ;4-0bit 0> rabbit2000
cp 0x00 ; 1> rabbit2000A
jr z,cpu_msg1_01 ; 2> rabbit2000B
or 0x40 ; 3> rabbit2000C
call putchar
cpu_msg1_01:
call cr
ret
また同様に、DATASEG、STACKSEG、SEGSIZE及びXPCの値をモニタ起動時に表示するようにしました。
cpu_msg1:
ld hl,cpu_msg_dataseg ;DATASEG reg disply
call msgout
ioi ld a,(DATASEG)
call hex_a_disp
ld hl,cpu_msg_stackseg ;STACKSEG reg disply
call msgout
ioi ld a,(STACKSEG)
call hex_a_disp
ld hl,cpu_msg_segsize ;SEGSIZE reg disply
call msgout
ioi ld a,(SEGSIZE)
call hex_a_disp
ld hl,cpu_msg_xpc ;XPC disply
call msgout
ld a,xpc
call hex_a_disp
call cr
ret
オールRAM化のモニタのtコマンドを追加しました。
ROMのモニタをRAMに転送して、RAM上でモニタを起動します。
ROMからRAMに転送する方法として、XPCを使用しました。
XPCは論理アドレス(64Kアドレス空間)では0xe000に開始アドレスが固定されています。この機能を使って、モニタを転送したいと思います。
モニタ起動時のXPCは物理アドレス0x4e000に紐付けされているので、0xe000の論理アドレスは、実は物理アドレスの0x4e000を指しています。
また、RAM上での0x0000の論理アドレスは、物理アドレス0x40000に紐付けするように、SEGSIZEレジスタを変更することで簡単に変更できます。
そこで、XPCの物理アドレスを0x40000に紐付けするよう変更すれば、0x0000から0xe000へのコピーで簡単にモニタを転送することができます。
実際のtコマンドのプログラムを確認したいと思います。
tコマンドを実行でyを入力します。
xpcにtrance_xpc_set(0x40-0x0e)すなわち0x32をセットします。
trance:
call call_yes_msg
call getchar
cp "y"
jr nz,crret_t
call cr
ld a,trance_xpc_set ;ram xpc 0xe0000 to 0xffff
ld xpc,a ;XPC Physics address 0x00000
ROMのモニタをXPC領域(0xe000~)物理アドレス0x40000にコピーします。
ld hl,0x0000 ;moni copy at temp_addr(XPC)
ld de,temp_addr
ld bc,prog_end
ldir
これでXPC領域にモニタがコピーされたので、XPC領域のモニタへジャンプします。ジャンプ後、ROMをRAMに切り替えるために、SEGSIZEレジスタに0x00を書き込みます。この時点で、物理アドレス0x40000は論理アドレス0x0000に紐付けされました。RAM上のモニタ(0x0000~)物理アドレス0x40000のモニタにジャンプします。
ld hl,move_prog+temp_addr
jp (hl) ;temprary address jump
;
move_prog:
xor a ;ram 0x0000 to 0xdfff setting
ioi ld (SEGSIZE),a
ld hl,go_moni
jp (hl) ;ram monitor jump
ram上のモニタにジャンプした後は、XPCの物理アドレスを0x4e000に変更し、ramに切り替えたメッセージを表示、スタックポインタを0x0100に設定したのち、モニタの入力待ちに戻ります。
go_moni:
ld a,RamPhysicsAddr
ld xpc,a ;XPC 0xe000 setting
call cr
ld hl,ram_msg
call msgout
ld sp,0x0100
jp ram_main
実際にtコマンドを実行してみました。
ramモニタ上で0x0000番地の内容が変更できるか確認してみました。
Monitor Rabbit2000 ver0.72 by Pinecone 2021/2/21
Revision Rabbit2000C
DATASEG:40 STACKSEG:40 SEGSIZE:A8 XPC:40
>t Yes:
RAM area switching monitor
Monitor Rabbit2000 ver0.72 by Pinecone 2021/2/21
Revision Rabbit2000C
DATASEG:40 STACKSEG:40 SEGSIZE:00 XPC:40
>d 0000
addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000 C3 80 00 FF FF FF FF FF FF FF FF FF FF FF FF FF
>m 0000 C3 00
>d 0000
addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000 00 80 00 FF FF FF FF FF FF FF FF FF FF FF FF FF
>m 0000 00 c3
>d 0000
addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000 C3 80 00 FF FF FF FF FF FF FF FF FF FF FF FF FF
>
今回のモニタソースです。
; rabbit2000 monitor ver0.72 by Pinecone 2021/2/21
;
; rabbit2000 cpu
; rom 0000h -- 7fffh
; ram 8000h -- ffffh
; External clock 19.6608MHz
; Rabbit2000 serial communication (TXA or RXA :C port)
; 38400bps 8N1
; assembler
; program start 0000H
; main 0100H
;
; assemblers ASxxxx and ASlink V5.10
; file name rabbit2000_moni072.asm
; $ asrab -l -s -o rabbit2000_moni072.asm
; $ aslink -i rabbit2000_moni072
; $ rom-writer TL866-2 plus rabbit2000_moni072.ihx
;
.r2k
.area TEST(ABS)
;;Global Control/Status Register
GCSR .equ 0x00
;;Global Output Control Register
GOCR .equ 0x0e
;;Global Clock Double Register
GCDR .equ 0x0f
;;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
;;MMU: Memory Bank 0 Control Ragister
MB0CR .equ 0x14
;;MMU: Memory Bank 1 Control Ragister
MB1CR .equ 0x15
;;Global Revision Register
GREV .equ 0x2f
;;External Interrupt
;;Interupt 0 Control Register
I0CR .equ 0x98
;;Interupt 1 Control Register
I1CR .equ 0x99
;;Parallel ports
;;PPA
;;Port A Data Register
PADR .equ 0x30
;;Slave Port Control Ragister
SPCR .equ 0x24
;;PPB
;;Port B Data Register
PBDR .equ 0x40
;;PPC
;;Port C Data Ragister
PCDR .equ 0x50
;;Port C Function Ragister
PCFR .equ 0x55
;;PPD
;;Port D Data Ragister
PDDR .equ 0x60
;;Port D Function Ragister
PDFR .equ 0x65
;;Port D Control Ragister
PDCR .equ 0x64
;;Port D Drive Control Ragister
PDDCR .equ 0x66
;;PPE
;;Port E Data Ragister
PEDR .equ 0x70
;;Port E Function Ragister
PEFR .equ 0x75
;;Port E Control Ragister
PECR .equ 0x74
;;Port E Data Direction Ragister
PEDDR .equ 0x77
;;Timer A
;;Timer A Control/Status Register
TACSR .equ 0xa0
;;Timer A Control Register
TACR .equ 0xa4
;;Timer A1 Constant register
TAT1R .equ 0xA3
;;Timer A4 Constant register
TAT4R .equ 0xA9
;;Serial A port
;;Serial A Port Status Register
SASR .equ 0xc3
;;Serial A port Control Register
SACR .equ 0xc4
;;Serial A port Data Register
SADR .equ 0xc0
;;Serial A port Address Register
SAAR .equ 0xc1
;;Serial A port Long Register
SALR .equ 0xc2
;;Watchdog Timer
;;Watchdog Timer Control Register
WDTCR .equ 0x08
;;Watchdog Timer Test Register
WDTTR .equ 0x09
;;ram Physics address setting
RamPhysicsAddr .equ 0x40 ;ram Physics address 0x40000
;;monitor trance address setting
trance_xpc_set .equ 0x40-0x0e ;xpc 0xe000 >> 0x40000 setting
temp_addr .equ 0xe000 ;moni move temprary address (XPC)
.org 0x0000
jp start
.org 0x0080
start:
ld a,0b00001000 ;proc=OSC,pclk=osc,periodic interrupt=disable
ioi ld (GCSR),a
ld a,0x00 ;0x000000 Use /OE0 or /WE0 Use CS0
ioi ld (MB0CR),a ;use ROM
ld a,0b00000101 ;0x400000 Use /OE1 or /WE1 Use CS1
ioi ld (MB1CR),a ;use RAM
ld a,0x0f ;A-ch Clock timer :=(PCLK/2/16/38400)-1 (PCLK=19.6608MHz >> 38400bps)
ioi ld (TAT4R),a
ld a,0x01 ;PCLK/2 Timer A Enabled
ioi ld (TACSR),a
; ld a,0b00000000 ;Timer A4~A7 Clocked by PCLK/2,interrupts disabled
; ioi ld (TACR),a
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
ld a,0x00
ld iir,a
ld eir,a
ipset 3 ;All interrupt suppessed (except RST)
jp main
.org 0x100
main: ;cold start
ld sp,0xe000 ;stack pointer set
call ppinit ;parallel ports initialize
call sioinit ;serial channel initialize
ram_main:
ld hl,msg_op ;opening message display
call msgout
call cpu_msg0
call cpu_msg1
prompt: ld a,">" ;main routine
call putchar ;prompt display
call getchar
call putchar
cp "?" ;help ?
jr nz,prompt01
call help
prompt01:
cp "d" ;memory display?
jr nz,prompt02
call dump
prompt02:
cp "m" ;memory rewrite ?
jr nz,prompt03
call memory
prompt03:
cp "l" ;hex file load?
jr nz,prompt04
call loadhex
prompt04:
cp "j" ;address jump?
jr nz,prompt05
call jump
prompt05:
cp "i" ;i/o register rewite
jr nz,prompt06
call ioreg
prompt06:
cp "c"
jr nz,prompt07
call calling ;address call
prompt07:
cp "t"
jr nz,prompt08
call trance ;moni 64Kmemory trance
prompt08:
cp 0x0d
jr z,prompt
cp 0x00
jr z,prompt
call cr
jr prompt
cpu_msg0:
ld hl,cpu_msg_revision ;Revision disply
call msgout
ioi ld a,(GREV)
and 0x0f ;4-0bit 0> rabbit2000
cp 0x00 ; 1> rabbit2000A
jr z,cpu_msg1_01 ; 2> rabbit2000B
or 0x40 ; 3> rabbit2000C
call putchar
cpu_msg1_01:
call cr
ret
cpu_msg1:
ld hl,cpu_msg_dataseg ;DATASEG reg disply
call msgout
ioi ld a,(DATASEG)
call hex_a_disp
ld hl,cpu_msg_stackseg ;STACKSEG reg disply
call msgout
ioi ld a,(STACKSEG)
call hex_a_disp
ld hl,cpu_msg_segsize ;SEGSIZE reg disply
call msgout
ioi ld a,(SEGSIZE)
call hex_a_disp
ld hl,cpu_msg_xpc ;XPC disply
call msgout
ld a,xpc
call hex_a_disp
call cr
ret
help: ld hl,help_msg ;help ?
call msgout
ret
cr:
push af
ld a,0x0d
call putchar
pop af
ret
crret_t:
call cr
ret
trance:
call call_yes_msg
call getchar
cp "y"
jr nz,crret_t
call cr
ld a,trance_xpc_set ;ram xpc 0xe0000 to 0xffff
ld xpc,a ;XPC Physics address 0x00000
ld hl,0x0000 ;moni copy at temp_addr(XPC)
ld de,temp_addr
ld bc,prog_end
ldir
ld hl,move_prog+temp_addr
jp (hl) ;temprary address jump
;
move_prog:
xor a ;ram 0x0000 to 0xdfff setting
ioi ld (SEGSIZE),a
ld hl,go_moni
jp (hl) ;ram monitor jump
go_moni:
ld a,RamPhysicsAddr
ld xpc,a ;XPC 0xe000 setting
call cr
ld hl,ram_msg
call msgout
ld sp,0x0100
jp ram_main
call_yes_msg:
push hl
ld hl,yes_msg
call msgout
pop hl
ret
jump: ;address jump?
ld a," "
call putchar
call input_hl ;dump address input
cp 0x00
jr nz,crret
ld a," "
call putchar
ld a,"y"
call putchar
ld a,":"
call putchar
call getchar
cp "y"
jr nz,crret
call cr
jp (HL)
crret:
call cr
ret
calling: ;address call?
ld a," "
call putchar
call input_hl ;call address input
cp 0x00
jr nz,crret
ld a," "
call putchar
ld a,"y"
call putchar
ld a,":"
call putchar
call getchar
cp "y"
jr nz,crret
call cr
ld de,callret
push de
jp (HL)
callret:
ret
loadhex:
call loadhexline ;load 1line Hex file
cp 0xff ;hex file read err
jr z,loadhexerr
cp 0x01 ;hex file end?
jr nz,loadhex
ld a,0x0d
call putchar
ld a,"O"
call putchar
ld a,"K"
call putchar
ld a,0x0d
call putchar
ret
loadhexerr:
ld a,0x0d ;hex file read skip
call putchar
ld a,"E"
call putchar
ld a,"R"
call putchar
ld a,"R"
call putchar
ld a,0x0d
call putchar
ret
loadhexline:
ld a,0x0d
call putchar
ld d,0x00 ;checksum count clr
call getchar ;record mark is ":"
cp ":"
jr nz,loadhexlineerr
call input_l ;data size 1byte
ld b,l ;B reg << Data size
ld a,d
add b ;checksum = checksum + data size
ld d,a
call input_hl ;offset address 2byte
ld ix,hl
;offset address HLreg >> IXreg
ld a,d ;checksum = checksum + address Low
add l
add h ;checksum = checksum + address Hi
ld d,a
call input_l ;record type
ld a,l
cp 0x00 ;data record
jr nz,checkrecord
;; *** data record job ****
data_hex_load:
call getchar ;read hex 1byte in Lreg(hex)
call ascii_hex
cp 0xff
jr z,loadhexlineerr
sla a
sla a
sla a
sla a
ld (ix+0),a ;offset address < hex data
call getchar ;read hex 1byte in Lreg(hex)
call ascii_hex
cp 0xff
jr z,loadhexlineerr
and a,0x0f
or a,(ix+0)
ld (ix+0),a ;offset address < hex data
ld a,d
add a,(ix+0) ;cheksum Dreg = Dreg + Lreg
ld d,a
inc ix ;offset address +1
djnz data_hex_load ;Breg(data size) == 0?
call input_l ;chechsum OK?
ld a,d
add l
cp 0x00
jr nz,loadhexlineerr
call getchar
cp 0x0a ;load 1line hex LF?
jr nz,loadhexlineerr
ld a,0x00
ret
checkrecord: ;end record ?
cp 0x01
jr nz,loadhexlineerr
call input_l
ld a,l
cp 0xff
jr nz,loadhexlineerr
ld a,0x01
ret
loadhexlineerr:
ld a,0xff ;read record err (no support)
ret
dump: ;memory dump
ld a," "
call putchar
call input_hl ;dump address input
cp 0x00
jr z,dump1
push iy ;memory dump address set
pop hl
dump1:
call dump_hl ;memory dump
push hl ;memory address IY set
pop iy
ret
memory: ;memory change
ld a," " ;space
call putchar
call input_hl ;change memory address
cp 0x00
jr z,memory1 ;no address hex code
ld a,0x0d
call putchar
ret
memory1:
ld a," " ;current memory display
call putchar
ld a,(HL)
call hex_a_disp
ld a," "
call putchar
push hl
call input_l ;new memory conntents input
cp 0x00
jr z,memory2
pop hl
xor a
ret
memory2:
ld c,l ;memory contents update
pop hl
ld (hl),c
ld a,0x0d
call putchar
ret
ioreg: ;ioreg change
ld a," " ;space
call putchar
call input_l ;change i/o register
cp 0x00
jr z,ioreg1 ;no address hex code
ld a,0x0d
call putchar
ret
ioreg1:
ld a," " ;current i/o address display
call putchar
ld b,0x00
ld c,l
ioi ld a,(bc)
call hex_a_disp
ld a," "
call putchar
call input_l ;new i/o conntents address input
cp 0x00
jr z,ioreg2
xor a
ret
ioreg2:
ld a,l ;new i/o address update
ioi ld (bc),a
ld a,0x0d
call putchar
ret
input_l: ;input Lreg hex (1byte)
push bc
ld b,0x02
jr input_prompt
input_hl: ;input HLreg hex (2byte)
push bc
ld b,0x04
input_prompt:
ld hl,0x0000 ;HL reg cler
jr input_hl2
shift_hl:
add hl,hl ;HL reg shift left 4bit
add hl,hl
add hl,hl
add hl,hl
input_hl2:
call getchar ;input ascii hex 1char
call putchar
call ascii_hex ;ascii hex 1char >> Areg
cp 0xff
jr z,input_hl_err
and 0x0f ;Areg low order 4bit >> Lreg
or l
ld l,a
djnz shift_hl
input_hl_end:
pop bc
xor a ;OK >> Areg 0x00
ret
input_hl_err:
ld a,0xff ;NG >> Areg 0xff
pop bc
ret
dump_hl: ;memory dump 1line(+0 -- +f)
ld a,0x0d
call putchar
push hl
ld hl,dump_msg ;dump address msg output
call msgout
pop hl
ld a,h ;dump address HLreg
call hex_a_disp ;dump address output
ld a,l
call hex_a_disp
ld a," "
call putchar
call putchar
ld b,0x10 ;address --> address +0f
hl_disp:
ld a,(HL) ;dump addres data (HL)
inc HL
call hex_a_disp
ld a," "
call putchar
djnz hl_disp
ld a,0x0d
call putchar
ret
hex_a_disp: ;Areg(HEX) >> putchar(areg)
push af
rrca ;7-4bit Right shift
rrca
rrca
rrca
call hex_ascii ;3-0bit Hex >> Hex ascii(0-F)
call putchar ;7-4bit putchar
pop af
call hex_ascii ;3-0bit Hex >> Hex ascii(0-F)
call putchar ;3-0bit putchar
ret
ascii_hex:
sub 0x30
jr c,err_hex
cp 0x0A ;0-9
jr c,hex_1_9
sub 0x11
cp 0x06 ;A-F
jr c,hex_A_F
sub 0x20
cp 0x06 ;a-f
jr nc,err_hex
hex_A_F:
add 0x0a
hex_1_9:
ret
err_hex:ld a,0xff
ret
hex_ascii: ;Areg(HEX) >> Areg(ascii code)
and a,0x0f
cp 0x0a
jr c,ascii0_9
add 0x37
ret
ascii0_9:
add 0x30
ret
msgout:
ld a,(hl) ;(HL)reg is output disp at 0x00
cp 0x00
ret z
call putchar
inc hl
jr msgout
putchar:
push af
putchar01:
ioi ld a,(SASR) ;Serial A port Status in
bit 3,a
jr nz,putchar01 ;XMIT DATA REG > Full(bit3==1) check
pop af
push af
ioi ld (SADR),a ;no full(Empty) >> TxA data out
putchar_busy:
ioi ld a,(SASR) ;Serial A port Status in
bit 3,a ;XMIT DATA REG > Full(bit3==1) check
jr nz,putchar_busy
pop af ;no full(Empty) >> return
ret
getchar:
ioi ld a,(SASR) ;Serial A port Status in
bit 7,a ;RCV DATA REG > EMPTY(bit7==0) check
jr z,getchar
ioi ld a,(SADR) ;No EMPTY(Full) > RxA data in
push af
getchar01:
ioi ld a,(SASR) ;Serial A port Status in
bit 7,a ;RCV DATA REG >EMPTY(bit7==0) check
jr nz,getchar01
pop af ;EMPTY >> return
ret
ppinit:
ld a,0x40
ioi ld (PCFR),a ;C Port TxA set
ret
sioinit:
ld a,0b00000000
ioi ld (SACR),a ;Asynch mode, C port used, 8bit, Interrupt Disabled
ret
msg_op: .str "Monitor Rabbit2000 ver0.72 by Pinecone 2021/2/21"
.db 0x0d
.db 0x00
help_msg:
.db 0x0d
.str "? Help"
.db 0x0d
.str "d memory dump"
.db 0x0d
.str "m memory change address old new"
.db 0x0d
.str "l hex file load"
.db 0x0d
.str "j jump"
.db 0x0d
.str "i i/o register i/o-address old new"
.db 0x0d
.str "c call"
.db 0x0d
.str "t ram area trance monitor jump"
.db 0x0d
.db 0x00
dump_msg:
.str "addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"
.db 0x0d
.db 0x00
yes_msg:
.str " Yes:"
.db 0x00
cpu_msg_stackseg:
.str " STACKSEG:"
.db 0x00
cpu_msg_dataseg:
.str " DATASEG:"
.db 0x00
cpu_msg_segsize:
.str " SEGSIZE:"
.db 0x00
cpu_msg_xpc:
.str " XPC:"
.db 0x00
ram_msg:
.str "RAM area switching monitor"
.db 0x0d
.db 0x00
cpu_msg_revision:
.str " Revision Rabbit2000"
.db 0x00
prog_end:
.end
HEXファイルです。
:03000000C38000BA
:200080003E08D33200003E00D33214003E05D33215003E0FD332A9003E01D332A0003E4004
:1F00A000D33212003E40D33211003EA8D33213003E40ED673E00ED47ED4FED5EC3000109
:200100003100E0CD6504CD6C04217304CD2B04CD6501CD7E013E3ECD3504CD4E04CD3504A1
:20012000FE3F2003CDB401FE642003CD1603FE6D2003CD2C03FE6C2003CD6102FE6A2003A0
:20014000CD0C02FE692003CD6003FE632003CD3602FE742003CDC701FE0D28B9FE0028B590
:20016000CDBB0118B021C805CD2B04D33A2F00E60FFE002805F640CD3504CDBB01C92192A7
:2001800005CD2B04D33A1200CDF203218705CD2B04D33A1100CDF203219C05CD2B04D33A29
:2001A0001300CDF20321A605CD2B04ED77CDF203CDBB01C921A604CD2B04C9F53E0DCD3558
:2001C00004F1C9CDBB01C9CD0302CD4E04FE7920F2CDBB013E32ED672100001100E001DD58
:2001E00005EDB021E7E1E9AFD332130021F001E93E40ED67CDBB0121AC05CD2B043100016E
:20020000C30901E5218105CD2B04E1C93E20CD3504CD9B03FE00201A3E20CD35043E79CDF0
:2002200035043E3ACD3504CD4E04FE792004CDBB01E9CDBB01C93E20CD3504CD9B03FE00BC
:2002400020F03E20CD35043E79CD35043E3ACD3504CD4E04FE7920DACDBB01116002D5E9A5
:20026000C9CD9B02FEFF2819FE0120F53E0DCD35043E4FCD35043E4BCD35043E0DCD350435
:20028000C93E0DCD35043E45CD35043E52CD35043E52CD35043E0DCD3504C93E0DCD350424
:2002A0001600CD4E04FE3A206ACD9603457A8057CD9B03DD7D7A858457CD96037DFE0020AB
:2002C00043CD4E04CD0504FEFF2848CB27CB27CB27CB27DD7700CD4E04CD0504FEFF283310
:2002E000E60FDDB600DD77007ADD860057DD2310D0CD96037A85FE002019CD4E04FE0A202B
:20030000123E00C9FE01200BCD96037DFEFF20033E01C93EFFC93E20CD3504CD9B03FE00BC
:200320002803FDE5E1CDC103E5FDE1C93E20CD3504CD9B03FE0028063E0DCD3504C93E203F
:20034000CD35047ECDF2033E20CD3504E5CD9603FE002803E1AFC94DE1713E0DCD3504C96D
:200360003E20CD3504CD9603FE0028063E0DCD3504C93E20CD350406004DD30ACDF2033ED9
:2003800020CD3504CD9603FE002802AFC97DD3023E0DCD3504C9C506021803C506042100ED
:2003A00000180429292929CD4E04CD3504CD0504FEFF2809E60FB56F10E9C1AFC93EFFC10B
:2003C000C93E0DCD3504E5214A05CD2B04E17CCDF2037DCDF2033E20CD3504CD35040610D4
:2003E0007E23CDF2033E20CD350410F43E0DCD3504C9F50F0F0F0FCD1F04CD3504F1CD1F14
:2004000004CD3504C9D6303813FE0A380ED611FE063806D620FE063003C60AC93EFFC9E68F
:200420000FFE0A3803C637C9C630C97EFE00C8CD35042318F6F5D33AC300CB5F20F8F1F57D
:20044000D332C000D33AC300CB5F20F8F1C9D33AC300CB7F28F8D33AC000F5D33AC300CB74
:200460007F20F8F1C93E40D3325500C93E00D332C400C94D6F6E69746F72205261626269D2
:20048000743230303020766572302E3732202062792050696E65636F6E6520323032312F72
:2004A000322F32310D000D3F202048656C700D6420206D656D6F72792064756D700D6D209C
:2004C000206D656D6F7279206368616E676520202061646472657373206F6C64206E6577CE
:2004E0000D6C20206865782066696C65206C6F61640D6A20206A756D700D692020692F6F4E
:2005000020726567697374657220202020692F6F2D61646472657373206F6C64206E6577F3
:200520000D63202063616C6C0D74202072616D2061726561207472616E6365206D6F6E6945
:20054000746F72206A756D700D006164647220202B30202B31202B32202B33202B34202BE6
:2005600035202B36202B37202B38202B39202B41202B42202B43202B44202B45202B460DD8
:2005800000205965733A0020535441434B5345473A0020444154415345473A0020534547CF
:2005A00053495A453A00205850433A0052414D206172656120737769746368696E67206D6B
:1D05C0006F6E69746F720D00205265766973696F6E205261626269743230303000D1
:00000001FF