前回で、boot対応のモニタができましたので、早速biosを作成して、CP/Mをブートしたい思います。
CP/Mファイルシステムは、「Z80に萌えたい CP/M ディスク容量拡張その2」を参考に、SDCARDに焼きこみます。
(128トラック/64セクタ/4ドライブ)
次にCP/Mシステムですが、CCP+BDOS+BIOSで構成されBIOSは今回製作します。CCP+BDOSは下記手順で別途入手する必要があります。
以前「Z80(TMPZ84C015)に萌えたい。CPM BIOS編1」で 紹介したサイトの「Digital Research Binary Files」「OPERATING SYSTEMS」から CP/M 2.2 のCP/M2.2 BINARY をダウンロードします。cpm22-b.zipというファイルでダウロードされますので、解凍します。解凍したフォルダーの中から CPM.SYSというファイルを使用します。
このCPM.SYSというファイルにはCCPとBDOSとBIOSが一緒にパッケージされています。このCPM.SYSのメモリサイズエリアは、62K CP/Mで、ロードアドレスは、0xDC00となっています。
作成したモニタではSYS形式のファイルは読み込めないので、一旦hexファイルに変換します。
HEXコンバートを行うソフトですが今旬なPythonを使うことにします。
Pythonで記述されたIntelHexというライブラリーがあり、その中にオブジェクトをHEXコードに変換する実行コマンドが含まれています。
では早速インストールしたいと思います。(今まで通りRaspberryPiのRaspbianでの環境で確認しています。)
ライブラリのインストール
pythonのパッケージ管理コマンドのpipコマンドでインストールします。
$ sudo pip install intelhex
cpm.sysをHEXファイルに変換します。ロードアドレスは。前述のように0xdc00とします。
コマンド名は bin2hex.py オフセットアドレス、入力ファイル、出力ファイルを順に指定します。ここでは出力ファイル名としてcpm.hexとしました。
$ sudo python /usr/local/bin/bin2hex.py --offset=0xdc00 CPM.SYS cpm.hex
モニタのtコマンドで64Kメモリに切り替えてから、lコマンドで先ほどのcpm.hexを読み込みます。0xdc00以降にccp、bdos、biosと書き込まれます。
ただしbiosは、作成したものを上書きします。
BIOSをアセンブルします。(文末にソース・HEXファイルがあります)
ここでは、ファイル名をHD64180_bios_sk0_64_128_4.asmとしました。
作成されたHD64180_bios_sk0_64_128_4.ihxをモニタlコマンドで読み込みbiosを上書きします。
今の状況では、メモリ上でCP/Mシステムが構成されていますが、これをSDCARDのトラック0のシステム領域に書き込みします。
これは書き込みソフトHD64180_cpm_rw(文末にソース・HEXファイルがあります)を使用します。
HD64180_cpm_rw.ihxを同じくlコマンドで読み込みます。
jコマンドで 0x8000へジャンプします。
>j 8000 y:
:SDHC
read >> r :write >> w CP/M go >> g key in:
SDCARDにシステム(CCP+BDOS)書き込みします。
wキーでwriteを選択し、0000ブロックから000bブロック、アドレスdc00より書き込み指定し、yキーで書き込み実行します。
read/write start block No:0000
read/write block:000b
read/write addr:dc00
Yes: read/write ok!
続いてBIOSを書き込みます。
000bブロックから 0004ブロック、アドレスf200より書き込みしてします。
>j 8000 y:
:SDHC
read >> r :write >> w CP/M go >> g key in:w
read/write start block No:000b
read/write block:0004
read/write addr:f200
Yes: read/write ok!
>
今度は、モニタのbキーでCP/Mシステムをbootします。
>b
CP/M boot ? yes:
:SDHC
CP/M boot ....
:SDHC
62K CP/M VERS 2.2
A>dir
A: ASM COM : DDT COM : DISKDEF LIB : DUMP COM
A: ED COM : LOAD COM : MAC COM : PIP COM
A: STAT COM : SUBMIT COM : XSUB COM : Z80 LIB
A>
ちゃんとブートしたみたいです^^
以下 BIOSのソースとHEXファイルです。その後にKL5C80_cpm_rwのソースとHEXファイルを添付しています。
BIOSのソース
;;HD64180 (HD64180+8255) 62K cp/m V2.2 BIOS 64sector*128track 4disk by Pinecone 2020/12/22
; HD64180 cpu
; ram 0000h -- ffffh
; clock 8MHz
; HD64180 serial communication
; extemal Clock 307.255KHz(4.9152MHz TC74HC4040 1/16 Frequency division)
; Band Rate:19200 8bits 1Stopbits none Parity (81N)
; assembler
; program start 0xF200
; main 0xF200
;
; assemblers ASxxxx and ASlink V5.10
; file name HD64180_bios_sk0_64_128_4.asm
; $ asz80 -l -s -o HD64180_bios_sk0_64_128_4.asm
; $ aslink -i HD64180_bios_sk0_64_128_4
; $ HD64180_moni72 l command Hex load jump 0xf200
.hd64
VERS .equ 22 ;Version 2.2
MSIZE .equ 62 ;CP/M memory size
BIAS .equ (MSIZE-20)*1024
CCP .equ 0x3400 + BIAS ;base of cpm console processor
BDOS .equ 0x806 + CCP ;basic dos
BIOS .equ CCP + 0x1600 ;BIOS
IOBYTE .equ 0x0003 ;intel i/o byte
cpmboot .equ CCP
TRACK_OFFSET .equ 1 ;cp/m used tracks number
;
TDR0 .equ 0x06 ;ch0 serial
RDR0 .equ 0x08
STAT0 .equ 0x04
CNTLA0 .equ 0x00
CNTLB0 .equ 0x02
;TDR1 .equ 0x07 ;ch1 serial
;RDR1 .equ 0x09
;STAT1 .equ 0x04
;CNTLA1 .equ 0x01
;CNTLB1 .equ 0x03
CBR .equ 0x38 ;i/o setting reg
BBR .equ 0x39
CBAR .equ 0x3a
;CMR .equ 0x1e
;CCR .equ 0x1f
DCNTL .equ 0x32
;8255 Parallel port
PPIA .equ 0x80 ;PPI-A PORT DATA REG
PPIB .equ 0x81 ;PPI-B PORT DATA REG
PPIC .equ 0x82 ;PPI-C PORT DATA REG
PPICNT .equ 0x83 ;PPI CONTL REG
;; 8255 pio SPI OUT-PORT PIO-C D7-D5
S_DI .equ 7 ;0b10000000 D7
S_CS .equ 6 ;0b01000000 D6
S_CLK .equ 5 ;0b00100000 D5
;; 8255 pio SPI OUT-PORT PIO-C D0
DO .equ 0 ;0b00000001 D0
BUFF_DEFAULT_ADDR .equ 0x80 ;default buff address
DISKS_MAX .equ 4 ;max disk
DISK_TRACK .equ 128 ;1 disk>> 128 track
DISK_SECTOR .equ 64 ;1 track>> 64 sector
.area BIOS(ABS)
.org BIOS
;; jump vector for indiviual routines
;
jp boot ;cold start
wboote: jp wboot ;warm start
jp const ;console status
jp conin ;console character in
jp conout ;console character out
jp list ;list character out
jp punch ;punch character out
jp reader ;reader character out
jp home ;move head to home position
jp seldsk ;select disk
jp settrk ;set track number
jp setsec ;set sector number
jp setdma ;set dma address
jp read ;read disk
jp write ;write disk
jp listst ;return list status
jp sectran ;sector translate
;;
;; Original DISKS 128 track 64 sector 4 disk
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; disk Parameter header for disk 00
dpbase:
DPE0: .dw XLT0,0x0000 ;TRANSLATE TABLE
.dw 0x0000,0x0000 ;SCRATCH AREA
.dw DIRBUF,DPB0 ;DIR BUFF,PARM BLOCK
.dw CSV0,ALV0 ;CHECK, ALLOC VECTORS
DPE1: .dw XLT1,0x0000 ;TRANSLATE TABLE
.dw 0x0000,0x0000 ;SCRATCH AREA
.dw DIRBUF,DPB1 ;DIR BUFF,PARM BLOCK
.dw CSV1,ALV1 ;CHECK, ALLOC VECTORS
DPE2: .dw XLT2,0x0000 ;TRANSLATE TABLE
.dw 0x0000,0x0000 ;SCRATCH AREA
.dw DIRBUF,DPB2 ;DIR BUFF,PARM BLOCK
.dw CSV2,ALV2 ;CHECK, ALLOC VECTORS
DPE3: .dw XLT3,0x0000 ;TRANSLATE TABLE
.dw 0x0000,0x0000 ;SCRATCH AREA
.dw DIRBUF,DPB3 ;DIR BUFF,PARM BLOCK
.dw CSV3,ALV3 ;CHECK, ALLOC VECTORS
;
; sector translate vector
; DISKDEF 0,1,64,,2048,508,128,128,1
dpblk: ;disk parameter block, common to all disks
DPB0: ;DISK PARM BLOCK
.dw 64 ;SEC PER TRACK
.db 4 ;BLOCK SHIFT
.db 15 ;BLOCK MASK
.db 0 ;EXTNT MASK
.dw 507 ;DISK SIZE-1
.dw 127 ;DIRECTORY MAX
.db 192 ;ALLOC0
.db 0 ;ALLOC1
.dw 32 ;CHECK SIZE
.dw 1 ;OFFSET
XLT0 .equ 0 ;NO XLATE TABLE
DPB1 .equ DPB0 ;.equIVALENT PARAMETERS
XLT1 .equ XLT0 ;SAME TRANSLATE TABLE
;; DISKDEF 2,0
DPB2 .equ DPB0 ;.equIVALENT PARAMETERS
XLT2 .equ XLT0 ;SAME TRANSLATE TABLE
;; DISKDEF 3,0
DPB3 .equ DPB0 ;.equIVALENT PARAMETERS
XLT3 .equ XLT0 ;SAME TRANSLATE TABLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; disk port and commands
lf .equ 0x0a
cr .equ 0x0d
signon: ;signon massage ??K cp/m ?.?
.db cr,lf,lf
.db MSIZE/10+"0",MSIZE % 10 +"0"
.str "K CP/M VERS "
.db VERS/10+"0",".",VERS % 10 +"0"
.db cr,lf,0
boot:
ld sp,BUFF_DEFAULT_ADDR + 0x80
call init_io
ld hl,signon
call prmsg
xor a
ld (disk_number),a
ld (old_disk_number),a
ld a,0x11
ld (IOBYTE),a
jr gocpm
wboot:
ld sp,BUFF_DEFAULT_ADDR
;reading system block (CCP+BDS)
ld hl,CCP
ld (read512_addr),hl ;system top addr (CCP)
ld hl,0x0000
ld (read512_block_no),hl ;system top sector no. (512byte read)
ld hl,0x000b
ld (read512_block),hl ;0x1600(ccp+BDOS) /512byte(sector)
call read512 ;read system block
gocpm: ;set default buff address to 0x80
ld bc,BUFF_DEFAULT_ADDR
call setdma
ld a,0xc3 ;jump wboot address set at 0x0000
ld (0x0000),a
ld hl,wboote
ld (0x0001),hl
ld (0x0005),a ;jump BDOS address set at 0x0005
ld hl,BDOS
ld (0x0006),hl
ld a,(disk_number)
ld c,a
jp cpmboot
prmsg:
ld a,(hl)
cp 0x00 ;massage end ?
ret z
ld c,a
call conout
inc hl
jr prmsg
const: in0 a,(STAT0)
rlca
jr nc,con_busy ;console status
ld a,0xff ;READY= 0xff BUSY=0x00 out Areg
ret
con_busy:
ld a,0x00
ret
reader: ;reader character out
ld a,0x1a
and 0x7f
ret
getchar:
conin: ;console character in
in0 a,(STAT0)
rlca
jr nc,getchar
in0 a,(RDR0)
; and 0x7f
ret
list: ;list character out
ld a,c
ret
punch: ;punch character out
ld a,c
ret
conout: ;console character out
ld a,c
call putchar
ret
putchar:
push af
putchar01:
in0 a,(STAT0)
bit 1,a
jr z,putchar01
pop af
out0 (TDR0),a
ret
home:
ld c,0x00 ;track 00
call settrk
ret
listst: ;return list status
ld a,0x00
ret
sectran: ;sector translate
;logical sector > BC
;sector translate teble > de
;return to translate ogical sector > hl
; ld b,0
; ex de,hl
; add hl,bc
; ld a,(hl)
; ld (sector_number),a
; ld l,a
ld h,b
ld l,c
ret
setdma: ;set dma address set bc reg
ld h,b
ld l,c
ld (dma_Buff_addr),hl
ret
seldsk: ;c reg set disk no
ld hl,0x0000 ;err set hl=0000 return
ld a,c
cp DISKS_MAX
jr nc,disk_max
ld (disk_number),a
ld (old_disk_number),a
ld l,a
ld h,0x00
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ld de,dpbase
add hl,de
ret
disk_max:
ld a,(old_disk_number)
ld (disk_number),a
ld hl,0x0000 ;err set hl=0000 return
ret
settrk: ;set track address given by c
ld hl,track_number
ld (hl),c
ret
setsec: ;set sector numbar given by c
ld hl,sector_number
ld (hl),c
ret
init_io: ;tmpz84c015 serial siob ch/pio-a ch/spi-init
call uartinit
call pioinit
call init_spi
ret
init_spi:
push af
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ld b,80 ;80 clok output
call loopspii
pop af
xor a
out0 (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
jr init_msg
ret
init_err:
ld hl,spi_init_err_msg
call msgout
ld a,0x0d
call putchar
jp boot
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
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
cmd58_r_d:
ld hl,r7
ld b,4
cmd58_r_d_loop:
inc hl
djnz cmd58_r_d_loop
ld a,0x0d
call putchar
pop af
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
out0 (PPIC),a
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
set S_CLK,a ;CLK H
out0 (PPIC),a
in0 a,(PPIC)
rrca
rl e
djnz loopspi
xor a
set S_DI,a ;DI H
out0 (PPIC),a
pop bc
ret
get_sector:
; ld a,"["
; call putchar
; ld a,(disk_number)
; call hex_a_disp
; ld a,","
; ld a,(track_number)
; call hex_a_disp
; ld a,","
; ld a,(sector_number)
; call hex_a_disp
; ld a,"="
; call putchar
ld hl,0x0000
; ld de,DISK_TRACK * DISK_SECTOR ;1 disk sector >> DISK_TRACK * DISK_SECTOR
; ld a,(disk_number)
; cp 0x00
; jr z,read_track
; ld b,a
;read_disk01:
; add hl,de
; djnz read_disk01
;disk_number * 0x2000(DISK_TRACK * DISK_SECTOR)
ld a,(disk_number)
rrca
rrca
rrca
and a,0xe0
ld h,a
read_track:
; ld de,DISK_SECTOR ;1 track sector >> DISK_SECTOR
; ld a,(track_number)
; cp 0x00
; jr z,read_sector
; ld b,a
;read_track01:
; add hl,de
; djnz read_track01
;
ld e,0x00
ld a,(track_number) ;track_number * 64
ld d,a
srl d
rr e
srl d
rr e
add hl,de
read_sector:
ld a,(sector_number)
; dec a
ld e,a
ld d,0x00
add hl,de
; ld a,h
; call hex_a_disp
; ld a,l
; call hex_a_disp
; ld a,"]"
; call putchar
ret
read: ;read next disk record(assuming disk/trk/sec/dma set)
; ld a,"R"
; call putchar
call get_sector ;read block HL reg
ld a,(r7)
bit 6,a
jp z,read_SD_ver2
ld a,h ;SDHC
ld (cmd18+03),a
ld a,l
ld (cmd18+04),a
jr spi_read2
read_SD_ver2:
ld a,h ;Ver2
ld (cmd18+02),a
ld a,l
ld (cmd18+03),a
ld hl,(dma_Buff_addr)
spi_read2:
call dummy_data ;dummy data(0xff) out
ld hl,cmd18
call cmd_out ;cmd17 Issue
call r1_resp
cp 0x00 ;response is 0x00 read mode OK?
jr nz,cmd18_err
cmd18_st:
ld d,0xff
call spi_8bit
call r1_resp ;read data start response?
cp 0xfe ;data start byte 0xfe?
jr nz, cmd18_st
ld b,0x80 ;read data size 128byte
ld hl,(dma_Buff_addr) ;read data buff address
cmd18_r:
call resp ;read data
ld (hl),a
inc hl
djnz cmd18_r
;; dummy read 128byte 2st 3st 4st
ld b,0x80 ;read data size 128byte
cmd18_r2st:
call resp
djnz cmd18_r2st
ld b,0x80
cmd18_r3st:
call resp
djnz cmd18_r3st
ld b,0x80
cmd18_r4st:
call resp
djnz cmd18_r4st
call resp ;crc Skipping read
call resp ;crc Skipping read
ld d,0xff ;dummy data 0xff
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_wch3:
call resp
cp 0x00
jr z,cmd18_wch3
call set_cs ;CS="H"
; ld a,"R"
; call putchar
; ld a,"o"
; call putchar
; ld a,"k"
; call putchar
; ld a,0x0d
; call putchar
xor a
ret
cmd18_err:
call set_cs ;CS="H"
ld a,0x01
ret
read512:
;read 1sector 512byte
ld hl,(read512_block_no) ;read bolck_no
ld a,(r7)
bit 6,a
jp z,read512_SD_ver2
ld a,h ;SDHC
ld (cmd18+03),a
ld a,l
ld (cmd18+04),a
jr spi_read512_2
read512_SD_ver2:
ld a,h ;Ver2
ld (cmd18+02),a
ld a,l
ld (cmd18+03),a
spi_read512_2:
call dummy_data ;dummy data(0xff) out
ld hl,cmd18
call cmd_out ;cmd17 Issue
call r1_resp
cp 0x00 ;response is 0x00 read mode OK?
jr nz,cmd18_512_err
sector_read_loop:
cmd18_512_st:
call r1_resp ;read data start response?
cp 0xfe ;data start byte 0xfe?
jr nz, cmd18_512_st
ld hl,(read512_addr) ;read data buff address
ld b,0x00 ;read data size 256byte
cmd18_512_r:
call resp ;read data
ld (hl),a
inc hl
djnz cmd18_512_r
ld b,0x00 ;2st 256byte write
cmd18_512_r2st:
call resp
ld (hl),a ;read data
inc hl
djnz cmd18_512_r2st
ld (read512_addr),hl
call resp ;crc Skipping read
call resp ;crc Skipping read
ld hl,(read512_block)
dec hl
ld (read512_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_512_err
cmd18_512_wch3:
call resp
cp 0x00
jr z,cmd18_512_wch3
call set_cs ;CS="H"
xor a
ret
cmd18_512_err:
call set_cs ;CS="H"
ld a,0x01
ret
write:
; ld a,"W"
; call putchar
call get_sector
spi_write1:
ld a,(r7)
bit 6,a
jp z,write_SD_ver2
ld a,h ;SDHC
ld (cmd25+03),a
ld a,l
ld (cmd25+04),a
jr spi_write2
write_SD_ver2: ;Ver2
ld a,h
ld (cmd25+02),a
ld a,l
ld (cmd25+03),a
spi_write2:
; call dummy_data
ld hl,cmd25
call cmd_out
call r1_resp
cp 0x00
jp nz,cmd25_err
ld d,0xff
call spi_8bit
ld d,0xfc ;cmd25 data token
call spi_8bit
ld hl,(dma_Buff_addr)
ld b,0x80
cmd25_w:
ld d,(hl)
inc hl
call spi_8bit
djnz cmd25_w
; 2st dummy write(0xe5)
ld b,0x80
cmd25_w2st:
ld d,0xe5
call spi_8bit
djnz cmd25_w2st
; 3st dummy write(0xe5)
ld b,0x80
cmd25_w3st:
ld d,0xe5
call spi_8bit
djnz cmd25_w3st
; 4st dummy write(0xe5)
ld b,0x80
cmd25_w4st:
ld d,0xe5
call spi_8bit
djnz cmd25_w4st
ld d,0xff
call spi_8bit ;crc
ld d,0xff
call spi_8bit ;crc
call r1_resp
and 0x0f
cp 0x05
jr nz,cmd25_err2
cmd25_wch:
call resp
cp 0x00
jr z,cmd25_wch
ld d,0xfd ;cmd25 stop token
call spi_8bit
ld d,0xff
call spi_8bit
cmd25_wch3:
call resp
cp 0x00
jr z,cmd25_wch3
call set_cs ;set CS
call dummy_data
; ld a,"W"
; call putchar
; ld a,"o"
; call putchar
; ld a,"k"
; call putchar
; ld a,0x0d
; call putchar
xor a
ret
cmd25_err:
cmd25_err2:
call set_cs ;set cs
ld a,0x01
ret
set_cs:
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ret
dummy_data:
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ld b,8 ;1clok output
call loopspii
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ret
loopspii:
res S_CLK,a ;CLK L
out0 (PPIC),a
nop
nop
nop
nop
nop
nop
nop
nop
set S_CLK,a ;CLK H
out0 (PPIC),a
nop
nop
nop
nop
nop
djnz loopspii
ret
msgout:
ld a,(hl) ;(HL)reg is output disp at 0x00
cp 0x00
ret z
call putchar
inc hl
jr msgout
uartinit:
push af
ld a,0x64
out0 (CNTLA0),a
ld a,0x07
out0 (CNTLB0),a
; ld a,0x64
; out0 (CNTLA1),a
; ld a,0x07
; out0 (CNTLB1),a
pop af
ret
pioinit:
ld a,0b10000011 ;PPIA mode0,output PPIB mode0,input
out (PPICNT),a ;PPIC C7-C4 output,C3-C0 input
ret
hl_disp:
push hl
ld a,(HL) ;dump addres data (HL)
inc HL
call hex_a_disp
ld a,(HL) ;dump addres data (HL)
call hex_a_disp
pop hl
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
hex_ascii: ;Areg(HEX) >> Areg(ascii code)
and a,0x0f
cp 0x0a
jr c,ascii0_9
add 0x37
ret
ascii0_9:
add 0x30
ret
sdhc_msg:
.str ":SDHC"
.db 0x0d
.db 0x00
sd_ver2_msg:
.str ":SD Ver2"
.db 0x0d
.db 0x00
spi_init_err_msg:
.str "Spi Init Err"
.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
cmd8:
.db 0x48
.db 0x00
.db 0x00
.db 0x01
.db 0xaa
.db 0x87
cmd55:
.db 0x77
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff
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
cmd16:
.db 0x50
.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
cmd25:
.db 0x59
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff
r7:
.ds 4
; scratch ram area for bdos use
;begdat equ $ ;beginning of data area
DIRBUF: .ds 128 ;DIRECTORY ACCESS BUFFER
ALV0: .ds 64
CSV0: .ds 32
ALV1: .ds 64
CSV1: .ds 32
ALV2: .ds 64
CSV2: .ds 32
ALV3: .ds 64
CSV3: .ds 32
dma_Buff_addr: .dw BUFF_DEFAULT_ADDR ;dma buff address
sector_number: .db 0x01 ;sector number
track_number: .db TRACK_OFFSET ;track number
disk_number: .db 0x00 ;disk number
old_disk_number: .dw 0x00 ;old disk number
read512_addr: .dw 0xdc00 ;system top addr(512byte read)
read512_block_no: .dw 0x0000 ;system top sector no. (512byte read)
read512_block: .dw 0x000b ;0x1600(ccp+BDOS) /512byte(sector)
.end
BIOSのHEXファイル
:20F20000C399F2C3B3F2C3F7F2C308F3C316F3C312F3C314F3C303F3C328F3C33AF3C35EC8
:20F22000F3C363F3C334F3C3ADF4C3BFF5C32EF3C331F300000000000000002DF773F2EDBC
:20F24000F7ADF700000000000000002DF773F24DF80DF800000000000000002DF773F2AD0A
:20F26000F86DF800000000000000002DF773F20DF9CDF84000040F00FB017F00C00020002F
:20F2800001000D0A0A36324B2043502F4D205645525320322E320D0A00310001CD68F321C6
:20F2A00082F2CDECF2AF3231F93232F93E1132030018183180002100DC2234F921000022D3
:20F2C00036F9210B002238F9CD39F5018000CD34F33EC33200002103F2220100320500214C
:20F2E00006E42206003A31F94FC300DC7EFE00C84FCD16F32318F5ED38040730033EFFC9A8
:20F300003E00C93E1AE67FC9ED38040730FAED3808C979C979C979CD1BF3C9F5ED3804CB86
:20F320004F28F9F1ED3906C90E00CD5EF3C93E00C96069C96069222DF9C921000079FE0473
:20F3400030123231F93232F96F2600292929291133F219C93A32F93231F9210000C9213065
:20F36000F971C9212FF971C9CD97F6CDA4F6CD72F3C9F5AFCBF7CBFFED39820650CD73F6B7
:20F38000F1AFED3982CDCDF3FE01C2BFF3CDD7F3FE01C2BFF3CDF5F3FE01C2BFF3CD02F430
:20F3A000CD16F43A29F7CB7FCABFF3CB77280A21D4F6CD8DF6CD54F6C921DBF618F4C921DF
:20F3C000E5F6CD8DF63E0DCD1BF3C399F221F3F6CD4DF4CD3EF4C9CD5DF621F9F6CD4DF470
:20F3E000CD3EF4FE01C006042129F7CD46F4772310F93E01C9CD5DF621FFF6CD4DF4CD3E03
:20F40000F4C9CD5DF62105F7CD4DF4CD3EF4FE00C8CDF5F318ECCD5DF6210BF7CD4DF4CD48
:20F420003EF4F506042129F7CD46F4772310F92129F706042310FD3E0DCD1BF3F1C9CD4642
:20F44000F4FEFF28F9C916FFCD5BF47BC9E5C5060656CD5BF42310F9C1E1C9C50E000608BC
:20F46000AFCB021FCBAFED3982000000000000000000000000CBEFED3982ED38820FCB13D9
:20F4800010DEAFCBFFED3982C1C92100003A31F90F0F0FE6E0671E003A30F957CB3ACB1B31
:20F4A000CB3ACB1B193A2FF95F160019C9CD8AF43A29F7CB77CAC2F47C321AF77D321BF7A8
:20F4C000180B7C3219F77D321AF72A2DF9CD5DF62117F7CD4DF4CD3EF4FE00205616FFCD89
:20F4E0005BF4CD3EF4FEFE20F406802A2DF9CD46F4772310F90680CD46F410FB0680CD46FD
:20F50000F410FB0680CD46F410FBCD46F4CD46F416FFCD5BF4211DF7CD4DF416FFCD5BF4A1
:20F52000CD3EF4FE00200CCD46F4FE0028F9CD54F6AFC9CD54F63E01C92A36F93A29F7CB50
:20F5400077CA4EF57C321AF77D321BF718087C3219F77D321AF7CD5DF62117F7CD4DF4CDDF
:20F560003EF4FE002053CD3EF4FEFE20F92A34F90600CD46F4772310F90600CD46F4772326
:20F5800010F92234F9CD46F4CD46F42A38F92B2238F97CB520D016FFCD5BF4211DF7CD4D8B
:20F5A000F416FFCD5BF4CD3EF4FE00200CCD46F4FE0028F9CD54F6AFC9CD54F63E01C9CD5C
:20F5C0008AF43A29F7CB77CAD4F57C3226F77D3227F718087C3225F77D3226F72123F7CD28
:20F5E0004DF4CD3EF4FE00C24EF616FFCD5BF416FCCD5BF42A2DF906805623CD5BF410F9F4
:20F60000068016E5CD5BF410F9068016E5CD5BF410F9068016E5CD5BF410F916FFCD5BF4C7
:20F6200016FFCD5BF4CD3EF4E60FFE052020CD46F4FE0028F916FDCD5BF416FFCD5BF4CD0F
:20F6400046F4FE0028F9CD54F6CD5DF6AFC9CD54F63E01C9AFCBF7CBFFED3982C9AFCBF766
:20F66000CBFFED39820608CD73F6AFCBF7CBFFED3982C9CBAFED3982000000000000000006
:20F68000CBEFED3982000000000010E7C97EFE00C8CD1BF32318F6F53E64ED39003E07ED09
:20F6A0003902F1C93E83D383C9E57E23CDB5F67ECDB5F6E1C9F50F0F0F0FCDC8F6CD1BF340
:20F6C000F1CDC8F6CD1BF3C9E60FFE0A3803C637C9C630C93A534448430D003A534420569D
:20F6E0006572320D0053706920496E6974204572720D0040000000009548000001AA8777F8
:20F7000000000000FF6940FF8000FF7A00000000FF5000000200FF5200000000FF4C00005C
:09F720000000FF5900000000FF89
:0DF92D008000010100000000DC00000B0064
:00000001FF
HD64180_cpm_rwのソース
;HD64180 (HD64180+8255) cp/m V2.2 system read/write by Pinecone 2020/12/22
; HD64180 cpu
; ram 0000h -- ffffh
; clock 8MHz
; HD64180 serial communication
; extemal Clock 307.255KHz(4.9152MHz TC74HC4040 1/16 Frequency division)
; Band Rate:19200 8bits 1Stopbits none Parity (81N)
; assembler
; program start 0x8000
; main 0x8000
;
; assemblers ASxxxx and ASlink V5.10
; file name HD64180_cpm_rw005.asm
; $ asz80 -l -s -o HD64180_cpm_rw005.asm
; $ aslink -i HD64180_cpm_rw005
; $ HD64180_moni71 l command Hex load jump 0x8000
.hd64
TDR0 .equ 0x06 ;ch0 serial
RDR0 .equ 0x08
STAT0 .equ 0x04
CNTLA0 .equ 0x00
CNTLB0 .equ 0x02
;;8255 Parallel port
PPIA .equ 0x80 ;PPI-A PORT DATA REG
PPIB .equ 0x81 ;PPI-B PORT DATA REG
PPIC .equ 0x82 ;PPI-C PORT DATA REG
PPICNT .equ 0x83 ;PPI CONTL REG
;; 8255 pio SPI OUT-PORT PIO-C D7-D5
S_DI .equ 7 ;0b10000000 D7
S_CS .equ 6 ;0b01000000 D6
S_CLK .equ 5 ;0b00100000 D5
;; 8255 pio SPI OUT-PORT PIO-C D0
DO .equ 0 ;0b00000001 D0
.area FORMAT(ABS)
.org 0x8000
; spi read, write. boot
;
;
start:
call com_init
call pioinit
call init_spi
ld hl,rwg_msg
call msgout
call getchar
call putchar
cp "r"
jr z,read
cp "w"
jr z,write
cp "b"
jr z,cpm_boot
ret
read:
call cr
call spi_read
ret
write:
call cr
call spi_write
ret
cpm_boot:
ld hl,0x0000 ;CP/M system block 0x0000 start
ld (rw_block_no),hl
ld hl,0x000b ;ccp+bdos >0x0b
ld (rw_block),hl
ld hl,0xdc00 ;62K cp/m ccp top addr >> 0xdc00
ld (rw_addr),hl
call spi_read_go
ld hl,0x000b ;CP/M bios block 0x000b start
ld (rw_block_no),hl
ld hl,0x0004 ;bios >0x04
ld (rw_block),hl
ld hl,0xf200 ;62K cp/m bios top addr >> 0xf200
ld (rw_addr),hl
call spi_read_go
ld hl,cpm_boot_msg
call msgout
jp 0xf200
init_spi:
push af
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ld b,80 ;80 clok output
call loopspii
pop af
xor a
out0 (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
jr init_msg
init_err:
ld hl,spi_init_err_msg
call msgout
ld a,0x0d
call putchar
jp 0x0000
set_cs:
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ret
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
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
cmd58_r_d:
ld hl,r7
ld b,4
cmd58_r_d_loop:
inc hl
djnz cmd58_r_d_loop
ld a,0x0d
call putchar
pop af
ret
cr:
ld a,0x0d
call putchar
ret
spi_read:
call data_in
cp 0x00
ret z
ld hl,yes_msg
call msgout
call getchar
cp "y"
ret nz
call spi_read_go
call cr
ret
spi_write:
call data_in
cp 0x00
ret z
ld hl,yes_msg
call msgout
call getchar
cp "y"
ret nz
call spi_write_go
ret
data_in:
call cr
ld hl,rw_sblock_no_msg
call msgout
call input_hl
cp 0x00
jr z,spi_data_in01
call cr
xor a
ret
spi_data_in01: ;read/write block no
call cr
ld (rw_block_no),hl
ld hl,rw_block_msg
call msgout
call input_hl
cp 0x00
jr z,spi_data_in02
call cr
xor a
ret
spi_data_in02:
call cr
ld (rw_block),hl ;read/write block
ld hl,rw_addr_msg
call msgout
call input_hl
cp 0x00
jr z,spi_data_in03
call cr
xor a
ret
spi_data_in03:
call cr
ld (rw_addr),hl ;read/write addr
ld a,0xff
ret
spi_write_go:
ld hl,(rw_block_no)
ld a,(r7)
bit 6,a
jp z,write_SD_ver2
ld a,h ;SDHC
ld (cmd25+03),a
ld a,l
ld (cmd25+04),a
jr spi_write4
write_SD_ver2: ;Ver2
ld a,h
ld (cmd25+02),a
ld a,l
ld (cmd25+03),a
spi_write4:
call dummy_data
ld hl,cmd25
call cmd_out
call r1_resp
cp 0x00
jp nz,cmd25_err
ld d,0xff
call spi_8bit
sector_write_loop:
ld hl,(rw_addr)
ld d,0xfc ;cmd25 data token
call spi_8bit
;; spi write 256byte 1st blok
ld b,0x00
cmd25_w: ;1st 256byte write
ld d,(hl)
inc hl
call spi_8bit ; D reg >> write data
djnz cmd25_w
; 2st write 256byte 1st blok
ld b,0x00
cmd25_w2st: ;2st 256byte write
ld d,(hl)
inc hl
call spi_8bit ; D reg >> write data
djnz cmd25_w2st
ld (rw_addr),hl
ld d,0xff
call spi_8bit ;crc
ld d,0xff
call spi_8bit ;crc
call r1_resp
and 0x0f
cp 0x05
jr nz,cmd25_err2
cmd25_wch:
call resp
cp 0x00
jr z,cmd25_wch
ld d,0xff
call spi_8bit
ld hl,(rw_block)
dec hl
ld (rw_block),hl
ld a,h ;HL = 0?
or l
jr nz,sector_write_loop
ld d,0xfd ;cmd25 stop token
call spi_8bit
ld d,0xff
call spi_8bit
cmd25_wch2:
call resp
cp 0x00
jr z,cmd25_wch2
call dummy_data
call set_cs ;set CS
ld hl,rw_ok_msg
call msgout
call cr
xor a
ret
cmd25_err:
cmd25_err2:
ld hl,cmd25_err_msg
call msgout
call set_cs ;set CS
ld a,0x01
ret
spi_read_go:
ld hl,(rw_block_no)
ld a,(r7)
bit 6,a
jp z,read_SD_ver2
ld a,h ;SDHC
ld (cmd18+03),a
ld a,l
ld (cmd18+04),a
jr spi_read01
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
;**************************************************
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
r1_resp:
call resp
cp 0xff
jr z,r1_resp
ret
resp:
ld d,0xff
call spi_8bit
ld a,e
ret
cmd0_msg:
.str "CMD0:"
.db 0x00
dummy_data:
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ld b,8 ;1clok output
call loopspii
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (PPIC),a
ret
loopspii:
res S_CLK,a ;CLK L
out0 (PPIC),a
nop
nop
nop
nop
nop
nop
nop
nop
set S_CLK,a ;CLK H
out0 (PPIC),a
nop
nop
nop
nop
nop
djnz loopspii
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
out0 (PPIC),a
nop
nop
nop
nop
nop
nop
set S_CLK,a ;CLK H
out0 (PPIC),a
in0 a,(PPIC)
rrca
rl e
djnz loopspi
xor a
set S_DI,a ;DI H
out0 (PPIC),a
pop bc
ret
msgout:
ld a,(hl) ;(HL)reg is output disp at 0x00
cp 0x00
ret z
call putchar
inc hl
jr msgout
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
hex_ascii: ;Areg(HEX) >> Areg(ascii code)
and a,0x0f
cp 0x0a
jr c,ascii0_9
add 0x37
ret
ascii0_9:
add 0x30
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
getchar:in0 a,(STAT0) ;ch0 serial input
rlca
jr nc,getchar
in0 a,(RDR0)
ret
putchar:push af ;ch0 seriai output
com_out:in0 a,(STAT0)
bit 1,a
jr z,com_out
pop af
out0 (TDR0),a
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
com_init:
push af
ld a,0x64
out0 (CNTLA0),a
ld a,0x07
out0 (CNTLB0),a
; ld a,0x64
; out0 (CNTLA1),a
; ld a,0x07
; out0 (CNTLB1),a
pop af
ret
pioinit:
ld a,0b10000011 ;PPIA mode0,output PPIB mode0,input
out (PPICNT),a ;PPIC C7-C4 output,C3-C0 input
ret
sdhc_msg:
.str ":SDHC"
.db 0x0d
.db 0x00
sd_ver2_msg:
.str ":SD Ver2"
.db 0x0d
.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
rw_sblock_no_msg:
.str " read/write start block No:"
.db 0x00
rw_block_msg:
.str " read/write block:"
.db 0x00
rw_addr_msg:
.str " read/write addr:"
.db 0x00
yes_msg:
.str " Yes:"
.db 0x00
rw_ok_msg:
.str " read/write ok!"
.db 0x00
rwg_msg:
.str " read >> r :write >> w CP/M boot >> b key in:"
.db 0x00
cpm_boot_msg:
.db 0x0d
.str " CP/M system 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
cmd8:
.db 0x48
.db 0x00
.db 0x00
.db 0x01
.db 0xaa
.db 0x87
cmd55:
.db 0x77
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff
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
cmd16:
.db 0x50
.db 0x00
.db 0x00
.db 0x02
.db 0x00
.db 0xff
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
cmd23:
.db 0x57
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff
cmd24:
.db 0x58
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff
cmd25:
.db 0x59
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff
r7:
.ds 4
rw_block_no:
.ds 2
rw_block:
.ds 2
rw_addr:
.ds 2
.end
HD64180_cpm_rwのHEXファイル
:20800000CDF083CDFD83CD6380219984CD6B83CDBF83CDC983FE722809FE77280CFE622830
:208020000FC9CD3781CD3D81C9CD3781CD5681C9210000222A85210B00222C852100DC228D
:208040002E85CD6282210B00222A85210400222C852100F2222E85CD628221C884CD6B8306
:20806000C300F2F5AFCBF7CBFFED39820650CD2883F1AFED3982CDC680FE01C2AF80CDD0BD
:2080800080FE01C2AF80CDEE80FE01C2AF80CDFB80CD0F813A2685CB7FCAAF80CB77280A04
:2080A000210284CD6B83CDBD80C921098418F4211384CD6B833E0DCDC983C30000AFCBF7C6
:2080C000CBFFED3982C921DE84CDEF82CDFD82C9CD128321E484CDEF82CDFD82FE01C00655
:2080E00004212685CD0583772310F93E01C9CD128321EA84CDEF82CDFD82C9CD128321F0F9
:2081000084CDEF82CDFD82FE00C8CDEE8018ECCD128321F684CDEF82CDFD82F5060421267F
:2081200085CD0583772310F921268506042310FD3E0DCDC983F1C93E0DCDC983C9CD6C81B7
:20814000FE00C8218384CD6B83CDBF83FE79C0CD6282CD3781C9CD6C81FE00C8218384CDBC
:208160006B83CDBF83FE79C0CDBA81C9CD3781214284CD6B83CD9983FE002805CD3781AF8B
:20818000C9CD3781222A85215E84CD6B83CD9983FE002805CD3781AFC9CD3781222C852178
:2081A0007184CD6B83CD9983FE002805CD3781AFC9CD3781222E853EFFC92A2A853A2685E0
:2081C000CB77CACF817C3223857D32248518087C3222857D322385CD1283212085CDEF8263
:2081E000CDFD82FE00C2568216FFCD42832A2E8516FCCD428306005623CD428310F9060053
:208200005623CD428310F9222E8516FFCD428316FFCD4283CDFD82E60FFE052039CD058335
:20822000FE0028F916FFCD42832A2C852B222C857CB520B916FDCD428316FFCD4283CD0577
:2082400083FE0028F9CD1283CDBD80218984CD6B83CD3781AFC9213784CD6B83CDBD803E4B
:2082600001C92A2A853A2685CB77CA77827C320B857D320C8518087C320A857D320B85CD8A
:208280001283210885CDEF82CDFD82FE00C2E382CDFD82FEFE20F92A2E850600CD058377DC
:2082A0002310F90600CD0583772310F9222E85CD0583CD05832A2C852B222C857CB520D01B
:2082C00016FFCD4283210E85CDEF8216FFCD4283CDFD82FE00200CCD0583FE0028F9CDBDEA
:2082E00080AFC9213784CD6B83CDBD803E01C9E5C5060656CD42832310F9C1E1C9CD058353
:20830000FEFF28F9C916FFCD42837BC9434D44303A00AFCBF7CBFFED39820608CD2883AF35
:20832000CBF7CBFFED3982C9CBAFED39820000000000000000CBEFED3982000000000010AC
:20834000E7C9C50E000608AFCB021FCBAFED3982000000000000CBEFED3982ED38820FCBEC
:208360001310E4AFCBFFED3982C1C97EFE00C8CDC9832318F6F50F0F0F0FCD8883CDC9839B
:20838000F1CD8883CDC983C9E60FFE0A3803C637C9C630C9C506021803C506042100001885
:2083A0000429292929CDBF83CDC983CDD683FEFF2809E60FB56F10E9C1AFC93EFFC1C9ED9A
:2083C00038040730FAED3808C9F5ED3804CB4F28F9F1ED3906C9D6303813FE0A380ED61175
:2083E000FE063806D620FE063003C60AC93EFFC9F53E64ED39003E07ED3902F1C93E83D3F7
:2084000083C93A534448430D003A534420566572320D0053706920496E6974204572720D14
:2084200000636D643137204572720D00636D643234204572720D00636D6432352045727276
:208440000D0020726561642F777269746520737461727420626C6F636B204E6F3A002072D7
:208460006561642F777269746520626C6F636B3A0020726561642F777269746520616464B4
:20848000723A00205965733A0020726561642F7772697465206F6B21002072656164203E5A
:2084A0003E2072203A7772697465203E3E2077202043502F4D20626F6F74203E3E206220D3
:2084C0006B657920696E3A000D2043502F4D2073797374656D20626F6F7420210D004000BF
:2084E0000000009548000001AA877700000000FF6940FF8000FF7A00000000FF5000000205
:2085000000FF5100000200FF5200000000FF4C00000000FF5700000000FF5800000000FFC1
:068520005900000000FFFD
:00000001FF