-
Notifications
You must be signed in to change notification settings - Fork 0
/
KEYIN.s
310 lines (240 loc) · 8.25 KB
/
KEYIN.s
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
RAM EQU 8000H
ROM EQU 0000H
PIO_AD EQU 01CH
PIO_AC EQU 01DH
PIO_BD EQU 01EH
PIO_BC EQU 01FH
ORG RAM
LED_1: DS 1
LED_2: DS 1
LED_3: DS 1
LED_4: DS 1
MODE: DS 1
; MODE0 入力なし MODE1 入力1 演算子入力完了
; MODE1 足し算, MODE2 引き算
; MODE3 かけ算, MODE4 割り算
ORG ROM
LD SP, RAM+0FFFH
CALL PIO_INIT
CALL LED_CLEAR
JP NUM_IN
; PIO_INIT
PIO_INIT:
LD A,0CFH
OUT (PIO_AC),A
LD A,000H
OUT (PIO_AC),A
LD A,007H
OUT (PIO_AC),A
LD A,0CFH
OUT (PIO_BC),A
LD A,00FH
OUT (PIO_BC),A
LD A,007H
OUT (PIO_BC),A
RET
LED_CLEAR:
LD A,000H
LD (LED_1), A
LD (LED_2), A
LD (LED_3), A
LD (LED_4), A
OUT (PIO_AD),A
RET
NUM_IN:
; 一つ目の数字と演算子が入力されるまでループ
JP INPUT_FIRST_NUMBER_OPE
INPUT_NUM2:
JP INPUT_SEDOND_NUMBER_CALC
JP NUM_IN
INPUT_FIRST_NUMBER_OPE:
CALL KEY_IN
; ここで入力されたキーによって処理を変えるようにすればよい
CP 00AH
JP Z, INPUT_C_BUTTON
; オペランドの入力確認を行う
; = のとき無視
CP 00BH
JP Z, INPUT_FIRST_NUMBER_OPE
; + のとき
CP 00CH
JP Z, INPUT_ADD_OPE:
; - のとき
CP 00DH
JP Z, INPUT_SUB_OPE:
; * のとき
CP 00EH
JP Z, INPUT_MUL_OPE:
; / のとき
CP 00FH
JP Z, INPUT_DIV_OPE:
; 数字だったときの処理
LD B, A
LD A, (LED_4)
CP 000H
LD A, B
JP Z, OVERWRITE_FIRST_PLACE_NUM1
CALL NZ, L_SHIFT
JP INPUT_FIRST_NUMBER_OPE
INPUT_SEDOND_NUMBER_CALC:
CALL KEY_IN
; ここで入力されたキーによって処理を変えるようにすればよい
CP 00AH
JP Z, INPUT_C_BUTTON
; オペランドの入力確認を行う
; = のとき
CP 00BH
JP Z, ENDP
; + , -, * , /のとき無視
CP 00CH
JP P, INPUT_SEDOND_NUMBER_CALC
; 数字だったときの処理
LD B, A
LD A, (LED_4)
CP 000H
LD A, B
JP Z, OVERWRITE_FIRST_PLACE_NUM2
CALL NZ, L_SHIFT
JP INPUT_SEDOND_NUMBER_CALC
; HALTして確認する用途で作成
ENDP:
;+以上のとき
;CP 00CH
;JP P, ENDP
HALT
INPUT_C_BUTTON:
LD A, 000H
LD (MODE), A
CALL LED_CLEAR
JP NUM_IN
INPUT_ADD_OPE:
LD A, 002H
LD (MODE),A
; 数値の保存をする必要あり
CALL LED_CLEAR
JP INPUT_NUM2
INPUT_SUB_OPE:
LD A, 003H
LD (MODE),A
; 数値の保存をする必要あり
CALL LED_CLEAR
JP INPUT_NUM2
INPUT_MUL_OPE:
LD A, 004H
LD (MODE),A
; 数値の保存をする必要あり
CALL LED_CLEAR
JP INPUT_NUM2
INPUT_DIV_OPE:
LD A, 005H
LD (MODE),A
; 数値の保存をする必要あり
CALL LED_CLEAR
JP INPUT_NUM2
OVERWRITE_FIRST_PLACE_NUM1:
LD (LED_4), A
JP INPUT_FIRST_NUMBER_OPE
OVERWRITE_FIRST_PLACE_NUM2:
LD (LED_4), A
JP INPUT_SEDOND_NUMBER_CALC
L_SHIFT:
LD B,A
LD A, (LED_2)
LD (LED_1), A
LD A, (LED_3)
LD (LED_2), A
LD A, (LED_4)
LD (LED_3), A
LD A,B
LD (LED_4),A
RET
LED_OUT:
PUSH AF
PUSH HL
PUSH BC
IN A,(PIO_AD)
ADD A,010H
AND 030H
LD B,A
RRCA
RRCA
RRCA
RRCA
LD HL,LED_1
ADD A,L
LD L,A
LD A,(HL)
OR B
OUT (PIO_AD),A
POP BC
POP HL
POP AF
RET
KEY_IN:
PUSH HL
PUSH BC
CALL KEY_LP
POP BC
POP HL
RET
KEY_LP:
CALL KEY_GET
LD C,A
CALL KEY_GET
CP C
JP NZ,KEY_LP
LD B,A
CALL WAIT
LD A,B
RET
KEY_GET:
LOOP:
CALL LED_OUT
ADD A,010H
AND 030H
OUT (PIO_BD),A
SRL A
SRL A
SRL A
SRL A
AND 003H
LD B,A
IN A,(PIO_BD)
BIT 0,A
JP Z,ROW4
BIT 1,A
JP Z,ROW3
BIT 2,A
JP Z,ROW2
BIT 3,A
JP Z,ROW1
JP LOOP
WAIT:
CALL LED_OUT
IN A,(PIO_BD)
AND 00FH
CP 00FH
JP NZ, WAIT
RET
ROW4:
LD A,B
ADD A,00CH
LD B,A
RET
ROW3:
LD A,B
ADD A,008H
LD B,A
RET
ROW2:
LD A,B
ADD A,004H
LD B,A
RET
ROW1:
LD A,B
ADD A,000H
LD B,A
RET
HALT
END