Subversion Repositories pentevo

Rev

Rev 952 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
792 savelij 1
 
1186 savelij 2
; LAST UPDATE: 06.02.2025 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
 
1186 savelij 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
792 savelij 22
                DW .XHEX4DEC
23
                DW .XHEX2DEC
24
                DW .XHEX1DEC
25
 
26
.XHEX4DEC       LD BC,(RREG_C)
27
                LD DE,(RREG_E)
28
                CALL .HEX4DEC
1186 savelij 29
.LDIRSTRTEXT    LD BC,CPU2
792 savelij 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
 
1186 savelij 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'
792 savelij 48
                EXX
1186 savelij 49
                LD HL,(RREG_E)          ; HL
50
                LD DE,(RREG_EE)         ; DE
792 savelij 51
                CALL .ldiv
1186 savelij 52
                LD (RREG_EE),DE         ; DE'
53
                LD (RREG_E),HL          ; DE
792 savelij 54
                EXX
1186 savelij 55
                LD (RREG_CC),DE         ; BC'
56
                LD (RREG_C),HL          ; BC
792 savelij 57
                RET
58
 
1186 savelij 59
; BC'DE'BCDE = BCDE * HL                ; DE'HL'DEHL = DEHL * BC
60
.XMULTIPLY32    LD DE,(RREG_C)          ; BC
61
                LD HL,(RREG_E)          ; DE *
792 savelij 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
 
1186 savelij 73
; DE = HL/DE                            ; BC = BC / DE
74
.XDIVIDE16      LD BC,(RREG_L)          ; HL /
792 savelij 75
                LD DE,(RREG_E)          ;   / DE
76
                CALL .DIVIDE
77
                LD (RREG_E),BC          ;   = DE
78
                RET
79
 
1186 savelij 80
; BCDE = HL * DE                        ; HLDE = BC * DE
81
.XMULTIPLY16    LD BC,(RREG_C)          ; HL *
792 savelij 82
                LD DE,(RREG_E)          ;   * DE
83
                CALL .MULTIPLY
84
                LD (RREG_C),HL          ;   = BC
85
                LD (RREG_E),DE          ;     DE
86
                RET
87
 
1186 savelij 88
;  BC = BC / DE
792 savelij 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
 
1186 savelij 105
; 㬭 HLDE = BC * DE
792 savelij 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
 
1186 savelij 126
; 㬭 DE'HL'DEHL = DEHL * BC
792 savelij 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
1186 savelij 135
                LD A,0x20
792 savelij 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
 
1186 savelij 159
; BCDE = BCDE / HL
792 savelij 160
.LDIV_HL        EX DE,HL
161
                PUSH BC
162
                EXX
163
                POP HL
164
                LD DE,0
165
                JR .LDIV1
166
 
1186 savelij 167
; BCDE = (HL) / BCDE
168
.LDIV__HL_      PUSH BC         ; DE'
792 savelij 169
                LD C,(HL)
170
                INC HL
1186 savelij 171
                LD B,(HL)       ; HL
792 savelij 172
                INC HL
173
                LD A,(HL)
174
                INC HL
175
                LD H,(HL)
1186 savelij 176
                LD L,A          ; HL'
792 savelij 177
                PUSH HL
178
                LD H,B
1186 savelij 179
                LD L,C          ; HL
792 savelij 180
                EXX
1186 savelij 181
                POP HL          ; HL'
182
                POP DE          ; DE'
792 savelij 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
; ⥫.
1186 savelij 200
; HL'HL = HL'HL / DE'DE
201
; DE'DE = HL'HL % DE'DE
792 savelij 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
1186 savelij 216
                sbc a,d         ; DE'DE=0-divisor
792 savelij 217
                sub e
218
                ld d,a
219
                and e
220
                inc a           ; Z=short divisor
221
                push hl
1186 savelij 222
                ld hl,0         ; HL'HL=reminder
792 savelij 223
                exx
224
                pop bc
1186 savelij 225
                ld a,b          ; A,C,BC'=divident
792 savelij 226
                jr nz,.ldiv_long
227
 
1186 savelij 228
; divisor = -00DE
792 savelij 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
 
1186 savelij 250
; divisor = -DE'DE
792 savelij 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
1186 savelij 272
; result = C,BC',A -> HL'HL
273
; reminder = HL'HL -> DE'DE
792 savelij 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
 
