今回は、64K化モニタに移行するtコマンドとCP/Mのシステムをブートするためのbコマンドを実装したいと思います。
bコマンドについては今後SDCARDに実装するCP/Mシステムができた時点でコマンドを実行することができます。Bコマンドはそれまでおあずけです。

では最初にtコマンドから実装していきます。
以前手動で64K化は確認済みですので、プログラムでモニタを転送して自動化していきます。

tコマンドを実行すると、ほんとに実行するか確認(cp "y")してから、ldir命令で、モニタ自体をram領域にコピーします。
ここでは、temp_addrとして、転送先0x8000に 0x0000からprog_end(0x0b2f:アセンブル時に決定されます。)までをコピーします。

trance: 
        call    call_yes_msg
        call    getchar
        cp      "y"
        jr      nz,crret_t
        call    cr

				;ram    0x8000 to 0xffff
        ld      hl,0x0000       ;moni   copy at temp_addr
        ld      de,temp_addr
        ld      bc,prog_end
        ldir

コピーが完了したら、0x8000+move_prog:にジャンプします。
ここでは、move_progは0x0186番地なので、0x8186番地にジャンプし、move_prog: からはコピー先の0x8186番地からの実行になります。

ROM_RAM_SW_PORT(0x80)にON_RAM(0x03)を書き込みし、0x0000-0x7fffまでのROM領域をRAMに切り替えます。
今度は、0x8000からコピーしているモニタをram領域にidir命令でコピーします。
コピーが終了したら、コピー先のモニタのgo_moni(0x0199)へジャンプします。
ram化になったことのメッセージを表示し、スタックポインタを初期化して、ram化モニタに制御を移します。

        ld      hl,move_prog+temp_addr
        jp      (hl)            ;temprary address jump
;
move_prog:
        ld	a,ON_RAM        ;ram 0x0000 to 0x7fff setting
        out     (ROM_RAM_SW_PORT),a
        ld      hl,temp_addr    ;moni moveing at ram 0x0000 to prog_end
        ld      de,0x0000
        ld      bc,prog_end
        ldir
        ld      hl,go_moni
        jp      (hl)            ;ram monitor jump
;
go_moni:
	call	cr
	ld	hl,ram_msg
	call	msgout
        ld      sp,0x0000       ;stack pointer set
        jp      hot_start

実際に実行してみました。

tコマンドを実行してramモニタに制御を移します。
0x0000番地の内容を書き換えてみます。
dコマンドで0x0000番地の内容を確認すると0xc3となっています。
mコマンドで0xc3を0x00に変更します。
再度dコマンドで確認すると0x00に変更されています。
再度 0xc3に変更して、表示すると元通りに変更されました。

Monitor Z80+8251+8255 CPU ver0.72(SPI+boot) by Pinecone 2020/10/09
>?
?  Help
d  memory dump
m  memory change   address old new
l  hex file load
j  jump
i  i/o register    i/o-address old new
c  call
t  ram area trance monitor jump
b  CP/M system boot at SDCARD
ai spi(sd-card) Initialization
ar spi(sd-card) read  (512byte/block)  0x0000-0xffff set
aw spi(sd-card) write (512byte/block)  0x0000-0xffff set
>t Yes:

RAM area switching monitor
Monitor Z80+8251+8255 CPU ver0.72(SPI+boot) by Pinecone 2020/10/09
>d 0000
addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000  C3 00 01 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 00 01 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 00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF 
>

続いて、bコマンドを実装していきます。

bコマンドを実行するか確認してから、cmd17とcmd24、cmd18,cmd12のコマンドエリアをram領域にコピーし、SDCARDを初期化します。

bコマンドでは、SDCRADからブロックを読み込むために、cmd18を使用しました。cmd18はマルチブロック読み出しコマンドで、連続したブロックを効率よく読み込むことができます。

今後実装するCP/MシステムのSDカードでの配置は、最初のトラック0x00の第0セクタから0x0b分までをCCP+BDOSに、0x0bから0x04文をbiosに割り当てます。
パラメータを指定した後、spi_read_goでsdcardから読み込みします。
システムトラックだけは、1ブロック512byteで読み込みします
(CP/Mファイルシステムは、BIOS上でのプログラムを簡略化するために1セクタ128byteになっています。)
読み込みが終了したら、0x0000-0x7fffのrom領域をramに切り替えるために、切り替えプログラム(boot_move_prog:)を0x8000にコピーして、制御を0x8000に移し、ROMからRAMに切り替え、BIOSの先頭にジャンプして、CP/Mに制御を移します。

cpm_boot:
	ld	hl,boot_yes_msg
	call 	msgout   
        call    getchar
        cp      "y"
        ret      nz

	call	cr
	call	cmd17_24_copy		;command rom >> ram area copy
        call    spi_card_init		;sdcard initialize

	ld	hl,0x0000		;CP/M system block 0x0000 start 
	ld	(rw_block_no),hl
	ld	hl,0x000b		;ccp+bdos >0x0b (512byte * 0x000b)
	ld	(rw_block),hl
	ld	hl,0xdc00		;62K cp/m ccp top addr >> 0xdc00
	ld	(rw_addr),hl
	call	spi_read_go
	cp	0x01
	ret	z
	ld	hl,0x000b		;CP/M bios block 0x000b start 
	ld	(rw_block_no),hl
	ld	hl,0x0004		;bios >0x04 (512byte * 4 bios area)
	ld	(rw_block),hl
	ld	hl,0xf200		;62K cp/m bios top addr >> 0xf200
	ld	(rw_addr),hl
	call	spi_read_go
	cp	0x01
	ret	z
	ld	hl,cpm_boot_msg
	call	msgout

        ld      hl,boot_move_prog       ;64K swiching ram progrum  copy at temp_addr
        ld      de,temp_addr		;transfer boot_move_prog ~ boot_move_end >>temp_addr(0x8000)
        ld      bc,boot_move_end
        ldir
        
        ld      hl,temp_addr
        jp      (hl)            	;temprary address jump(0x8000)
