-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathPSET.asm
434 lines (405 loc) · 6.46 KB
/
PSET.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
10 ORG 100H
20 JP MAIN
30RPTCHR EQU 0BFEEH
40GPF EQU 0BFD0H
50AOUT EQU 0BD09H
60PUTSTR EQU 0BFF1H
70WAITK EQU 0BFCDH
80LDPSTR EQU 0BD00H
100MAIN: CALL CLS
110 LD A,12
120 LD (POSY),A
130 LD A,133
140 LD (POSX),A
150 CALL PSET
160 LD HL,DPNT0
170 LD A,133
180 CALL HX2DEC
190 LD HL,DPNT1
200 LD A,12
210 CALL HX2DEC
220 LD HL,DPNT
230 CALL STRLN
240 LD DE,0000H
250 CALL PUTSTR
260 CALL WAIT
270 LD A,120
280 LD (POSX),A
290 LD A,22
300 LD (POSY),A
310 CALL PSET
320 LD HL,DPNT0
330 LD A,120
340 CALL HX2DEC
350 LD HL,DPNT1
360 LD A,(POSY)
370 CALL HX2DEC
380 LD HL,DPNT
390 CALL STRLN
400 LD DE,0000H
410 CALL PUTSTR
420 CALL WAIT
430 LD A,32
440 LD (POSY),A
450MAIN00: LD A,100
460 LD (POSX),A
470 LD A,133
480 LD (ENDX),A
490 CALL HLINE
500 LD HL,DLINE0
510 LD A,100
520 CALL HX2DEC
530 LD HL,DLINE1
540 LD A,(POSY)
550 CALL HX2DEC
560 LD HL,DLINE2
570 LD A,133
580 CALL HX2DEC
590 LD HL,DLINE
600 CALL STRLN
610 LD DE,0000H
620 CALL PUTSTR
630 CALL WAIT
640 LD A,(POSY)
650 INC A
660 INC A
670 LD (POSY),A
680 CP 42
690 JP NZ,MAIN00
700 LD A,80
710 LD (POSX),A
740 LD A,28
750 LD (ENDY),A
720MAIN01: LD A,10
730 LD (POSY),A
760 LD HL,DLINE0
770 LD A,(POSX)
780 CALL HX2DEC
790 LD HL,DLINE1
800 LD A,(POSY)
810 CALL HX2DEC
820 LD HL,DLINE2
830 LD A,(ENDY)
840 CALL HX2DEC
850 LD HL,DLINE
860 CALL STRLN
870 LD DE,0000H
880 CALL PUTSTR
890 CALL VLINE
900 CALL WAIT
910 LD A,(POSX)
920 INC A
925 INC A
930 LD (POSX),A
940 CP 90
950 JP NZ,MAIN01
960 LD HL,RNDPNT
970 LD B, 24
980 LD DE,0
990 CALL PUTSTR
1000 LD B,3 ; 3 TIMES
1010FILL01: PUSH BC
1020 LD B,0 ; 256 TIMES
1030FILL00: PUSH BC
1040 CALL PRNG
1050 LD D,143
1060 CALL DVDX ; A = A % 143
1070 LD (POSX),A
1080 CALL PRNG
1090 LD D,45
1100 CALL DVDX ; A = A % 45
1110 LD (POSY),A
1120 CALL PSET
1130 POP BC
1140 DJNZ FILL00
1150 POP BC
1160 DJNZ FILL01
1170 CALL WAIT
1180 XOR A
1190 LD (POSX),A
1200 LD A,15
1210 LD (POSY),A
1220 LD A,120
1230 LD (ENDX),A
1240 LD A,32
1250 LD (ENDY),A
1260 CALL PLINE
1270 CALL WAIT
1900 RET
1950WAIT: CALL WAITK
1960 OR A
1970 JP Z,WAIT
1980 RET
2000CLS: LD B, 144
2010 LD DE, 0
2020CLS0: LD A, 32
2030 CALL RPTCHR
2040 RET
2050CLLN: LD B,24
2060 LD E,0
2070 JP CLS0
3000BYTE: PUSH AF
3010 AND 0F0H
3020 RRCA
3030 RRCA
3040 RRCA
3050 RRCA
3060 CALL NIBBLE
3070 INC HL
3080 POP AF
3090 AND 15
3100 CALL NIBBLE
3110 INC HL
3120 RET
3130NIBBLE: SUB 10
3140 JP M,ZERO9
3150 ADD A,7
3160ZERO9: ADD A,58
3170 LD (HL),A
3180 RET
4000CALCXY: LD A,(POSX) ; x
4010 CALL DVD6
4020 LD (REMNX),A
4030 LD A,B
4040 LD (CHARX),A
4050 LD A,(POSY) ; y
4060 CALL DVD8
4070 LD (REMNY),A
4080 LD A,B
4090 LD (CHARY),A
4100 LD D,A ; Y-pos as a line num
4110 LD A,(CHARX)
4120 LD E,A ; X-pos as a column num
4130 PUSH DE ; POSY/POSX
4140 LD HL,BUFFER
4150 LD B,6
4160 CALL LDPSTR ; read 6 bytes: one char
4170 LD HL,BUFFER
4180 LD A,(REMNX)
4190 OR A
4200 JP Z, PSET01
4210 LD B,A
4220PSET00: INC HL ; ADD REMNX TO HL
4230 DJNZ PSET00
4240PSET01: LD A,(REMNY)
4250 OR A
4260 JP NZ, PSET02
4270 LD A,1
4280 JP PSET03
4290PSET02: LD B,A
4300 LD A,1
4310PSET04: SLA A; A = A * 2
4320 DJNZ PSET04
4330PSET03: LD B,A ; bit offset in B
4340 LD A,(HL) ; 8 bits in A
4350 POP DE
4360 ;CALL WAIT
4370 RET
4380PSET: CALL CALCXY
4390 OR B ; set to black
4400 LD (HL),A
4410 LD HL,BUFFER
4420 LD B,6
4430 CALL GPF ; draw
4440 RET
4450PUNSET: CALL CALCXY
4460 XOR B ; set to white
4470 LD (HL),A
4480 LD HL,BUFFER
4490 LD B,6
4500 CALL GPF ; draw
4510 RET
4520PGET: CALL CALCXY
4530 AND B ; is it black?
4540 RET
4550HLINE: CALL PSET
4560 LD A,(ENDX)
4570 LD D,A
4580 LD A,(POSX)
4590 INC A
4600 LD (POSX),A
4610 CP D
4620 JP NZ,HLINE
4630 RET
4640VLINE: CALL PSET
4650 LD A,(ENDY)
4660 LD D,A
4670 LD A,(POSY)
4680 INC A
4690 LD (POSY),A
4700 CP D
4710 JP NZ,VLINE
4720 RET
4730POSX: DB 0
4740POSY: DB 0
4750ENDX: DB 0
4760ENDY: DB 0
4770REMNX: DB 0
4780CHARX: DB 0
4790REMNY: DB 0
4800CHARY: DB 0
4810BUFFER: DB 0,0,0,0,0,0
4820HX2DEC: PUSH HL
4830 LD B,'0'
4840 LD (HL),B
4850HDEC00: LD (TMP),A
4860 CP 100
4870 JP M,HDEC01
4880 INC (HL)
4890 SUB 100
4900 JP HDEC00
4910HDEC01: INC HL
4920 LD B,'0'
4930 LD (HL),B
4940 LD A,(TMP)
4950HDEC02: LD (TMP),A
4960 CP 10
4970 JP M,HDEC03
4980 INC (HL)
4990 SUB 10
5000 JP HDEC02
5010HDEC03: INC HL
5020 LD A,(TMP)
5030 ADD A,48
5040 LD (HL),A
5050 POP HL ; remove heading 0s
5060 LD A,(HL)
5070 CP '0'
5080 JP NZ,HDEC05
5090 LD A,' '
5100 LD (HL),A
5110HDEC04: INC HL
5120 LD A,(HL)
5130 CP '0'
5140 JP NZ,HDEC05
5150 LD A,' '
5160 LD (HL),A
5170HDEC05: RET
6000 ; A <-- INPUT
6010 ; A --> REMAINDER. B --> QUOTIENT
6020DVD6: LD B,0
6030DVD6A: CP 6
6040 RET M
6050 SUB 6
6060 INC B
6070 JP DVD6A
6080DVD8: LD B,0
6090DVD8A: CP 8
6100 RET M
6110 SUB 8
6120 INC B
6130 JP DVD8A
6140DVDX: LD B,0
6150DVDXA: CP D
6160 RET M
6170 SUB D
6180 INC B
6190 JP DVDXA
6200STRLN: LD B,0
6210 PUSH HL ;preserve HL
6220STRLN0: LD A,(HL)
6230 OR A
6240 JP Z,STRLN1
6250 INC HL
6260 INC B
6270 JP STRLN0
6280STRLN1: POP HL ;restore HL
6290 RET
6300DPNT: DB 'PSET: '
6310DPNT0: DB 0, 0, 0, ','
6320DPNT1: DB 0, 0, 0, 0
6330DLINE: DB 'HLINE '
6340DLINE0: DB 0,0,0
6350 DB ','
6360DLINE1: DB 0,0,0
6370 DB ' TO '
6380DLINE2: DB 0,0,0,0
6390TMP: DB 0
6400RNDPNT: DB 'Drawing random points '
7000 ; change Seed value for LCM PRNG
7010PRNG: PUSH DE
7020 PUSH HL
7030 LD DE,(RVAL16)
7040 LD H,E
7050 LD L,1
7060 ADD HL,DE
7070 ADD HL,DE
7080 ADD HL,DE
7090 ADD HL,DE
7100 ADD HL,DE
7110 LD A,H
7120 LD (RVAL16),HL
7130 POP HL
7140 POP DE
7150 LD A,(RVAL88)
7170 RET ; 0-255
7200RVAL16: DB 30H
7210RVAL88: DB 81H
7300DX: DB 0
7310DY: DB 0
7320MYD: DB 0
7330PLINE: ; POSX,POSY,ENDX,ENDY
7340 LD A,(POSX)
7350 LD B,A
7360 LD A,(ENDX)
7370 SUB B
7380 LD (DX),A ;dx = x1 - x0
7390 LD A,(POSY)
7400 LD B,A
7410 LD A,(ENDY)
7420 SUB B
7430 LD (DY),A ;dy = y1 - y0
7440 LD H,0
7450 LD L,A
7460 LD D,0
7470 LD E,A
7480 ADD HL,DE
7490 LD D,0
7500 LD A,(DX)
7510 LD E,A
7520 OR A
7530 SBC HL,DE ; D = 2*dy - dx
7540 LD A,L
7550 LD (MYD),A
7560PLINE1: CALL PSET ; plot(x,y)
7570 LD A,(MYD)
7580 CP 144 ; if D >143 it's negative
7590 JP M,PLINE0
7600 LD A,(POSY)
7610 INC A
7620 LD (POSY),A ;y = y + 1
7630 LD D,0
7640 LD A,(DX)
7650 LD E,A
7660 LD L,A
7670 LD H,0
7680 ADD HL,DE
7685 PUSH HL
7690 POP DE
7700 LD A,(MYD)
7710 LD L,A
7720 LD H,0
7730 OR A
7740 SBC HL,DE
7750 LD A,L
7760 LD (MYD),A ;D = D - 2*dx
7770PLINE0: LD D,0
7780 LD A,(DY)
7790 LD E,A
7800 LD L,A
7810 LD H,0
7820 ADD HL,DE
7830 LD A,(MYD)
7840 LD L,A
7850 LD H,0
7860 ADD HL,DE
7870 LD A,L
7880 LD (MYD),A ;D = D + 2*dy
7890 LD A,(POSX)
7900 INC A
7910 LD (POSX),A
7920 LD HL,ENDX
7930 CP (HL) ;for x from x0 to x1
7940 JP NZ,PLINE1
7950 RET