-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathTP.asm
More file actions
143 lines (132 loc) · 3.87 KB
/
Copy pathTP.asm
File metadata and controls
143 lines (132 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
;=================================================
;[TP]カンマで区切られた2つの文字列式のポインタを取得する
;IN HL=TP
;OUT (ARG0)=1番目の文字列式のポインタ,(ARG1)=2番目の文字列式のポインタ
;=================================================
GET_2STR_PTR:
CALL SKIP_SPC ;
LD (ARG0),HL ;
LD C,"," ;
CALL SKIP_CHR ;
LD E,MISSING_OPERAND ;
JP NC,ERROR ;
CALL SKIP_SPC ;
LD (ARG1),HL ;
LD C,":" ;
CALL SKIP_CHR ;
RET NC ;
DEC HL ;
RET ;
;=================================================
;[TP]テキストポインタの式を評価して16ビットレジスタに取得する
;・値=0000~FFFFH
;IN HL=TP
;OUT HL=TP,DE=式の結果
;=================================================
EXP2WORD:
RST 10H ;!重要!
.SKIP: CALL EVALEXP ;FAC<-式の計算結果
PUSH HL ;TP退避
CALL FAC2INT ;HL<-INT(FAC)
EX DE,HL ;
POP HL ;TP復帰
RET ;
;=================================================
;[TP]テキストポインタの式を評価して8ビットレジスタに取得する
;・値=00~FFH
;IN HL=TP
;OUT HL=TP,A=式の結果
;=================================================
IF FALSE
EXP2BYTE:
RST 10H ;!重要!BASIC解析命令
CALL BYTE_EVALEXP ;A<-式の計算結果(0~255)
RET
ENDIF
;=================================================
;[TP]テキストポインタ以降の文字列とコマンドテーブルを比較して、一致すればジャンプする
;IN C=ジャンプ用インデックスの初期値,DE=コマンドテーブルポインタ,HL=現在のテキストポインタ
;OUT HL=次のテキストポインタ
;=================================================
WORD_JUMP:
CALL SKIP_SPC ;
.L1: PUSH HL ;TPを退避
LD A,(DE) ;ここでDEはコマンド文字列の先頭を指している
OR A ;その値が00Hならすべて不一致を意味するので
JR NZ,.L3 ;エラーを出力して終了
LD E,SYNTAX_ERROR ;
JP ERROR ;
.L3: CP (HL) ;コマンド文字とTPの内容を比較
JR Z,.EQUAL ;等しくなければ次のコマンド文字列へ
.NEXT: INC DE ;コマンド文字に00Hが見つかるまでCPを進める
LD A,(DE) ;
OR A ;
JR NZ,.NEXT ;
INC DE ;00Hの次の文字にポインタをセットする
INC C ;ジャンプ用インデックス値++
POP HL ;TPを復帰
JR .L1 ;
.EQUAL: INC DE ;ここから文字が等しい場合の処理
INC HL ;TPとCPを1進める
LD A,(DE) ;CPが指す内容が文字列終端マーカーならすべて一致したことになるので
OR A ;一致処理へ進む
JR NZ,.L3 ;
POP DE ;ここから一致処理。スタックに退避していたTPを捨てる
PUSH HL ;現在のTPを退避
LD HL,JUMP_TABLE ;HL<-JUMP_TABLE+C*2=ジャンプ先
SLA C ;
LD B,0 ;
ADD HL,BC ;
LD A,(HL) ;HL<-(HL)=ジャンプ先
INC HL ;
LD H,(HL) ;
LD L,A ;
EX (SP),HL ;(SP)<-ジャンプ先,HL<-現在のTP
RET ;ここでスタックからジャンプ先が取り出される
;=================================================
;[TP]TPを開二重引用符の次に進める。存在しなければエラーにする
;IN HL=TP
;OUT HL=TP
;=================================================
OPEN_DQUOTE:
CALL SKIP_SPC ;
LD A,(HL) ;
CP DQUOTE ;
LD E,MISSING_OPERAND ;
JP NZ,ERROR ;
INC HL ;
RET ;
;=================================================
;[TP]TPを閉二重引用符の次に進める
;IN HL=TP
;OUT HL=TP
;=================================================
CLOSE_DQUOTE:
LD C,DQUOTE ;
CALL SKIP_CHR ;
RET ;
;=================================================
;[TP]空白以外の文字が現れるまでTPを進める
;IN HL=TP
;OUT HL=TP,Z<-1
;=================================================
SKIP_SPC:
.L1: LD A,(HL) ;
CP SPC ;
RET NZ ;
INC HL ;
JR .L1 ;
;=================================================
;[TP]指定された文字の次、または00HまでTPを進める
;IN HL=TP,C=スキップする文字
;OUT HL=新しいTP,CY=1:目的の文字が見つかった 0:EOLが見つかった
;=================================================
SKIP_CHR:
.L1: LD A,(HL) ;EOLならCY<-0で終了
OR A ;
RET Z ;
INC HL ;TPを進める
CP C ;目的の文字ならCY<-1で終了
JR NZ,.L1 ;
SCF ;
RET ;