石原 博の覚書

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

デジットのジャンクの68KボードでForthを動かす

2022-02-23 22:23:49 | 日記
以前電脳伝説様の記事(https://vintagechips.wordpress.com/2021/06/20/digit_more2_junk/)を参考にLチカを行った。しかしせっかくこのボードにはシリアルがついているのだから、もったいないのでForthも動かしてみた。

68KのForthは、なかなかソースが見つからない。ここでは、https://home.hccnet.nl/a.w.m.van.der.horst/fig68k.zip を使用している。68Kは初めてで色々試行錯誤を行った。

・注意点1 (メモリマップ)
Lチカのルーチンでは、000000-01ffffがROM、400000-40ffffがRAMとしていた。Forthは自己書き換えが生じるためRAM上に置く必要がある。ところがダウンロードした68K用Forthは16bitで、プログラムが000000-00ffffに置かれることを想定したものであった。(再アセンブルしても他に置けない)
そこで
[1]000000-01ffffをROM, 400000-407fffをRAMとする。Forthはもともとのソースと同じ1000〜ワーク、2000〜プログラムとしてROMに書き込んで置く。
[2]起動時にROM内ルーチンで、ROMの内容(0000-ffff)すべてRAM(400000-40ffff)に転送する
[3]RAMのスタートアドレスを 0に変更する(アクセスはROMが優先)
[4]ROMを無効化し、SPをRAMに設定しなおす
[5]ForthのCOLDスタートへjmp
とした。

・注意点2 (アセンブラ)
Lチカでは、https://archive.org/details/68000ASM_ZIP を使用したが、カレントアドレスを示す「*」が使えない。Forthでは「*」を多用するためアセンブラをEASy68Kとした。EASy68Kでも出力はモトローラのS-Record形式のため、srec_catでバイナリに変換している。

・注意点3 (68Kのニーモニックの書き方)
8080の時の 「MVI 'A',A」 などと同じつもりで、「move.b 'A',D0」として失敗。アセンブリリストを見て気づいたが、これは「move.b $41,D0」と同じ扱いで、Absolute shortアドレス$41(0000 0041) のメモリの内容をD0に入れる。本当は「move.b #'A',D0」としないといけない

・注意点4 (シリアルの接続)
デジットのジャンク68Kボードでは立派なRS232Cの9pinの接続口がある。ここにUSB-RS232Cのケーブルを接続したが応答がない。オシロで調べると、pin2とpin3をクロスしたクロスケーブルが必要であった。オス-メスタイプのNULL MODEMのコネクタを使って接続した。

・注意点5 (使用したForthがFig-Forthから変更されている?)
やっと接続してテストしたところ : TEST 10 0 DO I LOOP ; が通らない。ソースを良くみたところ、以下のワードを使えないようにコメントアウトされていた。
-----
I
RP@
2DUP
2@
2!
U<
;CODE
(ABORT)
U.
TRIAD
.CPU
TASK
WARM
-----

他はともかくIは使いたい。A3がデータスタック、A7がリターンスタックなので、以下のように修正
----修正前-----
*F DC.B $81 * I
*F DC.B $80+'I'
*F DC.W XDO-8
*F IDO DC.W 2+* * (S1) <- (R1), (R1) UNCHANGED
*F


DC.B $85 * DIGIT


DC.B 'DIGI'


DC.B $80+'T'


DC.W XDO-7

DIGIT DC.W 2+*
----修正後----
DC.B $81 * I
DC.B $80+'I'
DC.W XDO-7
IDO DC.W 2+* * (S1) <- (R1), (R1) UNCHANGED
MOVE.W (A7),-(A3)
MOVE.W (A4)+,A5
MOVE.W (A5)+,A0
JMP (A0)
*
DC.B $85 * DIGIT

DC.B 'DIGI'

DC.B $80+'T'

DC.W IDO-4

DIGIT DC.W 2+*
---------------


・注意点6 (Forthのバグ?)
COLDで、なぜか絶対アドレス $2F00 が使用されている。XEMIT等の入出力ルーチンをを若干変更したためアドレスがずれて、これで異常動作してしまったので修正。
------------------------------
COLD DC.W 2+*
MOVE.W #COLDUS,A0 * BOOTLIST
MOVE.W (A0),$2F00 * TOP NFA
------------------------------
COLD DC.W 2+*
MOVE.W #COLDUS,A0 * BOOTLIST
MOVE.W (A0),FORTH+6 * TOP NFA
------------------------------


以下で今回使用した入出力ルーチンを示す。

*
* Title: Fig-Forth
* Target: DIGIT TMP68301 BOARD
* Assembler: http://www.easy68k.com/ EDIT68K.EXE
*
*
IORBASE equ $00FFFC00
*
* Address setting REGs
AMAR0 equ IORBASE+$000
AMAR1 equ IORBASE+$004
AAMR0 equ IORBASE+$001
AAMR1 equ IORBASE+$005
AACR0 equ IORBASE+$003
AACR1 equ IORBASE+$007
AACR2 equ IORBASE+$009
ATOR equ IORBASE+$00B
ARELR equ IORBASE+$00C
*
* Parallel interface REGs
PDIR equ IORBASE+$100
PCR equ IORBASE+$103
PSR equ IORBASE+$105
PCMR equ IORBASE+$107
PMR equ IORBASE+$109
PDR equ IORBASE+$10A
PPR1 equ IORBASE+$10D
PPR2 equ IORBASE+$10F
*
* Serial interface REGs
SMR0 equ IORBASE+$181
SCMR0 equ IORBASE+$183
SBRR0 equ IORBASE+$185
SSR0 equ IORBASE+$187
SDR0 equ IORBASE+$189
SPR equ IORBASE+$18D
SCRX68 equ IORBASE+$18F

SMR1 equ IORBASE+$191
SCMR1 equ IORBASE+$193
SBRR1 equ IORBASE+$195
SSR1 equ IORBASE+$197
SDR1 equ IORBASE+$199

SMR2 equ IORBASE+$1A1
SCMR2 equ IORBASE+$1A3
SBRR2 equ IORBASE+$1A5
SSR2 equ IORBASE+$1A7
SDR2 equ IORBASE+$1A9
*
* Port select 0 or 1 or 2
SMR equ SMR0
SCMR equ SCMR0
SBRR equ SBRR0
SSR equ SSR0
SDR equ SDR0
*
* Reset vectors
org $00000000
RESVCT: dc.l $0040FFFC Stack address
dc.l $00000400 Start address
*
* main
org $00000400
START: move.w #$0000,CCR IRQ disable
move.b #$00,ATOR BERR disable
*
* RAM CS1
move.b #$40,AMAR1 Address area
move.b #$FF,AAMR1 No mask
move.b #$3D,AACR1 CS1 enable, Wait 5 clocks
*
* Parallel interface
move.b #$00,PCR Mode0 16bit simple IO
move.w #$FFFF,PDIR Set all ports as output
move.w #$0000,PDR Initialize as all ports L
*
* Serial interface
move.b #$81,SCRX68 SCLK,RESET解除,INTM=1
move.b #$CE,SMR CL1,CL0=1 -> 8bit char, interrupt mask
move.b #$01,SBRR SBRR=1, SPR=208 -> 9600baud
move.b #$D0,SPR
move.b #$5,SCMR RxEN, TxEN
*
* Copy ROM to RAM
move.l #$0,A0
move.l #$400000,A1
move.w #$4000,D0
COPY move.l (A0)+,(A1)+
dbra D0,COPY
*
* Change RAM Address
move.b #$0,AMAR1
*
* Disable ROM
move.b #$1D,AACR0 CS0 EN=0
move.l #$FFFC,SP STACK POINTER SET
*
bra MCOLD
*
OUTCH btst #0,SSR
beq OUTCH
move.b D0,SDR
rts
*
INCH btst #1,SSR
beq INCH
clr.w D0
move.b SDR,D0
rts
*
SENSE btst #1,SSR
beq SENSE1
move.w #$FF,D0
bra SENSE2
SENSE1 clr.w D0
SENSE2 rts

-----------------

上のPGを呼び出すForth内の入出力ルーチン
-----------------
IOARE ORG USPAG+RTS
*
* THE I/O ROUTINE PART IS SYSTEM DEPENDANT
*
XEMIT AND.W #$7F,D0
JSR OUTCH
RTS
*
XKEY JSR INCH
AND.W #$7F,D0
RTS
*
XCR MOVEQ #ACR,D0
JSR XEMIT
MOVEQ #LF,D0
JSR XEMIT
RTS
*
XQTERM JSR SENSE
RTS
*
XRSLW RTS
*