PC-8001に8K SRAM増設

PC-8001は6000Hから7FFFHまでが増設用のROM領域になっていて、ここにSRAMを増設してみます。

![MEM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/e821da36-9c00-27ef-6027-e20aa3cd008b.png)

まずGALにアドレスのデコードとメモリのRD/WRを追加します。

```
title    CH376S IO UNIT 
pattern  CHIO 
revision A 
author   yamori813 
date     07/13/21 
chip chio gal6001 

; The following pin list order mustly be followed strictly: 
; 1. device pins 1 to 24 
; 2. slmc 7 to slmc 0 
; 3. buried feedback (OLMC 14) to buried feedback (OLMC 23) 

; pins 1  2  3  4  5  6  7  8  9  10  11  12 
       i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 gnd 

; pins 13   14  15  16  17  18  19  20  21  22  23  24 
       oclk o14 o15 o16 o17 o18 o19 o20 i21 i22 i23 vcc 

; slmc7 slmc6 slmc5 slmc4 slmc3 slmc2 slmc1 slmc0 
  nc    nc    nc    nc    nc    nc    nc    nc 

; buried feedback to AND array from OLMCs. 
; bur14 bur15 bur16 bur17 bur18 bur19 bur20 bur21 bur22 bur23 
  nc    nc    nc    nc    nc    nc    nc    nc    nc    nc 

; specify the User Electronic Signature (UES) 

@ues chio
  ; 8 ues bits are used per character. 

equations 

; ILMC         : asynchronous inputs. 
; IOLMC        : asynchronous feedback to AND array. 
; SLMC         : not used. 
; OLMC 14-18   : asynchronous outputs (output always enabled). 
; OLMC 19-23   : D-type registered outputs (output always enabled). 
;      buried feedback of OLMCs not used. 
; asynch reset : not used (default is registers cannot be reset).  

; RESET
;o14  = /i1 

; RD =  RD | IORQ
o14  =  i2 | i3
; WR =  IORQ | WR
o15  =  i3 | i4

; CE ADDRESS A1-A7 FC(252),FD(253) 11111100 11111101

/o16 = /i5 & i6 & i7 & i8 & i9 & i10 & i11

; RD =  RD | MREQ
o17  =  i2 | i1
; WR =  MREQ | WR
o18  =  i1 | i4

; a13 a14 a15 6000H 0110 0000
o19 = i21 & i22 & /i23

; end of example 5 
```

何かの基板から剥がしたSOP28のHY6264を変換基板で使おうと思ったのですが、変換基板のパターンより足が大きくハンダ付けできません。

いろいろ試して、片側はパターンでハンダ付けして、片側はワイヤーを張ることにしました。（後日追記：いろいろいじってたら、片側のパターンがはがれ、結局両方ワイヤー張ることになりました）

![SRAM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6bb5e3aa-6880-5a26-76c6-0c5a0cd73e61.png)

![IMG_20210724_112248.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4b5d1f8e-c21e-9ee8-a86c-4bb333ed2f15.jpeg)

電源を入れる前には必ずVCCとGNDがショートしていない事を確認します。

DataバスがショートしているとPCが起動しません。起動するようになってもちゃんと接続されてないかもしれません。とりあえず最初はmonで増設領域に書き込みをして読み込んで正常か確認します。

後日追記：秋月の変換基板のAE-SOP28-DIP-Aはパターンが広くハンダ付けしやすいです。

手動での確認では全領域のテストはできないので、テストプログラムを書いて確認しました。ロジックは「マイコンのためのBASICの使い方」のRAMテスター(P125)を参考にしています。

```
	MEMSTART EQU	6000H
	MEMEND   EQU	8000H

PUT	MACRO	C
	LD	A, C
	RST	18H
	ENDM

TEST_00:
	LD	HL,MEMSTART
LOOP1
	LD	(HL), 0
	INC	HL
	LD	A, MEMEND SHR 8
	CP	H
	JP	NZ, LOOP1

	PUT	'0'
	PUT	'0'

	LD	HL,MEMSTART
LOOP2:
	LD	A,(HL)
	AND	A
	JP	NZ, ERR
	INC	HL
	LD	A, MEMEND SHR 8
	CP	H
	JP	NZ, LOOP2

	PUT	':'
	PUT	'O'
	PUT	'K'

TEST_BW:
	PUT	'-'
	PUT	'B'
	PUT	'W'

	LD	HL,MEMSTART
LOOP4:
	LD	D, 1
LOOP3:
	LD	(HL), D
	LD	A, (HL)
	CP	D
	JP	NZ, ERR
	RLC	D
	JP	NC, LOOP3
	INC	HL
	LD	A, MEMEND SHR 8
	CP	H
	JP	NZ, LOOP4

	PUT	':'
	PUT	'O'
	PUT	'K'

TEST_FF:
	LD	HL,MEMSTART
LOOP5
	LD	(HL), 0FFH
	INC	HL
	LD	A, MEMEND SHR 8
	CP	H
	JP	NZ, LOOP5

	PUT	'-'
	PUT	'F'
	PUT	'F'

	LD	HL,MEMSTART
LOOP6:
	LD	A,(HL)
	CP	0FFH
	JP	NZ, ERR
	INC	HL
	LD	A, MEMEND SHR 8
	CP	H
	JP	NZ, LOOP6

	PUT	':'
	PUT	'O'
	PUT	'K'

END:
	JP	05C66H

ERR:

	PUT	':'
	PUT	'E'
	PUT	'R'
	PUT	'R'

	JP	05C66H
```

