Subversion Repositories pentevo

Rev

Rev 792 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
792 savelij 1
 
952 savelij 2
;LAST UPDATE: 27.02.2021 savelij
792 savelij 3
 
4
MATH            CALL P5_READ_BYTE
5
                LD A,(NEXTBYTERST8)
6
                ADD A,A
7
                ADD A,LOW (.MATH_FUNC)
8
                LD L,A
9
                ADC A,HIGH (.MATH_FUNC)
10
                SUB L
11
                LD H,A
12
                LD A,(HL)
13
                INC HL
14
                LD H,(HL)
15
                LD L,A
16
                JP (HL)
17
 
18
.MATH_FUNC      DW .XDIVIDE16           ;DE = HL/DE                                     ;BC = BC / DE
19
                DW .XMULTIPLY16         ;BCDE = HL * DE                                 ;HLDE = BC * DE
20
                DW .XDIVIDE32           ;BCDE = HLDE / HL'DE', BC'DE' = HLDE % HL'DE'   ;HL'HL = HL'HL / DE'DE, DE'DE = HL'HL % DE'DE
21
                DW .XMULTIPLY32         ;BC'DE'BCDE = BCDE * HL                         ;DE'HL'DEHL = DEHL * BC
22
                DW .XHEX4DEC
23
                DW .XHEX2DEC
24
                DW .XHEX1DEC
25
 
26
.XHEX4DEC       LD BC,(RREG_C)
27
                LD DE,(RREG_E)
28
                CALL .HEX4DEC
29
.LDIRSTRTEXT    LD BC,CPU6
30
                AND A
31
                SBC HL,BC
32
                LD DE,(RREG_L)
33
                LD BC,STRLEN("4294967295\0")
34
                JP LDIR_BYTES
35
 
36
.XHEX2DEC       LD DE,(RREG_E)
37
                CALL .HEX2DEC
38
                JR .LDIRSTRTEXT
39
 
40
.XHEX1DEC       LD DE,(RREG_E)
41
                CALL .HEX1DEC
42
                JR .LDIRSTRTEXT
43
 
44
;BCDE = HLDE / HL'DE', BC'DE' = HLDE % HL'DE'   ;HL'HL = HL'HL / DE'DE, DE'DE = HL'HL % DE'DE
45
;BCDE = BCDE / BC'DE', BC'DE' = BCDE % BC'DE'
46
.XDIVIDE32      LD HL,(RREG_C)          ;HL'
47
                LD DE,(RREG_CC)         ;DE'
48
                EXX
49
                LD HL,(RREG_E)          ;HL
50
                LD DE,(RREG_EE)         ;DE
51
                CALL .ldiv
52
                LD (RREG_EE),DE         ;DE'
53
                LD (RREG_E),HL          ;DE
54
                EXX
55
                LD (RREG_CC),DE         ;BC'
56
                LD (RREG_C),HL          ;BC
57
                RET
58
 
59
;BC'DE'BCDE = BCDE * HL                 ;DE'HL'DEHL = DEHL * BC
60
.XMULTIPLY32    LD DE,(RREG_C)          ;BC
61
                LD HL,(RREG_E)          ;DE *
62
                EXX
63
                LD BC,(RREG_L)          ;   * HL
64
                CALL .MUL_BC_DEHL
65
                LD (RREG_C),DE          ;   = BC
66
                LD (RREG_E),HL          ;     DE
67
                EXX
68
                LD (RREG_CC),DE         ;     BC'
69
                LD (RREG_EE),HL         ;     DE'
70
                EXX
71
                RET
72
 
73
;DE = HL/DE                             ;BC = BC / DE
74
.XDIVIDE16      LD BC,(RREG_L)          ;HL /
75
                LD DE,(RREG_E)          ;   / DE
76
                CALL .DIVIDE
77
                LD (RREG_E),BC          ;   = DE
78
                RET
79
 
80
;BCDE = HL * DE                                 ;HLDE = BC * DE
81
.XMULTIPLY16    LD BC,(RREG_C)          ;HL *
82
                LD DE,(RREG_E)          ;   * DE
83
                CALL .MULTIPLY
84
                LD (RREG_C),HL          ;   = BC
85
                LD (RREG_E),DE          ;     DE
86
                RET
87
 
88
;[������� bc=bc/de]
89
.DIVIDE         xor     a
90
                ld      h,a
91
                ld      l,a
92
                ld      a,10h
93
.loc_3E29       ccf
94
.loc_3E2A       rl      c
95
                rl      b
96
                dec     a
97
                ret     m
98
                adc     hl,hl
99
                sbc     hl,de
100
                jr      nc,.loc_3E29
101
                add     hl,de
102
                or      a
103
                jr      .loc_3E2A
104
 
105
;[㬭������ hlde=bc*de]
106
.MULTIPLY       push    bc
107
                ld      a,b