1186 savelij 286
; HL'HL = reminder
287
; DE'DE = divisor
288
; A = divident
792 savelij 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
 
1186 savelij 308
; HEX6DEC
309
; HLBCDE->⥪
952 savelij 310
 
311
.HEX6DEC       
312
 
1186 savelij 313
; HEX4DEC
314
; BCDE->⥪
792 savelij 315
.HEX4DEC        EXX
316
                LD HL,VARS_TXT_DEC
317
                PUSH HL
318
                PUSH HL
319
                LD B,9
320
                EXX
321
                LD HL,.CHISLA4
322
                REPT 9
323
                CALL .BCDEMHL
324
                ENDM
325
.H2D1           LD A,"0"
326
                ADD A,E
327
                EXX
328
                LD (HL),A
329
                INC HL
330
                LD (HL),0
331
                LD A,B
332
                EXX
333
                POP HL
334
                LD B,A
335
.H2D2           LD A,(HL)
336
                CP "0"
337
                JR NZ,.H2D3
338
                LD (HL)," "
339
                INC HL
340
                DJNZ .H2D2
341
.H2D3           POP HL
342
                RET
343
 
1186 savelij 344
; HEX2DEC
345
; DE->⥪
792 savelij 346
.HEX2DEC        EXX
347
                LD HL,VARS_TXT_DEC
348
                PUSH HL
349
                PUSH HL
350
                LD B,4
351
                EXX
352
                LD HL,.CHISLA2
353
                LD BC,0
354
                JR .H2D1-(4*3)
355
 
1186 savelij 356
; HEX1DEC
357
; E->⥪
792 savelij 358
.HEX1DEC        EXX
359
                LD HL,VARS_TXT_DEC
360
                PUSH HL
361
                PUSH HL
362
                LD B,2
363
                EXX
364
                LD HL,.CHISLA1
365
                LD BC,0
366
                LD D,0
367
                JR .H2D1-(2*3)
368
 
952 savelij 369
; 48         FFFF FFFF FFFF
370
;                  281474976710655
371
.CHISLA6        DQ 100000000000000
372
                DQ 10000000000000
373
                DQ 1000000000000
374
                DQ 100000000000
375
                DQ 10000000000
792 savelij 376
.CHISLA4        DD 1000000000
377
                DD 100000000
378
                DD 10000000
379
                DD 1000000
380
                DD 100000
381
.CHISLA2        DD 10000
382
                DD 1000
383
.CHISLA1        DD 100
384
                DD 10
385
 
1186 savelij 386
; BCDE - (ADR) = BCDE
792 savelij 387
.BCDEMHL        XOR A
388
                EX AF,AF'
389
.BCDEMHL1       LD A,E
390
                SUB (HL)
391
                INC HL
392
                LD E,A
393
                LD A,D
394
                SBC A,(HL)
395
                INC HL
396
                LD D,A
397
                LD A,C
398
                SBC A,(HL)
399
                INC HL
400
                LD C,A
401
                LD A,B
402
                SBC A,(HL)
403
                LD B,A
404
                DEC HL
405
                DEC HL
406
                DEC HL
407
                EX AF,AF'
408
                INC A
409
                EX AF,AF'
410
                LD A,B
1186 savelij 411
                CP 0xC4
792 savelij 412
                JR C,.BCDEMHL1
413
                LD A,(HL)
414
                ADD A,E
415
                LD E,A
416
                INC HL
417
                LD A,(HL)
418
                ADC A,D
419
                LD D,A
420
                INC HL
421
                LD A,(HL)
422
                ADC A,C
423
                LD C,A
424
                INC HL
425
                LD A,(HL)
426
                ADC A,B
427
                LD B,A
428
                DEC HL
429
                DEC HL
430
                DEC HL
431
                EX AF,AF'
432
                DEC A
433
                ADD A,'0'
434
                INC HL
435
                INC HL
436
                INC HL
437
                INC HL
438
                EXX
439
                LD (HL),A
440
                INC HL
441
                EXX
442
                RET
443
 
1186 savelij 444
; BCDE = BCDE + HL
792 savelij 445
.BCDE_BCDE_HL   ADD HL,DE
446
                EX DE,HL
447
                LD HL,0
448
                ADC HL,BC
449
                LD B,H
450
                LD C,L
451
                RET