![IMG_20210721_154628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fe4c7093-4767-583e-dd87-18dc082c5056.jpeg)

本体にROMを増設している場合はROMDS3#で無効にできるようです。これはPC-8011などで64Kフルメモリや外部のROMのサポートのためにあったと思われます。

CP/Mを利用するためには64Kフルメモリが必要で、ブート時にROMDS0-3ですべてのROMを無効にしてRAMを有効にして、フロッピーのIPL部分をメモリに貼り付ける必要がありました。

結構苦労しました。

ちなみにPC-8001のメモリはDRAMですが、これはSRAMに比べて部品が小さかったことと価格が安かったためです。PC-8001の16K増設メモリは9800円でしたが、1979/12号のRAMの秋月の広告ではSRAMのHM472114P-4が1000円で4ビットなので1Kバイト2000円で、16Kバイトだと32000円になりました。

90年代のデジタル系家電の基板にはSRAMが乗っていることがよくあります。SOPだったりしますが、ヒートガンを使うと簡単に剥がせるので、捨てる前に剥がして再利用がお勧めです。

# N-BASIC 1.0のバグ

6000HにAB"があるとその後の処理を実行するはずなのですが、何故か動きません。

monのディスパッチのほうは動きます。

```
MON
*S7FFC
7FFC 00-C9 00-00 00-00 00-55
8000 E6-
*^B
MON
Ok
```

仕方が無いので0000H-2000Hをモニターでセーブして、DumpListEditorで逆アセンブルしてみます。

ROMのチェックルーチンは183EHからあり以下のようなコードです。

```
   1:				
   2:     -	0000'         	START:
   3:    0+10	0000' 210060  		LD	HL, 6000H
   4:   10+7	0003' 7E      		LD	A, (HL)
   5:   17+7	0004' FE41    		CP	'A'
   6:   24+6	0006' 23      		INC	HL
   7:   30+10	0007' C21000  		JP	NZ, END
   8:   40+7	000A' 7E      		LD	A, (HL)	; N-BASIC 1.0 BUG
   9:   47+7	000B' FE42    		CP	'B'
  10:   54+10+7	000D' CC0260  		CALL	Z, 6002H
  11:     -	0010'         	END:
  12:				
```

二つ目のLD A,(HL)がありません。これでは6000Hに"AB"があっても絶対に呼ばれません。

# 32K対応

フルRAMにするため32Kにする方法を考えて見ます。

8Kも32Kも28Pinなのでそのままでいけます。

![32K.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/13a0d017-0be5-c555-777a-de78aa586a17.png)

1,26ピンがアドレスに変わっているので、接続します。

8K増設のときにCS1(20)はGNDにしてCS2(26)をつかっていたのでGALのデザインを変える必要があります。

```
/o19 = i21 & i22 & /i23
```

ROMDS0-3の制御も考える必要があります。内蔵でROMは増設してないのでROMDS0-2を一括で処理しても良いかもしれません。

PC-8011などではIOポートでROMDSの制御ができたようです。

6000からの8Kは常時読み書き可能、0000からの24Kはスイッチで、ROMDS0-2をHiの時は読み込み不可で、書きこみ可にします。そうすると同じアドレスの読み書きをするとRAMにROMがコピーされます。フルRAM化するときは、ROMDS0-2をLoにしてRAMをすべて読み書き可能にします。

ROMDS0-2を物理スイッチ（ジャンパー）にして、その出力をGALでももらって、上のデコードを実現するのがよさそうです。

バッテリーバックアップも付けたいです。あと空いているところになにか載せたいな。

と思って調べていたら8Kの32Kでは[仕様がちょっと違う](https://qiita.com/yamori813/items/5555c8f918fdced81cd2)ことに気がつきました。

![IMG_20241014_080215.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4fdfddb2-831b-183d-551f-0ac9a8067f57.jpeg)