Subversion Repositories pentevo

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 18.10.2018 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. ;[HEX4DEC]
  309. ;BCDE->текст
  310. .HEX4DEC        EXX
  311.                 LD HL,VARS_TXT_DEC
  312.                 PUSH HL
  313.                 PUSH HL
  314.                 LD B,9
  315.                 EXX
  316.                 LD HL,.CHISLA4
  317.                 REPT 9
  318.                 CALL .BCDEMHL
  319.                 ENDM
  320. .H2D1           LD A,"0"
  321.                 ADD A,E
  322.                 EXX
  323.                 LD (HL),A
  324.                 INC HL
  325.                 LD (HL),0
  326.                 LD A,B
  327.                 EXX
  328.                 POP HL
  329.                 LD B,A
  330. .H2D2           LD A,(HL)
  331.                 CP "0"
  332.                 JR NZ,.H2D3
  333.                 LD (HL)," "
  334.                 INC HL
  335.                 DJNZ .H2D2
  336. .H2D3           POP HL
  337.                 RET
  338.  
  339. ;[HEX2DEC]
  340. ;DE->текст
  341. .HEX2DEC        EXX
  342.                 LD HL,VARS_TXT_DEC
  343.                 PUSH HL
  344.                 PUSH HL
  345.                 LD B,4
  346.                 EXX
  347.                 LD HL,.CHISLA2
  348.                 LD BC,0
  349.                 JR .H2D1-(4*3)
  350.  
  351. ;[HEX1DEC]
  352. ;E->текст
  353. .HEX1DEC        EXX
  354.                 LD HL,VARS_TXT_DEC
  355.                 PUSH HL
  356.                 PUSH HL
  357.                 LD B,2
  358.                 EXX
  359.                 LD HL,.CHISLA1
  360.                 LD BC,0
  361.                 LD D,0
  362.                 JR .H2D1-(2*3)
  363.  
  364. .CHISLA4        DD 1000000000
  365.                 DD 100000000
  366.                 DD 10000000
  367.                 DD 1000000
  368.                 DD 100000
  369. .CHISLA2        DD 10000
  370.                 DD 1000
  371. .CHISLA1        DD 100
  372.                 DD 10
  373.  
  374. ;[BCDE-(ADR)=BCDE]
  375. .BCDEMHL        XOR A
  376.                 EX AF,AF'
  377. .BCDEMHL1       LD A,E
  378.                 SUB (HL)
  379.                 INC HL
  380.                 LD E,A
  381.                 LD A,D
  382.                 SBC A,(HL)
  383.                 INC HL
  384.                 LD D,A
  385.                 LD A,C
  386.                 SBC A,(HL)
  387.                 INC HL
  388.                 LD C,A
  389.                 LD A,B
  390.                 SBC A,(HL)
  391.                 LD B,A
  392.                 DEC HL
  393.                 DEC HL
  394.                 DEC HL
  395.                 EX AF,AF'
  396.                 INC A
  397.                 EX AF,AF'
  398.                 LD A,B
  399.                 CP 0XC4
  400.                 JR C,.BCDEMHL1
  401.                 LD A,(HL)
  402.                 ADD A,E
  403.                 LD E,A
  404.                 INC HL
  405.                 LD A,(HL)
  406.                 ADC A,D
  407.                 LD D,A
  408.                 INC HL
  409.                 LD A,(HL)
  410.                 ADC A,C
  411.                 LD C,A
  412.                 INC HL
  413.                 LD A,(HL)
  414.                 ADC A,B
  415.                 LD B,A
  416.                 DEC HL
  417.                 DEC HL
  418.                 DEC HL
  419.                 EX AF,AF'
  420.                 DEC A
  421.                 ADD A,'0'
  422.                 INC HL
  423.                 INC HL
  424.                 INC HL
  425.                 INC HL
  426.                 EXX
  427.                 LD (HL),A
  428.                 INC HL
  429.                 EXX
  430.                 RET
  431.  
  432. ;[BCDE=BCDE+HL]
  433. .BCDE_BCDE_HL   ADD HL,DE
  434.                 EX DE,HL
  435.                 LD HL,0
  436.                 ADC HL,BC
  437.                 LD B,H
  438.                 LD C,L
  439.                 RET
  440.