108
                ld      hl,0
109
                ld      b,10h
110
.MULTIPLY2      add     hl,hl
111
                rl      c
112
                rla
113
                jr      nc,.MULTIPLY1
114
                add     hl,de
115
                jr      nc,.MULTIPLY1
116
                inc     c
117
                jr      nz,.MULTIPLY1
118
                inc     a
119
.MULTIPLY1      djnz    .MULTIPLY2
120
                ex      de,hl
121
                ld      l,c
122
                ld      h,a
123
                pop     bc
124
                ret
125
 
126
;[㬭������ DE'HL'DEHL=DEHL*BC]
127
.MUL_BC_DEHL    XOR A
128
                LD H,A
129
                LD L,A
130
                LD D,A
131
                LD E,A
132
                EXX
133
                LD B,A
134
                LD C,A
135
                LD A,0X20
136
.MUL1           EX AF,AF'
137
                EXX
138
                ADD HL,HL
139
                EX DE,HL
140
                ADC HL,HL
141
                EX DE,HL
142
                EXX
143
                ADC HL,HL
144
                EX DE,HL
145
                ADC HL,HL
146
                EX DE,HL
147
                JR NC,.MUL2
148
                EXX
149
                ADD HL,BC
150
                JR NC,.MUL3
151
                INC DE
152
.MUL3           EXX
153
.MUL2           EX AF,AF'
154
                DEC A
155
                JR NZ,.MUL1
156
                EXX
157
                RET
158
 
159
;[BCDE=BCDE/HL]
160
.LDIV_HL        EX DE,HL
161
                PUSH BC
162
                EXX
163
                POP HL
164
                LD DE,0
165
                JR .LDIV1
166
 
167
;[BCDE=(HL)/BCDE]
168
.LDIV__HL_      PUSH BC         ;DE'
169
                LD C,(HL)
170
                INC HL
171
                LD B,(HL)       ;HL
172
                INC HL
173
                LD A,(HL)
174
                INC HL
175
                LD H,(HL)
176
                LD L,A          ;HL'
177
                PUSH HL
178
                LD H,B
179
                LD L,C          ;HL
180
                EXX
181
                POP HL          ;HL'
182
                POP DE          ;DE'
183
.LDIV1          EXX
184
                CALL .ldiv
185
                EXX
186
                PUSH HL
187
                EXX
188
                POP BC
189
                EX DE,HL
190
                RET
191
 
192
; http://zx-pk.ru/archive/index.php/t-4497.html
193
; ����� �� 2006-12-18 T 15:11:28+0300
194
; ����������� 32-ࠧ�來�� �������
195
; �㭪�� ��⮨� �� ���� ��⥩:
196
; 1. 32-ࠧ�來�� ������� � 16-ࠧ�來�
197
; ����⥫�.
198
; 2. 32-ࠧ�來�� ������� � 32-ࠧ�來�
199
; ����⥫�.
200
; hl'hl = hl'hl / de'de
201
; de'de = hl'hl % de'de
202
.ldiv           push hl
203
                xor a
204
                ld l,a
205
                ld h,a
206
                sub e
207
                ld e,a
208
                ld a,h
209
                sbc a,d
210
                ld d,a
211
                exx
212
                pop bc
213
                ld a,0
214
                sbc a,e
215
                ld e,a
216
                sbc a,d         ; de'de=0-divisor
217
                sub e
218
                ld d,a
219
                and e
220
                inc a           ; Z=short divisor
221
                push hl
222
                ld hl,0         ; hl'hl=reminder
223
                exx
224
                pop bc
225
                ld a,b          ; a,c,bc'=divident
226
                jr nz,.ldiv_long
227
 
228
; divisor = -00de
229
                ld b,8
230
                rla
231
.ldivs0         rl l
232
                add hl,de
233
                jr c,.ldivs1
234
                sbc hl,de
235
.ldivs1         rla
236
                djnz .ldivs0
237
                ld b,c
238
                ld c,a
239
                ld a,b
240
                ld b,8
241
                rla
242
.ldivs2         adc hl,hl
243
                add hl,de
244
                jr c,.ldivs3
245
                sbc hl,de
246
.ldivs3         rla
247
                djnz .ldivs2
248
                jr .ldiv_long1
249
 
250
; divisor=-de'de
251
.ldiv_long      call .ldiv_8
252
                ld b,c
253
                ld c,a
254
                ld a,b
255
                call .ldiv_8
256
.ldiv_long1     exx
257
                ex af,af'
258
                ld a,b
259
                ex af,af'
260
                ld b,a
261
                ex af,af'
262
                exx
263
                call .ldiv_8
264
                exx
265
                ex af,af'
266
                ld a,c
267
                ex af,af'
268
                ld c,a
269
                ex af,af'
270
                exx
271
                call .ldiv_8
