Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 06.02.2025 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,CPU2
  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.  
  308. ; HEX6DEC
  309. ; HLBCDE->текст
  310.  
  311. .HEX6DEC       
  312.                
  313. ; HEX4DEC
  314. ; BCDE->текст
  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.  
  344. ; HEX2DEC
  345. ; DE->текст
  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.  
  356. ; HEX1DEC
  357. ; E->текст
  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.  
  369. ; 48 бит        FFFF FFFF FFFF
  370. ;                  281474976710655
  371. .CHISLA6        DQ 100000000000000
  372.                 DQ 10000000000000
  373.                 DQ 1000000000000
  374.                 DQ 100000000000
  375.                 DQ 10000000000
  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.  
  386. ; BCDE - (ADR) = BCDE
  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
  411.                 CP 0xC4
  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.  
  444. ; BCDE = BCDE + HL
  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
  452.