Last Updated on 2021年12月31日 by kabekin
ベーシックマスタレベル3でFLEX9を動作させる作戦の続きです。
FLEX.CORをフロッピのTrk1,Sct1に置いてマーク5の64KB拡張メモリにロードするローダを作ってみました。
ベースはTSC社のFLEXアダプテーションガイドのAPPENDIX Eにレベル3のディスクルーチンを追加したものです。
拡張メモリのバンク切り換え機能を含め256バイト以内に収まりました。
まだまだ改良の余地もありますが、とりあえず目的の動作は達成しました^^
MS-DOSのクロス開発環境でAS63_DOS.EXEのアセンブラを使わせて頂きました
1 # ;*******************************************************
2 # ;* HITACHI BASIC MASTER LEVEL 3 MARK5 *
3 # ;* FLEX9 Minimum FLEX Loader for AS63_DOS *
4 # ;* Ver0.10 *
5 # ;* AdaptationGuide Apendix E, 6809の考え方P.172 *
6 # ;* AS63 Num.1 *
7 # ;*******************************************************
8 0000
9 # ;目標
10 # ;MP-1802とMP-3560の2Dデッキを使用
11 # ;FDのTrk=1 Sct=1からFLEXファイルで配置されたFLEX.SYSを拡張RAMの指定アドレスにロードし
12 # ;ロード完了で指定のトランスファーアドレスにジャンプする
13 0000
14 # ;作業メモ
15 # ;LOAD2のTABは読込Sct数っぽいので変数LENに代入→終了SctはTrk=0,Sct=0で検出しているので未使用?
22 0000
23 4000 SCTBUF EQU $4000 ;セクタバッファアドレス
24 00FE HOMECMD EQU $FE ;リストアコマンド($01)の反転=$FE
25 00EE SEEKCMD EQU $EE ;シークコマンド($11)の反転=$EE
26 007F READCMD EQU $7F ;リードコマンド($80)の反転=$7F
27 0000
28 # ;L3/S1用 イクオータ
29 FF00 CMDREG EQU $FF00 ;コマンドレジスタ(FDC)
30 FF00 STSREG EQU CMDREG ;ステータスレジスタ(FDC)
31 FF01 TRKREG EQU CMDREG+1 ;トラックレジスタ(FDC)
32 FF02 SCTREG EQU CMDREG+2 ;セクタレジスタ(FDC)
33 FF03 DATAREG EQU CMDREG+3 ;データレジスタ(FDC)
34 FF04 UNITREG EQU CMDREG+4 ;ユニットレジスタ(L3/S1)
35 FFE8 BANKREG EQU $FFE8 ;バンクメモリレジスタ
36 0000
37 4400 ORG $4400
38 4400
39 4400 7E 440D LOAD JMP LOAD0
40 4403
41 # ;変数領域
42 4403 10 00 00 FCB $10,$00,$00 ;Dummy? *** 1バイト目VERSION 2バイト目テストフラグ$FF
43 4406 01 TRK FCB $01 ;トラック(初期トラック=1)
44 4407 01 SCT FCB $01 ;セクタ(初期セクタ=1)
45 4408 00 LEN FCB $00 ;データバイト数
46 4409 DCF4 TADR FDB $DCF4 ;トランスファアドレス(実行アドレス) L3MON
47 440B 0000 LADR FDB $0000 ;ロードアドレス(メモリロードアドレス)
48 440D
49 440D
50 440D LOAD0 EQU *
51 # ;L3独自の初期化
52 440D 96 03 LDA $03
53 440F B7 FFC4 STA $FFC4 ;ACIA
54 #; LDS #$45FF ;スタックの初期化
55 4412
56 4412 17 00CC LBSR HOME ;ヘッドのレストア
57 4415
58 4415 FC 4406 LDD TRK
59 4418 FD 4000 STD SCTBUF ;初期Trk,SctをSCTBUFにセット
60 441B 108E 4100 LDY #SCTBUF+256
61 441F
62 # ;* PERFORM ACTUAL FILE LOAD
63 441F 8D 4A LOAD1 BSR GETCH *GET A CHARACTER
64 4421 81 02 CMPA #$02 *DATA RECORD HEADER?
65 4423 27 10 BEQ LOAD2 *SKIP IF SO
66 4425 81 16 CMPA #$16 *XFR ADDRESS HEADER?
67 4427 26 F6 BNE LOAD1 *LOOP IF NEITHER
68 4429 8D 40 BSR GETCH *GET TRANSFER ADDRESS
69 442B B7 4409 STA TADR
70 442E 8D 3B BSR GETCH
71 4430 B7 440A STA TADR+1
72 4433 20 EA BRA LOAD1 *CONTINUE LOAD
73 4435
74 4435 8D 34 LOAD2 BSR GETCH *GET LOAD ADDRESS
75 4437 B7 440B STA LADR
76 443A 8D 2F BSR GETCH
77 443C B7 440C STA LADR+1
78 443F 8D 2A BSR GETCH *GET BYTE COUNT
79 4441 1E 89 EXG A,B ***AccBにレコードバイト数セット
80 4443 27 DA BEQ LOAD1 *LOOP IF COUNT=0
81 4445 BE 440B LDX LADR *GET LOAD ADDRESS
82 4448 34 14 LOAD3 PSHS B,X
83 444A 8D 1F BSR GETCH *GET A DATA CHARACTER
84 444C 35 14 PULS B,X
85 444E 1A 50 ORCC #$50
86 4450 34 02 PSHS A
87 4452 86 10 LDA #$10
88 4454 B7 FFE8 STA BANKREG
89 4457 35 02 PULS A
90 4459 A7 80 STA ,X+ *PUT CHARACTER
91 445B 34 02 PSHS A
92 445D 86 00 LDA #$00
93 445F B7 FFE8 STA BANKREG
94 4462 1C AF ANDCC #$AF
95 4464 35 02 PULS A
96 4466 5A DECB *END OF DATA IN RECORD?
97 4467 26 DF BNE LOAD3 *LOOP IF NOT
98 4469 20 B4 BRA LOAD1 *GET ANOTHER RECORD
99 446B
100 446B
101 # ;* GET CHARACTER ROUTINE - READS A SECTOR IF NECESSARY
102 446B 108C 4100 GETCH CMPY #SCTBUF+256 *OUT OF DATA?
103 446F 26 11 BNE GETCH4 *GO READ CHARACTER IF NOT
104 4471 8E 4000 LDX #SCTBUF *POINT TO BUFFER
105 4474 EC 84 LDD 0,X *GET FORWARD LINK
106 4476 27 0D BEQ GO *IF ZERO, FILE IS LOADED
107 4478 8D 0F BSR READ *READ NEXT SECTOR
108 447A 1026 FF82 LBNE LOAD *START OVER IF ERROR
109 447E 108E 4004 LDY #SCTBUF+4 *POINT PAST LINK
110 4482 A6 A0 GETCH4 LDA ,Y+ *ELSE, GET A CHARACTER
111 4484 39 RTS
112 4485
113 # ;* FILE IS LOADED, JUMP TO IT
114 4485 GO EQU *
115 4485 6E 9F 4409 JMP [TADR] *JUMP TO TRANSFER ADDRESS
116 4489
117 4489
118 # -----[L3/S1サブルーチン]----------------------------------------------------
119 4489
120 #; 1セクタリード(割込不使用版)
121 #; 引数 AccA=Trk, AccB=Sct 戻り値 なし
122 4489 READ EQU *
123 4489 FD 4406 STD TRK ;AccA=TRK, AccB=SCT
124 448C 8E 4000 LDX #SCTBUF
125 448F 8D 31 BSR UNITSEL ;UNITSELセット
126 4491 8D 40 BSR SEEK ;シーク実行
127 4493 B6 4407 LDA SCT
128 4496 43 COMA
129 4497 B7 FF02 STA SCTREG ;Sctセット
130 449A 86 7F LDA #READCMD
131 449C B7 FF00 STA CMDREG ;リード実行
132 449F 8D 1A BSR DLY ;遅延
133 44A1 1A 50 ORCC #$50 ;割込禁止
134 44A3 B6 FF03 LDA DATAREG ;空読み?
135 44A6 B6 FF00 READ2 LDA STSREG
136 44A9 43 COMA
137 44AA 44 LSRA ;Busyチェック
138 44AB 24 0B BCC READ3 ;Busyがクリアなら終了
139 44AD 44 LSRA
140 44AE 24 F6 BCC READ2 ;DRQオンならデータ未転送で転送待ち
141 44B0 B6 FF03 LDA DATAREG ;DRQクリアならデータ転送済みでFDリード
142 44B3 43 COMA
143 44B4 A7 80 STA ,X+
144 44B6 20 EE BRA READ2
145 44B8 1C AF READ3 ANDCC #$AF
146 44BA 39 RTS
147 44BB
148 44BB
149 #; 遅延
150 44BB BD 44BE DLY JSR DLY1
151 44BE BD 44C1 DLY1 JSR DLY2
152 44C1 39 DLY2 RTS
153 44C2
154 44C2
155 #; UNITSEL
156 44C2 UNITSEL EQU *
157 44C2 B6 4407 LDA SCT
158 44C5 81 10 CMPA #16
159 44C7 22 04 BHI UNIT3
160 44C9 C6 28 UNIT2 LDB #$28 ;0010 1000
161 44CB 20 02 BRA UNIT4
162 44CD C6 38 UNIT3 LDB #$38 ;0011 1000
163 44CF F7 FF04 UNIT4 STB UNITREG
164 44D2 39 RTS
165 44D3
166 44D3
167 #; ヘッドのシーク(割込不使用版)
168 44D3 SEEK EQU *
169 44D3 B6 4406 LDA TRK
170 44D6 43 COMA
171 44D7 B7 FF03 STA DATAREG ;Trkセット
172 44DA 86 EE LDA #SEEKCMD
173 44DC B7 FF00 STA CMDREG ;シーク実行
174 44DF 20 0F BRA COMPWAIT
175 44E1
176 44E1
177 # ;ヘッドのレストア(割込不使用版)
178 44E1 86 FE HOME LDA #HOMECMD
179 44E3 B7 FF00 STA CMDREG ;レストア実行
180 44E6 B6 FF00 HOME2 LDA STSREG
181 44E9 43 COMA
182 44EA 85 04 BITA #$04 ;0000 0100
183 44EC 27 F8 BEQ HOME2 ;TRACK00完了待ち
184 44EE 20 00 BRA COMPWAIT
185 44F0
186 44F0
187 44F0 B6 FF00 COMPWAIT LDA STSREG
188 44F3 43 COMA
189 44F4 85 81 BITA #$81 ;1000 0001 Bit7=NotReady, Bit0=Busy
190 44F6 26 F8 BNE COMPWAIT ;コマンド完了待ち
191 44F8 39 RTS
192 44F9
193 4400 END
Total Errors 0
拡張メモリのバンク切り換えでは上半分の$8000~$FFFFをバンク切り換えしていますが、
バンクレジスタ$FFE8にビットをセットするとバンク切り換えができるようですが$FFE8を
操作する前に ORCC #$50 で割込みを禁止しないとうまく切り替わりません。
この辺、正しい使い方をまだまだ調べる必要がありそうです^^;;
拡張メモリの書込み専用モードに切替。
LDA #$10
STA BANKREG ;($FFE8)
標準メモリに戻す
LDA #$00
STA BANKREG ;($FFE8)
▼マーク5エミュでの動作確認手順
AS63_DOSでアセンブルしmot Sフォーマットで出力(debug.mot)しDL コマンドでメモリ―にロードします。
(DL 0 でSフォーマットのアドレスからオフセットゼロのアドレスにロード)
D 4400でロードされたかダンプして確認。
R PC 4400 でPCを移動して
Tでステップ実行しながら動作確認。
ある程度進めたらGで一気に実行。

