AKI-80でCP/M(RomWBW)を動かしてみた

気が付いたら3年もあけてしまった。

何年か前、ヤフオクを眺めていたところEasy Z80の基板が出品されていたので、さっそく落札した。
しばらくの間、10MHzで動くZ80SIO,CTCが手に入らず何か月か経ってから組み立てを行った。
このボードはRC2014というバスで機能を拡張できるようだったので、CFやIDEやRTCなど少しづつ購入していろいろ付け加えていった。
海外のサイトからの購入なので、すこし不安があったが無事に届いて安心した。

さて、話はかわって、秋月電子のAKI-80はいつのまにか終売となって、Super AKI-80も在庫限りで秋葉原店で投げ売りされていた。
手持ちのAKI-80やSuper AKI-80を眺めながら何か作れないかなを思い、ネットを眺めているとCP/Mを動かしたりしているのをいくつか見つけた。
そしてふとRomWBWを動かせないかと思いついたので、さらにネットを調べてみたがX(Twitter)で動いたという報告が1件あるだけだった。
どうしたものか調べてみると、RomWBWはTiny Z80に対応していて、そのTiny Z80はザイログのZ84C15が使用されている。
Z84C15は東芝のTMPZ84C015を元に作られていて、一部のピンとIO上にある設定用レジスタに違いはあるものの、ほぼ互換となっている。
ならば自分でもAKI-80でRomWBWを動かしてみようと思い、さっそく作ってみた。
クロック周りはTiny Z80を参考にしている。

まずはAKI-80で動くかどうか確認をかねて組み立て。

RomWBWもAKI-80用にコンフィグファイルを準備してアセンブルする。
コンフィグファイルはTiny Z80用のものを参考にした。
最初はうまく起動しなくて、ハード的・ソフト的にいろいろ調べてみた。
ハード的にはリセットにノイズが乗っていたようで、最終的にはAKI-80上のリセット周りは取り外した。
ソフト的には「hbios.asm」の一部に誤りらしきものがあったので、そこも修正。
v3.5.1を元に修正ファイルは \RomWBW-release\RomWBW-v3.5.1-Package\Source\HBIOS にある「hbios.asm」の1728行目以降。
修正箇所は以下の通り。

修正前

#IF (EIPCENABLE)
	LD	A,(EIPC_WDT_CONST | EIPC_HALT_RUN | EIPC_WDT_P2_22)
	OUT	(EIPC_WDTMR),A		; CLEAR WDTE BIT (DISABLE WATCHDOG)
	LD	A,EIPC_DIS_WDT		; DISABLE WDT - SECOND KEY
	OUT 	(EIPC_WDTCR),A
	LD	A,EIPC_WCR		; SET SYSTEM CONTROL REGISTER POINTER
					; (SCRP) TO POINT TO WAIT STATE
	OUT	(EIPC_SCRP),A		; CONTROL REGISTER (WCR)
	LD	A,(EIPC_IO_0WS | EIPC_MEM_OWS | EIPC_OCF_0WS | EIPC_INT_0WS | EIPC_CHAIN_0WS)
	OUT	(EIPC_SCDP),A		; NO WAIT STATES
	LD	A,EIPC_MCR		; SET SCRP TO POINT TO MISCELLANEOUS
	OUT	(EIPC_SCRP),A		; CONTROL REGISTER (MCR)
	LD	A,EIPC_CLKDIV1		; DIVIDE CLOCK BY 1, /CS0 DISABLE
	OUT	(EIPC_SCDP),A		; SET SYSTEM CONTROL DATA PORT (SCDP)
#ENDIF

修正後

#IF (EIPCENABLE)
	LD	A,EIPC_WDT_CONST | EIPC_HALT_RUN | EIPC_WDT_P2_22
	OUT	(EIPC_WDTMR),A		; CLEAR WDTE BIT (DISABLE WATCHDOG)
	LD	A,EIPC_DIS_WDT		; DISABLE WDT - SECOND KEY
	OUT 	(EIPC_WDTCR),A
;	LD	A,EIPC_WCR		; SET SYSTEM CONTROL REGISTER POINTER
					; (SCRP) TO POINT TO WAIT STATE
;	OUT	(EIPC_SCRP),A		; CONTROL REGISTER (WCR)
;	LD	A,EIPC_IO_0WS | EIPC_MEM_OWS | EIPC_OCF_0WS | EIPC_INT_0WS | EIPC_CHAIN_0WS
;	OUT	(EIPC_SCDP),A		; NO WAIT STATES
;	LD	A,EIPC_MCR		; SET SCRP TO POINT TO MISCELLANEOUS
;	OUT	(EIPC_SCRP),A		; CONTROL REGISTER (MCR)
;	LD	A,EIPC_CLKDIV1		; DIVIDE CLOCK BY 1, /CS0 DISABLE
;	OUT	(EIPC_SCDP),A		; SET SYSTEM CONTROL DATA PORT (SCDP)
#ENDIF

