石原 博の覚書

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

Z80 MBC2が動いた

2020-11-23 11:11:38 | 日記
https://hackaday.io/project/159973-z80-mbc2-a-4-ics-homebrew-z80-computer を参考に。

基板はオレンジピコから購入。(実績ある基板なので部品を日本橋で揃えて、あとは一直線)

ATMEGA32Aの書き込みは、USBASPを使う
$avrdude -c usbasp -p m32 -P usb -U flash:w:S220718-R240620_IOS-Z80-MBC2.ino.with_bootloader_atmega32_16000000L.hex

ソフトについては、SD-S220718-R280819-v1.zipを展開したものを、そのままマイクロSDにコピーして使用

注意点
RXにUSBシリアル変換ボードのTXD、TXにRXDを接続したが動かない。基板上RX,TXとなっているが、それぞれATMEGA32AのTXD、RXDに接続されている。逆に接続し動作OK。

マイクロSDには、CP/M 2.2, QP/M 2.71, CP/M 3.0, UCSD Pascalのディスクセットがあり、CP/M 2.2では以下のとおり。(QP/MやCP/M3.0、UCSD Pascalは使ったことがないので良くわからない)

a: pip, ed, asm mac 等のCP/M80のツール類 や zde16(エディタ)
b: TurboPascal
c: Hi-tech C
d: fortran80
e: bascom
以降f:〜p:まで16ドライブ(空の状態)
diskdefsは付属しており、cpmtoolsでソフトを導入することが出来る。

512バイト/セクタ、32セクタ/トラック、512トラック/ドライブ で約8メガバイト/ドライブ(Aドライブのみシステム用のトラックが1)
CP/M2.2のサイズは明記されていないが、0番地を見るとJMP 0b80eh なので、59.5K CP/Mのようだ。

PDP-8をCPLDで作る

2020-11-08 10:58:03 | 日記
omoikone CPLDP-8 version 3(http://www.gc-net.jp/omiokone/cpldp8/index.htm)を参考(というかデッドコピー

昔からCPUを作るのが夢でCPLDやFPGAを調べていたが、CPLDではレジスタがほとんど作れないため無理と諦めていた。しかし上記サイトでCPLDで作成出来る、しかもPDP-8ということで興味を持った。

verilogを見てもよくわからない。しかしたまたま以前購入していた、アルテラMAX II EPM240 CPLD開発ボード(amazonで1300円程度)があったため、それを流用しドーターボード形式で作れそう。

・回路はそのまま流用(デッドコピーです)
・ハンダ付けは大変なので、kicadでプリント基板を作成 

プリント基板はseed(https://www.fusionpcb.jp/login.html)で作成。10x10cm 10枚で$4.9(送料約$17 送料の方が高い)であるが、はんだ付けの手間を考えれば納得できる金額。

もともと開発ボードのクロックは50MHz。 必要なのは8MHzのクロック。CPLDなので内部で分周すればと思ったが、すでにセル数が限界。それにverilogの内容がよく理解出来ない。そこで開発ボードの裏に、別の発振子を接続。 RAMはIS62WV25616BLL(256Kx16 2.5V〜3.6V TSOPタイプ2 0.8mmピッチ)を使用


大変だった点
1作目
 ・開発ボードが、正常ではなかった
  (開発ボード初期に入っているPGによりLEDの点滅は確認出来るが、どう見てもショートしているピンがある)
  ピンのアサインを変えて対応 ->とりあえず動作

2作目
 ・発振子をドーターボード上に載せるべく、レイアウトを変更したがミス。また開発ボードの裏に半田づけ。
 ・開発ボードを同一業者から買ったが、ピンの配置が違う(ドーターボードがつながらない)
 ・今回購入した開発ボードも別のピンがショートしているような感じ->はんだ付けし直して正常化


とりあえず動いた。OSが動き、付属のソフトが動いている。頑張ってLEDをつけたが、あまり動作チェックの役には立たない。(ハードデバッグ時には役にたったけど)
この規模程度のCPUで、FORTRANやPASCALが動くことが信じられない。(まだZ80の方が高機能?) ただWeb上のさまざまな資料を見てもOS-8は良くわからないなあ。


avrcpmのDRAMリフレッシュ

2020-11-07 19:15:55 | 日記

avrcpmではソフトウエアでリフレッシュを行っている。

方法はCAS before RAS リフレッシュ

私が使っているメモリはTMS44C256 (262,144 x 4bit)なので 8msecに1回リフレッシュが必要
->RAS 9bit を8msecなので、1秒間に64000回リフレッシュが必要となる
(512回 / 8msec = 64000回/秒)

avrcpmのソフトでは、1回の割り込みで2アドレス分リフレッシュする。
このため32000回/秒の割り込みが必要。

1回あたりのリフレッシュでは、割り込み処理(call類似+rjmp)5cycle + (リフレッシュ)19cycle =24cycle 

これは 1.5usec(16MHz)必要なことからavr自身は約95%の速度でエミュレーションを行うことになる
(1.5usecx32000=0.048秒)

関連部分ソース
#config.inc
#define F_CPU 16000000   
#define REFR_RATE 64000

#init.asm
Init timer2. Refresh-call 8ms/512
#define REFR_PRE 8 /* prescale 1/8 */
#define REFR_CNT F_CPU / REFR_RATE /REFR_PRE

ldi temp,REFR_CNT*2
outm8 OCR2A,temp

 

#dram_refresh.asm

; ------------------- DRAM Refresh Interrupt --------------------

 .cseg
 
 INTERRUPT OC2Aaddr
; reti     ; only for SRAM 

 sbis P_RAS,ram_ras       ;2
 reti
                 ;       CAS  RAS  
 cbi P_CAS,ram_cas        ;2       1|   1|  
                             ;        1|   1|  
 cbi P_RAS,ram_ras           ;2      |0    1|  
                             ;       |0    1|  
 nop                         ;1      |0   |0     
 sbi P_RAS,ram_ras           ;2      |0   |0   
                             ;       |0   |0  
 cbi P_RAS,ram_ras           ;2      |0    1|  
                             ;       |0    1|  
 sbi P_CAS,ram_cas           ;2      |0   |0   
                             ;       |0   |0   
 sbi P_RAS,ram_ras           ;2       1|  |0   
                             ;        1|  |0         
                             ;        1|   1|  
 reti                        ;4

RAS  -----+           +--------+           +----
          +-----------+        +-----------+
CAS  --+                             +-------------
       +-----------------------------+