正常にロードが完了したらトランスファーアドレス($DCF4)にジャンプし
レベル3のモニタに移ります。

この状態で拡張メモリ側の内容を確認すると
正常にロードされているようです^^

最終セクタにあった$DD65から126バイトを確認すると$DDE2に$39でOK

$DDE2に$39でOK
先頭セクタの展開OK、最終セクタの展開OK、トランスファアドレスジャンプOK
でFLEXローダの動作はOKのようです。
全てのデータが64KBの拡張メモリ側にロードできているので、拡張メモリへの
ローダとしても大丈夫そうです^^
メモリへのロードはOK
次はBIOSを作成してFLEX9を実行させる準備にかかります^^
そんなFLEXローダ製作の記録・・・
ベーシックマスタの情報をお探しの方は是非こちらからどうぞ → Amazon

あけましておめでとうございます!
Mark5のFLEX対応化、進んでますね!64KB拡張RAMカードの利用は BMCALC以外で
見たことがありませんでしたので、楽しみです。
引き続き注目していますので、宜しくお願い致します^^
あけましておめでとうございます
今年もよろしくお願い致します^^
レベル3でFLEX9を使うときに私にはVRAMエリアが対処できないので64KB拡張RAMを使って挑戦してみることにしました。
FLEX9を拡張64KBRAMで動かしてROMのルーチンやROMの裏RAMも自由に使えるようになると素敵なFLEX9マシンにできそうですが私にはハードルが高いです^^;;;
S1でCP/M80を動作させるのに4年以上かかりましたが、FLEX9はそんなにかからないようにしたいですね^^