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はそんなにかからないようにしたいですね^^