Mel jsem ted tyden volno.
Takze jsem sedel 7 dni doma(v pokoji), protoze taky co delat, kdyz jste v miste kde vsichni mluvi jazykem kterym nerozumite.
To je spousta casu pro divani se do zdi nebo programovani.
Jak jiste vsichni vite, na rootu po serii clanku o programovani pro NES ted konecne (znovu) vychazi serie clanku o programovani na Spectru. Coz oceni kazdy programator v asembleru pro Z80. .)
https://www.root.cz/clanky/kouzlo-minimalismu-potreti-vyvoj-her-a-dem-pro-slavne-zx-spectrum/https://www.root.cz/clanky/vyvoj-pro-zx-spectrum-mikroprocesor-zilog-z80-a-smycky-v-assembleru/https://www.root.cz/clanky/vyvoj-pro-zx-spectrum-vypis-informaci-na-obrazovku/dalsi vyjde v utery rano 28.2.2023
Ten druhy clanek by o smyckach, tak jsem se hned dival jak to vlastne resim v rutine PUSH3_FILL, ktera dela obdobu toho co se popisovalo v clanku, nastavuje rozsah adres na nejakou hodnotu.
Nejefektivnejsi je pouzita zasobnik:
push HL ...11 taktu na 2 bajty = 5.5 taktu na bajt
Ale to vyzaduje vedet zda je povolene preruseni nebo zakazane a zakazat ho, schovat si hodnotu SP, presunout ho a opakovane od hornich adres pushovat ke spodnim.
Jenze co kdyz nekdo bude chtit aby bezelo neco na pozadi a s konstantnim intevalem 50x za vterinu?
Hudbu asi na pozadi ne, to se bude muset asi resit nejen prerusenim (dokonce by melo byt asi zakazane), ale kouskovat kod na casove konstatni intervaly mnohem kratsi jak 50 za vterinu (klidne s pouzitim vyplne) a mezitim pravidelne obsluhovat zvuk (teda menit jeden bit na zapnuto vypnuto). Ale nastesti jsem to pro Z80 nikdy nepsal. .)
Takze push nepouzivam i kdyz bych mohl mit na to nejaky flag pro pouziti.
Co teda zbyva?
LDIR ...21 taktu na bajt
LDI ...16 taktu na bajt ale to uz je lepsi
LD (HL), A
INC HL ...13 taktu na bajt
LD (HL), A
INC L ...11 taktu na bajt, ale musime vede ze neprelezame segment
Podivame se co dela nejhorsi/default varianta
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x4801,0x4321,xx)'
;[17:360941] 0x4801 0x4321 xx fill fill(addr,u,char) default variant: fill(no ptr,?,?)
push DE ; 1:11 0x4801 0x4321 xx fill
push HL ; 1:11 0x4801 0x4321 xx fill
ld HL, 0x4801 ; 3:10 0x4801 0x4321 xx fill HL = addr from
ld DE, 0x4802 ; 3:10 0x4801 0x4321 xx fill DE = to
ld BC, 0x4320 ; 3:10 0x4801 0x4321 xx fill = 0x4321-1
ld (HL),xx ; 2:10 0x4801 0x4321 xx fill
ldir ; 2:u*21/16 0x4801 0x4321 xx fill
pop HL ; 1:10 0x4801 0x4321 xx fill
pop DE ; 1:10 0x4801 0x4321 xx fill
; seconds: 0 ;[15:82]
LDIR je otesanek, vyzaduje obsazeni HL,DE,BC a to neco stoji.
Je to 17 bajtu a tech cca 21*bajt taktu.
A tady vyzva zacina, napsat to o hodne rychleji a ne o moc delsi a nebo kratsi a stejne rychle ci rychleji.
Variant je vic jak 10 tak nevim kolik toho zaspamovat...
Varianty do 7 bajtu nebudu ukazovat, ale jsou dulezite aby se aktivovaly protoze nasledujici varianty pouzivaji smycku a pocitaji s tim ze pocet bajtu je minimalne o velikosti smycky, jinak selzou.
Varianta kdy oblast konci na 0x..00 (vyjma) a nepreleza segment a pocet je delitelny trema:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000-5*19,5*19,xx)'
;[13:1528] 0x5000-5*19 5*19 xx fill fill(addr,u,char) variant >0: fill(num,max 256,?)
ld BC, 0x4FA1 ; 3:10 0x5000-5*19 5*19 xx fill addr
ld A, xx ; 2:7 0x5000-5*19 5*19 xx fill char
ld (BC),A ; 1:7 0x5000-5*19 5*19 xx fill
inc C ; 1:4 0x5000-5*19 5*19 xx fill
ld (BC),A ; 1:7 0x5000-5*19 5*19 xx fill
inc C ; 1:4 0x5000-5*19 5*19 xx fill
jp nz, $-4 ; 3:10 0x5000-5*19 5*19 xx fill
ld (BC),A ; 1:7 0x5000-5*19 5*19 xx fill
; seconds: 0 ;[13:56]
To same jen to neni delitelne trema(takze je to delitelne dvema s pripadnym zbytkem 1 jako je v nasledujici ukazce):
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000-19,19,xx)'
;[13:312] 0x5000-19 19 xx fill fill(addr,u,char) variant >0: fill(num,max 256,?)
ld BC, 0x4FED ; 3:10 0x5000-19 19 xx fill addr
ld A, xx ; 2:7 0x5000-19 19 xx fill char
ld (BC),A ; 1:7 0x5000-19 19 xx fill
inc C ; 1:4 0x5000-19 19 xx fill
ld (BC),A ; 1:7 0x5000-19 19 xx fill
inc C ; 1:4 0x5000-19 19 xx fill
jp nz, $-4 ; 3:10 0x5000-19 19 xx fill
ld (BC),A ; 1:7 0x5000-19 19 xx fill
; seconds: 0 ;[13:56]
Nebudu ukazovat skoro to same kdyz rozsah zacina na nule (vcetne).
Ted tu mame jeste efektivni smycku pro 256 opakovani pri pouziti B registru takze:
Varianta kdy pocet je delitelny trema, ale mensi nebo roven 256*3:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5033,3*83,xx)'
;[17:4024] 0x5033 3*83 xx fill fill(addr,u,char) variant: fill(num,3*83 (max 767),no ptr)
push HL ; 1:11 0x5033 3*83 xx fill
ld HL, 0x5033 ; 3:10 0x5033 3*83 xx fill addr
ld B, 0x53 ; 2:7 0x5033 3*83 xx fill (3*83)/3
ld A, xx ; 2:7 0x5033 3*83 xx fill char
ld (HL),C ; 1:7 0x5033 3*83 xx fill
inc HL ; 1:6 0x5033 3*83 xx fill 0x50FF=0x5033+0+3*68
ld (HL),C ; 1:7 0x5033 3*83 xx fill
inc L ; 1:4 0x5033 3*83 xx fill
ld (HL),C ; 1:7 0x5033 3*83 xx fill
inc L ; 1:4 0x5033 3*83 xx fill
djnz $-6 ; 2:13/8 0x5033 3*83 xx fill
pop HL ; 1:10 0x5033 3*83 xx fill
; seconds: 0 ;[17:93]
Kdy neni delitelny trema, ale dvema s pripadnym zbytkem 1:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5033,2*83,xx)'
;[15:2948] 0x5033 2*83 xx fill fill(addr,u,char) variant: fill(?,max 513,no ptr)
push HL ; 1:11 0x5033 2*83 xx fill
ld HL, 0x5033 ; 3:10 0x5033 2*83 xx fill addr
ld BC, 0x5300+xx ; 3:10 0x5033 2*83 xx fill B = 83x, C = xx
ld (HL),C ; 1:7 0x5033 2*83 xx fill
inc L ; 1:4 0x5033 2*83 xx fill
ld (HL),C ; 1:7 0x5033 2*83 xx fill
inc L ; 1:4 0x5033 2*83 xx fill only even numbers
djnz $-4 ; 2:13/8 0x5033 2*83 xx fill
pop HL ; 1:10 0x5033 2*83 xx fill
; seconds: 0 ;[14:76]
Specialni varianty kdy rozsah zabira presne cely jeden segment ukazu jen pro 7*256 protoze tady se vyplati jiny pristup:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000,7*256,xx)'
;[23:24078] 0x5000 7*256 xx fill fill(addr,u,char) variant: fill(0x??00,7*256,?)
ld A, xx ; 2:7 0x5000 7*256 xx fill char
ld C, 0x00 ; 2:7 0x5000 7*256 xx fill lo(addr)
ld B, 0x50 ; 2:7 0x5000 7*256 xx fill hi(addr)
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc B ; 1:4 0x5000 7*256 xx fill
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc B ; 1:4 0x5000 7*256 xx fill
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc B ; 1:4 0x5000 7*256 xx fill
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc B ; 1:4 0x5000 7*256 xx fill
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc B ; 1:4 0x5000 7*256 xx fill
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc B ; 1:4 0x5000 7*256 xx fill
ld (BC),A ; 1:7 0x5000 7*256 xx fill
inc C ; 1:4 0x5000 7*256 xx fill
jp nz, $-16 ; 3:10 0x5000 7*256 xx fill
; seconds: 0 ;[23:108]
Pamet se nastavuje postupne v kazdem segmentu na shodnem ofsete soucasne, protoze se pouziva jen jedna smycka pro offset.
Takze misto pomaleho djnz jde pouzit rychly jp. Zato se musi opakovane na zacatku smycky pokazde nastavit nejnizsi segment rozsahu. Nikde nehrozi zadne pouziti INC BC.
Pokud vyzkousime to same pro 6 segmentu tak vyhraje to ze je to delitelne ctyrma. Vlastne je dost dulezite jak je ten rozsah velky a jak se faktorizuje na prvocisla. Myslim tim ze 6*256=2×2×2×2×2×2×2×2×2×3
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000,6*256,xx)'
;[22:20874] 0x5000 6*256 xx fill fill(addr,u,char) variant >0: fill(no ptr,4*384 (no limit),?)
push HL ; 1:11 0x5000 6*256 xx fill
ld HL, 0x5000 ; 3:10 0x5000 6*256 xx fill HL = addr
ld BC, 0x0600+xx ; 3:10 0x5000 6*256 xx fill B = 6x, C = char
ld (HL),C ; 1:7 0x5000 6*256 xx fill
inc L ; 1:4 0x5000 6*256 xx fill
ld (HL),C ; 1:7 0x5000 6*256 xx fill
inc L ; 1:4 0x5000 6*256 xx fill
ld (HL),C ; 1:7 0x5000 6*256 xx fill
inc L ; 1:4 0x5000 6*256 xx fill
ld (HL),C ; 1:7 0x5000 6*256 xx fill
inc L ; 1:4 0x5000 6*256 xx fill
jp nz, $-8 ; 3:10 0x5000 6*256 xx fill
inc H ; 1:4 0x5000 6*256 xx fill
djnz $-12 ; 2:13/8 0x5000 6*256 xx fill
pop HL ; 1:10 0x5000 6*256 xx fill
; seconds: 0 ;[22:112]
Nasobek 4 je fajn, protoze obdovna varianta jde pouzit na cokoliv dalsiho, a budeme vedet ze jen jen INC bude muset byt 16 bitovy. A zbytek jsou max 3 bajty. Jen ta velikost je uz dost velka.
Co takhle varianty kdy rozsah je nasobek peti? A neodchyti to varianta pro rozsah do 513.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000,5*113,xx)'
;[20:8172] 0x5000 5*113 xx fill fill(addr,u,char) variant: fill(num,5*113 (max 767),no ptr)
push HL ; 1:11 0x5000 5*113 xx fill
ld HL, 0x5000 ; 3:10 0x5000 5*113 xx fill
ld BC, 0x7100+xx ; 3:10 0x5000 5*113 xx fill
ld (HL),C ; 1:7 0x5000 5*113 xx fill
inc HL ; 1:6 0x5000 5*113 xx fill 0x50FF=0x5000+0+5*51
ld (HL),C ; 1:7 0x5000 5*113 xx fill
inc HL ; 1:6 0x5000 5*113 xx fill 0x51FF=0x5000+1+5*102
ld (HL),C ; 1:7 0x5000 5*113 xx fill
inc L ; 1:4 0x5000 5*113 xx fill
ld (HL),C ; 1:7 0x5000 5*113 xx fill
inc L ; 1:4 0x5000 5*113 xx fill
ld (HL),C ; 1:7 0x5000 5*113 xx fill
inc L ; 1:4 0x5000 5*113 xx fill
djnz $-10 ; 2:8/13 0x5000 5*113 xx fill
pop HL ; 1:10 0x5000 5*113 xx fill
; seconds: 0 ;[20:108]
A co kdyz to bude koncit v nulovem ofsetu? Zmeni to neco?
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000-5*113,5*113,xx)'
;[18:7814] 0x5000-5*113 5*113 xx fill fill(addr,u,char) variant >0: fill(num,5*113 (max 1280),?)
ld BC, 0x4DCB ; 3:10 0x5000-5*113 5*113 xx fill addr = (0x4DCB..0x4FFF)
ld A, xx ; 2:7 0x5000-5*113 5*113 xx fill char
ld (BC),A ; 1:7 0x5000-5*113 5*113 xx fill
inc C ; 1:4 0x5000-5*113 5*113 xx fill
ld (BC),A ; 1:7 0x5000-5*113 5*113 xx fill
inc C ; 1:4 0x5000-5*113 5*113 xx fill
ld (BC),A ; 1:7 0x5000-5*113 5*113 xx fill
inc BC ; 1:6 0x5000-5*113 5*113 xx fill 0x4DFF=0x5000-5*113+2+5*10
ld (BC),A ; 1:7 0x5000-5*113 5*113 xx fill
inc BC ; 1:6 0x5000-5*113 5*113 xx fill 0x4EFF=0x5000-5*113+3+5*61
ld (BC),A ; 1:7 0x5000-5*113 5*113 xx fill
inc C ; 1:4 0x5000-5*113 5*113 xx fill
jp nz, $-10 ; 3:10 0x5000-5*113 5*113 xx fill
; seconds: 0 ;[18:86]
Jo hodne, uz nemusime mit jedno pocitadlo. Pro zacatek v nulovem ofsetu to ale nefunguje. Vysvetlim pozdeji.
Nebudu ukazovat vsechny, muzete si to vyzkouset sami. .)
Kód:
fill(addr,u,char) variant: fill(no ptr,ptr,?)
fill(addr,u,char) variant: fill(no ptr,ptr,?)
;[8:40] fill(addr,u,char) variant u = ??? = 1 byte
;[7:34] fill(addr,u,char) variant u = ??? = 1 byte
;[6:26] fill(addr,u,char) variant u = ??? = 1 byte
;[5:20] fill(addr,u,char) variant u = ??? = 1 byte
;[10:53] fill(addr,u,char) variant u = ??? = 2 byte
;[9:47] fill(addr,u,char) variant u = ??? = 2 byte
;[9:39] fill(addr,u,char) variant u = ??? = 2 byte
;[7:30] fill(addr,u,char) variant u = ??? = 2 byte
;[12:66] fill(addr,u,char) variant u = ??? = 3 byte
;[11:60] fill(addr,u,char) variant u = ??? = 3 byte
;[12:52] fill(addr,u,char) variant u = ??? = 3 byte
;[11:46] fill(addr,u,char) variant u = ??? = 3 byte
;[14:79] fill(addr,u,char) variant u = ??? = 4 byte
;[13:73] fill(addr,u,char) variant u = ??? = 4 byte
;[13:61] fill(addr,u,char) variant u = ??? = 4 byte
;[11:50] fill(addr,u,char) variant u = ??? = 4 byte
;[16:92] fill(addr,u,char) variant u = ??? = 5 byte
;[15:86] fill(addr,u,char) variant u = ??? = 5 byte
;[16:74] fill(addr,u,char) variant u = ??? = 5 byte
;[15:67] fill(addr,u,char) variant u = ??? = 5 byte
;[18:105] fill(addr,u,char) variant u = ??? = 6 byte
;[17:99] fill(addr,u,char) variant u = ??? = 6 byte
;[17:81] fill(addr,u,char) variant u = ??? = 6 byte
;[15:70] fill(addr,u,char) variant u = ??? = 6 byte
fill(addr,u,char) variant u = ??? > 6
fill(addr,u,char) variant u = ???
; fill(addr,u,char) variant: fill(?,0,?)},
;[8:40] fill(addr,u,char) variant: fill(ptr,1,ptr)
;[7:34] fill(addr,u,char) variant: fill(ptr,1,no ptr)
;[6:26] fill(addr,u,char) variant: fill(no ptr,1,ptr)
;[5:20] fill(addr,u,char) variant: fill(no ptr,1,no ptr)
;[10:53] fill(addr,u,char) variant: fill(ptr,2,ptr)
;[9:47] fill(addr,u,char) variant: fill(ptr,2,no ptr)
;[9:39] fill(addr,u,char) variant: fill(no ptr,2,ptr)
;[7:30] fill(addr,u,char) variant: fill(no ptr,2,no ptr)
;[12:66] fill(addr,u,char) variant: fill(ptr,3,ptr)
;[11:60] fill(addr,u,char) variant: fill(ptr,3,no ptr)
;[12:52] fill(addr,u,char) variant: fill(no ptr,3,ptr)
;[11:46] fill(addr,u,char) variant: fill(no ptr,3,no ptr)
;[14:79] fill(addr,u,char) variant: fill(ptr,4,ptr)
;[13:73] fill(addr,u,char) variant: fill(ptr,4,no ptr)
;[13:61] fill(addr,u,char) variant: fill(no ptr,4,ptr)
;[11:50] fill(addr,u,char) variant: fill(no ptr,4,no ptr)
;[16:92] fill(addr,u,char) variant: fill(ptr,5,ptr)
;[15:86] fill(addr,u,char) variant: fill(ptr,5,no ptr)
;[16:74] fill(addr,u,char) variant: fill(no ptr,5,ptr)
;[15:67] fill(addr,u,char) variant: fill(no ptr,5,no ptr)
;[18:105] fill(addr,u,char) variant: fill(ptr,6,ptr)
;[17:99] fill(addr,u,char) variant: fill(ptr,6,no ptr)
;[17:81] fill(addr,u,char) variant: fill(no ptr,6,ptr)
;[15:70] fill(addr,u,char) variant: fill(no ptr,6,no ptr)
fill(addr,u,char) variant >0: fill(num,3*__TMP_X (max 256),?)
fill(addr,u,char) variant >0: fill(num,max 256,?)
fill(addr,u,char) variant 0>: fill(num,3*eval(($2)/3) max(256),?)
fill(addr,u,char) variant 0>: fill(num,max 256,?)
fill(addr,u,char) variant: fill(ptr,7,ptr)
fill(addr,u,char) variant: fill(anything,7,0)
fill(addr,u,char) variant: fill(ptr,7,no ptr)
fill(addr,u,char) variant: fill(no ptr,7,ptr)
fill(addr,u,char) variant: fill(num,3*__TMP_X (max 767),ptr)
fill(addr,u,char) variant: fill(num,3*eval(($2)/3) (max 767),no ptr)
fill(addr,u,char) variant: fill(?,max 513,ptr)
fill(addr,u,char) variant: fill(?,max 513,no ptr)
fill(addr,u,char) variant 0>0: fill(0x??00,5*256,hi(addr))
fill(addr,u,char) variant >0: fill(num,5*eval($2/5) (max 1280),?)
fill(addr,u,char) variant >0: fill(num,5*__TMP_X-2 (max 1280),?)
fill(addr,u,char) variant: fill(num,5*__TMP_X (max 767),ptr)
fill(addr,u,char) variant: fill(num,5*__TMP_X (max 767),no ptr)
fill(addr,u,char) variant: fill(0x??00,4*256,?)
fill(addr,u,char) variant: fill(0x??00,4*256,ptr)
fill(addr,u,char) variant: fill(0x??00,4*256,no ptr)
fill(addr,u,char) variant >0: fill(no ptr,4*384 (no limit),?)
fill(addr,u,char) variant: fill(0x??00,6*256,?)
fill(addr,u,char) variant: fill(?,6*eval(($2)/6)(max 1536),ptr)
fill(addr,u,char) variant: fill(?,6*eval(($2)/6)(max 1536),no ptr)
fill(addr,u,char) variant >0: fill(no ptr,4*512 (no limit),?)
fill(addr,u,char) variant: fill(0x??00,7*256,?)
fill(addr,u,char) variant >0: fill(no ptr,4*512 (no limit),?)
fill(addr,u,char) variant: fill(0x??00,8*256,?)
fill(addr,u,char) variant: fill(?,max 1027,ptr)
fill(addr,u,char) variant: fill(?,max 1027,no ptr)
fill(addr,u,char) variant: fill(0x??00,n*6*256,?)
fill(addr,u,char) variant >0: fill(no ptr,4*__TMP_X (no limit),?)
fill(addr,u,char) variant 0>: fill(no ptr,4*__TMP_X (no limit),?)
fill(addr,u,char) variant: fill(ptr,4*eval(__TMP_X) (no limit),?)
fill(addr,u,char) variant: fill(no ptr,4*eval(__TMP_X) (no limit),?)
fill(addr,u,char) variant 0>: fill(no ptr,no limit,?)
fill(addr,u,char) default variant: fill(ptr,?,?)
fill(addr,u,char) default variant: fill(no ptr,?,?)
Z tohoto ukazi uz jen posledni, jednu z nejhnusnejsich variant, ale stale lepsi nez LDIR. Tu predpredposledni "variant 0>: fill(no ptr,no limit,?)".
Specialni podminka je, ze zaciname na nulovem ofestu. Chceme napsat stejne velky kod jako s LDIR ale rychlejsi.
Pocitadlo staci jen na segmenty, protoze budeme sestupne nastavovat adresy od konce rozsahu.
Prvne se nastavi neuplny segment a pak ty cele pod nim.
Do smycky se nam vleze zmena jen 2 bajtu. To je 6 bajtu kodu i se skokem. Mala vyhoda je, ze to nedelame pres djnz takze misto 13 taku bude 12 taktu pro relativni skok a ve smycce nikdy neprelezame segment, takze zadne 16 bitove dec, coz setri 2 takty pro kazde dec.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000,2142,xx)'
;[17:36558] 0x5000 2142 xx fill fill(addr,u,char) variant 0>: fill(no ptr,no limit,?)
push HL ; 1:11 0x5000 2142 xx fill 0x5000..0x585D
ld HL, 0x575E ; 3:10 0x5000 2142 xx fill HL = addr+u
ld BC, 0x0900+xx ; 3:10 0x5000 2142 xx fill B = 9x, C = char
dec L ; 1:4 0x5000 2142 xx fill
ld (HL),C ; 1:7 0x5000 2142 xx fill
dec L ; 1:4 0x5000 2142 xx fill
ld (HL),C ; 1:7 0x5000 2142 xx fill
jr nz, $-4 ; 2:7/12 0x5000 2142 xx fill
dec H ; 1:4 0x5000 2142 xx fill
djnz $-7 ; 2:13/8 0x5000 2142 xx fill
pop HL ; 1:10 0x5000 2142 xx fill
; seconds: 0 ;[17:87]
dworkin@dw-A15:~/Programovani/ZX/Forth/Automatic$ ../check_word.sh 'PUSH3_FILL(0x5000,2141,xx)'
;[18:36531] 0x5000 2141 xx fill fill(addr,u,char) variant 0>: fill(no ptr,no limit,?)
push HL ; 1:11 0x5000 2141 xx fill 0x5000..0x585C
ld HL, 0x575C ; 3:10 0x5000 2141 xx fill HL = addr+u
ld BC, 0x0900+xx ; 3:10 0x5000 2141 xx fill B = 9x, C = char
ld (HL),C ; 1:7 0x5000 2141 xx fill
dec L ; 1:4 0x5000 2141 xx fill
ld (HL),C ; 1:7 0x5000 2141 xx fill
dec L ; 1:4 0x5000 2141 xx fill
ld (HL),C ; 1:7 0x5000 2141 xx fill
jr nz, $-4 ; 2:7/12 0x5000 2141 xx fill
dec H ; 1:4 0x5000 2141 xx fill
djnz $-7 ; 2:13/8 0x5000 2141 xx fill
pop HL ; 1:10 0x5000 2141 xx fill
; seconds: 0 ;[18:94]