-
Notifications
You must be signed in to change notification settings - Fork 1
/
IN_OUT64.asm
517 lines (482 loc) · 5.96 KB
/
IN_OUT64.asm
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
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
;A - Length of input line
;D - YCOOR
;E - XCOOR
;HL - Address of bufer input
INPUT64
LD (LENGTH_LINE),A
LD (AT_X),DE
LD (BEGIN_AT),DE
LD (BUFER_INPUT),HL
LD (BEGIN_BUF_INP),HL
PUSH DE
LD DE,BUF_COPY_NAME
PUSH HL
LD C,A
XOR A
LD (CURRENT_LENGTH),A
LD B,A
LDIR
LD A,0
LD (DE),A
POP HL
CALL PRINT64
POP DE
LD (AT_X),DE
CALL CURSOR_ON_OFF
SCAN_KEYBOARD
EI
XOR A
LD (23560),A
SCAN_KEYBOARD2
LD A,(23560)
OR A
JR Z,SCAN_KEYBOARD2
CALL BEEP
CP #20
JR NC,CHAR?
CP 7
JR NZ,NO_RET_NAME
CALL RETURN_NAME
CALL CURSOR_ON_OFF
JR SCAN_KEYBOARD
NO_RET_NAME
CP 8
JR Z,CTRL_LEFT
CP 9
JP Z,CTRL_RIGHT
CP 10
JP Z,CTRL_BEGIN
CP 11
JP Z,CTRL_END
CP 12
JP Z,CTRL_DELETE
CP 13
JR NZ,NO_ENTER
CALL CURSOR_ON_OFF
RET
NO_ENTER
CP 14
JR NZ,NO_RUS_LAT
LD HL,RUS_LAT
BIT 7,(HL)
JR NZ,RUS
LAT
SET 7,(HL)
JR SCAN_KEYBOARD
RUS
RES 7,(HL)
JR SCAN_KEYBOARD
NO_RUS_LAT
CP 15
JP Z,CTRL_INSERT
JR_SCAN_KEYB
JR SCAN_KEYBOARD
CHAR?
CP #80
JR NC,SCAN_KEYBOARD
SKIP_VERIFI
LD B,A
LD A,(RUS_LAT)
ADD A,B
LD B,A
CALL END_LINE?
JR NC,SCAN_KEYBOARD
INC A
LD (CURRENT_LENGTH),A
LD A,B
LD HL,(BUFER_INPUT)
LD (HL),A
INC HL
LD (BUFER_INPUT),HL
CALL CURSOR_ON_OFF
CALL PRINT_CHAR64
CALL CURSOR_ON_OFF
JR JR_SCAN_KEYB
;
CTRL_LEFT
LD A,(CURRENT_LENGTH)
OR A
JR Z,JR_SCAN_KEYB
CALL CURSOR_ON_OFF
CALL PREC_POSITION
DEC_PARAMETRS
LD HL,CURRENT_LENGTH
DEC (HL)
LD HL,(BUFER_INPUT)
DEC HL
END_LEFT_RIGHT
LD (BUFER_INPUT),HL
CALL CURSOR_ON_OFF
JR_SCAN_KEYB1
JR JR_SCAN_KEYB
;
CTRL_RIGHT
CALL END_LINE?
JR Z,JR_SCAN_KEYB
CALL CURSOR_ON_OFF
LD DE,(AT_X)
INC E
LD (AT_X),DE
LD HL,CURRENT_LENGTH
INC (HL)
LD HL,(BUFER_INPUT)
INC HL
JR END_LEFT_RIGHT
;
CTRL_BEGIN
CALL CURSOR_ON_OFF
XOR A
LD (CURRENT_LENGTH),A
CALL INIT_AT
LD HL,(BEGIN_BUF_INP)
JR END_LEFT_RIGHT
;
CTRL_END
CALL CURSOR_ON_OFF
LD A,(LENGTH_LINE)
LD (CURRENT_LENGTH),A
LD C,A
LD B,0
LD HL,(BEGIN_AT)
ADD HL,BC
LD (AT_X),HL
LD HL,(BEGIN_BUF_INP)
ADD HL,BC
JR END_LEFT_RIGHT
;
CTRL_DELETE
LD A,(CURRENT_LENGTH)
OR A
JR Z,JR_SCAN_KEYB1
CALL LEN_RIGHT_PART
LD HL,(BUFER_INPUT)
JR Z,SKIP_LDIR
LD C,A
LD B,0
PUSH HL
POP DE
DEC DE
LDIR
SKIP_LDIR
DEC HL
LD (HL),32
CALL CURSOR_ON_OFF
CALL PREC_POSITION
PUSH DE
CALL INIT_AT
LD HL,(BEGIN_BUF_INP)
CALL PRINT64
POP DE
LD (AT_X),DE
JP DEC_PARAMETRS
;
CTRL_INSERT
CALL END_LINE?
JR Z,JR_SCAN_KEYB1
CALL LEN_RIGHT_PART
DEC A
LD HL,(BUFER_INPUT)
JR Z,SKIP_LDDR
PUSH HL
LD C,A
LD B,0
ADD HL,BC
PUSH HL
POP DE
DEC HL
LDDR
POP HL
SKIP_LDDR
LD (HL),32
LD DE,(AT_X)
CALL PRINT64
LD (AT_X),DE
CALL CURSOR_ON_OFF
JP SCAN_KEYBOARD
;
RETURN_NAME
LD DE,(BEGIN_BUF_INP)
PUSH DE
LD HL,BUF_COPY_NAME
LD BC,(LENGTH_LINE)
LD B,0
LDIR
POP HL
LD DE,(AT_X)
PUSH DE
CALL INIT_AT
CALL PRINT64
POP DE
JR END_NEW_POS
;
INIT_AT
LD DE,(BEGIN_AT)
JR END_NEW_POS
;
LEN_RIGHT_PART
LD A,(LENGTH_LINE)
LD BC,(CURRENT_LENGTH-1)
SUB B
RET
;
PREC_POSITION
LD DE,(AT_X)
DEC E
END_NEW_POS
LD (AT_X),DE
RET
;
END_LINE?
LD A,(CURRENT_LENGTH)
LD HL,LENGTH_LINE
CP (HL)
RET
;
BEEP
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD HL,#000A
LD DE,#0032
CALL #03B5
POP IX
POP HL
POP DE
POP BC
POP AF
RET
;HL - address of text
;CTRL: #16 - AT
; #11 - PAPER
; #10 - INK
; 0 - end of text
PRINT64
LD A,(HL)
OR A
RET Z
INC HL
CP #16
JR Z,AT_CTRL
CP #11
JR Z,PAPER_CTRL
CP #10
JR Z,INK_CTRL
PUSH HL
PUSH AF
LD A,(AT_X)
RRA
LD B,0
LD C,A
LD H,B
LD A,(AT_Y)
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,BC
LD BC,#5800
ADD HL,BC
LD A,(ATTR)
LD (HL),A
POP AF
CALL PRINT_CHAR64
POP HL
JR PRINT64
;
AT_CTRL
LD D,(HL)
INC HL
LD E,(HL)
INC HL
LD (AT_X),DE
JR PRINT64
;
PAPER_CTRL
LD A,(ATTR)
AND 7
LD B,A
LD A,(HL)
RLCA
RLCA
RLCA
JR PAPER_PLUS_INK
;
INK_CTRL
LD A,(ATTR)
AND #38
LD B,A
LD A,(HL)
PAPER_PLUS_INK
OR B
LD (ATTR),A
INC HL
JR PRINT64
;A - code of char
PRINT_CHAR64
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL PRINT_CHAR
LD HL,AT_X
INC (HL)
BIT 6,(HL)
JR Z,NO_NEXT_AT_Y
LD (HL),0
INC HL
INC (HL)
NO_NEXT_AT_Y
POP HL
POP DE
POP BC
POP AF
RET
;
PRINT_CHAR
SRL A
PUSH AF
LD H,#00
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,FONT
ADD HL,DE
EX DE,HL
CALL ADDR_OF_OUT64
LD B,#08
JR C,PRINT_IN_RIGHT
POP AF
JR NC,WITH_RIGHT
PRINT_IN_LEFT
WITH_LEFT
LD A,(HL)
AND #0F
LD C,A
LD A,(DE)
AND #0F
RLC A
RLC A
RLC A
RLC A
OR C
LD (HL),A
INC DE
INC H
DJNZ WITH_LEFT
RET
WITH_RIGHT
LD A,(HL)
AND #0F
LD C,A
LD A,(DE)
AND #F0
OR C
LD (HL),A
INC DE
INC H
DJNZ WITH_RIGHT
RET
PRINT_IN_RIGHT
POP AF
JR NC,WITH_RIGHT2
WITH_LEFT2
LD A,(HL)
AND #F0
LD C,A
LD A,(DE)
AND #0F
OR C
LD (HL),A
INC DE
INC H
DJNZ WITH_LEFT2
RET
WITH_RIGHT2
LD A,(HL)
AND #F0
LD C,A
LD A,(DE)
AND #F0
RLC A
RLC A
RLC A
RLC A
OR C
LD (HL),A
INC DE
INC H
DJNZ WITH_RIGHT2
RET
;
CURSOR_ON_OFF
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL ADDR_OF_OUT64
LD A,#F0
JR NC,PRINT_IN_LEFT2
LD A,#0F
PRINT_IN_LEFT2
LD C,A
LD B,8
NEXT_BYTE
LD A,(HL)
XOR C
LD (HL),A
INC H
DJNZ NEXT_BYTE
POP HL
POP DE
POP BC
POP AF
RET
;
ADDR_OF_OUT64
LD A,(AT_Y)
LD H,#00
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,(AT_X)
RRA
PUSH AF
LD B,#00
LD C,A
ADD HL,BC
RL H
RL H
RL H
SET 6,H
POP AF
RET
;
LENGTH_LINE
DEFB 0
BEGIN_AT
DEFB 0,0
BUFER_INPUT
DEFW 0
BEGIN_BUF_INP
DEFW 0
CURRENT_LENGTH
DEFB 0
RUS_LAT
DEFB 0
BUF_COPY_NAME
DEFS 9
AT_X DEFB 0
AT_Y DEFB 0
ATTR DEFB 56
CURSOR_Y
DEFB 0
CURSOR_X
DEFB 1