OldComp.cz
https://www.oldcomp.cz/

celočílené dělení 2 16-bitových čísel se znaménkem
https://www.oldcomp.cz/viewtopic.php?f=47&t=10076
Stránka 11

Autor:  l00k [ 27.05.2021, 14:37 ]
Předmět příspěvku:  celočílené dělení 2 16-bitových čísel se znaménkem

pro ty co programují v assembleru 8080 / Z80 a potřebovali by dělit nebo zbytek po dělení 2-bajtových čísel, zde je zajímavá rutina:

Kód:
;dělení DE=int(DE/HL) a HL=DE MOD HL (zbytek)
;--------------------------------------------
DELENI:   push    bc      ;uschovej BC
   ld      a,d
   xor     h
   push    af      ;výsledné znaménko ve flagu M
   call    ABSDEHL      ;DE=ABS(DE) a HL=ABS(HL)
   xor     a      ;vynuluj A
   sub     l      ;-L
   ld      c,a      ;do C
   sbc     a,a      ;přenos
   sub     h      ;-H
   ld      b,a      ;do B -> BC=-HL
   ld      hl,0   ;připrav na výpočet
   ld      a,10h      ;počítadlo 16x
del0:   add     hl,hl
   ex      de,hl
   add     hl,hl
   ex      de,hl
   jp      nc,del1
   inc     hl
del1:   push    hl
   add     hl,bc
   jp      nc,del2
   ex      (sp),hl
   inc     de
del2:   pop     hl
   dec     a      ;sniž počítadlo
   jp      nz,del0   ;opakuj 16x
   pop     af      ;obnov výsledné znaménko
   jp      m,del3   ;pro záporné odskoč
   pop     bc      ;obnov BC
   ret         ;a návrat     

del3:   ld      a,h      ;otestuj HL na 0000
   or      l
   jp      z,del4   ;pokud bylo, poskoč
   add     hl,bc      ;jinak přičti hodnotu
   call    MINHL      ;HL=-HL
del4:   ex      de,hl      ;DE do HL
   call    MINHL      ;HL=-HL
   ex      de,hl      ;a zpět
   pop     bc
   ret     

;DE=ABS(DE) a HL=ABS(HL)
ABSDEHL:   ex      de,hl      ;DE do HL
   call    ABSHL      ;HL=ABS(HL)
   ret     m      ;nemělo by nastat
   ex      de,hl

;HL=ABS(HL)
ABSHL:   ld      a,h
   or      a
   ret     p

;HL=-HL
MINHL:   xor     a
   sub     l
   ld      l,a
   sbc     a,a
   sub     h
   ld      h,a
   ret


autorem je někdo z FEL Praha - vytaženo z programu vytvořeného FEL-Pascalem (1986-7)

lze jednoduše upravit vynecháním pár řádků na dělení čísel bez znamének

Stránka 11 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/