mz-80K SP-5030(旧バージョン)
仕様
1.形式
中間言語式インタープリタ
2.数値データ
浮動小数点形式、有効数字8桁×10±19乗の実数
実数範囲:0.27105055E−19 〜 0.92233720E+19
16進数:LIMIT、POKE、PEEK、USRで16進数4桁のみ前に$をつける事が可能
3.数値変数
(1)数値変数
変数名は始めの2文字が有効
第1文字は英字のみ、特殊文字、BASICワードの使用不可
(2)1次配列数値変数
配列は最大255まで、DIMで配列定義をする
配列は括弧内に添字を置く
変数名は(1)と同様
<例> DIM A(10) A(0)からA(10)までの配列要素が定義される
(3)2次配列数値変数
配列の添字を2つもつ変数、各配列は最大255まで、DIMで配列定義をする
配列は括弧内に添字を置く
変数名は(1)と同様
<例> DIM A(10,10) A(0、0)からA(10、10)まで
11×11=121の配列要素をもつ2次元配列が定義される
4.ストリングデータ
最大255文字
アスキーコード列、終端に00DHがつく
5.ストリング変数
種類:ストリング変数、1次元配列ストリング変数、2次元ストリング変数
形式:数値変と同様の条件の名前に$をつける
6.その他
(1)文番号:1〜65535
(2)CMTのファイルネーム 最大16文字
(3)CURSOR x,yコマンドにおけるxとy x=0〜39、y=0〜24
(4)SET x,yコマンドにおけるxとy x=0〜79、y=0〜49
(5)TI$に代入できるストリング 6桁10進数
最初の2文字は時=00〜23、次の2文字は分=00〜59、次の2文字は秒=00〜59
(6)FOR〜NEXTループのネスティング 最大15まで
(7)GOSUBのネスティング 最大15まで
(8)DEF FNによる関数定義のネスティング 最大6まで
(9)INP、OUT命令による入出力 0〜239(240〜255は周辺用)
(10)オートリピート機能:カーソルキー、HOMEキー、スペースキー、DELキーの各キー
(11)円周率の値:π=3.1415927
計算の優先順位
1.()
2.↑ べき乗
3.*、/
4.+、−
もし暴走したら
マシン語を実行したとき等で暴走した場合リセットをしてモニタに戻ります
モニタから0124DH(または01259H)を実行しますと
プログラムをクリアせずにBASICのコマンド待ちになります
ただし、BASIC自体が壊れている可能性があります
GETの応用
通常の方法
10 GET A$
20 IF A$=”A” THEN PRINT ”A”;
30 GOTO 10
上記プログラムを実行するとキーを一旦離さないと次のキー入力が受け付けないのがわかります
Aキーを押しながらSHIFTキーを連打するとキー入力はA、スペード、A...
と変わるのでAの文字がつづけて表示する事は可能
通常ゲームでGET文を使用すると同じ方向を移動するのに
動いたら一旦離してもう一度押すという事になってしまいます
入力モードを変える方法
10 GET A$:POKE$1170,1:GET B$:POKE$1170,0
20 IF A$=”A” THEN PRINT ”A”;
30 GOTO 10
上記のように10行を変更するとAキーが押された分だけAの文字が表示されます
10行はA$=キーデータ、カナ入力モード、B$=ダミーのキー入力(数値入力でも可)、通常入力モード
またLEDの点灯はありません
ダミーのキー入力を入れるだけではダメで入力モードを切り替えることで可能となります
ただし通常入力、カナモードで同じキーデータ(スペース等)では使用できません
BASICワークを書き換える方法
10 GET A$:POKE$45A4,0
20 IF A$=”A” THEN PRINT ”A”;
30 GOTO 10
これだとスペース等のキーも使用できます
ただしBASICのバージョンによっては動かない可能性があります
BASIC自体を書き換える方法
5 POKE$284B,0
10 GET A$:POKE$45A4,0
20 IF A$=”A” THEN PRINT ”A”;
30 GOTO 10
ただしBASICのバージョンによっては動かない可能性があります
CHR$
PRINT CHR$(44)は本来”,”カンマが表示されるはずが表示されません
PRINT ”,”にならずPRINT ,扱いになります
TI$の表示
12時と24時の切換え時に表示がおかしくなります
単純な確認方法として下記のプログラムを実行
10 TI$=”115957”
20 PRINT TI$
30 GOTO 20
*24時のチェックではTI$=”235957”に変更
12時へ切り替わる場合
115959−>235956−>061214−>061215−>120000
24時へ切り替わる場合
235959−>115956−>181214−>181215−>000000
つまり12時と24時のam/pmの切換え時にTI$の数値がおかしくなるのが確認できます
BEEPの代わり
BASICにはBEEP命令がありませんがUSR(62)[$003E]が代用できます
これは約880Hzの音を一定の間鳴らします
効果音
ゲームでよく使われる手法として
FORI=0TO10:POKE$11A2,I:USR($0044):NEXT
等、$0044のMSTAをコールする場合があります
$0044は分周比データを8253 カウンタ0に設定して音を鳴らします
カウンタ0はLS74で1/2に分周されスピーカへ出力されます
必要な設定は$11A1と$11A2なのですが、$11A2のみの設定の場合
$11A1=分周比データ下位(設定しないので0)
$11A2=分周比データ上位(0だと音は出ない)
分周比データ=2000000Hz÷(周波数×2)なので
2000000÷(分周比データ×2)=周波数(近似値)
分周比データ上位nnのみのインクリメントだとI=nn*256
I | クロック 分周比×2 周波数
−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
0 | サウンド出力停止
1 |2000000÷( 256×2)=3906.25Hz
2 |2000000÷( 512×2)=1953.125Hz
3 |2000000÷( 768×2)=1302.0833...Hz
| |
10 |2000000÷(2560×2)= 390.625Hz
上記に近い周波数が出力されます(高い音から低い音が出力)
MUSIC
RYTHM[002C8H]先頭部分は[BREAK]キーのみのチェックを行っており
このルーチンをコールしているMUSIC文も[BREAK]キーだけで止まります
10 MUSIC”CDE”:GOTO10
上記のプログラムは[SHIFT]+[BREAK]キーでも[BREAK]キーでも止まります
ただしキーを長押しすること
16進数表記について
LIMIT、POKE、PEEK、USR文で16進数表記が可能になりましたが
アドレス指定のみで演算を組み込む事はできません
<例>
POKE$D000,255 <−画面左上にディスプレイコード0FFHが表示される
I=0:POKE$D000+I,255 <−SYNTAX ERRORになる
V=$D000:POKEV,255 <−代入文自体、16進数を扱えないので
SYNTAX ERRORになる
マシン語プログラムを少しでも使いやすく
SP−5030では2桁の16進数が扱えず4桁の16進数も
限られたコマンド内でしか使用出来ません
VAL命令でA=VAL(”$”+A$)のような事が出来きない為
マシン語をREAD、DATAでメモリに書き込む場合、DATA文は10進データにする事になります
それではマシン語データが見難いのでプログラムで16進数を扱うようにします
簡易なのでDATA内のデータ長、範囲チェックを行っていません(必ず2バイト、16進数のみ)
<例>全画面に人を書くプログラム(VBLANKチェック無し)
10 LIMIT$7FFF:GOSUB30:USR($8000)
20 END
30 FOR AD=32768 TO 32783:READ A$
40 GOSUB60:POKE AD,A:NEXT AD
50 RETURN
60 REM *** READ DATA ***
70 H$=LEFT$(A$,1):H=ASC(H$)
80 IF H<58 THEN H=H−48:GOTO 100
90 IF H<71 THEN H=H−55
100 L$=RIGHT$(A$,1):L=ASC(L$)
110 IF L<58 THEN L=L−48:GOTO 130
120 IF L<71 THEN L=L−55
130 A=H*16+L
140 RETURN
150 REM *** HEX DATA ***
160 DATA 21,00,D0,11,01,D0,01,E8
170 DATA 03,36,CA,ED,B0,C9,00,00
キークリック
キー入力時に音のオン・オフの設定を行います
POKE$119D,0 :キークリック オン
POKE$119D,1 :キークリック オフ
PEEKプロテクト
通常PEEKを使ってもLIMIT(BASICプログラムエリア領域)以前を覗いてみても
プロテクトが働き正しい値は返ってきません(32が返る)
POKE$2731,0…プロテクト オン
POKE$2731,1…プロテクト オフ
UNLISTファイル作成
SAVEする前に実行するとSAVE、LISTの実行が出来ないファイルが作成されます
POKE$2999,0…UNLIST作成しない
POKE$2999,1…UNLIST作成する
BASICオートスタートテープ作成
SAVEする前に実行するとオートスタート ファイルが作成されます
POKE$299A,0…オートスタート作成しない
POKE$299A,1…オートスタート作成する
BASICコマンド入力のコントロールキーリピート
コマンド入力時にリピートのオン・オフの設定を行います
オンになるとキークリック オンの場合、音が少し高くなります
またINPUT文ではリピート オフと同じになります
POKE$3D25,0…リピート オン
POKE$3D25,1…リピート オフ
修正
SP−5030の旧バージョンでは一部演算結果が誤って出力されますので修正が必要になります
(旧) (新)
3112:FF −> FE
3196:8F −> 8E
31A0:DF −> DE
3A26:DE −> DF
コマンド
LIST [m][−[n]]
m:開始行番号(省略すると始めから表示)
n:終了行番号(省略すると終わりまで表示)
入力したプログラムを表示します
[SHIFT]+[BREAK]キーで中断
RUN [m]
m:開始行番号(省略すると始めから実行)
プログラムの実行を開始させます
[SHIFT]+[BREAK]キーで中断
CONT
中断したプログラムの再開を行う
NEW
BASICプログラムの消去を行う
CLR
変数の初期化
数値をとる変数は全て0、ストリング変数は全て空にします
BYE
BASICの使用を止め、モニタを実行
LOAD [”ファイル・ネーム”]
プログラムをロードします(ファイル・ネームは省略可)
SAVE [”ファイル・ネーム”]
プログラムをセーブします(ファイル・ネームは省略可)
VERIFY [”ファイル・ネーム”]
セーブしたプログラムとメモリのプログラムの比較を行う事で
正確にセーブ出来たのかチェックを行います(ファイル・ネームは省略可)
ステートメント
GOTO m
m:ジャンプ先の行番号
指定した行番号へジャンプします
GOSUB m
m:サブルーチンの先頭行番号
サブルーチンのコールします
GOSUB〜RETURNのネスティングは最大15重
RETURN
サブルーチンから戻ります
ON s GOTO m1[,m2...]
s:数式(1≦s)
mn:ジャンプ先の行番号
指定された行番号へジャンプします
sが指定範囲外なら次の文を実行
ON s GOSUB m1[,m2...]
s:数式(1≦s)
mn:サブルーチンの先頭行番号
指定されたサブルーチンへコールします
sが指定範囲外なら次の次の文を実行
IF r THEN s
IF r GOTO m
IF r GOSUB m
r:条件式
s:文(命令文または行番号)
m:行番号
条件式が合えばTHEN(またはGOTO、GOSUB)を実行
合わなければ次の行番号へジャンプ
FOR m=n1 TO n2 [STEP n3]
m:添字変数名
n1:初期値
n2:終値
n3:増分(省略すると1に指定)
FOR文からNEXT文までを条件にしたがって繰り返し実行
NEXT [m1][,m2...]
mn:添字変数名
FORループの終わりを示します
FOR〜NEXT文を重ねる(入れ子)は15重まで
READ d1[,d2...]
dn:変数名
DATA文に格納してあるデータを読み、変数に代入します
DATA c1[,c2...]
cn:数値またはストリング
READ文で変数に代入する為のデータを格納します
RESTORE
READ文で読む最初のDATA命令の最初のデータ指定を行います
TEMPO s
s:数式(1〜7)
MUSIC文で演奏する速さを指定します
1 最も遅い Lento,Adagio
4 中位の速度 Moderato(TEMPO1の4倍の速さ)
7 最も速い Molto Allegro,Presto(TEMPO1の7倍の速さ)
設定していないとTEMPO4の設定になります
本体基板上にある68kΩのボリュームもTEMPOの設定に関係があります
MUSIC ストリング
音符の指定 [オクターブ][#(嬰音)][音名][音長]
オクターブ(3オクターブまで)
アスキーコード0D7H…高音域の指定
指定なし …中音域の指定
アスキーコード0CFH…低音域の指定
オクターブは音名毎に指定する(指定なしがオクターブ2になる為)
嬰音
#…半音の指定
音名
C…ド D…レ E…ミ F…ファ
G…ソ A…ラ B…シ
R…無音
音長(初期値=5)
0… 32分音符、 32分休付
1… 16分音符、 16分休付
2…付点16分音符、付点16分休付
3… 8分音符、 8分休付
4…付点8分音符、付点8分休付
5… 4分音符、 4分休付
6…付点4分音符、付点4分休付
7… 2分音符、 2分休付
8…付点2分音符、付点2分休付
9… 全音符、 全休付
音長は継続されます
MUSIC”C9DE”ならC9D9E9として演奏
またストリング部分は結合する事も可
<例>
MUSIC A$,B$,A$
MUSIC A$;B$;A$
MUSIC A$+B$+A$
MUSIC ”CD”+A$+B$
DEF FN d(x)=z
d:関数名
x:引数
z:関数の定義式
ユーザによって作成された関数を定義します
関数定義のネスティングは6重まで
SET x,y
x:グラフィックX座標 0〜79
y:グラフィックY座標 0〜79
擬似グラフィックのドットの描画
VRAMにディスプレイコード0F0H−0FFHを使用して描画するので
キャラクタの合成は不可
RESET x,y
x:グラフィックX座標 0〜79
y:グラフィックY座標 0〜79
擬似グラフィックのドットの消去
WOPEN [”ファイル・ネーム16文字以内”]
CMTにデータを書き込む準備を行います(ファイル・ネームは省略可)
データを書き込むにはPRINT/T、クローズするにはCLOSEを使用します
<例>
10 WOPEN ”TEST”
20 FOR I=0 TO 9
30 PRINT/T I
40 NEXT I
50 CLOSE
ROPEN [”ファイル・ネーム16文字以内”]
CMTにデータを読み込む準備を行います(ファイル・ネームは省略可)
データを書き込むにはINPUT/T、クローズするにはCLOSEを使用します
<例>
10 ROPEN ”TEST”
20 FOR I=0 TO 9
30 INPUT/T A
35 PRINT A
40 NEXT I
50 CLOSE
CLOSE
WOPENまたはROPENでCMTデータのオープンのクローズを行います
WOPEN、ROPENの切換えをする場合は必ずクローズする必要があります
INPUT [d$;]d1[,d2...]
d$:プロンプト文またはダブルクォーテーションで囲まれたストリング
dn:変数名またはストリング変数名
指定した変数へデータをキーボードから入力します
INPUT/T d1[,d2...]
dn:変数名またはストリング変数名
指定した変数へデータをCMTから入力します
GET d
d:変数名またはストリング変数名
キーボードから一文字入力を行います
変数名の場合
1〜9キーのみで各数値1〜9
何も押されなければ 0
ストリング変数名の場合
押されたキーのアスキーコード(+SHIFTの場合は+SHIFTのコードになる)
何も押されなければ 0(000H)
[DEL]だと 96(060H)
[INS]だと 97(061H)
[CR] だと 102(066H)
PRINT [s1{,または;}s2...]
sn:式(省略すると改行)
式で指定された数値やストリングをディスプレイに出力します
式はカンマ”,”かセミコロン”;”で区切ります
カンマは式を表示、区切られた後ろにスペースを空けて次の式の表示を行います
セミコロンは式を表示、区切られた後ろに続いて次の式の表示を行います
最後の式の区切りのコロンがあると改行は行われません、何もないと改行が行われます
PRINT/T PRINT文と同様にCMTに出力
PRINT/P PRINT文と同様にプリンタに出力
SIZE
フリーエリアの取得
<例>
10 A=SIZE:PRINT A
TI$
タイマの設定または読み出しを行います
時間は24時間制の000000から235959
設定する場合は6文字のストリング
TI$=”hhmmss”
読み出す場合はそのまま読みますhhmmssと6文字のストリングで取得されます
また12:00:00と24:00:00の切換え時に一定時間だけ数値がおかしくなります
PRINT TI$
CURSOR x,y
x:カーソルX座標 0〜39
y:カーソルY座標 0〜24
表示位置を決めます
TAB(x)
x:数式または0〜38
画面左端からx+1文字目にカーソル移動
SPC(x)
x:数式または文字数
現在カーソル位置からスペースを指定数だけ表示、カーソル移動
DIM d1(n1[,n2])[,d2(n1[,n2])...]
dn:配列名
n1−n2:添字の最大値
配列変数の要素の大きさを指定して配列を宣言、メモリ領域の確保を行います
配列宣言は2次元までです
STOP
BASICプログラムの中断を行います(CONTで再開可)
END
BASICプログラムの終了
終了してからCONTを実行すると終了した先の行番号の実行を行います
REM
コメントを書きます
他機種のBASICと違い:がREM文の終了となり:以降はプログラムとみなされます
その為REMでマルチステートメントのプログラムを止めておく事が出来ません
<例>
10 REM TEST:MUSIC ”CDEF”
RUNすると音が鳴ります
INP #p,d
p:ポート番号 0〜239(10進数のみ)
d:入力する変数
I/Oポートpからデータを読み、変数dに代入します
入力にストリング変数にするとMISSMATCH ERROR、
ポート番号240以降指定するとDATA ERRORとなる
OUT #p,d
p:ポート番号 0〜239(10進数のみ)
d:出力する変数または数値0〜255(10進数のみ)
I/Oポートpからデータdを出力します
ポート番号240以降指定するとDATA ERRORとなる
LIMIT d
d:確保する変数またはアドレス(16進数可)
BASICプログラムエリアをdのアドレスまでに制限します
マシン語領域の確保に使用します
LIMIT MAX
BASICプログラムエリアをメモリ最大限にします
PEEK(a)
a:アドレス −32767〜32767(16進数可)
指定したメモリの内容を与えます
ただし通常($2731=0)ではマシン語領域以降でしか使用できません
領域より前だと32になります
全領域を除く場合POKE$2731,1を実行
<例>
A=PEEK($D000)
POKE a,d
a:アドレス −32767〜32767(16進数可)
d:データ 0〜255(10進数のみ)
指定したメモリにデータを書き込みます
USR(a[,d$])
a:アドレス −32767〜32767(16進数可)
d$:ストリング変数
指定したアドレスのマシン語を実行
ストリング変数の指定がある場合
指定したストリング変数がある場所のアドレスがDEレジスタに
長さがBCレジスタに入る
<例>
SP−1002の00015H(MSG)をコールする場合
DEレジスタに文字列のデータアドレスが必要になりますが
BASIC上でもUSR命令で使用できます
A$=”ABC”:USR($0015,A$)
ファンクション
LEFT$(s,x)
s:ストリング
x:ストリングの長さ 0〜ストリングの長さ
ストリングの左から任意の長さのストリングを与えます
RIGHT$(s,x)
s:ストリング式
x:ストリングの長さ 0〜ストリング式の長さ
ストリングの右から任意の長さのストリングを与えます
MID$(s,x,y)
s:ストリング式
x:ストリングの先頭位置 1〜x
y:ストリングの長さ
ストリングの任意の位置から任意の長さのストリングを与えます
LEN(s)
s:ストリング
ストリングの長さを与えます
ASC(s)
s:ストリング
ストリングの最初の文字のアスキーコードを与えます
CHR$(x)
x:数式 0〜255
指定したアスキーコードに対応した文字を与えます
VAL(s)
s:ストリング
ストリングの数字を数値に変換します
数字以外の場合0が入る
STR$(x)
x:数式
数値をストリングに変換する
ABS(x)
x:数式
絶対値を与えます
SGN(x)
x:数式
xの値が正なら1、0なら0、負なら−1を与えます
INT(x)
x:数式
数値を超えない最大の整数値を与えます
SIN(x)
x:ラジアン
三角関数、正弦(サイン)の値を与えます
COS(x)
x:ラジアン
三角関数、余弦(コサイン)の値を与えます
TAN(x)
x:ラジアン
三角関数、正接(タンジェント)の値を与えます
ATN(x)
x:ラジアン
逆正接の値を求めます
求められる値は−π/2からπ/2の間です
SQR(x)
x:数値(0以上)
数値の平方根を求めます
EXP(x)
x:数式
eに対する指数関数の値を与えます
LOG(x)
x:数式(0以上)
eを底とする対数を求めます(自然対数)
LN(x)
x:数式(0以上)
自然対数の値を与えます
RND(x)
x:数値
xについて0.00000001〜0.99999999までの擬似乱数を与えます
xが正の場合、前回与えた乱数へひきつづく次の乱数を与えます
xが0、負の場合、擬似乱数の発生を初期化、最初の擬似乱数を与えます
<例>1から6までの乱数発生を表示
PRINT INT(RND(1)*6+1)
エラーメッセージ
SYNTAX ERROR :プログラムの文法上に誤りがある、指定した飛び先が無い
MEMORY ERROR :プログラムとして使えるメモリを超えた
DATA ERROR :扱えるデータ範囲を超えた
MISMATCH ERROR:数値変数とストリング変数を混合して使用
16FOR ERROR :FOR〜NEXTで16重以上使用
16GOSUB ERROR :GOSUBが16重以上使用
6FN ERROR :関数定義の多重定義が6重以上使用
CONT ERROR :プログラムの中断後プログラム編集を行ってCONTを実行
FILE ERROR :OPENせずにファイルを使用
OVERPLAY ERROR:RAM拡張せずにその領域にロードしようとした(48KRAMシステム以外のmz)
中間言語
|080H REM |0A0H BYE |0C0H LEFT$( |0E0H |
|081H DATA |0A1H LIMIT |0C1H RIGHT$( |0E1H |
|082H LIST |0A2H CONT |0C2H MID$( |0E2H |
|083H RUN |0A3H SET |0C3H LEN( |0E3H |
|084H NEW |0A4H RESET |0C4H CHR$( |0E4H |
|085H PRINT |0A5H GET |0C5H STR$ |0E5H |
|086H LET |0A6H INP# |0C6H ASC( |0E6H |
|087H FOR |0A7H OUT# |0C7H VAL( |0E7H |
|088H IF |0A8H*(0F2H) |0C8H PEEK( |0E8H |
|089H GOTO |0A9H |0C9H TAB( |0E9H |
|08AH READ |0AAH |0CAH SPC( |0EAH |
|08BH GOSUB |0ABH |0CBH SIZE |0EBH |
|08CH RETURN |0ACH |0CCH |0ECH |
|08DH NEXT |0ADH THEN |0CDH |0EDH |
|08EH STOP |0AEH TO |0CEH |0EEH |
|08FH END |0AFH STEP |0CFH ↑ |0EFH |
|090H ON |0B0H >< |0D0H RND( |0F0H |
|091H LOAD |0B1H <> |0D1H SIN( |0F1H |
|092H SAVE |0B2H =< |0D2H COS( |0F2H CURSOR |
|093H VERIFY |0B3H <= |0D3H TAN( |0F3H |
|094H POKE |0B4H => |0D4H ATN( |0F4H |
|095H DIM |0B5H >= |0D5H EXP( |0F5H |
|096H DEF FN |0B6H = |0D6H INT( |0F6H |
|097H INPUT |0B7H > |0D7H LOG( |0F7H |
|098H RESTORE |0B8H < |0D8H LN( |0F8H |
|099H CLR |0B9H*AND |0D9H ABS( |0F9H |
|09AH MUSIC |0BAH*OR |0DAH SGN( |0FAH |
|09BH TEMPO |0BBH*NOT |0DBH SQR( |0FBH |
|09CH USR( |0BCH + |0DCH |0FCH |
|09DH WOPEN |0BDH − |0DDH |0FDH |
|09EH ROPEN |0BEH * |0DEH |0FEH |
|09FH CLOSE |0BFH / |0DFH |0FFH |
*0A8H(0F2H)はコードは0A8Hとして実行、プログラムは0F2Hとして書き込む
AND、OR、NOTはSYNTAX ERROR(未定義命令)となります
0124DH:BASICのコマンド待ち(MUSIC ストップ、プロンプトの表示)
01259H:BASICのコマンド待ち
01355H:ストリング 表示
入力:DE=ストリングデータアドレス(ENDマークは00DH)
使用:AF
01171H〜01172H DSPXY カーソル位置X、Y
01173H〜0118DH MANG 上のライン接続フラグ
01194H DPRNT
DEの指すストリングデータを表示します
NEWLIN(00009H)
MSG (00015H)をコールします
014D4H−01614H:BASIC ワード
0162EH アスキー’ ’スキップ
入力:HL=ストリングデータアドレス
出力:HL=’ ’スキップしたストリングデータアドレス
使用:AF
ストリングデータの先頭から’ ’をスキップして
’ ’以外を見つけたらRET
0165AH アスキー数字のチェック
入力:HL=ストリングデータアドレス
出力: A=チェックしたアスキーコード
HL=’ ’をスキップしたストリングデータアドレス
Zf=1 データ’:’
0 データ’:’以外
Cf=1 数字
0 数字以外
使用:AF
0162EHをコールしてストリングデータの先頭から’ ’をスキップ
データが数字(アスキーコード030H−039H)かチェックを行います
01663H CP HL,DE
入力:HL=データ
DE=データ
出力:Zf=1 HL= DE
0 HL<>DE
Cf=1 HL< DE
0 HL >DE
使用:AF
Aレジスタを使用してHLの値からDEの値を減算します
ただしDEとHLの値はそのままになります
01669H HL=HL−DE
入力:HL=データ
DE=データ
出力:HL=減算したデータ
使用:AF
Aレジスタを使用してHLの値からDEの値を減算しHLへ出力します
016E9H ストリングバッファから10進数アスキーコードから16進数に変換
入力:HL=ストリングバッファ
出力:HL=ストリングバッファ+取り込んだ文字数
DE=変換した数値
使用:AF、DE、HL
最初にアスキーコードのチェックを行い数字(030H−039H)でなければRET
次から’0’から’65535’までの数字があればDEに数値を出力(00000Hから0FFFFH)
’65536’以上だとSYNTAX ERROR出力へ飛びます
016EFH 16進数から10進数(アスキー)の変換
入力:HL=変換する16進数
DE=出力データアドレス
出力: C=005H (5桁分)
使用:AF、BC、DE、HL
HLの2バイト16進数を10進数アスキーコードい変換して
DEの出力アドレスに出力します
この時先頭が0の場合’ ’(020H)に変換します
出力データの最後は00DHを出力します
01737H フリーエリアの計算
出力:HL=フリーエリア
01790H ブロック転送
入力:HL=転送するアドレス
DE=転送先アドレス
BC=長さ(00000Hだと何もしない)
出力:HL=転送するアドレス(入力値)
DE=転送先アドレス(入力値)
BC=長さ(入力値)
使用:AF
LDIRを使用したブロック転送を行います
ただし入力パラメータBC=00000Hだと何もしません
01826H BASICプログラムのクリア
使用:AF、HL、 B、DE
04642H〜04643H ストリング変数ポインタ
04644H〜04645H=変数へ代入する数値のポインタ
出力:02998H=000H LISTの実行可
04632H〜04633H=00000H
04634H〜04635H=04808H BASICプログラム最終アドレス
04646H〜04647H=0466AH DEF FNスタックポインタ
04648H〜04649H=04787H FOR スタックポインタ
0464AH〜0464BH=0466AH GOSUB スタックポインタ
04803H=000H FOR 〜 NEXTによるネスティング数
04804H=000H FOR 〜 NEXTによるネスティング数
04805H=000H GOSUB によるネスティング数
04806H〜04807H=00000H(最終マーク)
各ワークエリアを初期値にしてBASICプログラムのクリアを行います
0186FH 各スタックのクリア
使用:A 、HL
出力:04646H=0466AH DEF FNスタックポインタ
04648H=04787H FOR スタックポインタ
0464AH=0466AH GOSUB スタックポインタ
04803H=000H FOR 〜 NEXTによるネスティング数
04804H=000H FOR 〜 NEXTによるネスティング数
04805H=000H GOSUB によるネスティング数
BASIC内で使用されるスタック等を初期値に戻します
01889H 2バイトデータクリア
使用:A 、HL
入力:HL=クリアするアドレス
出力:HL=クリアするアドレス+2
(HL)=00000H
HLで指定したアドレスに000H*2を書き込み、HLに次のアドレスにセットします
01A0EH−01A5F BASICコマンド アドレス
01A66H LISTデバイス フラグ
000H=CRT
001H〜0FFH=PRT
02731H PEEK範囲フラグ
000H=0D000H以降
001H〜0FFH=全ての内容
02998H UNLIST用フラグ
000H =UNLISTの実行不可(通常通り )
001H〜0FFH=UNLISTの実行可 (SAVE、LIST不可)
02999H UNLIST作成用フラグ
000H =UNLIST 作成しない
001H〜0FFH=UNLIST 作成する
0299AH オートスタート作成用フラグ
000H =作成しない
001H〜0FFH=作成する
03BC3H プリンタ CR出力
使用:AF
プリンタに00CH、00AHを出力します
03BCAH プリンタ1バイト出力
出力:A=出力データ
使用:AF
プリンタに1バイトデータを出力して000Hを出力します
03C65H:プリンタ タブ 000Hで出力しない
03C66H〜03C8DH:PRINT文表示バッファ 40バイト
03D24H:コマンド入力 1キーデータ (CTRLディスプレイコード)
03D25H:コマンド入力 コントロールキーオートリピート フラグ
001H=オフ
000H=オン
03D26H:BASICコマンド入力
入力:DE=キーバッファアドレス
使用:AF
01171H〜01172H DSPXY カーソル位置
01173H〜0118DH:MANG 上のライン接続フラグ
0118EH FLASH カーソル点滅用退避キャラクタ
0118FH〜01190H FLPST カーソル点滅用のカーソル位置
01191H FLSST 000H=カーソル表示する、001H=カーソル表示しない
01192H FLSDT カーソル用ディスプレイコード
01193H STRGF キー入力時のコントロール
d7:インサート数 1=コントロールコード入力、0=通常入力
d6:インサート数 d6
d5:インサート数 d5
d4:インサート数 d4
d3:インサート数 d3
d2:インサート数 d2
d1:インサート数 d1
d0:インサート数 d0
0119DH SERK 000H=クリック音オフ、0FFH=クリック音オン
03D25H コントロールキーのオートリピートフラグ
キー入力を行い指定したキーバッファに[CR]またはSHIFT+BREAKされるまで入力されます
03D25H=000H ならGETL(00003H)のルーチン(リピート無し)
001H〜0FFHならBASIC内ルーチンの実行(オートリピート)
03EF1H:MZ−80DU データ送信
03F07H:MZ−80DU データ受信
03F3EH:MZ−80DU コールドスタート
03FB5H:MZ−80DU モニタのコマンド待ち
03F65H:MZ−80DU 1バイトHEXデータ送信
04100H〜043FFH:空き
04400H〜0444FH:汎用バッファ
04455H〜04456H:1ライン入力 プログラム格納アドレス
04457H〜04458H:1ライン入力 プログラム行番号(0だとダイレクトコマンド)
04459H〜044A4H:1ライン入力 プログラム (中間言語)
04561H〜04562H:RAMの最終アドレス+1
04563H〜04564H:スタックポインタ(RAMの最終アドレス+1)
04565H :プログラム中断フラグ
000H=中断していない
001H=ENDまたはSTOP
002H=BREAK+SHIFTキー
04566H〜0456BH:プログラムを中断時(047FDH−04802H)退避エリア
0456CH〜0456DH:変数の内容の長さ(???上位0456DHは無視)
0456EH :ストリングの長さ
0456FH :変数の型 000H=単精度、001H=ストリング
04570H :以前の変数の長さ(変数名は除く)
04571H :指定した変数の型 000H=単精度、001H=ストリング
04572H〜04573H:指定した変数のアドレス
04574H :000H=INPUT文、001H=READ文
04575H〜04576H:次のDATAがあるBASICプログラムPC
04577H :000H=最初からDATAを探す、001H=途中からDATAを探す
04578H〜04579H:次のDATAがあるBASICプログラムPC
0457AH :BSDファイルオープン 000H=オープン可、001H=オープン中
0457BH〜0457CH:BSDエンドポインタ (045AEH−0462DH内を参照)
0457DH :PRINT・INPUT文フラグ 000H=CRT、001H=CMT、080H=PRT
0457EH〜0457FH:LIST スタート行番号
04580H〜04581H:LIST エンド 行番号
0458EH :ロード ファイルネームチェック 000H=チェックしない、001H−0FFH=チェックする
0458FH〜04590H:指定したファイルネームのストリングアドレス
04592H :ロード タイプ 000H=VERIFY、001H=LOAD、002H=ROPEN
045A2H :GET文 押されたデータ(アスキー)またはヌル値
045A3H :00DH
045A4H :GET文 押されたデータ(アスキー)
045AEH〜0462DH:BSDファイル用バッファ 128バイト
0462EH〜0462FH:入力した行番号 退避
04630H〜04631H:指定したストリング変数名
04632H〜04633H:???プログラムクリア(NEW)で00000Hになる
04634H〜04635H:BASICプログラム最終アドレス
04636H〜04637H:2重添字つきストリング変数エリア ポインタ
04638H〜04639H: 添字つきストリング変数エリア ポインタ
0463AH〜0463BH: ストリング変数エリア ポインタ
0463EH〜0463FH: 配列エリア ポインタ
04640H〜04641H: 変数エリア ポインタ
04642H〜04643H: ストリング ポインタ
04644H〜04645H: 変数へ代入する数値 ポインタ
04646H〜04647H:DEF FN スタック ポインタ
04648H〜04649H:FOR 〜 NEXT スタック ポインタ
0464AH〜0464BH:GOSUB スタック ポインタ
0464CH〜04669H:DEF FN スタック領域
0466AH〜04786H:FOR 〜 NEXTスタック領域19バイト1組 15レベル
04787H〜047EFH:GOSUB スタック領域 7バイト1組 15レベル
047F0H〜047FCH:実行中のFOR〜TO〜STEP設定
:ループする変数名 2バイト
:STEP値 単精度 5バイト
:最終値 単精度 5バイト
:???STEP用フラグ 1バイト
047FDH〜047FEH:実行中のBASICプログラムの次の行番号
047FFH〜04800H:実行中のBASICプログラムの 行番号
04801H〜04802H:実行中のBASICプログラムの PC
04803H :DEF FN ネスティング数(最大15レベル)
04804H :FOR 〜 NEXT ネスティング数(最大15レベル)
04805H :GOSUB ネスティング数(最大15レベル)
04806H以降 :BASICプログラム領域
*次の行番号のアドレス(2バイト 00000Hなら最終マーク)
行番号 (2バイト)
プログラム
00DH (エンドマーク)
行番号 (2バイト)
プログラム
00DH (エンドマーク)
|
000000H (2バイト 最終マーク)
*SAVE、LOAD、VERIFY時には1行の長さに変換される
浮動小数点形式(単精度実数)
d7 仮数 1=正、0=負
d6 指数 1=正、0=負
d5 指数 D5
d4 指数 D4
d3 指数 D3
d2 指数 D2
d1 指数 D1
d0 指数 D0
仮数 第3バイト
仮数 第2バイト
仮数 第1バイト
仮数 第0バイト
1の場合0C1H 000H 000H 000H 080Hになる
仮数、指数ともに正、符号の位置は仮数部の左から1つ目
仮数 10000000 00000000 00000000 00000000
↑
0C2H 000H 000H 000H 080だと
仮数、指数ともに正、符号の位置は仮数部の左から2つ目
仮数 10000000 00000000 00000000 00000000
↑
になる為10B=2になる
仮数は第0バイトのd7が左端、第3バイトのd0が右端
↑より左は1、2、4…となる
↑より右は0.5、0.25、0.125…となる
mz−80Kのコーナへ
Home へ戻る