;
boot_move_prog:				;transfer address (temp_addr:0x8000)
        ld	a,ON_RAM        	;ram 0x0000 to 0x7fff setting
        out     (ROM_RAM_SW_PORT),a
	nop
	nop
	jp	0xf200			;62K CP/M bios top address
boot_move_end:

SDCARDからの読み込みは次のようになります。

前もって指定された読み出し指定ブロック(HLレジスタ)をcmdコマンドのワークエリアに設定します。
Ver2かSDHCかの区分は、初期化実行後のワークアエリアr7に保存されているのでこの値をチェックします。

spi_read_go:
	ld	hl,(rw_block_no)
 
        ld      a,(r7)
        bit     6,a
        jp      z,spi_read_SD_ver2
        ld      a,h                   ;SDHC
        ld      (cmd18+03),a
        ld      a,l
        ld      (cmd18+04),a
        jr      spi_read01
spi_read_SD_ver2:                        ;Ver2
        ld      a,h
        ld      (cmd18+02),a
        ld      a,l
        ld      (cmd18+03),a    

まずは、ダミーデータ(0xff)でSPIの同期を取ります。
次に、cmd18コマンドを発行します。レスポンスが0x00であれば、エラーを返します。レスポンスがデータスタート0xfeを返すまで、待ちます。
データスタート0xfeを返したら、hlレジスタに格納先を指定したのち、512byteの受信を行います
ここでは、256byt*2回で受信しています。
受信データは「call resp」で1byteづつ受け取ります。
512byte(256byte*2回)受けとったら、CRC 2byteを受信しますが、ここではCRCは計算していないので、CRCは捨てます。
これで、1データブロックは受信完了となります。
続くデータブロックがあれば、sector_read_loop:に戻り次のブロックを読み込みします。
読み込むブロックが終了したら、0xffのダミーデータを送信します。
その後、終了コマンドcmd12を発行します。
レスポンスで0x00が帰ってきたら終了です。

spi_read01: 

        call    dummy_data
        ld      hl,cmd18
        call    cmd_out
        call    r1_resp
        cp      0x00
        jp      nz,cmd18_err

sector_read_loop:
cmd18_st:
        call    r1_resp                 ;read data start response?
        cp      0xfe                    ;data start byte 0xfe?
        jr nz,  cmd18_st


	ld	hl,(rw_addr)

        ld      b,0x00
cmd18_r:
	call	resp				;read data
	ld	(hl),a
	inc	hl
        djnz    cmd18_r

;	2st dummy read
 
        ld      b,0x00
cmd18_r2st:					;2st 256byte write
	call	resp
	ld	(hl),a
	inc	hl
        djnz    cmd18_r2st

	ld	(rw_addr),hl

        call    resp                    ;crc Skipping read
        call    resp                    ;crc Skipping read

	ld	hl,(rw_block)
	dec	hl
	ld	(rw_block),hl
	ld	a,h			;HL = 0?
	or	l
	jr	nz,sector_read_loop

        ld      d,0xff                  ;dummy data 0xff(cs low)
        call    spi_8bit


       	ld      hl,cmd12		;stop cmd
        call    cmd_out                 ;cmd12 Issue
	ld	d,0xff
	call	spi_8bit
        call    r1_resp
        cp      0x00                    ;response is 0x00 read mode OK?
        jr      nz,cmd18_err

cmd18_wch:
	call	resp
	cp	0x00
	jr	z,cmd18_wch

	call	set_cs

	xor	a
	ret

今回のモニタソースとHEXファイルは次のとおりです。
次回は、SDCARDのファイルシステムの作成を行っていきたいと思います。

; Z80+8251+8255 monitor ver0.72(SPI+boot) by Pinecone 2020/10/09
;
; Z80 cpu
; rom 0000h -- 7fffh
; ram 8000h -- ffffh(MMU)
; clock 8MHz


; 8251 serial communication
; extemal Clock 614.4KHz(4.9152MHz TC74HC4040 1/8 Frequency division)
; Band Rate:38400  8bits 1Stopbits none Parity (81N)

 
; assembler
;  program start 0000H
;  main          0100H
;
; assemblers  ASxxxx and ASlink V5.10
; file name Z80_8251_moni072_spi_boot.asm
; $ asz80 -l -s -o Z80_8251_moni072_spi_boot.asm
; $ aslink -i Z80_8251_moni072_spi_boot
; $ rom-writer TL866-2 plus Z80_8251_moni072_spi_boot.ihx
;

        .z80
 
;;8251 UART 

UARTD	.equ	0x84	;UART DATA REG
UARTC	.equ	0x85	;UART CONTL REG

;;8255 Parallel port

PPIA 		.equ 	0x88		;PPI-A PORT DATA REG
PPIB		.equ	0x89		;PPI-B PORT DATA REG
PPIC		.equ	0x8a		;PPI-C PORT DATA REG
PPICNT		.equ	0x8b		;PPI  CONTL REG

	;OUTPUT-PORT PPIC D7-D5
S_DI 	.equ 7 ;0b10000000 D7
S_CS 	.equ 6 ;0b01000000 D6
S_CLK 	.equ 5 ;0b00100000 D5

	;INPUT-PORT PPIC D0
