- PCB Rev2.00の更新。
- PCB Rev2.00をPCBWayに発注。
- PCB Rev2.00入荷。
- Rev1.00のバグ修正したfeature-PCB2ブランチをdevelopにマージした。
- PCB Rev2.00にパーツをマウントし動作確認できた。
- 配線、パーツ間のクリアランスも問題なし。
- 残念ながらUSB-Cシリアル変換モジュールの信号名のシルクが間違っている。修正忘れ。
- Hardware Release Noteなどのドキュメントも更新。
- CP/Mのディスクイメージを作りやすくするとともに、ドキュメントを追加した。
- システムディスク、空ディスク、ZORK I/II/IIIのイメージ作成をMakefileのターゲット指定でできるようにした。
- developブランチにマージ済み。
- CP/M BIOSのドキュメント追加。
- Boot sequenceのドキュメント追加。
z80/cpm22/image/mkimg.sh
で引数チェックのバグを修正。DiskImage-CPM22.mdも更新。- v2.0をリリースした。
10/24にeBayで購入した、旧東ドイツ製 Z80互換CPU(デッドコピー)のU880
がウクライナから届いた。
パッケージのシルクは80A-CPU MME
となっているが、Wikipediaによるとこれはピン間隔2.54mmの輸出版らしい。
換装して動作確認したところ、あっさり動いた。あたりまえか。
以下がeBayにあったスペックだが、Soviet cloneってのはちょっと違うんじゃないか?
80A CPU MME Soviet Clone Z80A IC 4MHz NMOS MCPU logic 8-bit microprocessor NEW
MME 80A-CPU
Soviet Clone Z80A
Manufacturer: MME Erfurt
Type: Microprocessor
Introduced: 198х
Name (codename): Z80A clone
Code (Copyright): 80A-CPU (no)
Specification number: no
Core speed: 4MHz
BUS: 4MHz, 8-bit
Transistors хх
Technology: 3.0-micron NMOS
L1/L2 cache: no / no
Can address: 64 kB of physical memory
V core: 5V
Power dissipation (max.): х W
Operating temperature (min./max.): 0 — 70°C
Package (Socket): Plastic DIP 40-pin (40-pin DIL)
Dimensions: 52 x 15 x 8mm
こんな文書にUA880の記載がある。
- CP/M Plusの対応を始めた。
- これを利用すれば、CP/M 2.2からCP/M 3が起動できるみたいだ。まずCP/M 2.2を起動し、二段ロケット方式でCP/M3を起動する。
- 62K CP/M 2.2 BIOSがそのまま再利用できる。BIOSのジャンプテーブルを参照可能なシンボルファイルをリンクすることで、CPM3.SYSとCPMLDR.COMを生成する。(CP/M2.2上アセンブラ、リンカを動かして生成する。)
- このイメージになるように、LDRBIOS.ASMの
bios
を値を、BIOS2の先頭アドレスf200h
に変更する。CP/M 2.2 CP/M 3 0000H +--------+ +--------+ 0100H |--------| |--------| | TPA | | TPA | | (55K) | | (52K) | | | D000H |--------| DC00H |--------| | | | CCP | | BDOS3 | | (800H) | | (1D00H)| E400H |--------| | | | BODS2 | ED00H |--------| | (800H) | | BIOS3 | | | | (400H) | F200H |--------| - - - - |--------| | BIOS2 | | BIOS2 | | (E00H) | | (E00H) | FFFFH +--------+ - - - - +--------+
gencpm.com
でCPM3.SYSを生成するが、このメモリマップになるようにするには、以下のようにパラメータをセットする。ノンバンクメモリバージョンで生成。Top page of memory (FF) ? F0 Bank switched memory (Y) ? N
- CP/M 3が動いた。
- BIOSとCPMLDR.COMの生成は、
gen.sub
のバッチファイルを使うのが便利だが、A:ドライブに置かないといけない。また、CP/M2.2用のsubmit.comを使う必要がある。 - A:に、CPMLDR.COM, CPM3.SYS, CCP.COMをコピーして、CPMLDR.COMを起動すると、CP/M3が立ち上がった。なんかリターンがたくさん入るけど。。
62K CP/M-80 Ver2.2 on Z80ATmega128 BIOS Copyright (C) 2023 by 46nori A>cpmldr CP/M V3.0 Loader Copyright (C) 1998, Caldera Inc. BIOS3 SPR ED00 0400 BDOS3 SPR CE00 1F00 51K TPA A>
- PC-8801mkIIでCP/M 2.2を使っていた頃は、CP/M Plusに憧れがあったのだけど、いまのところありがたみも凄みも感じられないなぁ。。
- DIRコマンドとか?
A>dir.com Scanning Directory... Sorting Directory... Directory For Drive A: User 0 Name Bytes Recs Attributes Name Bytes Recs Attributes ------------ ------ ------ ------------ ------------ ------ ------ ------------ BDOS3 SPR 16k 77 Dir RW BIOS3 SPR 8k 9 Dir RW BIOS3 SYM 8k 2 Dir RW BNKBDOS3 SPR 16k 106 Dir RW CCP COM 8k 25 Dir RW COPYSYS COM 8k 15 Dir RW CPM3 SYS 16k 72 Dir RW CPMLDR COM 8k 25 Dir RW CPMLDR REL 8k 23 Dir RW CPMLDR SYM 8k 2 Dir RW DATE COM 8k 26 Dir RW DEVICE COM 8k 57 Dir RW DIR COM 16k 114 Dir RW DUMP COM 8k 8 Dir RW ED COM 16k 73 Dir RW ERASE COM 8k 30 Dir RW GBIOS ASM 16k 103 Dir RW GBIOS PRN 24k 164 Dir RW GBIOS REL 8k 6 Dir RW GBIOS SYM 8k 9 Dir RW GEN SUB 8k 1 Dir RW GENCOM COM 16k 115 Dir RW GENCPM COM 24k 166 Dir RW GET COM 8k 51 Dir RW HELP COM 8k 55 Dir RW HELP HLP 64k 496 Dir RW HEXCOM CPM 8k 9 Dir RW LDRBIOS ASM 16k 103 Dir RW LDRBIOS PRN 24k 164 Dir RW LDRBIOS REL 8k 6 Dir RW LDRBIOS SYM 8k 9 Dir RW LINK COM 16k 122 Dir RW PATCH COM 8k 19 Dir RW PIP COM 16k 68 Dir RW PUT COM 8k 55 Dir RW README 1ST 8k 9 Dir RW Press RETURN to Continue Directory For Drive A: User 0 Name Bytes Recs Attributes Name Bytes Recs Attributes ------------ ------ ------ ------------ ------------ ------ ------ ------------ RENAME COM 8k 23 Dir RW RESBDOS3 SPR 8k 16 Dir RW RMAC COM 16k 106 Dir RW SAVE COM 8k 14 Dir RW SCB REL 8k 3 Dir RW SET COM 16k 81 Dir RW SETDEF COM 8k 34 Dir RW SHOW COM 16k 66 Dir RW SUBMIT COM 8k 10 Dir RW TYPE COM 8k 24 Dir RW Total Bytes = 576k Total Records = 2771 Files Found = 46 Total 1k Blocks = 370 Used/Max Dir Entries For Drive A: 46/ 256
- 以下のパッチをあてるときにエラーになる場合があるので、Issueを上げた。(Issue 10, Issue 12)
- z80/cpm22/sys/CPM22-asz80.patch
- z80/cpm3/image/CPM3-LDRBIOS.patch
vscode@Z80ATmega128:/z80/cpm3/image$ make ... patch -i CPM3-LDRBIOS.patch ./tmp/cpm3on2/LDRBIOS.ASM patching file ./tmp/cpm3on2/LDRBIOS.ASM Hunk #1 FAILED at 110 (different line endings). 1 out of 1 hunk FAILED -- saving rejects to file ./tmp/cpm3on2/LDRBIOS.ASM.rej make: *** [Makefile:89: tmp/cpm3on2] Error 1
- 原因
- checkout時にファイルの改行コードがLFになるから。パッチ適用先のCP/MのファイルはCRLFなので、Gitで勝手にLFに変換されてしまうと行が一致しないのでエラーになる。
- 対策
.gitattributes
に以下を追加して、強制的に改行コードをCRLFにする。*.patch text eol=crlf
- さらにpatchコマンドにバイナリ比較オプション
--binary
を追加したら解決した。(だが、なぜこれが必要なのかよくわからない。。)
- Ubuntu 22.04上で
mkfs.cpm
でディスクイメージ作るとエラーになる。apt install cpmtool
した/etc/cpmtools/diskdefs
にsdcard
の定義が存在しないのが原因。コマンドラインで指定できないのでdiskdefsに定義を追加するしかない。wontfix扱いでIssue 13を登録した。
10/24にeBayで発注したZ8400APS
(5個セット)が届いた。深圳からだけどEconomy International Shipping($2USD)だったので時間かかった。
- 樫木総業に発注していたNECのuPD780C-1が届いた。
- いまのところZ80Aのコレクションはこんな感じ。
Manufacturer 型番 ロット? その他 Zilog Z8400APS 8320 中学生の頃入手 Zilog Z8400APS 9013 eBayで購入 SHARP LH0080A 9640 SHARP MZ-80Bで採用 NEC uPD780C-1 8338X5 NEC PC-8001で採用 MME 80A-CPU (U880) eBayで購入。旧東ドイツ製。輸出版。
- Z80を何度も挿抜しているとチップもソケットも傷がつくので、評価用にゼロプレッシャーソケットの基板を1枚作った。
- eBayで購入した5個セットのZ8400APS、全数チェックしたら1個故障していた。(泣)
- TinyMonitorの
test
コマンドがハングアップする。
Z80を載せておかないといけない。/BUSACKによるZ80のバス解放をAVRのPD6で確認しているため。 Insert microSD Card
が表示される。
microSD Card slotの挿入状態が正しく取れていない。以下を確認。- PB6のハンダ不良
- microSD Card slotの9番ピン、10番ピン(GND)のハンダ不良
冬休みに入ったので、(Issue #11)に手をつけることにした。
SELDSKが遅いため、ファイルコピーなどドライブの切り替えが発生するとパフォーマンスが著しく低下する問題。ストレスフルなので何とかしたい。
Petit FatFsではファイルが同時に1つしかオープンできない制約があるため、SELDSKでDISKイメージファイルを切り替えるたびにpf_open()を実行する必要がある。ここに2,3秒かかっている。すべてのDISKイメージファイルがあらかじめオープンしておけるなら、pf_open()が不要になるので相当早くなるはずだ。
複数ファイルの同時オープンはFatFsを使用すれば可能。そもそもPetit FatFsを採用したのは以下の理由なので、フットプリントの懸念がなければFatFsに乗り換えられる。
- CP/Mでは同時に複数のディスク(イメージファイル)にアクセスする必要がない。(が、まさかpf_open()がこんなに遅いとは思わなかった。)
- AVRのRAMが4KBしかない。当初は全体でどのくらいメモリを食うか正確に見積もるのは難しかったため、フットプリントはなるべく小さくしたかった。
改めてFatFsのフットプリントを調べてみた。
- 条件
-
$V=1$ : 1物理ドライブ -
$F=5$ : 5ファイル (A: - E:の5 DISKイメージ分)
-
- 必要なSRAMサイズ
- .bss =
$V \times 4 + 2$ = 6 -
FF_FS_TINY == 0
の場合- .bss + Work area
$= 6 + V \times 560 + F \times 546 = 3296$
- .bss + Work area
-
FF_FS_TINY == 1
の場合- .bss + Work area
$= 6 + V \times 560 + F \times 34 = 736$
- .bss + Work area
- .bss =
現在の残SRAMサイズは2048bytesなので、FF_FS_TINY == 1
なら問題ない。
ということで、ブランチfeature-FatFs
で作業することにした。
- FatFsのソース管理用に
avr/src/fatfs/
を作成。(avr/src/petitfs/
の代替) - FatFs本体(R0.15)とパッチを入手し、patch3まで適用してコミット。
- サンプルをダウンロードしてAVR用のソースを取り出す。
- ffsample.zip : サンプル
diskio.h
,mmc_avr.h
,mmc_avr_spi.c
をカスタマイズして使用する。 他は不要。
Petit FatFsからFatFsへの乗り換え作業を実施。意外と簡単に移行できた。
非常に速くなった!特にPIPのファイルコピーが劇的に改善された。
現在のメモリ残量は1265bytes。
- Microchip StudioのSolution Explorerで、
petitfs/
を削除、fatfs/
を追加。 petitfs/
は削除。ffconf.h
- ディレクトリ関連のAPIは不要。RTCはハード的に存在しないので不要。LFNも使用しない。文字列処理やUNICODE対応も不要。
- 以下のようにコンフィグレーションを変更する。
#define FF_FS_MINIMIZE 2 #define FF_FS_TINY 1 #define FF_FS_NORTC 1
diskio.c
- MMCの実装以外は削除。
diskio.h
mmc_avr_spi.c
に合うように、サンプルから中身をほぼコピー。
mmc_avr_spi.c
- Platform依存のSPIやポートのマクロ定義を
petitfs/diskio_avr.c
の実装からコピぺ。 power_on()
に、SPIの初期化コードをpetitfs/diskio_avr.c
の実装からコピぺ。FCLK_SLOW()
16MHzの1/64に設定。FCLK_FAST()
16MHzの1/2に設定。MMC_CD
Card検出をサポート。MMC_WP
WRITE PROTECTサポート。未使用だったDIPSW3がON時にプロテクト状態とした。disk_timerproc()
で以下をチェック。- MMC_WPなら、YELLOW LEDを点灯させる。
- MMC_CD未挿入なら、BLUE LEDを点灯させる。
- タイムアウト処理を行っているので
disk_timerproc()
を10msごとに呼び出す必要がある。isr.cのTIMER2の10msの周期割り込みハンドラ内で呼び出す。
- Platform依存のSPIやポートのマクロ定義を
em_diskio.c
- FatFSのAPIに乗り換え。
init_em_diskio()
でDISKイメージファイル5つをすべてオープン。OUT_0A_DSK_SelectDisk()
でのオープン処理を削除し、カレントDISKイメージのポインタだけ切り替えるように変更。- Writeのフラッシュ処理を
f_sync()
に変更。
-
CP/M起動後にmicroSDをWRITE PROTECT ON/OFFしたときに復帰できるよう、以下の変更を実施。現在のメモリ残量は1151bytes。
OUT_0A_DSK_SelectDisk()
で、指定されたDISKイメージファイルがエラー状態だったら、再openし、エラー状態をリセット。- エラー発生で全滅しないよう、ドライブごとに状態を独立管理させた。
-
v3.0リリース