Subversion Repositories pentevo

Rev

Rev 792 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 27.02.2021 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.  
  308. ;[HEX6DEC]
  309. ;HLBCDE->текст
  310.  
  311. .HEX6DEC       
  312.                
  313.  
  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.  
  370. ; 48 бит        FFFF FFFF FFFF
  371. ;                  281474976710655
  372. .CHISLA6        DQ 100000000000000
  373.                 DQ 10000000000000
  374.                 DQ 1000000000000
  375.                 DQ 100000000000
  376.                 DQ 10000000000
  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
  453.