DO 	.equ 0 ;0b00000001 D0

temp_addr       .equ    0x8000  ;moni move temprary address
ROM_RAM_SW_PORT	.equ	0x80	;D-FF rom/ram sw port
ON_RAM		.equ	0x03	;D0 0:ROM 1:RAM 
ON_ROM		.equ	0x00	;D1 0:LED_ROM 1:RAM_LED

       .area TEST(ABS)
 
        .org    0x0000
        jp      start
 
        .org    0x100

start:				;cold start
                
        ld      sp,0x0000       ;stack pointer set

        call    uart_init       ;serial channel initialize
	call	ppi_init	;Parallel port A initialize
hot_start:

        ld      hl,msg_op       ;opening message display
        call    msgout
prompt: ld      a,">"           ;main  routine
        call    putchar         ;prompt display
        call    getchar
        call    putchar
        cp      "?"             ;help ?
        call    z,help
        cp      "d"             ;memory display?
        call    z,dump
        cp      "m"             ;memory rewrite ?
        call    z,memory
        cp      "l"             ;hex file load?
        call    z,loadhex       
        cp      "j"             ;address jump?
        call    z,jump
        cp	"i"		;i/o register rewite
        call	z,ioreg
        cp	"c"
        call	z,calling	;address call
        cp      "t"
        call    z,trance        ;moni 64Kmemory trance
        cp      "a"
        call    z,spi_card      ;read/write spi sd-card
	cp	"b"		
	call	z,cpm_boot	;cpm system boot
        cp      0x0d
        jr	z,prompt
        cp 	0x00
        jr	z,prompt
        call	cr
        jr      prompt

help:   ld      hl,help_msg     ;help ?
        call    msgout
        ret
cr:
        ld	a,0x0d
        call	putchar
        ret
crret_t:
        call    cr
        ret
trance: 
        call    call_yes_msg
        call    getchar
        cp      "y"
        jr      nz,crret_t
        call    cr

				;ram    0x8000 to 0xffff
        ld      hl,0x0000       ;moni   copy at temp_addr
        ld      de,temp_addr
        ld      bc,prog_end
        ldir
        
        ld      hl,move_prog+temp_addr
        jp      (hl)            ;temprary address jump
;
move_prog:
        ld	a,ON_RAM        ;ram 0x0000 to 0x7fff setting
        out     (ROM_RAM_SW_PORT),a
        ld      hl,temp_addr    ;moni moveing at ram 0x0000 to prog_end
        ld      de,0x0000
        ld      bc,prog_end
        ldir
        ld      hl,go_moni
        jp      (hl)            ;ram monitor jump
;
go_moni:
	call	cr
	ld	hl,ram_msg
	call	msgout
        ld      sp,0x0000       ;stack pointer set
        jp      hot_start

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             ;checksum = checksum + data size
        ld      a,d
        add     b
        ld      d,a
        call    input_hl        ;offset address 2byte
        push    hl
        pop     ix              ;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:
        call    input_l         ;read hex 1byte in Lreg(hex)
        ld      (ix),l          ;offset address < hex data
        inc     ix              ;offset address +1
        ld      a,l
        add     d               ;cheksum Dreg = Dreg + Lreg
        ld      d,a
        djnz    data_hex        ;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
        in      a,(c)
        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
        out     (c),a
        ld      a,0x0d
        call    putchar
        ret

call_yes_msg:
        push    hl
        ld      hl,yes_msg
        call    msgout
        pop     hl
        ret

cpm_boot:
	ld	hl,boot_yes_msg
	call 	msgout   
        call    getchar
        cp      "y"
        ret      nz

	call	cr
	call	cmd17_24_copy		;command rom >> ram area copy
        call    spi_card_init		;sdcard initialize

	ld	hl,0x0000		;CP/M system block 0x0000 start 
	ld	(rw_block_no),hl
	ld	hl,0x000b		;ccp+bdos >0x0b (512byte * 0x000b)
	ld	(rw_block),hl
	ld	hl,0xdc00		;62K cp/m ccp top addr >> 0xdc00
	ld	(rw_addr),hl
	call	spi_read_go
	cp	0x01
	ret	z
	ld	hl,0x000b		;CP/M bios block 0x000b start 
	ld	(rw_block_no),hl
	ld	hl,0x0004		;bios >0x04 (512byte * 4 bios area)
	ld	(rw_block),hl
	ld	hl,0xf200		;62K cp/m bios top addr >> 0xf200
	ld	(rw_addr),hl
	call	spi_read_go
	cp	0x01
	ret	z
	ld	hl,cpm_boot_msg
	call	msgout

        ld      hl,boot_move_prog       ;64K swiching ram progrum  copy at temp_addr
        ld      de,temp_addr		;transfer boot_move_prog ~ boot_move_end >>temp_addr(0x8000)
        ld      bc,boot_move_end
        ldir
        
        ld      hl,temp_addr
        jp      (hl)            	;temprary address jump(0x8000)
;
boot_move_prog:				;transfer address (temp_addr:0x8000)
        ld	a,ON_RAM        	;ram 0x0000 to 0x7fff setting
        out     (ROM_RAM_SW_PORT),a
	nop
	nop
	jp	0xf200			;62K CP/M bios top address
boot_move_end:

spi_read_go:
	ld	hl,(rw_block_no)
 
        ld      a,(r7)
        bit     6,a
        jp      z,spi_read_SD_ver2
        ld      a,h                   ;SDHC
        ld      (cmd18+03),a
        ld      a,l
        ld      (cmd18+04),a
        jr      spi_read01
