Vlákno názorů k článku Tisk hexadecimálních hodnot s využitím instrukce DAA na ZX Spectru od _dw - Diky za clanek. Ten tisk hex hodnoty mam uplne...

  • Článek je starý, nové názory již nelze přidávat.
  • 20. 4. 2023 5:43

    _dw

    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
  • 25. 4. 2023 12:22

    Pavel Tišnovský
    Zlatý podporovatel

    jo no, ja si totiz uvedomil, ze jsem jeste neprobiral blokove operace, takze jsem to LDIR v kodu mel a potom zase vyhodil :-