Celočíselné dělení

Opravená a rozšířená verze 2005/01
Raster/c.p.u.

V minulém Flopu č.47 jsem se věnoval problematice celočíselného dělení a uvedl i knihovnu divide.asm se dvěma rutinami.

Bohužel, teprve nedávno jsem díky upozornění od Fandala zjistil, že se mi do rutiny "deleni_wwww" vloudila chyba, a dále že jsem opomněl zmínit důležité upozornění o rozsahu vstupních a výstupních hodnot pro jednotlivé rutiny. Omlouvám se vám tedy, pokud jste tyto rutiny někde použili a řešili problém, že v některých případech nepracovaly správně.

Používané označení pro rozsahy hodnot

Jednobyteové rozsahy:
BYTE7  = $00-$7f
BYTE8  = $00-$ff
Dvoubyteové rozsahy:
WORD15 = $0000-$7fff
WORD16 = $0000-$ffff

deleni_wbbb

WORD15/BYTE7=BYTE8 (zbytek BYTE7)

Dělenec tedy může být v rozsahu WORD15, dělitel a zbytek BYTE7, podíl BYTE8.

U této rutiny je dále důležité upozornit na fakt, že výslednou hodnotu podílu sestavuje v paměťové buňce velikosti BYTE8, a tím pádem funguje správně pouze v případech, kdy výsledný podíl nabývá hodnoty maximálně $FF !

Pokud tedy provádíte dělení, u něhož toto předem není jisté, použijte následující rutinu deleni_wbwb, která v původní verzi knihovny nebyla.

deleni_wbwb

WORD16/BYTE7=WORD16 (zbytek BYTE7)

Tato nově přidaná rutina je určena pro operaci dělení, kdy dělenec i podíl mají rozsah WORD16, dělitel a zbytek rozsah BYTE7.

deleni_wwww

WORD16/WORD16=WORD16 (zbytek WORD16)

Dělenec, dělitel, podíl i zbytek mají rozsah WORD16.

V původní verzi knihovny byla v této rutině chyba (omylem přehozené pořadí zpracovávání horních a dolních bytů při odečítání), což způsobovalo v některých případech chybné výsledky.

Novou verzi knihovny divide.asm se zmíněným rozšířením a opravenou chybou najdete v tomto Flopu č.48.