Diky za clanek.
Ten tisk hex hodnoty mam uplne stejne. Jen se lisi instrukce pro 4 bitovy posun. Tam jsou mozne 3 varianty (rra,rrca,rlca).
U toho ZX cisla s plovouci carkou bych jen vyslovne upozornil ze ta mantisa je od 0.5 do skoro 1. A ne od 1 do skoro 2 jako v IEEE 754. Takze i ten Bias se pak chape jinak.
Ve chvili co zacnete delat deleni, vas zacne zajimat jak je ten exponent reseny a proc nekdy x --> 1/x --> 1/x --> != x. Pokud budete delat vlastni format tak se tomu budete snazit vyhnout.
PS: Registru IX bych se vyhybal co to jde... .)
Skoda ze neimplementovali misto IX to same pro SP (i pres tu pomalost a velikost by to bylo uzitecne). Jak pro funkce psane v C tak i pro Forth, kde to ale tolik neboli.
https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/83-print-fp-numbers.asm
ma 113 bajtu a kdyz se to napise na HL a udela par uprav tak to ma 73 bajtu (a slo by to stahnout jeste minimalne o bajt).
ENTRY_POINT equ $8000
ROM_CLS equ $0DAF
PRINT_FP equ $2DE3
org ENTRY_POINT
start:
call ROM_CLS ; smazání obrazovky a otevření kanálu číslo 2 (screen)
ld HL, fp0 ; adresa s pěticí bajtů FP hodnoty
ld B, 7
loop:
call print_fp_number ; tisk FP hodnoty na obrazovku s odřádkováním
djnz loop
ret
; mantisa+128 exponent <0.5..1)
fp0: db %00000000, %00000000, %00000000, %00000000, %00000000 ; 0
fp1: db %10000000, %00000000, %00000000, %00000000, %00000000 ; 0.5
fp2: db %10000000, %10000000, %00000000, %00000000, %00000000 ;-0.5
fp3: db %10000000, %01000000, %00000000, %00000000, %00000000 ; 0.75
fp4: db %10000001, %01000000, %00000000, %00000000, %00000000 ; 1.5
fp5: db %10000001, %01000000, %00000000, %00000001, %00000000 ; 1.5000001
fp6: db %10000001, %00111111, %11111111, %11111111, %00000000 ; 1.4999999
print_fp_number:
; HL pointer to FP
; Nici: AF,DE,DE',BC'
; Meni: HL +=5
push BC
ld DE,($5C65) ; Fetch the address of the first location above the present stack (STKEND).
ld BC, 5
ldir
LD ($5C65),DE
push HL
; zachova jen IX, IY, AF' a HL'
call PRINT_FP ; vytisknout FP hodnotu uloženou na vrcholu zásobníku
pop HL
pop BC
new_line:
ld A, 0x0d ; kód znaku pro odřádkování
rst 0x10 ; zavolání rutiny v ROM
ret ; návrat ze subrutiny
end ENTRY_POINT