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ě.
Jednobyteové rozsahy: BYTE7 = $00-$7f BYTE8 = $00-$ff Dvoubyteové rozsahy: WORD15 = $0000-$7fff WORD16 = $0000-$ffff
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.
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.
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.