goo blog サービス終了のお知らせ 

石原 博の覚書

電子工作に関する日々の覚書を記載します

avrcpm注意点4

2020-10-18 13:38:31 | 日記
CP/Mディスク作成

https://github.com/petersieg/avrcpm を参考にさせて頂いてます。

付属するCPMDSK_A_IMGでは動作します。

しかしサイトから The Unofficial CP/M Web site(http://www.cpm.z80.de/)等から
ソフトを入れたいと考えました。

neko javaさんの、「CP/Mディスクイメージ作成手順メモ」を参考に、
64セクタ/トラック、244トラックで作成を考えました。ところが上手く動きません。

通常はbios内だけにディスクパラメタがあるのですが、
実は、dsk_fsys.asm内にもあります。これも修正が必要です。(当然BIOSも修正が必要)

1トラック=64セクタ中 IPL=1セクタ、CCP+BDOS=44セクタとして、残り19セクタまでBIOSに割り当てることが可能なため、
offsetは1としています。

さらに同じようにdiskdefsを作成し mkfs.cpm を使用してディスクイメージを作成することが必要です。

この状態で、通常のコマンドやMBASICの単純な動作確認は通ります。しかしBDS Cでコンパイルの実験をすると、
bad sectorエラーが出ます。SDRAMのノイズ等のハードも疑ったのですが、思ってもみないところで問題がありました。

===ディスクイメージ作成スクリプト(失敗)===
dd conv=sync bs=128 count=1 if=ipl.bin > cpm.bin
dd conv=sync bs=128 count=44 if=cpm.sys >> cpm.bin
dd conv=sync bs=128 count=17 if=bios.bin >> cpm.bin

mkfs.cpm -f CPM-A -b cpm.bin -L drive_a diskimage
cpmcp -f CPM-A diskimage ./temp/A/*.* 0:
mv diskimage CPMDSK_A.IMG
=======================================

これで作成したイメージは、mkfs.cpmだけだと16,384バイト、cpmcpを行うと243,712バイト(イメージ内にコピーするデータによる)
これをパーティションを切った上でfat16でフォーマットしたSDRAMにコピーするのですが、
avrcpm側ではこの領域を広げることが出来ないようです。
そもそも 128byte/sec 64sec/trk 244trk なら 1,998,848バイトです。

mkfsのソースは読んでませんが、予め領域を確保していれば良いことが分かりました。そこで

===ディスクイメージ作成スクリプト(失敗)===
dd conv=sync bs=128 count=1 if=ipl.bin > cpm.bin
dd conv=sync bs=128 count=44 if=cpm.sys >> cpm.bin
dd conv=sync bs=128 count=17 if=bios.bin >> cpm.bin

dd conv=sync bs=8192 count=244 if=/dev/zero > diskimage
mkfs.cpm -f CPM-A -b cpm.bin -L drive_a diskimage
cpmcp -f CPM-A diskimage ./temp/A/*.* 0:
mv diskimage CPMDSK_A.IMG
=======================================
としています。

Neko Javaさんのところでは、1つのファイルに複数CP/Mドライブイメージを入れてます。
Dドライブは領域不足になるのではないかなぁ
私の場合は、Aドライブは変更せずCドライブだけ導入ソフトを変更するということがあるので、
ドライブ毎にファイルを分けています。
===Neko Javaさんのページ ディスクイメージ作成===
mkfs.cpm -f cpm_d diskimage
mkfs.cpm -f cpm_c diskimage
mkfs.cpm -f cpm_b diskimage
mkfs.cpm -f cpm_a -b cpm.bin -L test diskimage
=======================================================

様々なサイトにお世話になりながら、やっと動くものが出来ました。

参考
CP/Mディスクイメージ作成手順メモ
https://www.mikrocontroller.net/articles/AVR_CP/M

===dsk_fsys.asm(オリジナル)===
dpbdat_avrcpm: ;(dpb243)
.db 0x00,0x1A ;sector offset, low(spt)
.db 0x00,0x03 ;high (spt), block shift
.db 0x07,0x00 ;bock mask, extent mask
.db 0xF2,0x00 ;disk size - 1,
.db 0x3F,0x00 ;dir max
.db 0xC0,0x00 ;alloc0, alloc1
.db 0x10,0x00 ;chk size
.db 0x02,0x00 ;offset
=======================

===dsk_fsys.asm(修正後)===
dpbdat_avrcpm: ;
.db 0x00,64 ;sector offset, low(spt)
.db 0x00,4 ;high (spt), block shift
.db 15,0x00 ;bock mask, extent mask
.db 0xcb,0x03 ;disk size - 1,
.db 0x7F,0x00 ;dir max
.db 0xC0,0x00 ;alloc0, alloc1
.db 0x20,0x00 ;chk size
.db 0x01,0x00 ;offset
=======================


===BIOS内該当部分========
dpb972:
dw 64 ;sec per track
db 4 ;block shift BSH 2048=128*(2^4)
db 15 ;block mask BLM 2048/128-1=15
db 0 ;extnt mask EXM
dw 971 ;disk size-1 DSM 128*64*(244-1)/2048-1=971
dw 127 ;directory max DRM 2*64-1
db 192 ;alloc0
db 0 ;alloc1
dw 32 ;check size CKS (DRM+1)/4=(127+1)/4=32
dw 1 ;offset
============================

===diskdefs===
# CP/M A:drive
diskdef CPM-A
seclen 128
tracks 244
sectrk 64
blocksize 2048
maxdir 128
skew 1
boottrk 1
os 2.2
end
=================

avrcpm注意点3

2020-10-18 13:37:49 | 日記
デバッグ

https://github.com/petersieg/avrcpm を参考にさせて頂いてます。

config.incでデバックの指定が出来ます。
===config.inc===
;Debugging aids

.equ BOOTWAIT = 1
.equ MEMTEST = 1
.equ MEMFILL = 1 /* Fill DRAM */
.equ SRAM_FILL = 1 /* Fill unused SRAM */
.equ MMC_DEBUG = 0 /* Increase for more debugging */
.equ MMC_DEBUG_RDW = 0
.equ DSKSEL_DEBUG = 0
.equ DISK_DEBUG = 0 /* 1 = BOOT/HOME debug, 2 = +R/W debug */
.equ HOSTRW_DEBUG = 0
.equ FAT16_DEBUG = 0
.equ FAT16_DBG_FAT = 0
.equ HEAP_DEBUG = 0
.equ PORT_DEBUG = 0
.equ INS_DEBUG = 0
.equ STACK_DBG = 0
.equ PRINT_PC = 0
.equ TIMER_DEBUG = 0
.equ I2C_STATE_DEBUG = 0
.equ MEMDUMP_DEBUG = 1

しかしDISK_DEBUGを1にすると、アセンブル時にエラーが発生します。(dsk_fsys.asm(1017): error: Relative branch out of reach
)
相対ブランチが届かないのだとは分かりますが、どこなのかわからない。調べてみると以下の部分で発生していました。
これでデバッグが出来ます。

dskdbg1:
ldd temp,y+o_seekdsk
subi temp,-('A')
- rcall uartputc
+ lcall uartputc
printstring ": trk "
ldd temp2,y+o_seektrk+1
ldd temp,y+o_seektrk



avrcpm注意点2

2020-10-18 13:35:48 | 日記

4BIT DRAMの使用

https://github.com/petersieg/avrcpm を参考にさせて頂いてます。

config.incでは
===config.inc===
; Set this to 0, if you have a (one) DRAM chip whith 4 Bit data bus.
#define DRAM_8BIT 1

; Baudrate of serial port (console).
#define BAUD 9600

; I2C_SUPPORT defaults to 1 on 8-bit-ram systems and must be 0 on 4-bit-ram systems.
; Set this do 0, if you don't have  I2C peripherals and want to save some flash
; or use the I2C pins for other purposes.
#define I2C_SUPPORT
======================

となっています。私の場合、4BIT DRAMを使っていますので、
#define DRAM_8BIT 0
#define I2C_SUPPORT 0
とした訳ですが、動きません。

調べたところinit.asmでは以下のようになっており、4BITの場合PortB, PortCの入出力設定がされていません。

ご注意ください。

===init.asm(修正前)===
#if I2C_SUPPORT
 ldi temp,~((1<<SCL)|(1<<SDA))
 out DDRC,temp
#endif
#if DRAM_8BIT
 ldi temp,~(1<<RXD)
 out DDRB,temp
#endif
============================

===init.asm(修正後)===
#if I2C_SUPPORT
 ldi temp,~((1<<SCL)|(1<<SDA))
 out DDRC,temp
#else
 out DDRC, _255
#endif
#if DRAM_8BIT
 ldi temp,~(1<<RXD)
 out DDRB,temp
#else
 out DDRB, _255
#endif
============================


avrcpm注意点1

2020-10-18 10:00:48 | 日記

avrcpmといえば、最初に発表されたこのページの手書き回路図が有名です。 (https://spritesmods.com/?art=avrcpm)

atmega88を3.3v 20MHzで、本来5Vが必要なDRAMを3.3vで動かすといった無理矢理な部分はありますが、 AVRと256kx4bitのDRAM1個、ソフトウエアでリフレッシュという極限までシンプルにした構成でありながら SDRAMをディスク代わりに使用してCP/Mが動くということに驚いたものです。

その後いくつかのサイトで別のバージョンが公表されていますが、注意点があります。(私はhttps://github.com/petersieg/avrcpmを参考にしてはまりました)

DRAM周りの回路が変更になり、ソフトウエアも変更されています。 最初の手書き回路図があまりに印象的なので、そのまま作成し、 ソフトウエアはバグが少ないだろうと最近のものを使用すると動きません。

Yoshiさんのサイト(http://yoshi-s.cocolog-nifty.com/cpu/2011/10/avr-cpm.html)に もavrcpm_upd2.zipはオリジナルから配線の変更有とありますが、(githubに移行して消したのか)petersiegのサイトにあったavrcpm_upd2.zip自身すでにダウンロード出来なくなっているため、なかなか気づけません。

ご注意ください。

ポート
PC0 D0 D0
PC1 W D1
PC2 D1 D2
PC3 D3 D3
PC4 D2 W
PC5 CAS CAS