LD A,(~)のところをLD A,~に修正。
かっこの有無で意味が変わってくるが、説明は省略。
あとは、Z84C15で追加されてTMPZ84C015には無いレジスタの設定はコメントアウト。
ここはコメントアウトしなくても、I/Oを空振りするだけなので直さなくてもよいかも。

いろいろ修正して動くようになったが、今度はCFモジュールをつけるとCTCが見えなくなる。
なぜだろうと回路図を眺めると、CFモジュールのアドレスデコードでA7を見ていないことが分かった。
この状態だと、I/Oアドレスの0x10と0x90の両方に反応して、CTCのアドレスとかち合ってしまっている。
これに対応するためCFモジュールの修正を行った。
具体的には、アドレスバスのA7をM1とANDを取るようにダイオードとプルアップ抵抗を追加。
これでI/Oアドレスの0x90でのみ反応するようになった。
 

基板については、M1から74HCT138へ伸びているパターンをカットして、基板裏面にダイオードと抵抗を追加した。
 

とりあえずAKI-80で動くことを確認したら、今度は」Super AKI-80のほうに取り掛かった。
こちらは82C265(82C55 × 2)が付いていて、せっかくだからIDEの機能を乗せることにした。
IDEについては、RFC2014のサイトにあるIDE Hard Drive Moduleにある回路図を参考に配線する。


電源投入時にコンソールから起動メッセージが表示されても、こちらからの文字が入力できず、リセットしてから再起動後に入力できるようになることがあるので、リセットICのM51957Bを使って電源投入時の約1秒間リセット信号を送るようにモジュールを組む。
これで、電源投入して起動したあとのコンソール入力も問題なくできるようになった。

AKI-80とSuper AKI-80にメモリーなどいろいろ載せて動かしているところ。
Super AKI-80はIDEでコンパクトフラッシュをつないでいるので縦長になってしまった。

TeraTermの表示内容。
PPIDEがSuper AKI-80上のPPI(82C265)の0番を指していている。
RomWBWのコンフィグファイルもSuper AKI-80に合わせて直してある。

最後にコンフィグファイルの内容。
\RomWBW-v3.5.1-Package\Source\HBIOS\Config 内に「RCZ80_aki80_std.asm」というファイルを作成して、あとは\RomWBW-v3.5.1-Package\Source\HBIOS にある Buildコマンドでアセンブルするだけ。

