補足 MZ80のBASIC言語(SP5030)の処理
***
補足 MZ80のBASIC言語(SP5030)の処理
***
第二部で解読した情報を整理しました。
ですが読まないで次エピに進んで問題ないです。と言うか第二部を読まないでこいつを読んでも意味不明だと思います。
第二部を読んでいて(感謝です)...、この番地は何だったかな? と思った時に参照して下さいな。
なお本編は予告も報告もなく更新されますョ。ご承知おきを。
***
**
*
* * * * * * * * * * * * * * * *
* 処理
* * * * * * * * * * * * * * * *
:::::::::::::::::::::::::::::::
1200 〜 124C : 初期化処理(エピ5で解説)
124D 〜 12DF : メインループ(エピ6とエピ7で解説)
・124D 〜 1258 : (M1)「READY」を表示
・1259 〜 1277 : (M2) 4565hが00hならスタックポインタを復旧, 47FFh〜4800h(実行中の文番号)が 0000h以外なら47FDh〜4802hの6バイトを退避
・1278 〜 1290 : (M3) 47FDh〜4800hの4バイトをゼロクリア, 改行して入力待ち。入力を調べて文番号があれば4457h〜4458hに格納, 命令文は中間コードに変換して4459h〜に格納, 文番号の有無により(M4)または(M5)に進む
・1291 〜 129E : (M4) 文番号無しなら直接実行命令文として実行, (M3)に戻る
・129F 〜 12DF : (M5) 文番号付きなら4577hと4565hを00h, プログラムとして記憶, (M2)に戻る
:::::::::::::::::::::::::::::::
12E0 〜 13BB : エラーメッセージの処理(エピ5で解説)
・12E0 〜 1354 : メッセージ文字列。0Dhで終端
・12E0 〜 : " * SHARP_BASIC_SP-5030",0Dh
・12F7 〜 : "READY",0Dh
・12FD 〜 : " ERROR",0Dh
・1304 〜 : " IN",0Dh
・1308 〜 : "SYNTAX",0Dh
・130F 〜 : "MEMORY",0Dh
・1316 〜 : "DATA",0Dh
・131B 〜 : "MISMATCH",0Dh
・1324 〜 : " BYTES",0Dh
・132B 〜 : "BREAK",0Dh
・1331 〜 : "16FOR",0Dh
・1337 〜 : "16GOSUB",0Dh
・133F 〜 : "6FN",0Dh
・1343 〜 : "CONT",0Dh
・1348 〜 : "FILE",0Dh
・134D 〜 : "OVERLAY",0Dh
・1355 〜 135A : 画面表示(ROM:0009hと0015hをコール)
・135B 〜 1381 : 表示処理
・1382 〜 13BB : メッセージ毎のエントリー
・1382 〜 : BREAK
・138A 〜 : SYNTAX ERROR
・138F 〜 : MEMORY ERROR
・1394 〜 : DATA ERROR
・1399 〜 : MISMATCH ERROR
・139E 〜 : 16FOR ERROR
・13A3 〜 : 16GOSUB ERROR
・13A8 〜 : 6FN ERROR
・13AD 〜 : FILE ERROR
・13B2 〜 : OVERLAY ERROR
・13B7 〜 : CONT ERROR
:::::::::::::::::::::::::::::::
13BC 〜 13C8 : 4565h に 00h, 01h, 02h をセット(エピ6で解説)
・13BC 〜 : [4565h] = 00h; プログラムの変更有
・13BF 〜 : [4565h] = 01h; STOP,ENDで停止
・13C3 〜 : [4565h] = 02h; BREAKで停止
13C9 〜 1614 : 入力文を中間コードに変換(エピ6で解説)
・13C9 〜 143C : 変換1
・143D 〜 148C : 変換2
・148D 〜 14D3 :(13C9h,143Dhのサブルーチン)
・148D, 14C1, 14A1, 14B6, 14AD
・14D4 〜 1614 : 中間コードのリスト(80h〜DBh)。MSB==1で終端
1615 〜 1628 :(定数データ; 5バイトx4個); 各所から参照
・1615: C1 00 00 00 80 = 1.0
・161A: 80 00 00 00 00 = 0.0
・161F: 41 00 00 00 80 = -1.0
・1624: C2 A1 DA 0F C9 = 3.14159265 ; PI
:::::::::::::::::::::::::::::::
::::::::::::命令文のスキャン
1629 〜 : HL=[4801h], HL--; 次に続く; 呼び出し元が不明
162D 〜 : HL++; 次に続く
162E 〜 1633 : while([HL]==0x20){HL++}
1634 〜 163C : 次の文字列を探す; A=0Dh, while([HL]!=0Dh){HL++}; AF保存
163D 〜 : HL++; 次に続く
163E 〜 1651 :(REM,DATAからコール)HLを0Dh,":"まで進める("〜"の処置含)
1652 〜 1659 : BC = 1-BC; BCを反転してINC
165A 〜 1662 :(16C9h のサブルーチン)文番号の有無の判定に利用; [HL]>=3Ahを判定, A=[HL]; RUNからコール
1663 〜 1668 :(179Bh のサブルーチン)HL?=DEを判定
1669 〜 166F : HL=DE-HL
1670 〜 : pop HL; 次に続く★
1671 〜 : ex (SP),HL; 次に続く★
1672 〜 1679 :(168Chからジャンプ)d0,d1にジャンプ★
167A 〜 : pop HL; 次に続く★
167B 〜 167F : (SP)を +2 して RET(リターン番地を2進める)★
1680 〜 1688 :(175Eh,1773h のサブルーチン);HL := [4644h] + 5
1689 〜 : HL = [4801h]; 次に続く★
168C 〜 1696 : (M4) からコール; [HL]!=d0ならd1,d2にジャンプ; 19CBhに飛ぶ★
1697 〜 : HL = [4801h]; 次に続く★
169A 〜 : 162Ehをコール, [HL]!=d0 なら SYNTAX ERR; 次に続く★
16A2 〜 16A5 :(168Chのジャンプ先)[SP]を+1, 162Dh にジャンプ
::::::::::::基数の変換
16A6 〜 16C2 : DEをHL倍する; if(H!=00h and D!=00h){jp d0,d1}★
16C3 〜 16C8 : call 16A6h(d0,d1=1394h), ret
16C9 〜 16E8 : DEに文番号をセット(10進を16進に)★
16E9 〜 16EE : call 16C9h(d0,d1=138Ah), ret
16EF 〜 : C=00h; 次に続く
16F1 〜 1719 : 16進数を10進文字列に変換(HLを変換して[DE]にセット)
171A 〜 1733 : (16F1hのサブルーチン)
::::::::::::メモリのチェック
1734 〜 : BC=0000h; 次に続く
1737 〜 1749 : メモリサイズのチェック
174A 〜 1751 : 1737hをコール(メモリサイズのチェック);DE,HL保存
::::::::::::プログラム編集用か?
1752 〜 175D : HLからの4バイトをHL(番地),DE(文番号)にロード。HLの0判定
175E 〜 1772 : 削除する文の次文から最後の文までをDEに移動; DE,HL,BC保存
1773 〜 178C : LDDRを実行
178D 〜 : 1773hをコール(挿入先以降をLDDR); 次に続く
1790 〜 179A : 挿入元から挿入先にLDIR, DE,HL,BC保存
179B 〜 : HLを[462Eh]に保存; 次に続く★
179E 〜 17B8 : [462Eh]と同じ文番号を探す; jp d0,d1有; call 1752h, 1663h★
17B9 〜 17CC : [HL]==0000hならjp d0,d1; 1663hをコール★
17CD 〜 17DB : 次文への番地を修正。
・17D4h 〜 :(同上のエントリー)
17DC 〜 17E6 : HL番地の文のバイト数をBCに格納(番地と文番号の4バイトを含)
::::::::::::数値ワークと文字ワーク
17E7 〜 : BC = 0000h; 次に続く
17EA 〜 17F4 :(17DCh のサブルーチン)while([HL]!=0Dh){HL++, BC++}; BC--; HL保存
17F5 〜 1802 : 文字ワーク[4642]の末尾をDEに; 1634hをコールして0DhをE個スキップ
1803 〜 1807 : 値や変数の型をチェック; err-msg MISMATCH, if D==00h
1808 〜 180D : 値や変数の型をチェック; err-msg MISMATCH, if D!=00h
180E 〜 1817 : HL=DE, DE=[4644h](=数値ワーク), BC=0005h, LDIR, ret
1818 〜 181C : HL=[4644h](=数値ワーク), (DEはそのまま), BC=0005h, LDIR, ret
181D 〜 1825 : 162Ehコール, [HL]を0Dh,3Ah(":") と比較
:::::::::::初期化1〜3(エピ11で解説)
1826 〜 1849 : 初期化1; ..., 13BCh,184Ah,186Fhをコール
・1842 〜 1849 :(上の一部; 1889hをコール)
184A 〜 186E : 初期化2(1826h のサブルーチン); ...
・1865 〜 186E :(上の一部; HL=[4642h]で1889hをコール, [4644]=HL)
186F 〜 1888 : 初期化3(1826h のサブルーチン); [464Ah]=47F0h, [4648h]=4787h, [4646h]=476Ah, HL=4803hで1889hをコール, [HL]=A
1889 〜 188E :(184Ah,186Fh のサブルーチン; LISTからコール)A=0, [HL]=A, [HL+1]=A, HL+=2
・188A 〜 : (同上; A=0しない; LISTからコール)[HL]=A, [HL+1]=A, HL+=2
::::::::::::
188F 〜 18B2 : 変数領域の更新; [4644h]〜DEにBCを加算(INC/DEC)
18B3 〜 18FB : DATA文のデータを文字ワーク[4642]にLDIR, [4644]+=BC,
・18B6 〜 : ?
・18CE 〜 :
18FC 〜 192B : d0,d1; jp 1671h or 167Bh★
192C 〜 193B : 0-9,".","-","+" と比較; 1917h,236Bhからコール
193C 〜 1961 : 数値ワークにある配列の添字をチェック
1962 〜 : 数値の処理; HL=456Ch, 196Ah へ
1967 〜 : 変数の処理; HL=4570h, 196Ah へ
196A 〜 1972 : BC,DEを[HL]〜にセット
1973 〜 1977 : A=00h,[4577h]=00h,ret; 4577hはREADしたデータ数, RESTORE命令からコール
1978 〜 1994 : 配列の添字を評価; 数値ワークを +5, 2551hをコール, 193Chをコール, 数値ワークを -5
・198C 〜 1994 : 数値ワーク[4644h] にBCを加算
1995 〜 199D : 配列の添字の処理; 1978hをコール, D!=00hならDATAエラー
:::::::::::::::::::::::::::::::
199E 〜 1A5F : 直接実行可能な中間コードの分岐処理(エピ7で解説)
・199E 〜 : HL = [4801h]
・19A1 〜 : 162Ehをコール
・19A4 〜 : [HL]==0Dhなら19B1hへ
・19A8 〜 : [HL]==3Ah(':')なら[4801h]=HLして19CBhへ(':'でなければ SYNTAX ERROR)
・19B1 〜 : [47FDh]==00hなら124Dhへ
・19B9 〜 : [HL]から47FDh〜に4バイト転送(HL+=4), [4801h]=HL, [47FEh]==00hなら"END"へ
・19CB 〜 1A0D : 中間コードの分岐処理(A=[[4801h]], DE=1A0Eh)
・1A01 〜 :(同上; A,DEはそのまま)
・1A0E 〜 1A5F : ジャンプテーブル(直接実行可能な中間コード 80h〜A8h の分岐先)
:::::::::::::::::::::::::::::::
1A60 〜 1A65 : "NEW" 命令; 1826hコール, 124Dhにジャンプ
(1A66 : LIST用データ; 00h=通常, 01h=LIST/Pの場合)
1A67 〜 1ACF : "LIST" 命令
・1AD0 〜 1AE2 : LIST nn-mm の処理 (1A8Fhからジャンプで来て1A95hに戻る)
・1AE3 〜 1AEF : LIST nn-mm の処理 (ジャンプで来て)
・1AF0 〜 1AF8 : 改行
・1AF9 〜 1B09 : 1行表示
1B0A 〜 1B0C : "RESTORE" 命令; 1973hコール
1B0D 〜 1B12 : "REM" 命令, "DATA" 命令; 163Ehコール, 19A4hにジャンプ
1B13 〜 1B1B : "END" 命令
1B1C 〜 1B24 : "STOP" 命令
1B25 〜 1B4F : "LET" 命令;
1B50 〜 1C0E :(LETからコール); d0,d1付き★
1C0F 〜 1CA4 : "PRINT" 命令
1CA5 〜 1CCC : "RUN" 命令
・1CB4〜1CB1 : "GOTO" 命令
1CCD 〜 1CFE : "GOSUB" 命令
1CFF 〜 1D2E : "RETURN" 命令
1D2F 〜 1DBA : "FOR" 命令
1DBB 〜 1DC3 :(FORからコール);
1DC4 〜 1E40 : "NEXT" 命令
1E41 〜 1E45 :(NEXTからコール);
1E46 〜 : "INPUT" 命令
1F6C 〜 : "READ" 命令
1FB0 〜 2004 : "ON" 命令
2005 〜 2084 : "DIM" 命令
(2085 〜 2086 : 番地?; 配列の処理で参照)
(2087 : 00h=1次元配列, 01h=2次元配列)
(2088 〜 2089 : 配列で)
208A 〜 20EF :(DIMからコール, 配列処理からコール)
20F0 〜 20F1 : xor A,ret
20F2 〜 2106 :(DIMからコール)
2107 〜 2112 :(DIMからコール)2次元配列の2つ目の添字を評価; 1995hコール
2113 〜 2123 : "POKE" 命令;
2124 〜 212D : "CLR" 命令; 184Ah,1865hコール, 19A1hへ
212E 〜 215B : "IF" 命令; IF-GOTO, IF-GOSUB, IF-THEN-999, IF-THEN-etc
215C 〜 21CE : "DEF FN" 命令;
21ED 〜 21FD : "TEMPO" 命令; 1995hコール, ROM:XTEMPコール, 1B0Dhヘ
:::::::::::::::::::::::::::::::
21FE 〜 224F : 数式処理ルーチン達の★1(エピ14で解説)
・21FE: inc HL
・21FF: 2251hをコール
・2202: A<B0h('><')ならRET, A>=BCh('+')ならRET
・2208: A=[B0h..BBh]の場合; ><, =<, =, >, <, AND, OR, NOT
D==00hなら 22D4hへジャンプ; BC=2202h,DE=2250h
D!=00hなら 2218hへ続く
・2218: ?(文字列 = 文字列) ...の評価?
2250 〜 22B0 : 数式処理ルーチン達の★2
・2250: inc HL
・2251: A=[HL], 20hならスキップ
・2256: A=BCh('+')なら 2266hへ
A=BDh('-')なら 225Ehへ
それ以外なら 2267hへ
・225E: 22B1hをコール, 232Bhをコール, 226Ahへ
・2266: inc HL
・2267: 22B2hをコール
・226A: A<BCh('+')ならRET, A>=BEh('*')ならRET
・2270: A=[BCh..BDh]の場合; +, -
D==00hなら 22D4hへジャンプ; BC=226Ah,DE=22B1h
D!=00hなら 227Fhへ続く
・227F: ?文字列 + 文字列 ????
22B1 〜 22C3 : 数式処理ルーチン達の★3
・22B1: inc HL
・22B2: 22C5hをコール
・22B5: A<BE(*)ならRET, A>=C0(LEFTS)ならRET
・22BB: A=[BE..BF]の場合; *, /,
22D4へジャンプ; BC=22B5h,DE=22C4h
22C4 〜 22D3 : 数式処理ルーチン達の★4
・22C4: inc HL
・22C5: 231Dをコール
・22C8: A!=CF(^)ならRET
・22C8: A==CFの場合
22D4へ続く; A=C0h,BC=22C8,DE=231C
::::::::::::
22D4 〜 22F6 : TBL1の分岐処理; 数値ワークを+5, 分岐先と22F7hをPUSH, [DE]へ
22F7 〜 2310 : TBL1のジャンプ; 数値ワークを-5, 2314hをPUSHして分岐
2311 〜 : 180Ehコール(数値ワークにDEから5バイト転送); 次に続く
2314 〜 : 分岐処理の後処理; pop HL; 次に続く
2315 〜 231B : BC=0005h, DE=0000h, A=[HL], RET
::::::::::::
231C 〜 233F : 値の処理(変数・関数・数値・文字列・・・)
231C: inc HL
231D: 162Eをコール
2320: A=BC(+)なら 2340hへジャンプ
2324: A!=BD(-)なら 2341hへジャンプ
2328: 2340hをコール
232B: ?
2340 〜 2361 : 値の処理の本体
2340: inc HL
2341: 2556hをコール(変数名のチェック) [A-Z][A-Z,0-9]
2344: NCなら 2362hへジャンプ(A-Z以外の場合) 数値,記号,中間コード
234E: DE='FN'なら 2405hへジャンプ(関数定義)
2351: 23C7hをコール(変数)
2357: B=00なら 2311hへジャンプ(数値ワークに転送してRET)
235C: 18CEhをコール(文字ワークに転送)
235F: pop HL, A=[HL], RET
2362 〜 2391 : 文字以外の場合 (数値,記号,中間コード,FFh)
2362: 28h'(', 22h'"' と比較; 括弧は2384h, 文字列は18B3hへジャンプ
236B: 192Chをコール(数値か判定)
236E: NCなら 2377hへジャンプ(中間コードかFFh)
2374: 2F75hへジャンプ ★★★(数値の場合)
2377: A!=FFなら 2392hへジャンプ(中間コード)
237B: FFなら パイを設定
2384 : 括弧の場合
2384: BC = 0000h
2387: 174Ahをコール ; メモリサイズのチェック
238A: 21FEhをコール ; +++++++++++ ルーチン★1★
238D: 169Ah(29h)をコール ; 29h=')'
2391: ret
::::::::::::
2392 〜 23C6 : 中間コードの処理; C0h〜CEhはTBL2で分岐, D0h〜DEhはTBL3で分岐(スタックフレーム注意; PUSH HL,PUSH 2314h)
::::::::::::
23C7 〜 23D1 : 変数の処理; 文字変数は2486h, 配列は2511hへ
23D2 〜 2404 : 数値変数の処理; DEと同じ名前の変数を探索, 無ければ追加
2405 〜 2485 : 関数定義の処理; Eと同じ名前の関数定義を探索, 無ければSYNTAX ERRORへ
2486 〜 24C4 : 文字変数の処理(文字配列は250Chへ)
24C5 〜 24EA : TI$の処理
24EB 〜 24EB : A=00h, 24EChへ
24EC 〜 24F4 : HL+=DEしてカウント?, 24F5hへ
24F5 〜 250B: [HL] に何かをセット; [HL]=0Dh
250C 〜 2510 : 文字配列変数の処理; BC=0100h, 2514hへ
2511 〜 2513 : 数値配列変数の処理; BC=0000h, 2514hへ
2514 〜 2554 : 配列変数の共通の処理
2555 〜 : inc HL, 次へ続く
2556 〜 259A : 変数名をチェック; 結果はCfにセット
259B 〜 25AC : (LETから)2556hコール, DE="FN"ならSYNTAX ERROR
::::::::::::
25AD 〜 25CE : ジャンプテーブル1(B0h 〜 BFh, CFh)
25CF 〜 25E6 : ジャンプテーブル2(C0h 〜 CBh)
25E7 〜 25FE : ジャンプテーブル3(D0h 〜 DBh)
::::::::::::
25FF 〜 262F : C0 "LEFT$(" 関数;
2630 〜 2651 : C1 "RIGHT$(" 関数;
2652 〜 2689 : C2 "MID$(" 関数;
268A 〜 268C : B9 "AND"
268D 〜 268E : BA "OR"
268F 〜 2690 : BB "NOT"
269F 〜 26B7 : C4 "CHR$(" 関数;
26B8 〜 26D3 : C5 "STR$(" 関数;
26D4 〜 26F0 : C7 "VAL(" 関数;
26F1 〜 2720 : C6 "ASC("
2721 〜 2730 :(2709hからコール)
(2731 : 00 ; PEEK用データ; 00h=PEEK範囲を制限, 00h以外=制限なし)
2732 〜 274E : C8 "PEEK("
2750 〜 2775 : C9 "TAB(" 関数;
2776 〜 2799 : CA "SPC(" 関数; 4400hを使用
279A 〜 27AB : CB "SIZE" 関数;
27AC 〜 27B0 : D9 "ABS(" 関数; A=[DE], A|=80h, [DE]=A, ret
27B1 〜 27C5 : DA "SGN(" 関数;
:::::::::::::::::::::::::::::::
27C6 〜 27C8 : "BYE" 命令; 0000hへ
27C9 〜 : "CURSOR" 命令
27FC 〜 : "GET" 命令
2852 〜 : "USR(" 命令
2875 〜 : "LIMIT" 命令
28AE 〜 : (POKEからコール)
28DD 〜 290A : "CONT" 命令
290B 〜 290D : "SET" 命令; A=01hで2910hへ
290F 〜 290F : "RESET" 命令; A=00hで次ぎに続く
2910 〜 296F : SET,RESETの共通の処理
::::::::::::
2970 〜 : "VERIFY" 命令
(2995-2997 : "OK",0Dh)
(2998 : 00h ; 00h以外ならLIST禁止, SAVE禁止)
(2999 : 00h ; SAVE命令で参照; 1108hに転送)
(299A : 00h )
299B 〜 2A14 : "SAVE" 命令
2A15 〜 : "LOAD" 命令
2ADE 〜 2AF6 : msg + FileName
(2AF7: "FOUND",0Dh)
(2AFE: "LOADING",0Dh)
(2B07: "VERIFYING",0Dh)
2B12 〜 2B1D : 1826hコール; DATA ERRかBREAKを表示
2B1E 〜 2B34 : SAVE前; プログラム領域の番地をバイト数に変換
2B35 〜 2B47 : LOAD後; プログラム領域のバイト数を番地に変換
:
2B79 〜 : "WOPEN" 命令
2B98 〜 2BA8 :(SAVEからコール); ROM:save1をコール
2BA9 〜 : "ROPEN" 命令
2BBB 〜 :
2BD5 〜 2C04 : "CLOSE" 命令
2C05 〜 2C19 :(INPUTから)
2C1A 〜 : PRINT ?
::::::::::::
2C9D 〜 : INP#
2CF0 〜 2D07 : OUT#
:::::::::::::::::::::::::::::::
(2D08 : 00h)
(2D09 : 00h)
(2D0A : 00h)
2D0B 〜 : '-': BD
2D0E 〜 : '+': BC
2D97 〜 2DA4 : 35E1hコール, [HL]以降にA,E,D,C,Bをセット; ex. HL=4818, AEDCB=数値
2DC0 〜 : (実質コール) 2D97にジャンプ, RETでPUSHされている番地にリターン?
2E08 〜 : '*': BE
2E1B 〜 : (実質コール)
2ED6 〜 : '/': BF
::::::::::::
(2F72 : 00 > 1D ;@3005 )
(2F73,2F74 : 0000 > 4818 ;@2F7D )
2F75 〜 305F : 数値の場合の処理
2F90: 3075hをコール
2F93: 306Bhをコール
3026: 2DC0hへジャンプ(実質コール)
・3029 〜 :
3055: 2E1Bhへジャンプ(実質コール)
・3058 〜 305F : pop HL, BC=0005h, DE=0000h, A=[HL], ret
305F: RET
3060 〜 306A :
306B 〜 3074 : IX++, A=[IX], while(A!=20h){IX++, A=[IX]}; ret
3075 〜 :
(30B1-31A5 : DATA, 5*49?)
(3146 : )
(31A6-31BD : 00h * 24)
31BE 〜 : (STR$()からコール)
3366 〜 : BC=0005h,次に続く
3369 〜 : [DE]〜と[HL]〜とをBCバイト分比較する
3389 〜 : D6 INT(
345F 〜 :
3465 〜 : >< B0; <> B1
348A 〜 : =< B2; <= B3
348E 〜 : => B4; >= B5
3482 〜 : = B6
3476 〜 : > B7
347A 〜 : < B8
349B 〜 : D0 RND(
(34E7-34F0 : DATA, 5*2)
(34F1-3504 : DATA, nop 5*4)
3505 〜 :
350B 〜 :
3511 〜 :
(3517-3518 : DATA, 2バイト)
3519 〜 : D1 SIN(
35C8 〜 35E9 :
・35E1 〜 35E9 : BC=0000h, DE=0000h, A=80h をセット
3608 〜 3616 : D2 COS(
3617 〜 : D3 TAN(
3642 〜 : DB SQR(
(36EF-3702 : DATA, 5バイト4個)
(3703-3704 : DATA, 2バイト)
3705 〜 3805 : D5 EXP(
37BC
37ED
37FB
(3806-3832 : DATA, 5バイト9個)
(3803-3835 : DATA, 3バイト)
3836 〜 3941 : JMP-TBL 3: D8 LN(
(3942-3964 : DATA, 5バイト7個)
3965 〜 396F : JMP-TBL 3: D7 LOG(
(3970-3975 : DATA; = BF A9 D8 5B DE)
(3975-3976 : DATA)
3977 〜 : JMP-TBL 3: D4 ATN(
3A22-3A4E : DATA; 45バイト
3A4F-3A59 : DATA; 00h * 11
・3A4F,3A50
・3A53
・3A54 : =80h
・3A55 : A
・3A56 : E
・3A57 : D
・3A58 : C
・3A59 : B
3A5A 〜 3AA4 : JMP-TBL : ^ C0 (was CF)
3AA5 〜 3AEC :(べき乗 '^' からコール)
::::::::::::プリンタ出力の処理
3AED 〜 : LIST/P
3AF2 〜 : PRINT/P
3B02 〜 : PRINT ?
3B1E
3B4B 〜 : LIST/P
3B8B 〜 : PRINT/P, /T ?
3BA5 〜 :
3BB6
3BC3 〜 : LIST/P
3BCA 〜 :
3BE0
3BF2
3C06
(3C2F-3C52 : "NO POWER OR NO CONNECTION (PRINTER)",0Dh)
(3C53-3C58 : "ALARM",0Dh)
(3C59-3C64 : "PAPER EMPTY",0Dh)
(3C65 : 文字列のワーク用)
::::::::::::
(3C66-3C8D : ワーク用?, 40文字分)
3C8E 〜 3CCA :(PRINT命令の1C89hからジャンプ)
3CCB 〜 3D23 :
::::::::::::
(3D24 : リピート中のキーコード)
(3D25 : オートリピート; 00h=オン, 01h=オフ)
3D26 〜 3E40 : 1行入力([3D25h]!=0ならROM:0003hをコール)
3E41 〜 3E77 : 1文字入力/オートリピート用
3E78 〜 3E8C : ピポ音出
3E8D 〜 3ED5 : 1文字入力
:::::::::::: I/O; コール元が不明
(3ED6-3EF0 : DATA)
3EF1 〜 3F06 :
3F07 〜 3F37 :
(3F38 〜 3F43 : DATA )
3F44 〜 3F5C :
(3F5D-3F64 : "J,$13A8",0Dh)
3F65 〜 3F7E :
3F7F 〜 3F81 : A=00h, jr 3F76h
3F82 〜 3FA3 :(3F6Ehからコール) JP (IX)
3FA4 〜 3FB4 :(3F85hからコール)
3FB5 〜 3FD3 : I/O
(3FD4-3FDB : "J,$0048",0Dh)
3FDC 〜 4006 :(3F0Chからコール) I/O
4007 〜 4048 : I/O
::::::::::::(エピ10で解説)
4049 〜 4068 : LOAD 処理1(ファイル名等の128バイト)
4069 〜 4080 : LOAD 処理2(データ本体)
4081 〜 40FB : 3)データの取得(BCバイトを[HL]番地に格納)
40FC 〜 4121 : 0連続待ち
4122 〜 4127 : 2)40FChコール, 065Ehコール(1連続0連続待ち)
4128 〜 413F : 1)06B2hコール(テープ・スタート待ち), 20000hループ
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2026.3.31 推敲
2026.4.2 微推敲
2026.4.3 推敲
2026.4.18 エピを入れ換え(初出: 2026/02/03 21:58)