spi_read_SD_ver2:                        ;Ver2
        ld      a,h
        ld      (cmd18+02),a
        ld      a,l
        ld      (cmd18+03),a    


spi_read01: 

        call    dummy_data
        ld      hl,cmd18
        call    cmd_out
        call    r1_resp
        cp      0x00
        jp      nz,cmd18_err

sector_read_loop:
cmd18_st:
        call    r1_resp                 ;read data start response?
        cp      0xfe                    ;data start byte 0xfe?
        jr nz,  cmd18_st


	ld	hl,(rw_addr)

        ld      b,0x00
cmd18_r:
	call	resp				;read data
	ld	(hl),a
	inc	hl
        djnz    cmd18_r

;	2st dummy read
 
        ld      b,0x00
cmd18_r2st:					;2st 256byte write
	call	resp
	ld	(hl),a
	inc	hl
        djnz    cmd18_r2st

	ld	(rw_addr),hl

        call    resp                    ;crc Skipping read
        call    resp                    ;crc Skipping read

	ld	hl,(rw_block)
	dec	hl
	ld	(rw_block),hl
	ld	a,h			;HL = 0?
	or	l
	jr	nz,sector_read_loop

        ld      d,0xff                  ;dummy data 0xff(cs low)
        call    spi_8bit


       	ld      hl,cmd12		;stop cmd
        call    cmd_out                 ;cmd12 Issue
	ld	d,0xff
	call	spi_8bit
        call    r1_resp
        cp      0x00                    ;response is 0x00 read mode OK?
        jr      nz,cmd18_err

cmd18_wch:
	call	resp
	cp	0x00
	jr	z,cmd18_wch

	call	set_cs

	xor	a
	ret


;; 1 sector write 


cmd18_err: 
cmd18_err2:
	ld	hl,cmd25_err_msg
	call    msgout
	call	set_cs
	ld	a,0x01
	ret


spi_card:
        call    getchar
        cp      "i"
        call    z,spi_init
        cp      "r"
        call    z,spi_read
        cp      "w"
        call    z,spi_write
        ret

spi_read:
        ld      hl,read_block_no_msg
        call    msgout
        call    input_hl
        cp      0x00
        jr      z,spi_read1
        call    cr
        xor   a
        ret
spi_read1:
        ld      a,(r7)
        bit     6,a
        jp      z,read_SD_ver2
        ld      a,h                    ;SDHC
        ld      (cmd17+03),a
        ld      a,l
        ld      (cmd17+04),a
        jr      spi_read2
read_SD_ver2:
        ld      a,h                    ;Ver2
        ld      (cmd17+02),a
        ld      a,l
        ld      (cmd17+03),a
spi_read2:
        ld      hl,save_addr_msg
        call    msgout
        call    input_hl
        cp      0x00
        jr      z,cmd17_out
        call    cr
        xor     a
        ret

cmd17_out:
        call    call_yes_msg
        call    getchar
        cp      "y"
        jp      nz,spi_ret

        push    hl
        call    dummy_data              ;dummy data(0xff) out
        ld      hl,cmd17
        call    cmd_out                 ;cmd17 Issue
        call    r1_resp
        cp      0x00                    ;response is 0x00 read mode OK?
        jr      nz,cmd17_err
cmd17_st:
        call    r1_resp                 ;read data start response?
        cp      0xfe                    ;data start byte 0xfe?
        jr nz,  cmd17_st
        ld      b,0x00                  ;read data size 256byte
        pop        hl           ;read data buff address
cmd17_r:
        call    resp                    ;read data
        ld      (hl),a
        inc     hl
        djnz    cmd17_r

        ld      b,0x00

cmd17_r2:
        call    resp
        ld      (hl),a                  ;read data
        inc     hl
        djnz    cmd17_r2

        call    resp                    ;crc Skipping read
        call    resp                    ;crc Skipping read
        ld      d,0xff                  ;dummy data 0xff(cs low)
        call    spi_8bit

                ;memory dump address

        ld      bc,0x0200
        sbc     hl,bc
                                ;memory dump 512b
        ld      a,0x0d
        call    putchar
        
  
        call    hl_disp256              ;256bye dump 
        call    putchar
        call    hl_disp256              ;256bye dump
        call    putchar

        call	set_cs		          ;CS="H"
        xor        a
        ret

cmd17_err:
	pop	hl
	ld	hl,cmd17_err_msg
	call    msgout
        call	set_cs		          ;CS="H"
	ret

hl_disp256:
        push    bc
        ld      b,0x00                  ;dump data size 256bye
        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
hl_disp256_loop:
        ld      a,(HL)                  ;dump addres data (HL)
        inc     HL
        call    hex_a_disp
        ld      a,b
        cp      0x01                    ;end dump size?
        jr      z,hl_disp256_loop1
        ld      a,b
        and     0x0f
        cp      0x01                    ;0x?0-0x?f is 0x01(1line disp end?)
        jr      z,hl_disp256_cr
        ld      a," "                   ;space Insert
        call    putchar
        jr      hl_disp256_loop1
hl_disp256_cr:
        ld      a,0x0d
        call    putchar
        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
hl_disp256_loop1:

        djnz    hl_disp256_loop

        ld      a,0x0d
        call    putchar
        pop     bc
        ret

spi_write:

        ld      hl,write_block_no_msg
        call    msgout
        call    input_hl
        cp      0x00
        jr      z,spi_write1
        call    cr
        xor     a
        ret
spi_write1:
        ld      a,(r7)
        bit     6,a
        jp      z,write_SD_ver2
        ld      a,h                   ;SDHC
        ld      (cmd24+03),a
        ld      a,l
        ld      (cmd24+04),a
        jr      spi_write2