272
; result=c,bc',a -> hl'hl
273
; reminder=hl'hl -> de'de
274
                ex de,hl
275
                ld l,a
276
                ld a,c
277
                exx
278
                ex de,hl
279
                ld h,a
280
                ld l,b
281
                ld a,c
282
                exx
283
                ld h,a
284
                ret
285
 
286
; hl'hl=reminder
287
; de'de=divisor
288
; a=divident
289
.ldiv_8         ld b, 8
290
                rla
291
.ldiv_8_0       adc hl,hl
292
                exx
293
                adc hl,hl
294
                exx
295
                add hl,de
296
                exx
297
                adc hl,de
298
                exx
299
                jr c, .ldiv_8_1
300
                sbc hl,de
301
                exx
302
                sbc hl,de
303
                exx
304
.ldiv_8_1       rla
305
                djnz .ldiv_8_0
306
                ret
307
 
952 savelij 308
;[HEX6DEC]
309
;HLBCDE->⥪��
310
 
311
.HEX6DEC       
312
 
313
 
792 savelij 314
;[HEX4DEC]
315
;BCDE->⥪��
316
.HEX4DEC        EXX
317
                LD HL,VARS_TXT_DEC
318
                PUSH HL
319
                PUSH HL
320
                LD B,9
321
                EXX
322
                LD HL,.CHISLA4
323
                REPT 9
324
                CALL .BCDEMHL
325
                ENDM
326
.H2D1           LD A,"0"
327
                ADD A,E
328
                EXX
329
                LD (HL),A
330
                INC HL
331
                LD (HL),0
332
                LD A,B
333
                EXX
334
                POP HL
335
                LD B,A
336
.H2D2           LD A,(HL)
337
                CP "0"
338
                JR NZ,.H2D3
339
                LD (HL)," "
340
                INC HL
341
                DJNZ .H2D2
342
.H2D3           POP HL
343
                RET
344
 
345
;[HEX2DEC]
346
;DE->⥪��
347
.HEX2DEC        EXX
348
                LD HL,VARS_TXT_DEC
349
                PUSH HL
350
                PUSH HL
351
                LD B,4
352
                EXX
353
                LD HL,.CHISLA2
354
                LD BC,0
355
                JR .H2D1-(4*3)
356
 
357
;[HEX1DEC]
358
;E->⥪��
359
.HEX1DEC        EXX
360
                LD HL,VARS_TXT_DEC
361
                PUSH HL
362
                PUSH HL
363
                LD B,2
364
                EXX
365
                LD HL,.CHISLA1
366
                LD BC,0
367
                LD D,0
368
                JR .H2D1-(2*3)
369
 
952 savelij 370
; 48 ���        FFFF FFFF FFFF
371
;                  281474976710655
372
.CHISLA6        DQ 100000000000000
373
                DQ 10000000000000
374
                DQ 1000000000000
375
                DQ 100000000000
376
                DQ 10000000000
792 savelij 377
.CHISLA4        DD 1000000000
378
                DD 100000000
379
                DD 10000000
380
                DD 1000000
381
                DD 100000
382
.CHISLA2        DD 10000
383
                DD 1000
384
.CHISLA1        DD 100
385
                DD 10
386
 
387
;[BCDE-(ADR)=BCDE]
388
.BCDEMHL        XOR A
389
                EX AF,AF'
390
.BCDEMHL1       LD A,E
391
                SUB (HL)
392
                INC HL
393
                LD E,A
394
                LD A,D
395
                SBC A,(HL)
396
                INC HL
397
                LD D,A
398
                LD A,C
399
                SBC A,(HL)
400
                INC HL
401
                LD C,A
402
                LD A,B
403
                SBC A,(HL)
404
                LD B,A
405
                DEC HL
406
                DEC HL
407
                DEC HL
408
                EX AF,AF'
409
                INC A
410
                EX AF,AF'
411
                LD A,B
412
                CP 0XC4
413
                JR C,.BCDEMHL1
414
                LD A,(HL)
415
                ADD A,E
416
                LD E,A
417
                INC HL
418
                LD A,(HL)
419
                ADC A,D
420
                LD D,A
421
                INC HL
422
                LD A,(HL)
423
                ADC A,C
424
                LD C,A
425
                INC HL
426
                LD A,(HL)
427
                ADC A,B
428
                LD B,A
429
                DEC HL
430
                DEC HL
431
                DEC HL
432
                EX AF,AF'
433
                DEC A
434
                ADD A,'0'
435
                INC HL
436
                INC HL
437
                INC HL
438
                INC HL
439
                EXX
440
                LD (HL),A
441
                INC HL
442
                EXX
443
                RET
444
 
445
;[BCDE=BCDE+HL]
446
.BCDE_BCDE_HL   ADD HL,DE
447
                EX DE,HL
448
                LD HL,0
449
                ADC HL,BC
450
                LD B,H
451
                LD C,L
452
                RET