?login_element?

Subversion Repositories NedoOS

Rev

Rev 1102 | Rev 1240 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. DAAal
  2.         ex af,af' ;'
  3.        push af
  4.        pop bc
  5.        res 1,c ;reset N flag
  6. DAAq
  7.        push bc
  8.        pop af
  9.         ld a,(_AL)
  10.         daa
  11.         ld (_AL),a
  12.         ex af,af' ;'
  13.        _Loop_
  14.  
  15. DASal
  16.         ex af,af' ;'
  17.        push af
  18.        pop bc
  19.        set 1,c ;set N flag
  20.         jr DAAq
  21.  
  22. AAMer
  23. ;aam i8 ;ASCII коррекция после умножения
  24. ;ah <= al/i8
  25. ;al <= al mod i8
  26. ;[костыль для para512: ah <= al/0x10, al <= al&0x0f]
  27.         get
  28.         next
  29.         ld l,a
  30.         ld h,-1
  31.         ld a,(_AL)
  32. _AAMer0
  33.         inc h
  34.         sub l
  35.         jr nc,_AAMer0
  36.         add a,l ;a=остаток, h=частное
  37.         ld l,a
  38.         ld (_AX),hl
  39.        _Loop_
  40.  
  41. AADer
  42. ;aad i8
  43. ;ASCII Adjust AX Before Division
  44. ;sets the value in the AL register to (AL + (10 * AH)), and then clears the AH register to 00H. TODO
  45. ;пока костыль для megapole: ax=ah+al
  46.         get
  47.         next
  48.         ld hl,(_AX)
  49.         ld a,h
  50.         add a,l
  51.         ld l,a
  52.         ld h,0
  53.         ld (_AX),hl
  54.        _Loop_
  55.  
  56.  
  57. ;cbw ;Expand AL to AX
  58. CBWer
  59.         ld a,(_AL);l ;al
  60.         rla
  61.         sbc a,a
  62.         ld (_AH),a;h,a ;ah
  63.        _Loop_
  64.  
  65. ;cwd ;Expand AX to DX:AX
  66. CWDer
  67.         ld a,(_AH);h ;ah
  68.         rla
  69.         sbc a,a
  70.         ld h,a
  71.         ld l,a
  72.         ld (_DX),hl
  73.        _Loop_
  74.  
  75. ADDali8
  76.         get
  77.         next
  78.         ld hl,_AL
  79.         add a,(hl)
  80. keephlflagsfroma_loop
  81.         ld (hl),a
  82. keepflagsfroma_loop
  83.         KEEPHFCFPARITYOVERFLOW_FROMA
  84.        _Loop_
  85. SUBali8
  86.         get
  87.         next
  88.         ld c,a
  89.         ld hl,_AL
  90.         ld a,(hl)
  91.         sub c
  92.         jr keephlflagsfroma_loop
  93.         ;ld (hl),a
  94.         ;KEEPCFPARITYOVERFLOW_FROMA
  95.        ;_Loop_
  96. ADCali8
  97.         ex af,af' ;'
  98.         get
  99.         next
  100.         ld hl,_AL
  101.         adc a,(hl)
  102.         jr keephlflagsfroma_loop
  103.         ;ld (hl),a
  104.         ;KEEPCFPARITYOVERFLOW_FROMA
  105.        ;_Loop_
  106. SBBali8
  107.         ex af,af' ;'
  108.         get
  109.         next
  110.         ld c,a
  111.         ld hl,_AL
  112.         ld a,(hl)
  113.         sbc a,c
  114.         jr keephlflagsfroma_loop
  115.         ;ld (hl),a
  116.         ;KEEPCFPARITYOVERFLOW_FROMA
  117.        ;_Loop_
  118. CMPali8
  119.         get
  120.         next
  121.         ld c,a
  122.         ld a,(_AL)
  123.         sub c
  124.         jr keepflagsfroma_loop
  125.         ;KEEPCFPARITYOVERFLOW_FROMA
  126.        ;_Loop_
  127.  
  128. ADDaxi16
  129.         or a
  130.         ex af,af' ;'
  131. ADCaxi16
  132.         getBC
  133.         ld hl,(_AX)
  134.         ex af,af' ;'
  135.         ADCHLBC_KEEPCFPARITYOVERFLOW_FROMHL
  136. keepaxfromhl_loop
  137.         ld (_AX),hl
  138.        _Loop_
  139. SUBaxi16
  140.         or a
  141.         ex af,af' ;'
  142. SBBaxi16
  143.         getBC
  144.         ld hl,(_AX)
  145.         ex af,af' ;'
  146.         SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL
  147.         jr keepaxfromhl_loop
  148.         ;ld (_AX),hl
  149.        ;_Loop_
  150. CMPaxi16
  151.         getBC
  152.         ld hl,(_AX)
  153.         or a
  154.         SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL
  155.        _Loop_
  156.  
  157. IMUL_bc_de_to_hlde
  158.         call MUL16SIGNED ;HLDE=DE*BC
  159.         ld a,d
  160.         rla ;LSW sign
  161.         jr c,IMULCX_NEG
  162.         ld a,h
  163.         or l
  164.         add a,255 ;set CF if LSW sign != HSW (result >=32768 or < -32768)
  165.         jp IMULCX_NEGQ
  166. IMULCX_NEG
  167.         ld a,h
  168.         and l
  169.         sub 255 ;set CF if LSW sign != HSW (result >=32768 or < -32768)
  170. IMULCX_NEGQ
  171.         sbc a,a ;keep CF
  172.         srl a ;keep CF
  173.         exx
  174.         ld e,a ;overflow (d7 != d6) if CF
  175.         exx
  176.         ex af,af' ;'
  177.         ret
  178.  
  179. ;HLDE=DE*BC
  180. MUL16SIGNED
  181.         bit 7,d
  182.         jr nz,MUL16SIGNED_NEGDE
  183.         bit 7,b
  184.         jp z,MUL16
  185. MUL16SIGNED_NEGBC
  186.         xor a
  187.         sub c
  188.         ld c,a
  189.         sbc a,b
  190.         sub c
  191.         ld b,a
  192.         jp MUL16NEGHLDE
  193. MUL16SIGNED_NEGDE
  194.         xor a
  195.         sub e
  196.         ld e,a
  197.         sbc a,d
  198.         sub e
  199.         ld d,a
  200.         bit 7,b
  201.         jr nz,MUL16SIGNED_NEGDE_NEGBC
  202. MUL16NEGHLDE
  203.         call MUL16
  204.         xor a
  205.         sub e
  206.         ld e,a
  207.         ld a,0
  208.         sbc a,d
  209.         ld d,a
  210.         ld a,0
  211.         sbc a,l
  212.         ld l,a
  213.         ld a,0
  214.         sbc a,h
  215.         ld h,a
  216.         ret
  217. MUL16SIGNED_NEGDE_NEGBC
  218.         xor a
  219.         sub c
  220.         ld c,a
  221.         sbc a,b
  222.         sub c
  223.         ld b,a
  224. ;HLDE=DE*BC
  225. MUL16
  226.         ld hl,0
  227.         dup 16
  228.         rr d
  229.         rr e
  230.         jr nc,$+3
  231.         add hl,bc
  232.         rr h
  233.         rr l
  234.         edup
  235.         rr d
  236.         rr e
  237.         ret
  238.  
  239. ;BC = HLBC/DE, HL = HLBC%DE
  240. DIV32SIGNED
  241.         bit 7,h
  242.         jr nz,DIV32SIGNED_NEGHLBC
  243.         bit 7,d
  244.         ;jr nz,DIV32SIGNED_NEGDE
  245.         jp z,DIV32
  246. DIV32SIGNED_NEGDE
  247.         xor a
  248.         sub e
  249.         ld e,a
  250.         sbc a,d
  251.         sub e
  252.         ld d,a
  253.         call DIV32
  254.         xor a
  255.         sub c
  256.         ld c,a
  257.         sbc a,b
  258.         sub c
  259.         ld b,a ;neg result
  260.         ret
  261. DIV32SIGNED_NEGHLBC
  262.         xor a
  263.         sub c
  264.         ld c,a
  265.         ld a,0
  266.         sbc a,b
  267.         ld b,a
  268.         ld a,0
  269.         sbc a,l
  270.         ld l,a
  271.         ld a,0
  272.         sbc a,h
  273.         ld h,a
  274.         bit 7,d
  275.         jr nz,DIV32SIGNED_NEGHLBC_NEGDE
  276.         call DIV32
  277.         xor a
  278.         sub c
  279.         ld c,a
  280.         sbc a,b
  281.         sub c
  282.         ld b,a ;neg result
  283.         xor a
  284.         sub l
  285.         ld l,a
  286.         sbc a,h
  287.         sub l
  288.         ld h,a ;знак остатка равен знаку делимого
  289.         ret    
  290. DIV32SIGNED_NEGHLBC_NEGDE
  291.         xor a
  292.         sub e
  293.         ld e,a
  294.         sbc a,d
  295.         sub e
  296.         ld d,a
  297.         call DIV32
  298.         xor a
  299.         sub l
  300.         ld l,a
  301.         sbc a,h
  302.         sub l
  303.         ld h,a ;знак остатка равен знаку делимого
  304.         ret
  305.  
  306. ;BC = HLBC/DE, HL = HLBC%DE
  307. DIV32
  308.         ld a,b
  309.         call DIV32_8
  310.         push af
  311.         ld a,c
  312.         call DIV32_8
  313.         pop bc
  314.         ld c,a
  315.         ret
  316. ;A = HLA/DE, HL = HLA%DE
  317. DIV32_8
  318.         ld b,8
  319. DIV321
  320.         add a,a
  321.         adc hl,hl
  322.         jr c,DIV322
  323.         sbc hl,de
  324.         jr nc,DIV323
  325.         add hl,de
  326.         djnz DIV321
  327.         ret
  328. DIV322
  329.         ccf
  330.         sbc hl,de
  331. DIV323
  332.         inc a
  333.         djnz DIV321
  334.         ret
  335.