write_SD_ver2:                        ;Ver2
        ld      a,h
        ld      (cmd24+02),a
        ld      a,l
        ld      (cmd24+03),a    


spi_write2:
        ld      hl,write_addr_msg
        call    msgout
        call    input_hl
        cp      0x00
        jr      z,cmd24_out
        call    cr
        xor     a
        ret

cmd24_out:       
        call    call_yes_msg
        call    getchar
        cp      "y"
        jp      nz,spi_ret
        push    hl
        call    dummy_data
        ld      hl,cmd24
        call    cmd_out
        call    r1_resp
        cp      0x00
        jp      nz,cmd24_err
        ld      d,0xfe
        call    spi_8bit
        pop     hl
        ld      b,0x00
cmd24_w:
        ld      d,(hl)
        inc     hl
        call    spi_8bit
        djnz    cmd24_w
 
        ld      b,0x00
cmd24_w2:
        ld      d,(hl)
        inc     hl  
        call    spi_8bit
        djnz    cmd24_w2
        ld      d,0xff
        call    spi_8bit    ;crc
        call    spi_8bit    ;crc
        call    r1_resp
        and     0x0f
        cp      0x05
        jr      nz,cmd24_err2
cmd24_wch:
        call    resp
        cp      0x00
        jr      z,cmd24_wch
        call    dummy_data
 
        ld      bc,0x0200
        sbc     hl,bc

                                ;memory dump 512b
        ld      a,0x0d
        call    putchar
        
  
        call    hl_disp256              ;256bye dump 
        call    putchar
        call    hl_disp256              ;256bye dump
        call    putchar

        call	set_cs		          ;CS="H"
        xor     a
        ret

cmd24_err:
	pop	hl
cmd24_err2:
	ld	hl,cmd24_err_msg
	call    msgout
        call	set_cs		          ;CS="H"
	ret



spi_init:
	call	cmd17_24_copy

        ld      hl,spi_init_msg
        call    msgout
        call    call_yes_msg
        call    getchar
        cp      "y"
        jp      nz,spi_ret
        call    cr
        call    spi_card_init
        ld      hl,ok_msg
        call    msgout
        ret

cmd17_24_copy:
	ld	b,0x06
	ld	hl,m_cmd17
	ld	de,cmd17
cmd17_copy:
	ld	a,(HL)
	ld	(DE),a
	inc	hl
	inc	de
	djnz	cmd17_copy

	ld	b,0x06
	ld	hl,m_cmd24
	ld	de,cmd24
cmd24_copy:
	ld	a,(HL)
	ld	(DE),a
	inc	hl
	inc	de
	djnz	cmd24_copy

	ld	b,0x06
	ld	hl,m_cmd18
	ld	de,cmd18
cmd18_copy:
	ld	a,(HL)
	ld	(DE),a
	inc	hl
	inc	de
	djnz	cmd18_copy

	ld	b,0x06
	ld	hl,m_cmd12
	ld	de,cmd12
cmd12_copy:
	ld	a,(HL)
	ld	(DE),a
	inc	hl
	inc	de
	djnz	cmd12_copy
	ret

spi_card_init:
        xor     a
        set     S_CS,a          ;CS="H" 
        set     S_DI,a          ;DI="H"
        out    (PPIC),a
        ld      b,80            ;80 clok output
        call    loopspii

        xor     a
        out     (PPIC),a     ;CS="L" DI="L" CLK="L"

        call    cmd0_out
        cp      0x01
        jp      nz,init_err
        call    cmd8_out
        cp      0x01
        jp      nz,init_err
        call    cmd55_out
        cp      0x01
        jp      nz,init_err
        call    acmd41_out
        call    cmd58_out
        ld      a,(r7)
        bit     7,a
        jp      z,init_err
        bit     6,a
        jr      z,SD_ver2
        ld      hl,sdhc_msg
init_msg:
        call    msgout
	call	set_cs
        ret
SD_ver2:
        ld      hl,sd_ver2_msg
	call	set_cs
        jr      init_msg

cmd0_out: 
        ld      hl,cmd0
        call    cmd_out
        call    r1_resp
        ret


        
cmd8_out:
        call    dummy_data
        ld      hl,cmd8
        call    cmd_out
        call    r1_resp
        cp      0x01
        ret     nz
        ld      b,4
        ld      hl,r7
cmd8_r:
        call    resp
        ld      (hl),a
        inc     hl
        djnz    cmd8_r
        ld      a,0x01
        ret


cmd55_out:
        call    dummy_data
        ld      hl,cmd55
        call    cmd_out
        call    r1_resp
        ret

acmd41_out:
        call    dummy_data
        ld      hl,acmd41               ;sd-card Initialize
        call    cmd_out
        call    r1_resp
        cp      0x00
        ret     z
        call    cmd55_out
        jr      acmd41_out

spi_ret:
        call    cr
        ret

init_err:
        ld      hl,spi_init_err_msg
        call    msgout
        call    cr
        jp      start      


cmd58_out:
        call    dummy_data
        ld      hl,cmd58
        call    cmd_out
        call    r1_resp
        push    af
        ld      b,4
        ld      hl,r7
cmd58_r:
        call    resp
        ld      (hl),a
        inc     hl
        djnz    cmd58_r
        pop     af
        ret

dummy_data:
        xor     a
        set     S_CS,a          ;CS="H"
        set     S_DI,a          ;DI="H"
        out    (PPIC),a
        ld      b,8            ;1clok output
        call    loopspii
        xor     a
	set     S_CS,a          ;CS="H"	
	set	S_DI,a		;DI="H"
        out    (PPIC),a
        ret