;
;==================================================================================================
;   ROMWBW DEFAULT BUILD SETTINGS FOR TINY Z80
;==================================================================================================
;
; THIS FILE DEFINES THE DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM
; INDICATED ABOVE.  THESE SETTINGS DEFINE THE OFFICIAL BUILD FOR THIS
; PLATFORM AS DISTRIBUTED IN ROMWBW RELEASES.
;
; ROMWBW USES CASCADING CONFIGURATION FILES AS INDICATED BELOW:
;
; cfg_MASTER.asm			- MASTER: CONFIGURATION FILE DEFINES ALL POSSIBLE ROMWBW SETTINGS
; |
; +-> cfg_<platform>.asm		- PLATFORM: DEFAULT SETTINGS FOR SPECIFIC PLATFORM
;     |
;     +-> Config/<plt>_std.asm		- BUILD: SETTINGS FOR EACH OFFICIAL DIST BUILD
;         |
;         +-> Config/<plt>_<cust>.asm	- USER: CUSTOM USER BUILD SETTINGS
;
; THE TOP (MASTER CONFIGURATION) FILE DEFINES ALL POSSIBLE ROMWBW
; CONFIGURATION SETTINGS. EACH FILE BELOW THE MASTER CONFIGURATION FILE
; INHERITS THE CUMULATIVE SETTINGS OF THE FILES ABOVE IT AND MAY
; OVERRIDE THESE SETTINGS AS DESIRED.
;
; OTHER THAN THE TOP MASTER FILE, EACH FILE MUST "#INCLUDE" ITS PARENT
; FILE (SEE #INCLUDE STATEMENT BELOW).  THE TOP TWO FILES SHOULD NOT BE
; MODIFIED.
;
; TO CUSTOMIZE YOUR BUILD SETTINGS YOU SHOULD MODIFY THIS FILE, THE
; DEFAULT BUILD SETTINGS (Config/<platform>_std.asm) OR PREFERABLY
; CREATE AN OPTIONAL CUSTOM USER SETTINGS FILE THAT INCLUDES THE DEFAULT
; BUILD SETTINGS FILE (SEE EXAMPLE Config/SBC_user.asm).
;
; BY CREATING A CUSTOM USER SETTINGS FILE, YOU ARE LESS LIKELY TO BE
; IMPACTED BY FUTURE CHANGES BECAUSE YOU WILL BE INHERITING MOST
; OF YOUR SETTINGS WHICH WILL BE UPDATED BY AUTHORS AS ROMWBW EVOLVES.
;
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE
; SOURCE DIRECTORY (TWO DIRECTORIES ABOVE THIS ONE).
;
; *** WARNING: ASIDE FROM THE MASTER CONFIGURATION FILE, YOU MUST USE
; ".SET" TO OVERRIDE SETTINGS.  THE ASSEMBLER WILL ERROR IF YOU ATTEMPT
; TO USE ".EQU" BECAUSE IT WON'T LET YOU REDEFINE A SETTING WITH ".EQU".
;
#DEFINE PLATFORM_NAME "AKI-80", " [", CONFIG, "]"
#DEFINE AUTO_CMD	""		; AUTO CMD WHEN BOOT_TIMEOUT IS ENABLED
#DEFINE DEFSERCFG	SER_115200_8N1 | SER_RTS	; DEFAULT SERIAL CONFIGURATION
;
#INCLUDE "cfg_RCZ80.asm"
;
BOOT_TIMEOUT	.SET	-1		; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
BOOT_PRETTY	.SET	FALSE		; BOOT WITH PRETTY PLATFORM NAME
AUTOCON		.SET	TRUE		; ENABLE CONSOLE TAKEOVER AT LOADER PROMPT
;
CPUOSC		.SET	8000000		; CPU OSC FREQ IN MHZ
INTMODE		.SET	2		; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
;
CTCENABLE	.SET	TRUE		; ENABLE ZILOG CTC SUPPORT
CTCBASE		.SET	$10		; CTC BASE I/O ADDRESS
CTCTIMER	.SET	TRUE		; ENABLE CTC PERIODIC TIMER
CTCMODE		.SET	CTCMODE_CTR	; CTC MODE: CTCMODE_[NONE|CTR|TIM16|TIM256]
CTCOSC		.SET	921600		; CTC CLOCK FREQUENCY
EIPCENABLE	.SET	TRUE		; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION
WDOGMODE	.SET	WDOG_NONE	; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO		.SET	$6F		; WATCHDOG REGISTER ADR
;
FPLED_ENABLE	.SET	TRUE		; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE	.SET	TRUE		; FP: ENABLES FRONT PANEL SWITCHES
LCDENABLE	.SET	TRUE		; ENABLE LCD DISPLAY
CRTACT		.SET	FALSE		; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU_SERKBD	.SET	$FF		; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
DSRTCENABLE	.SET	TRUE		; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE	.SET	FALSE		; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
INTRTCENABLE	.SET	TRUE		; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)
;
DUARTENABLE	.SET	FALSE		; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM)
UARTENABLE	.SET	FALSE		; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
ACIAENABLE	.SET	FALSE		; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE	.SET	TRUE		; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
SIO0MODE	.SET	SIOMODE_STD	; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R]
SIO0BASE	.SET	$18		; SIO 0: REGISTERS BASE ADR
SIO0ACLK	.SET	1843200		; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SIO0BCLK	.SET	1843200		; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SIO1ACLK	.SET	7372800		; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SIO1BCLK	.SET	7372800		; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
;
TMSENABLE	.SET	FALSE		; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE		.SET	TMSMODE_MSX	; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU]
TMS80COLS	.SET	FALSE		; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958
TMSTIMENABLE	.SET	FALSE		; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VRCENABLE	.SET	FALSE		; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
EFENABLE	.SET	FALSE		; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM)
;
FDENABLE	.SET	FALSE		; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE		.SET	FDMODE_RCWDC	; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC]
FD0TYPE		.SET	FDT_3HD		; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8]
FD1TYPE		.SET	FDT_3HD		; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8]
;
IDEENABLE	.SET	TRUE		; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
IDE0BASE	.SET	$90		; IDE 0: IO BASE ADDRESS
;
PPIDEENABLE	.SET	TRUE		; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
PPIDE0BASE	.SET	$30		; PPIDE 0: PPI REGISTERS BASE ADR
;
SDENABLE	.SET	FALSE		; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE		.SET	SDMODE_PIO	; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR|PIO|Z80R|EPITX|FZ80|GM|EZ512|K80W]
SDCNT		.SET	1		; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY
;
CHENABLE	.SET	TRUE		; CH: ENABLE CH375/376 USB SUPPORT
;
PRPENABLE	.SET	FALSE		; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)
;
LPTENABLE	.SET	FALSE		; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE	.SET	FALSE		; PPA: ENABLE IOMEGA ZIP DRIVE (PPA) DISK DRIVER (PPA.ASM)
IMMENABLE	.SET	FALSE		; IMM: ENABLE IOMEGA ZIP PLUS DRIVE (IMM) DISK DRIVER (IMM.ASM)
SYQENABLE	.SET	FALSE		; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
SN76489ENABLE	.SET	FALSE		; SN: ENABLE SN76489 SOUND DRIVER
;
AY38910ENABLE	.SET	FALSE		; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK		.SET	1789772		; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE		.SET	AYMODE_RCZ80	; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU]
AY_FORCE	.SET	FALSE		; AY: BYPASS AUTO-DETECT, FORCED PRESENT
カテゴリー: CP/M, Z80, 電子工作 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください