MB-6892 マーク5の拡張RAMでFLEX9を試す その3 (FLEX Loader)

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のモニタに移ります。

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

最初のセクタにあった$CC00からのデータもOK。

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

$DDE2に$39でOK
先頭セクタの展開OK、最終セクタの展開OK、トランスファアドレスジャンプOK
でFLEXローダの動作はOKのようです。

全てのデータが64KBの拡張メモリ側にロードできているので、拡張メモリへの
ローダとしても大丈夫そうです^^
メモリへのロードはOK
次はBIOSを作成してFLEX9を実行させる準備にかかります^^

そんなFLEXローダ製作の記録・・・

ベーシックマスタの情報をお探しの方は是非こちらからどうぞ → Amazon

2件のコメント

  1. あけましておめでとうございます!
    Mark5のFLEX対応化、進んでますね!64KB拡張RAMカードの利用は BMCALC以外で
    見たことがありませんでしたので、楽しみです。
    引き続き注目していますので、宜しくお願い致します^^

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

コメントを残す

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

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