loopspii:
        res     S_CLK,a         ;CLK    L
        out    (PPIC),a
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop

        set     S_CLK,a         ;CLK    H
        out    (PPIC),a
        nop
        nop
        nop
        nop
        nop
        djnz    loopspii
        ret
r1_resp:
        call    resp
        cp      0xff
        jr      z,r1_resp
        ret

resp:
        ld      d,0xff  
        call    spi_8bit
        ld      a,e
        ret

cmd_out:                        ;command out
        push    hl
        push    bc
        ld      b,0x06          ;command line word count
cmd_out1:
        ld      d,(hl)          ;command line area
        call    spi_8bit
        inc     hl
        djnz    cmd_out1
        pop     bc
        pop     hl
        ret

spi_8bit:                       ;outdata Dreg,inputdata Ereg
        push    bc
        ld      c,0x00
        ld      b,0x08        
loopspi:
        xor     a
        rlc     d
        rra
        res     S_CLK,a         ;CLK    L
        out    (PPIC),a
        nop
        nop
        nop
        nop
        nop
        nop
        set     S_CLK,a         ;CLK    H
        out    (PPIC),a
        in     a,(PPIC)
        rrca
        rl      e
        djnz    loopspi
        xor     a
	set	S_DI,a		;DI  H
        out    (PPIC),a
        pop     bc
        ret

set_cs:
	xor	a
	set     S_CS,a          ;CS="H"
	set	S_DI,a		;DI="H"
	out    (PPIC),a
        ret


input_l:                        ;input Lreg hex (1byte)
        push    bc
        ld      b,0x02
        jr      input_loop

input_hl:                       ;input HLreg hex (2byte)
        push    bc
        ld      b,0x04
input_loop:
        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


getchar:
	in	a,(UARTC)	;Rx status in
	bit	1,a		;RxRdy ?
	jr	z,getchar
	in	a,(UARTD)	;Rx data in
	ret

putchar:push	af
putchar01:
	in	a,(UARTC)	;Tx status in
	bit	0,a		;TxRdy ?
	jr	z,putchar01
	pop	af
	out	(UARTD),a	;Tx data out
	ret

uart_init:
	xor	a
	ld	b,3
uartinit01:
	out	(UARTC),a		;dummy command
	djnz	uartinit01
	ld	a,0b01000000		;reset commmand 
	out	(UARTC),a
	ld	a,0b01001110		;1 stop bit,Parity disble,8char,1/16
	out	(UARTC),a
	ld	a,0b00110111		;RxEnable,TxEnable,RTS=0,DTR=0
	out	(UARTC),a
	ret

ppi_init:
	ld	a,0b10000001		;PPIA mode0,output PPIB mode0,output
	out	(PPICNT),a		;PPIC C7-C4 output,C3-C0 input
	ret	




msg_op: .str    "Monitor Z80+8251+8255 CPU ver0.72(SPI+boot) by Pinecone 2020/10/09"
        .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
        .str    "b  CP/M system boot at SDCARD"
        .db     0x0d
       	.str  	"ai spi(sd-card) Initialization"
        .db   	0x0d
        .str  	"ar spi(sd-card) read  (512byte/block)  0x0000-0xffff set"
        .db  	0x0d
        .str 	"aw spi(sd-card) write (512byte/block)  0x0000-0xffff set"
        .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
cmd0_msg:
        .str    "CMD0:"
        .db     0x00
cmd8_msg:
        .str    "CMD8:"
        .db     0x00
cmd55_msg:
        .str    "CMD55:"
        .db     0x00
acmd41_msg:
        .str    "ACMD41:"
        .db     0x00
cmd58_msg:
        .str    "CMD58:"
        .db     0x00
yes_msg:
        .str    " Yes:"
        .db     0x00
ok_msg:
        .str    "OK"
        .db     0x0d
        .db     0x00
err_msg:
        .str    "ERR"
        .db     0x0d
        .db     0x00
read_block_no_msg:
        .str    " read block No:"
        .db     0x00
write_block_no_msg:
        .str    " write block No:"
        .db     0x00
save_addr_msg:
        .str    " save addr:"
        .db     0x00
write_addr_msg:
        .str    " write addr:"
        .db     0x00
spi_init_err_msg:
        .str    "Spi Init Err"
        .db     0x0d
        .db     0x00    
cmd17_err_msg:
        .str    "cmd17 Err"
        .db     0x0d
        .db     0x00  
cmd24_err_msg:
        .str    "cmd24 Err"
        .db     0x0d
        .db     0x00
cmd25_err_msg:
        .str    "cmd25 Err"
        .db     0x0d
        .db     0x00 
sdhc_msg:
        .str    ":SDHC"
        .db     0x0d
        .db     0x00    
sd_ver2_msg:
        .str    ":SD Ver2"
        .db     0x0d
        .db     0x00
spi_init_msg:
        .str    " spi(sd-card) Initialize :"
        .db     0x00 
ram_msg:
	.str	"RAM area switching monitor"
	.db     0x0d
	.db	0x00
boot_yes_msg:
	.db	0x0d
	.str	"CP/M boot ? yes:"
	.db	0x00
cpm_boot_msg:
	.str	"CP/M boot ...."
	.db     0x0d
	.db	0x00
cmd0:                           ;;48bit(6byte) Fixed length 
        .db     0x40            ;;command index 
        .db     0x00            ;;argument
        .db     0x00            ;;argument
        .db     0x00            ;;argument
        .db     0x00            ;;argument
        .db     0x95            ;;CRC  
