Mix
Random mix of pages and files
FORTH_doc_02
2025.04.29 13:20:23 end SW FORTH Gilhad

FORTH_doc_02

Velikost typů

  • CELL 16bit
  • DOUBLE 32bit
  • Pointer je 16bit, nebo DOUBLE, pak nižší 2 byte někam ukazují, 3. byte říká kam (0x80 = RAM) a 4. je nula
  • ukládání v paměti - nižší řády níž => byte b[]= 0x12345678 => b[0]=0x78; b[1]=0x56; b[2]=0x23; b[3]=0x12; => b: .byte 0x78 0x56 0x34 0x12
    • na zásobníku taky 0x12345678 => push(0x12); push(0x34); push(0x56); push(0x78) => forth> 0x12345678 ~ forth> 0x12 0x34 0x56 0x78
    • prostě je to normálně jako na 8086 little endian
  • oba zásobníky rostou zhora dolů, ukazují na poslední hodnotu v zásobníku. Počáteční adresa je tedy 0x0100. push(x): *(--SP)=x; pop: return *(SP++)
  • Adresa funkce a __memx u AVR:
    • pokud mam navesti ve strojaku w_test_data a v .c ho mam jako `extern const __memx char w_test_data;` a nactu ho do `const __memx InstrPoint_t *IP;` `IP=(const __memx void)&w_test_data;` tak se nacte jako hodnota (např.) 0x0001A3.
    • Zatimco funkce void f_docol(void) se nacte IP=(const __memx void*)&f_docol jako hodnota 0x8002CE
    • Hlavni rozdil je, ze data smeruji spravne do FLASH, zatimco f_docol smeruje nespravne do RAM - proc je tomu tak a jak to udelat lip?
; normalni funkce
ldi r24,lo8(gs(f_docol))
ldi r25,hi8(gs(f_docol))
ldi r26,lo8(-128)
; z asm.S
ldi r24,lo8(w_test_data)
ldi r25,hi8(w_test_data)
ldi r26,hlo8(w_test_data)

lo8(name), pm_lo8(name), lo8(gs( name ))

gcc generuje trampoliny pro funkce, ktere jsou moc vysoko, nebo si o to reknou

some_fn:
        ldi r16,lo8(some_fn)     ; Byte-address, low byte
        ldi r17,hi8(some_fn)     ; Byte-address, high byte
        ldi r18,hh8(some_fn)     ; Byte-address, highest byte

        ldi r19,pm_lo8(some_fn)  ; Word-address, low byte
        ldi r20,pm_hi8(some_fn)  ; Word-address, high byte
        ldi r21,pm_hh8(some_fn)  ; Word-address, highest byte

        ldi r22,lo8(gs(some_fn)) ; Word-address where the linker will
        ldi r23,hi8(gs(some_fn)) ; generate a stub as needed.

jak gcc rict, ze jde o funkci:

.global some_fn
.type some_fn,@function

See:

rozhodnuti

budu pouzivat ukazatele na funkce pouze 16bit ukazatele na jejich trampoliny (trampolina je 4B/2W JMP kamsi trva 3 takty a usetri 3. byte odkud je volana (+ opruzy s nastavovanim EIND)

tyka se to hlavne(?pouze?) codewords ktera stejne vznikaji prekladem v C a jsou za nazvem, ktery je nezarovnany.