KZ80シリーズ、SBC8080 8085でCP M - kuninet/KZ80_CPM GitHub Wiki
概要
- KZ80-CPUB、SBC8080/8085 CPUルーズキットとCFカードアダプタ(KZ80-CF)、128kBメモリーボード(KZ80-1MSRAM REV2)を組み合わせて、CP/M 2.2を動かす手順をまとめてみます。
- 128kBメモリーボード(KZ80-1MSRAM)はREV2から64kバイトモード切り替えに対応しています。それ以前のリビジョンではCP/M稼働はできません。
- Grant氏のブレッドボードマイコンの構成はZ80 CPU+SIO(シリアルA/B)となっていますので、シリアル通信部分の変更が必要です。
- KZ80-CPUB、SBC8080/8085 CPUルーズキットではシリアル通信をインテル8251で実施していますので、SBC8080データパックのソース(MSBAS80.ASM)を参考に移植します。
- CP/Mの機種依存部分はBIOSに集まっていますので、cbiosxxx.asmの移植がメインですが、起動するためのROMモニター、CFフォーマッター、システム転送プログラムも環境に合わせた修正が必要です。
- SBC8080/8085については、最後に記載しているとおり、Z80命令を8080命令に書き換える修行が追加で必要です。^^)/
参考サイト
- いつもお世話になっているGrant氏の以下のサイトを参考にします。
注意点
- CFカードをFDにみたててCP/Mを起動しますが、"TrueIDE"対応の128M/64MバイトCFカードが必要です。いままで確認できたカードは以下の通りです。(同品種で必ず動くとは限りませんが...)
| メーカー | CFカード型番 | 備考 |
|---|---|---|
| バッファロー | RCF-X 128M | RCF-XシリーズはメーカーFAQで"TrueIDE"対応と出ています |
| I/Oデータ | CFS-128M | |
| Hagiwara Sys-com | CFI-128MDG | |
| Hagiwara Sys-com | NFD10-256B |
各種ソースのアセンブル環境整備
- CP/Mを動かすための各種ソースを変更した際、Grant氏提供のzipファイルに同梱されているTASM(A Table Driven Cross Assembler for the MSDOS* Environment)でアセンブルするのが簡単です。
- MS-DOSが必要です。私はMac上の仮想Win2000でTASMを実行してアセンブルしました。
- 簡易にMS-DOS環境を手に入れるにはDOSBoxもオススメです。英語DOS環境が手軽に動かせます。ホストOSのディレクトリもマウント可能です。
- MacでDOSBoxを動かす場合はディレクトリ名/ファイル名を8文字以内にするのが無難です。"~"を入力するのが困難です。
- Windows7/8/10環境でMS-DOS用プログラムを動かす場合は、MS-DOS Playerがおすすめです。
- http://takeda-toshiya.my.coocan.jp/msdos/
- 配布パッケージを展開した中の source\binary\i486_x64\msdos.exe を使用してTASMを以下のように使用できます。
msdos\source\binary\i486_x64\msdos.exe tasm -80 source\basic.asm hexFiles\basic.hex lst\basic.lst
まずは、KZ80-CPUB(Z80マイコン)でCP/Mを動かす際の移植/変更ポイントを以下にまとめます。
ROMモニター(monitor.asm)の移植
- ROMモニターのソース(monitor.asm)はZ80 SIO前提となっていますので変更が必要です。
- CP/Mのシステム部分をCFカードからロードするルーチンを持っていますので、このROMモニターを使う方が今後の運用が楽です。
変更箇所について
- ROMモニターの変更箇所は以下のとおりです。
- CFレジスターのI/Oアドレス
- バッファ等の定義
- シリアル割り込み入力ルーチン
- coninルーチン (シリアル1文字入力処理)
- conoutルーチン (シリアル1文字出力処理)
- CKINCHARルーチン (シリアル入力バッファチェック処理)
- INITルーチン (各種初期化処理)
CFレジスターのI/Oアドレス
- KZ80-CFのI/Oアドレスジャンパで設定した値に合わせてください。
- 例) $1x → $Ex へ変更
CF_BASE .EQU $E0 ; CompactFlash BASE I/O Address
; CF registers
CF_DATA .EQU CF_BASE+0
CF_FEATURES .EQU CF_BASE+1
CF_ERROR .EQU CF_BASE+1
CF_SECCOUNT .EQU CF_BASE+2
CF_SECTOR .EQU CF_BASE+3
CF_CYL_LOW .EQU CF_BASE+4
CF_CYL_HI .EQU CF_BASE+5
CF_HEAD .EQU CF_BASE+6
CF_STATUS .EQU CF_BASE+7
CF_COMMAND .EQU CF_BASE+7
CF_LBA0 .EQU CF_BASE+3
CF_LBA1 .EQU CF_BASE+4
CF_LBA2 .EQU CF_BASE+5
CF_LBA3 .EQU CF_BASE+6
バッファ等の定義
- シリアルバッファ等の定義を実施します。もともとのZ80 SIO用バッファ領域などは適宜削除してください。
UARTRD .EQU 00H
UARTRC .EQU 01H
;
BUFSIZ .EQU 3FH
BUFFUL .EQU 30H
BUFEMP .EQU 5
;
RTSHIG .EQU 00010111B
RTSLOW .EQU 00110111B
.ORG 4000h
;
SERBUF .ds BUFSIZ
SERINP .ds 2
SERRDP .ds 2
SERCNT .ds 1
BASFLG .ds 1
シリアル割り込み入力ルーチン
- 元ソースではZ80 SIOをZ80 CPUの割り込みモード2で使用するルーチンとなっています。KZ80-IOB/SBC8080サブルーズキットのインテル8251を使用する場合 割り込みモード0/モード1を使用してアドレス0038hからシリアル割り込みルーチンを配置(または0038hへシリアル割り込み処理へのJP命令を配置)が必要です。
.ORG 0038H
RST38: JP SERINT
;
; 8251 -> BUFFER BY INTERRUPT
SERINT: PUSH AF
PUSH HL
IN A,(UARTRC)
AND 00000010B
JP Z,RTS0
IN A,(UARTRD)
PUSH AF
LD A,(SERCNT)
CP BUFSIZ
JP NZ,NOTFUL
POP AF
JP RTS0
NOTFUL: LD HL,(SERINP)
INC HL
LD A,L
CP SERINP & 0FFH
JP NZ,NOTWRP
LD HL,SERBUF
NOTWRP: LD (SERINP),HL
POP AF
LD (HL),A
LD A,(SERCNT)
INC A
LD (SERCNT),A
CP BUFFUL
JP C,RTS0
LD A,RTSHIG
OUT (UARTRC),A
RTS0: POP HL
POP AF
EI
RET
- もともとのserialIntルーチンは削除して、SBC8080データパックのソース(MSBAS80.ASM)から SERINTルーチンを移植します。
coninルーチン (シリアル1文字入力処理)
- coninルーチン (シリアル1文字入力処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から RXAルーチンを移植します。
- coninルーチンの戻り値はAレジスタに入力文字をセットして返すかたちとなります。
conin:
LD A,(SERCNT)
CP 00H
JP Z,conin
PUSH HL
LD HL,(SERRDP)
INC HL
LD A,L ;Only need to check low byte becasuse buffer<256 bytes
CP SERINP & 0FFH ;(SERBUF+BUFSIZ) & 0FFH
JP NZ,NRWRAP
LD HL,SERBUF
NRWRAP: DI
LD (SERRDP),HL
LD A,(SERCNT)
DEC A
LD (SERCNT),A
CP BUFEMP
JP NC,RTS1
LD A,RTSLOW
OUT (UARTRC),A
RTS1: LD A,(HL)
EI
POP HL
RET ;Char ready in A
conoutルーチン (シリアル1文字出力処理)
- conoutルーチン (シリアル1文字出力処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から TXAルーチンを移植します。
- conoutルーチンで出力したい文字はAレジスタで渡ってきますのでインターフェースはいっしょです。
conout: PUSH AF ;Store character
COUT1: IN A,(UARTRC) ;Status byte
AND 01H ;Set Zero flag if still transmitting character
JP Z,COUT1 ;Loop until flag signals ready
POP AF ;Retrieve character
OUT (UARTRD),A ;Output the character
RET
CKINCHARルーチン (シリアル入力バッファチェック処理)
- CKINCHARルーチン (シリアル入力バッファチェック処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から CHKCHRルーチンを移植します。
- CKINCHARルーチンの戻り値はフラグレジスタです。
CKINCHAR LD A,(SERCNT)
CP 00H
RET
INITルーチン (各種初期化処理)
- INITルーチン (各種初期化処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から SINITルーチンのシリアルバッファ初期化/8251の初期化ルーチンを移植します。
- 元ソースではEI命令(割り込み許可)のあと、SIOA、SIOBの2つのシリアル端末へ「スペースバーを押せ」というメッセージを出力してスペースバーを押下された側をやりとりするシリアル端末として決定する処理が入っています。しかし今回はシリアル端末は1つなのでその部分は削除して構いません。
INIT LD SP,STACK ; Set the Stack Pointer
LD HL,SERBUF
LD (SERINP),HL
LD (SERRDP),HL
XOR A
LD (SERCNT),A
OUT (UARTRC),A
OUT (UARTRC),A
OUT (UARTRC),A
LD A,01000000B
OUT (UARTRC),A
LD A,01001110B
OUT (UARTRC),A
LD A,RTSLOW
OUT (UARTRC),A
EI
; Clear message on consoles
LD A,$0C
CALL conout
;
IM 0
動作確認
- 上記修正を実施したmonitor.asmをTASMでアセンブリして作成されたインテルHEXファイルを元にROMを焼いて起動確認を実施してください。
- 8251の初期設定値をSBC8080データパックのソース(MSBAS80.ASM)に合わせた場合、9600bpsで通信可能で初期メッセージが出力されれば移植成功です。
CFフォーマッター(form128/64.asm)、CP/Mシステム転送ユーティリティ(putsys.asm)の移植ポイント
- CFフォーマッター(form128/64.asm)、CP/Mシステム転送ユーティリティ(putsys.asm)の変更点はCFカードのI/Oアドレスのみです。
- KZ80-CFのI/Oアドレスジャンパで設定した値に合わせてください。
- 例) $1x → $Ex へ変更
CF_BASE .EQU $E0 ; CompactFlash BASE I/O Address
; CF registers
CF_DATA .EQU CF_BASE+0
CF_FEATURES .EQU CF_BASE+1
CF_ERROR .EQU CF_BASE+1
CF_SECCOUNT .EQU CF_BASE+2
CF_SECTOR .EQU CF_BASE+3
CF_CYL_LOW .EQU CF_BASE+4
CF_CYL_HI .EQU CF_BASE+5
CF_HEAD .EQU CF_BASE+6
CF_STATUS .EQU CF_BASE+7
CF_COMMAND .EQU CF_BASE+7
CF_LBA0 .EQU CF_BASE+3
CF_LBA1 .EQU CF_BASE+4
CF_LBA2 .EQU CF_BASE+5
CF_LBA3 .EQU CF_BASE+6
BIOSの移植
- CP/Mの機種依存部分であるBIOSの移植を行います。
- ベースとするソースは、CBIOS128.ASM/CBIOS64.ASMです。
変更箇所について
- BIOSの以下の箇所が変更対象です。
- 各種EQU定義
- CFレジスターのI/Oアドレス
- bootルーチン (バンク切り替え&シリアルLSI等初期化)
- wbootルーチン (割り込みモード2用初期化ルーチン削除)
- gocpmルーチン (RAM 0038番地のジャンプ命令初期配置)
- serialIntルーチン (シリアル割り込み処理)
- constルーチン (シリアル状況返却処理)
- readerルーチン (紙テープリーダー処理)
- coninルーチン (シリアル1文字入力処理)
- listルーチン (リストプリンタ処理)
- punchルーチン (紙テープ出力処理)
- conoutルーチン (シリアル1文字出力処理)
- popAndRunルーチン (ROMモニタからのスタート処理)
- シリアルバッファの定義
- アドレス0FFE8Hからのユーティリティ
各種EQU定義
- 後続のルーチンで使用するEQU定義を実施してください。
UARTRD .EQU 00H
UARTRC .EQU 01H
;
BUFSIZ .EQU 3FH
BUFFUL .EQU 30H
BUFEMP .EQU 5
;
RTSHIG .EQU 00010111B
RTSLOW .EQU 00110111B
;ROM BANK I/O
ROM_BANK_IO .EQU 80h
CFレジスターのI/Oアドレス
- KZ80-CFのI/Oアドレスジャンパで設定した値に合わせてください。
- 例) $1x → $Ex へ変更
CF_BASE .EQU $E0 ; CompactFlash BASE I/O Address
; CF registers
CF_DATA .EQU CF_BASE+0
CF_FEATURES .EQU CF_BASE+1
CF_ERROR .EQU CF_BASE+1
CF_SECCOUNT .EQU CF_BASE+2
CF_SECTOR .EQU CF_BASE+3
CF_CYL_LOW .EQU CF_BASE+4
CF_CYL_HI .EQU CF_BASE+5
CF_HEAD .EQU CF_BASE+6
CF_STATUS .EQU CF_BASE+7
CF_COMMAND .EQU CF_BASE+7
CF_LBA0 .EQU CF_BASE+3
CF_LBA1 .EQU CF_BASE+4
CF_LBA2 .EQU CF_BASE+5
CF_LBA3 .EQU CF_BASE+6
bootルーチン (バンク切り替え&シリアルLSI等初期化)
- ブート時に64kB フルRAM構成への切り替えルーチンを128kB メモリーボード(KZ80-1MSRAM)の仕様にあわせて修正します。
boot:
DI ; Disable interrupts.
LD SP,biosstack ; Set default stack.
; Turn off ROM (KZ80-1MSRAM)
LD A,$00
OUT (ROM_BANK_IO),A
; Initialise 8251
LD HL,SERBUF
LD (SERINP),HL
LD (SERRDP),HL
XOR A
LD (SERCNT),A
OUT (UARTRC),A
OUT (UARTRC),A
OUT (UARTRC),A
LD A,01000000B
OUT (UARTRC),A
LD A,01001110B
OUT (UARTRC),A
LD A,RTSLOW
OUT (UARTRC),A
- ブート時の8251初期化/シリアルバッファ初期化ルーチンを、SBC8080データパックのソース(MSBAS80.ASM) SINITルーチンから移植します。
wbootルーチン (割り込みモード2用初期化ルーチン削除)
- 元ソースでは、Z80 割り込みモード2で使用する Iレジスタへ$FFをセットしているルーチンがありますが、不要なので削除します。
; Interrupt vector in page FF
; LD A,$FF
; LD I,A
gocpmルーチン (RAM 0038番地のジャンプ命令初期配置)
- CP/M起動前にアドレス0000h、0005hにそれぞれ 起動時処理アドレス、BDOS Callアドレスをセットしているルーチンですので、あわせて シリアル割り込み処理のアドレスとジャンプ命令(0C3h)を0038hからセットします。
- ここをセットし忘れるとCP/M起動後シリアル入力ができなくなります。
gocpm:
:
:
:
LD (38h),A ; Opcode for 'JP'.
LD HL,serialInt ; ADDress of serial interrupt.
LD (39h),HL
serialIntルーチン (シリアル割り込み処理)
- serialIntルーチン (シリアル割り込み処理)は、エントリーポイントはそのままに、SBC8080データパックのソース(MSBAS80.ASM)から SERINTルーチンを移植します。
serialInt: PUSH AF
PUSH HL
IN A,(UARTRC)
AND 00000010B
JP Z,RTS0
IN A,(UARTRD)
PUSH AF
LD A,(SERCNT)
CP BUFSIZ
JP NZ,NOTFUL
POP AF
JP RTS0
NOTFUL: LD HL,(SERINP)
INC HL
LD A,L
CP SERINP & 0FFH
JP NZ,NOTWRP
LD HL,SERBUF
NOTWRP: LD (SERINP),HL
POP AF
LD (HL),A
LD A,(SERCNT)
INC A
LD (SERCNT),A
CP BUFFUL
JP C,RTS0
LD A,RTSHIG
OUT (UARTRC),A
RTS0: POP HL
POP AF
EI
RETI
constルーチン (シリアル状況返却処理)
- constルーチン (シリアル状況返却処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から CHKCHRルーチンを移植します。
- ROMモニターの場合と異なり戻り値はAレジスタに0(データなし)、0ffh(データあり)を返します。
const:
LD A,(SERCNT)
CP $00
JR Z, dataAEmpty
LD A,0FFH
RET
dataAEmpty:
LD A,0
RET
readerルーチン (紙テープリーダー処理)
- 紙テープリーダーは対象マイコンには装備されていないので、coninルーチン (シリアル1文字入力処理)へジャンプする命令に変更します。
reader:
JR conin
coninルーチン (シリアル1文字入力処理)
- coninルーチン (シリアル1文字入力処理)エントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から RXAルーチンを移植します。
- ROMモニターと同様Aレジスタへ入力文字をセットして返します。
conin:
LD A,(SERCNT)
CP 00H
JP Z,conin
PUSH HL
LD HL,(SERRDP)
INC HL
LD A,L ;Only need to check low byte becasuse buffer<256 bytes
CP SERINP & 0FFH ;(SERBUF+BUFSIZ) & 0FFH
JP NZ,NRWRAP
LD HL,SERBUF
NRWRAP: DI
LD (SERRDP),HL
LD A,(SERCNT)
DEC A
LD (SERCNT),A
CP BUFEMP
JP NC,RTS1
LD A,RTSLOW
OUT (UARTRC),A
RTS1: LD A,(HL)
EI
POP HL
RET ;Char ready in A
listルーチン (リストプリンタ処理)、punchルーチン (紙テープ出力処理)
- listルーチン (リストプリンタ処理)、punchルーチン (紙テープ出力処理)は対象マイコンには装備されていないので、conoutルーチン (シリアル1文字出力処理)へジャンプする命令に変更します。
list:
JR conout
punch:
JR conout
conoutルーチン (シリアル1文字出力処理)
- conoutルーチン (シリアル1文字出力処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から TXAルーチンを移植します。
- ★注意
- ROMモニターと異なり、conoutルーチンで出力したい文字は C レジスタで渡ってきますので、OUT命令の前に以下のロード命令を追加してください。
conout: PUSH AF ;Store character
COUT1: IN A,(UARTRC) ;Status byte
AND 01H ;Set Zero flag if still transmitting character
JP Z,COUT1 ;Loop until flag signals ready
POP AF ;Retrieve character
LD A,C ;
OUT (UARTRD),A ;Output the character
RET
popAndRunルーチン (ROMモニタからのスタート処理)
- ROMモニターからCP/Mが起動された場合に飛び込んでくるルーチンです。元のソースでは2つのシリアル入出力(SIOA/SIOB)のうちシリアルAをデフォルトとするために使っているルーチンですが、今回のマイコンではシリアルは1つなのであまり意味はないルーチンです。
- RAMをフルRAMモードへ切り替えるルーチンと
POP AFでROMモニタでセットした出力先を取得する(特に判別しないのでPOPしたデータは捨てる...)ルーチンだけが必須となります。
PopAndRun:
LD A,$00
OUT (ROM_BANK_IO),A
POP AF
LD A,$00 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is CRT:)
setIOByte: LD (iobyte),A
JP bios
シリアルバッファの定義
- SIO-A、B用バッファの代わりに8251用バッファを定義してください。
hstBufEnd: .EQU $
SERBUF .ds BUFSIZ
SERINP .ds 2
SERRDP .ds 2
SERCNT .ds 1
BASFLG .ds 1
アドレス0FFE0hの割り込みベクタ、アドレス0FFE8Hからのユーティリティ
- アドレス0FFE0hの割り込みベクタはZ80 SIOを割り込みモード2で使用するためのポインタベクタアドレスです。今回は不要なので削除します。
- アドレス0FFE8Hからのユーティリティは、Grant氏の手順で各種実行ファイルを転送するためのDOWNLOAD.COMをCFカードへ保存するために使うユーティリティです。ここもRAMをフルRAMモードへ切り替えるルーチンがありますので、環境にあわせます。
.org 0FFE8H
;Turn off ROM (KZ80-1MSRAM)
LD A,$00
OUT (ROM_BANK_IO),A
CP/M起動までの流れ
- CP/Mの起動の流れはGrant氏のページの"INSTALLING CP/M"の項に詳細に説明があります。
- ちなみに ROMモニターは入力待ち">"のモードに直接インテルHEX形式のオブジェクトを流し込むとメモリーへプログラムがロードされます。(一般的なモニターだと Lコマンドで入力待ちになったりしますが...)
- TeraTERM等の端末端末プログラムで送信の際の送信遅延として1行送信時100ms程度の待ちを入れるのが無難です。
ドライブのフォーマット
- ROMモニターを起動し、form128.hex/form64.hexをロードします。
- G5000 で5000番地からプログラムを起動してCFカードをフォーマットします。
システムの配置と転送
- CP/M本体(cpm22.hex)とBIOS(cbios128/64.hex)をそれぞれロードします。
- ソースを読むとわかりますがロードする順番はCP/M本体→BIOSとしてください。
- つづいて、システム転送プログラム(putsys.hex)もロードします。
- G5000 でシステム転送プログラム起動してCFカードへCP/Mシステム(D000h〜FFFFh)を転送します。
CP/Mの起動
- 一旦マイコンの電源をOFFにしてから、再度電源投入。
- モニタROMのXコマンドでCP/Mを起動します。起動メッセージと "A>"プロンプトが出てくれば起動成功です。
- "A>"プロンプトが出ない場合はcbiosの移植に足りないところがあります。適宜 メッセージを出すルーチン等を追加して動作を確認(原始的printfデバグ的な...)しましょう。その際 Cレジスタに文字を入れて conoutルーチンを直接呼び出すのがオススメです。
アプリケーションの導入等
- Grant氏のページの"INSTALLING APPLICATIONS"の項を参考に各種アプリケーションを転送してください。
- その際 私の環境では DOWNLOAD.COMへ各種コマンドを送る際 TeraTERM等の端末端末プログラムで送信の際の送信遅延として1行単位の遅延100msに加えて「1文字あたり1ms」を追加しないとダメでした。(転送が遅くなりますが....)
- Grant氏提供のzipパッケージのCPM211FilesPkg.txtに入っている基本的なCOMファイル以外のツール類を送りたい場合は、同じくzipファイルに入っている WindowsアプリケーションFilePackage.exeでDOWNLOAD.COMが解釈できるテキストファイルを生成することができます。
- DLOWNLOAD.COMでの転送は1文字ごとの送信遅延設定が必要なため多くのファイルを送る場合時間がかかりますので、XMODEM.COMやUNZIP.COMを使っての転送が便利です。
- XMODEM
- PICマイコンは面白い > 3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信 [Z80]
- https://piclabo.blog.so-net.ne.jp/2018-06-17
- UNZIP
- http://www.classiccmp.org/cpmarchives/cpm/mirrors/www.mv.com/users/besposito/cerealport.homeip.net/cereal/cpmmisc/
- LBR形式になっているので、併せて DELBR.COMも入手するのが吉です。
- XMODEM
SBC8080/8085でのCP/M稼働について
- Grant氏提供の各種CP/M用プログラム(cbios、formxx、download、putsys...)はZ80命令がだいぶ入っていますので、8080命令のみへ変更して再アセンブリが必要です。
- 上記の手順でZ80マイコンでCP/Mが稼働したら、「Z80 ASM(TASM)を8080 ASMへ移植する」などを参考に8080命令に変換して環境を構築してください。
- アドレス0FFE8HからのユーティリティについてはLDIR命令を置き換える際にルーチンが長くなるためエントリーポイントを 0FFE0hあたりにずらすことをお勧めします。
- CP/M本体(CPM22.ASM)はZ80命令が使われていないようなので、そのまま使用可能です。
謝辞
- みなさまのおかげでCP/Mが動作しました。ありがとうございます。
- Grant Searle さま
- いつもマイコンに関する有益な情報をWeb上に公開いただきありがとうございます。
- @vintagechips さま
- SBCシリーズをはじめ様々なマイコンのハード/ソフトを提供いただき活用させていただいています。
- @tomi9tw さま
- CFカードコネクタフットプリントをご提供をいただきました。またCFカードのTrueIDE対応情報をいただきました。
- @electrelic さま
- Z80ニーモニックで8080ベースの開発方法についてクロスアセンブラASの情報をいただきました。