;cmd1:
;       .db     0x41            ;;command init
;       .db     0x00
;       .db     0x00
;       .db     0x00
;       .db     0x00
;       .db     0xf9            ;;CRC
cmd8:
        .db     0x48
        .db     0x00
        .db     0x00
        .db     0x01
        .db     0xaa
        .db     0x87
acmd41:
        .db     0x69
        .db     0x40
        .db     0xff
        .db     0x80
        .db     0x00
        .db     0xff
cmd58:
        .db     0x7a
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0xff

cmd55:
        .db     0x77
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0xff

cmd16:
        .db     0x50
        .db     0x00
        .db     0x00
        .db     0x02
        .db     0x00
        .db     0xff
m_cmd17:
        .db     0x51
        .db     0x00
        .db     0x00
        .db     0x02
        .db     0x00
        .db     0xff
m_cmd18:
        .db     0x52
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0xff
m_cmd12:
        .db     0x4c
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0xff
m_cmd24:
        .db     0x58
        .db     0x00
        .db     0x00
        .db     0x02
        .db     0x00
        .db     0xff
prog_end:
	.org	0xff00
cmd17:
        .db     0x51
        .db     0x00
        .db     0x00
        .db     0x02
        .db     0x00
        .db     0xff
cmd18:
        .db     0x52
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0xff
cmd12:
        .db     0x4c
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0x00
        .db     0xff

cmd24:
        .db     0x58
        .db     0x00
        .db     0x00
        .db     0x02
        .db     0x00
        .db     0xff

r7:
        .ds     4 
rw_block_no:
	.ds	2
rw_block:
	.ds	2
rw_addr:
	.ds	2  

HEXファイル

:03000000C3000139
:20010000310000CD0808CD1C08212108CDEA073E3ECDFD07CDF407CDFD07FE3FCC5901FE91
:2001200064CC9002FE6DCCA602FE6CCCFD01FE6ACCA801FE69CCDA02FE63CCD201FE74CCC0
:200140006A01FE61CC0904FE62CC1903FE0D28BFFE0028BBCD600118B6216508CDEA07C9D0
:200160003E0DCDFD07C9CD6001C9CD1003CDF407FE7920F2CD6001210000110080012F0B57
:20018000EDB0218681E93E03D380210080110000012F0BEDB0219901E9CD600121B50ACD14
:2001A000EA07310000C309013E20CDFD07CD5A07FE00201A3E20CDFD073E79CDFD073E3A8C
:2001C000CDFD07CDF407FE792004CD6001E9CD6001C93E20CDFD07CD5A07FE0020F03E2014
:2001E000CDFD073E79CDFD073E3ACDFD07CDF407FE7920DACD600111FC01D5E9C9CD37025B
:20020000FEFF2819FE0120F53E0DCDFD073E4FCDFD073E4BCDFD073E0DCDFD07C93E0DCDBB
:20022000FD073E45CDFD073E52CDFD073E52CDFD073E0DCDFD07C93E0DCDFD071600CDF4CC
:2002400007FE3A2048CD5507457A8057CD5A07E5DDE17A858457CD55077DFE002020CD5587
:2002600007DD7500DD237D825710F3CD55077A85FE002019CDF407FE0A20123E00C9FE0165
:20028000200BCD55077DFEFF20033E01C93EFFC93E20CDFD07CD5A07FE002803FDE5E1CD49
:2002A0008007E5FDE1C93E20CDFD07CD5A07FE0028063E0DCDFD07C93E20CDFD077ECDB192
:2002C000073E20CDFD07E5CD5507FE002803E1AFC94DE1713E0DCDFD07C93E20CDFD07CDD8
:2002E0005507FE0028063E0DCDFD07C93E20CDFD0706004DED78CDB1073E20CDFD07CD55D4
:2003000007FE002802AFC97DED793E0DCDFD07C9E521110ACDEA07E1C921D10ACDEA07CD5E
:20032000F407FE79C0CD6001CDE705CD2006210000221CFF210B00221EFF2100DC2220FFAA
:20034000CD7C03FE01C8210B00221CFF210400221EFF2100F22220FFCD7C03FE01C821E352
:200360000ACDEA07217303110080017C03EDB0210080E93E03D3800000C300F22A1CFF3A1E
:2003800018FFCB77CA91037C3209FF7D320AFF18087C3208FF7D3209FFCDDF062106FFCD07
:2003A0001A07CD0B07FE00C2FD03CD0B07FEFE20F92A20FF0600CD1307772310F90600CDDD
:2003C0001307772310F92220FFCD1307CD13072A1EFF2B221EFF7CB520D016FFCD2807214D
:2003E0000CFFCD1A0716FFCD2807CD0B07FE00200CCD1307FE0028F9CD4D07AFC9217E0AA2
:20040000CDEA07CD4D073E01C9CDF407FE69CCC605FE72CC1C04FE77CC1205C921200ACD9A
:20042000EA07CD5A07FE002805CD6001AFC93A18FFCB77CA40047C3203FF7D3204FF1808A9
:200440007C3202FF7D3203FF21410ACDEA07CD5A07FE002805CD6001AFC9CD1003CDF4076B
:20046000FE79C2B406E5CDDF062100FFCD1A07CD0B07FE002040CD0B07FEFE20F90600E1CC
:20048000CD1307772310F90600CD1307772310F9CD1307CD130716FFCD2807010002ED4231
:2004A0003E0DCDFD07CDC104CDFD07CDC104CDFD07CD4D07AFC9E121680ACDEA07CD4D076E
:2004C000C9C50600E521B809CDEA07E17CCDB1077DCDB1073E20CDFD07CDFD077E23CDB100
:2004E0000778FE01282378E60FFE0128073E20CDFD0718153E0DCDFD077CCDB1077DCDB124
:20050000073E20CDFD07CDFD0710D13E0DCDFD07C1C921300ACDEA07CD5A07FE002805CD0E
:200520006001AFC93A18FFCB77CA36057C3215FF7D3216FF18087C3214FF7D3215FF214DB2
:200540000ACDEA07CD5A07FE002805CD6001AFC9CD1003CDF407FE79C2B406E5CDDF062181
:2005600012FFCD1A07CD0B07FE00C2BB0516FECD2807E106005623CD280710F90600562329
:20058000CD280710F916FFCD2807CD2807CD0B07E60FFE052026CD1307FE0028F9CDDF0674
:2005A000010002ED423E0DCDFD07CDC104CDFD07CDC104CDFD07CD4D07AFC9E121730ACD42
:2005C000EA07CD4D07C9CDE705219A0ACDEA07CD1003CDF407FE79C2B406CD6001CD200648
:2005E00021170ACDEA07C9060621170B1100FF7E12231310FA060621290B1112FF7E1223CD
:200600001310FA0606211D0B1106FF7E12231310FA060621230B110CFF7E12231310FAC972
:20062000AFCBF7CBFFD38A0650CDF306AFD38ACD6B06FE01C2B806CD7506FE01C2B806CDA9
:200640009306FE01C2B806CDA006CDC4063A18FFCB7FCAB806CB77280A21890ACDEA07CDA2
:200660004D07C921900ACD4D0718F121F30ACD1A07CD0B07C9CDDF0621F90ACD1A07CD0B28
:2006800007FE01C006042118FFCD1307772310F93E01C9CDDF06210B0BCD1A07CD0B07C941
:2006A000CDDF0621FF0ACD1A07CD0B07FE00C8CD930618ECCD6001C9215A0ACDEA07CD60FA
:2006C00001C30001CDDF0621050BCD1A07CD0B07F506042118FFCD1307772310F9F1C9AF7B
:2006E000CBF7CBFFD38A0608CDF306AFCBF7CBFFD38AC9CBAFD38A0000000000000000CB3A
:20070000EFD38A000000000010E9C9CD1307FEFF28F9C916FFCD28077BC9E5C5060656CDCF
:2007200028072310F9C1E1C9C50E000608AFCB021FCBAFD38A000000000000CBEFD38ADBAE
:200740008A0FCB1310E7AFCBFFD38AC1C9AFCBF7CBFFD38AC9C506021803C5060421000092
:20076000180429292929CDF407CDFD07CDC407FEFF2809E60FB56F10E9C1AFC93EFFC1C948
:200780003E0DCDFD07E521B809CDEA07E17CCDB1077DCDB1073E20CDFD07CDFD0706107E40
:2007A00023CDB1073E20CDFD0710F43E0DCDFD07C9F50F0F0F0FCDDE07CDFD07F1CDDE0722
:2007C000CDFD07C9D6303813FE0A380ED611FE063806D620FE063003C60AC93EFFC9E60FF6
:2007E000FE0A3803C637C9C630C97EFE00C8CDFD072318F6DB85CB4F28FADB84C9F5DB85D2
:20080000CB4728FAF1D384C9AF0603D38510FC3E40D3853E4ED3853E37D385C93E81D38B0A
:20082000C94D6F6E69746F72205A38302B383235312B383235352043505520766572302E58
:200840003732285350492B626F6F74292062792050696E65636F6E6520323032302F313053
:200860002F30390D000D3F202048656C700D6420206D656D6F72792064756D700D6D2020E4
:200880006D656D6F7279206368616E676520202061646472657373206F6C64206E65770D1D
:2008A0006C20206865782066696C65206C6F61640D6A20206A756D700D692020692F6F2077
:2008C000726567697374657220202020692F6F2D61646472657373206F6C64206E65770D43
:2008E00063202063616C6C0D74202072616D2061726561207472616E6365206D6F6E69741B
:200900006F72206A756D700D62202043502F4D2073797374656D20626F6F7420617420535B
:2009200044434152440D6169207370692873642D636172642920496E697469616C697A61F9
:2009400074696F6E0D6172207370692873642D636172642920726561642020283531326284
:200960007974652F626C6F636B2920203078303030302D307866666666207365740D61775C
:20098000207370692873642D63617264292077726974652028353132627974652F626C6FB1
:2009A000636B2920203078303030302D307866666666207365740D006164647220202B307C
:2009C000202B31202B32202B33202B34202B35202B36202B37202B38202B39202B41202BC0
:2009E00042202B43202B44202B45202B460D00434D44303A00434D44383A00434D443535A8
:200A00003A0041434D4434313A00434D4435383A00205965733A004F4B0D004552520D0045
:200A2000207265616420626C6F636B204E6F3A0020777269746520626C6F636B204E6F3A2B
:200A400000207361766520616464723A0020777269746520616464723A0053706920496E8F
:200A60006974204572720D00636D643137204572720D00636D643234204572720D00636D91
:200A8000643235204572720D003A534448430D003A534420566572320D0020737069287368
:200AA000642D636172642920496E697469616C697A65203A0052414D2061726561207377B3
:200AC00069746368696E67206D6F6E69746F720D000D43502F4D20626F6F74203F207965AE
:200AE000733A0043502F4D20626F6F74202E2E2E2E0D0040000000009548000001AA8769C9
:200B000040FF8000FF7A00000000FF7700000000FF5000000200FF5100000200FF52000033
:0F0B20000000FF4C00000000FF5800000200FF23
:18FF00005100000200FF5200000000FF4C00000000FF5800000200FFA2
:00000001FF
おすすめの記事