Predelal jsem rekurzivni smycky pokud prekladac nezna STOP hodnotu, protoze si ji taha ze stacku.
Da se rici ze jsem celkove zkratil kod a i zrychlil na jeden pruchod smyckou za cenu toho ze na zacatku je delsi a komplikovanejsi DO slovo. Je to stejny princip jako jsem delal u smycek kde znam vsechny hodnoty a kde "LOOP" uklada aktualizovany index az po zpetnem skoku na konec "DO".
Jen je to komplikovanejsi v tom ze pokud znam vse tak si musim ukladat jen "index" a ted za nim musim ukladat i "stop" hodnotu. Takze me stinove HL (ktere drzi index emulovaneho zasobniku pro RAS) ma ted pri navratu do DO ruzne hodnoty.
[HL] = lo index
[HL+1] = hi index
[HL+2] = lo stop
[HL+3] = hi stop
Predtim to vracelo HL zvysene o 1 ted je to bud o 2 a nebo o 3, podle toho zda uz u lo stop nezjistime ze muzeme smycku opakovat.
"DO" provadi ukladani hodnot, kde prvne ulozi "hi stop" pak "lo stop" a pak se ma provest ta spolecna/opakovana cast kdy se uklada prvne "hi index" a pak "lo index" a HL se dostava na puvodni hodnotu.
Ale pri tom skoku z "LOOP" nechci opakovane ukladat "lo stop" takze v tom "DO" udelam neco navic..
Kód:
HL--
[HL] = hi stop
HL--
[HL] = lo stop
HL++
skok_pri_hl_plus_3: ; [hl] ukazuje na hi stop
HL--
skok_pri_hl_plus_2: ; [hl] ukazuje na lo stop
HL--
[HL] = hi index
HL--
[HL] = lo index
Cele se to jeste vic komplikuje tim ze musim prevadet hodnoty z HL(tos), DE(nos) do stinovych registru a zaroven do novych TOS a NOS nacist co je za tim. Jedna hodnota je jeste v pohode, to se da udelat pres EX (SP),HL ale jak jsou dve tak prvni blokuje druhou. Takze se musi bud kopirovat do BC nebo to udelat 2x, coz se ukazuje vyhodnejsi protoze 2x "exx" je levne. Stejne jako 2x "ld reg8, reg8".
Puvodni +1 smycka
Kód:
dworkin@dw-A15:~/Programovani/ZX/M4_FORTH-Version-2023-7-23-/M4$ ../check_word.sh 'DO(R) LOOP'
;[15:116] do_101(r) ( stop index -- ) ( R: -- stop index )
ex (SP),HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
do101: ; do_101(r)
exx ; 1:4 loop_101(r)
ld E,(HL) ; 1:7 loop_101(r)
inc L ; 1:4 loop_101(r)
ld D,(HL) ; 1:7 loop_101(r) DE = index
inc HL ; 1:6 loop_101(r)
inc DE ; 1:6 loop_101(r) index++
ld A,(HL) ; 1:7 loop_101(r)
xor E ; 1:4 loop_101(r) lo(index ^ stop)
jr nz, $+8 ; 2:7/12 loop_101(r)
ld A, D ; 1:4 loop_101(r)
inc L ; 1:4 loop_101(r)
xor (HL) ; 1:7 loop_101(r) hi(index ^ stop)
jr z, leave101 ; 2:7/12 loop_101(r) exit
dec L ; 1:4 loop_101(r)
dec HL ; 1:6 loop_101(r)
ld (HL), D ; 1:7 loop_101(r)
dec L ; 1:4 loop_101(r)
ld (HL), E ; 1:7 loop_101(r)
exx ; 1:4 loop_101(r)
jp do101 ; 3:10 loop_101(r)
leave101: ; loop_101(r)
inc HL ; 1:6 loop_101(r)
exx ; 1:4 loop_101(r)
exit101: ; loop_101(r)
; seconds: 1 ;[41:242]
Nove +1 smycka
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO(R) LOOP'
;[19:132] do_101(r) ( stop index -- ) ( R: -- stop index )
ex [SP],HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
exx ; 1:4 do_101(r)
inc L ; 1:4 do_101(r)
do101save1: ; do_101(r) R:( stop index -- stop index )
dec L ; 1:4 do_101(r)
do101save2: ; do_101(r)
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
;[19:90] loop_101(r) ( R: stop index -- stop index )
exx ; 1:4 loop_101(r)
ld E,[HL] ; 1:7 loop_101(r)
inc L ; 1:4 loop_101(r)
ld D,[HL] ; 1:7 loop_101(r) DE = index
inc HL ; 1:6 loop_101(r)
inc DE ; 1:6 loop_101(r) index++
ld A,[HL] ; 1:7 loop_101(r)
xor E ; 1:4 loop_101(r) lo(index ^ stop)
jp nz, do101save2 ; 3:10 loop_101(r)
ld A, D ; 1:4 loop_101(r)
inc L ; 1:4 loop_101(r)
xor [HL] ; 1:7 loop_101(r) hi(index ^ stop)
jp nz, do101save1 ; 3:10 loop_101(r)
leave101: ; loop_101(r)
inc HL ; 1:6 loop_101(r)
exx ; 1:4 loop_101(r)
exit101: ; loop_101(r)
; seconds: 1 ;[38:222]
Puvodni -1 smycka
Kód:
dworkin@dw-A15:~/Programovani/ZX/M4_FORTH-Version-2023-7-23-/M4$ ../check_word.sh 'DO(R) PUSH(-1) ADDLOOP'
;[15:116] do_101(r) ( stop index -- ) ( R: -- stop index )
ex (SP),HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
do101: ; do_101(r)
exx ; 1:4 -1 +loop_101(r)
ld E,(HL) ; 1:7 -1 +loop_101(r)
inc L ; 1:4 -1 +loop_101(r)
ld D,(HL) ; 1:7 -1 +loop_101(r) DE = index
inc HL ; 1:6 -1 +loop_101(r)
ld A,(HL) ; 1:7 -1 +loop_101(r)
xor E ; 1:4 -1 +loop_101(r) lo index - stop
jr nz, $+8 ; 2:7/12 -1 +loop_101(r)
inc L ; 1:4 -1 +loop_101(r)
ld A,(HL) ; 1:7 -1 +loop_101(r)
xor D ; 1:4 -1 +loop_101(r) hi index - stop
jr z, leave101 ; 2:7/12 -1 +loop_101(r) exit
dec L ; 1:4 -1 +loop_101(r)
dec HL ; 1:6 -1 +loop_101(r)
dec DE ; 1:6 -1 +loop_101(r) index--
ld (HL), D ; 1:7 -1 +loop_101(r)
dec L ; 1:4 -1 +loop_101(r)
ld (HL), E ; 1:7 -1 +loop_101(r)
exx ; 1:4 -1 +loop_101(r)
jp do101 ; 3:10 -1 +loop_101(r)
leave101: ; -1 +loop_101(r)
inc HL ; 1:6 -1 +loop_101(r)
exx ; 1:4 -1 +loop_101(r)
exit101: ; -1 +loop_101(r)
; seconds: 0 ;[41:242]
Nove -1 smycka je o neco slozitejsi nez +1 smycka, protoze snizuji STOP o 1 uz v DO, abych mohl testovat konec az PO snizeni "indexu" a mohl tak snadno skakat uz po testu "low" casti.
Tohle se musi vsude ohlidat ze to bude pasovat s jakymkoliv LOOP (ze vi ze STOP je snizen).
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO(R) PUSH(-1) ADDLOOP'
;[20:138] do_101(r) ( stop index -- ) ( R: -- stop-1 index )
ex [SP],HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec DE ; 1:6 do_101(r) DE = stop-1
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
exx ; 1:4 do_101(r)
inc L ; 1:4 do_101(r)
do101save1: ; do_101(r) R:( stop-1 index -- stop-1 index )
dec L ; 1:4 do_101(r)
do101save2: ; do_101(r)
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
;[19:90] -1 +loop_101(r) ( R: stop-1 index -- stop-1 index )
exx ; 1:4 -1 +loop_101(r)
ld E,[HL] ; 1:7 -1 +loop_101(r)
inc L ; 1:4 -1 +loop_101(r)
ld D,[HL] ; 1:7 -1 +loop_101(r) DE = index
inc HL ; 1:6 -1 +loop_101(r)
dec DE ; 1:6 -1 +loop_101(r) index--
ld A,[HL] ; 1:7 -1 +loop_101(r)
xor E ; 1:4 -1 +loop_101(r) lo8(--index ^ --stop)
jp nz, do101save2 ; 3:10 -1 +loop_101(r)
inc L ; 1:4 -1 +loop_101(r)
ld A,[HL] ; 1:7 -1 +loop_101(r)
xor D ; 1:4 -1 +loop_101(r) hi8(--index ^ --stop)
jp nz, do101save1 ; 3:10 -1 +loop_101(r)
leave101: ; -1 +loop_101(r)
inc HL ; 1:6 -1 +loop_101(r)
exx ; 1:4 -1 +loop_101(r)
exit101: ; -1 +loop_101(r)
; seconds: 1 ;[39:228]
Puvodni s obecnym/neznamym "step"
Kód:
dworkin@dw-A15:~/Programovani/ZX/M4_FORTH-Version-2023-7-23-/M4$ ../check_word.sh 'DO(R) PUSH(step) ADDLOOP'
;[15:116] do_101(r) ( stop index -- ) ( R: -- stop index )
ex (SP),HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
do101: ; do_101(r)
;[38:170] step +loop_101(r)
exx ; 1:4 step +loop_101(r)
ld BC, step ; 3:10 step +loop_101(r) BC = step
ld E,(HL) ; 1:7 step +loop_101(r)
ld A, E ; 1:4 step +loop_101(r)
add A, C ; 1:4 step +loop_101(r)
ld (HL),A ; 1:7 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld D,(HL) ; 1:7 step +loop_101(r) DE = index
ld A, D ; 1:4 step +loop_101(r)
adc A, B ; 1:4 step +loop_101(r)
ld (HL),A ; 1:7 step +loop_101(r)
inc HL ; 1:6 step +loop_101(r)
ld A, E ; 1:4 step +loop_101(r)
sub (HL) ; 1:7 step +loop_101(r)
ld E, A ; 1:4 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld A, D ; 1:4 step +loop_101(r)
sbc A,(HL) ; 1:7 step +loop_101(r)
ld D, A ; 1:4 step +loop_101(r) DE = index-stop
ld A, E ; 1:4 step +loop_101(r)
add A, C ; 1:4 step +loop_101(r)
ld A, D ; 1:4 step +loop_101(r)
adc A, B ; 1:4 step +loop_101(r)
xor D ; 1:4 step +loop_101(r)
jp m, $+10 ; 3:10 step +loop_101(r)
dec L ; 1:4 step +loop_101(r)
dec HL ; 1:6 step +loop_101(r)
dec L ; 1:4 step +loop_101(r)
exx ; 1:4 step +loop_101(r)
jp do101 ; 3:10 step +loop_101(r) ( -- ) R:( stop index -- stop index+step )
leave101: ; step +loop_101(r)
inc HL ; 1:6 step +loop_101(r)
exx ; 1:4 step +loop_101(r) ( -- ) R:( stop index -- )
exit101: ; step +loop_101(r)
; seconds: 0 ;[53:286]
Nova varianta s neznamym "step". Mimochodem tady jsem se na dlouho zasekl jak to zapsat, protoze jsem delal neustale chyby...
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO(R) PUSH(step) ADDLOOP'
;[19:132] do_101(r) ( stop index -- ) ( R: -- stop index )
ex [SP],HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
exx ; 1:4 do_101(r)
inc L ; 1:4 do_101(r)
do101save1: ; do_101(r) R:( stop index -- stop index )
dec L ; 1:4 do_101(r)
do101save2: ; do_101(r)
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
;[28:138] step +loop_101(r)
exx ; 1:4 step +loop_101(r)
ld E,[HL] ; 1:7 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld D,[HL] ; 1:7 step +loop_101(r) DE = index
inc HL ; 1:6 step +loop_101(r)
ld C,[HL] ; 1:7 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld B,[HL] ; 1:7 step +loop_101(r) BC = stop
ex DE, HL ; 1:4 step +loop_101(r)
or A ; 1:4 step +loop_101(r)
sbc HL, BC ; 2:15 step +loop_101(r) HL = index-stop
ld A, low step ; 2:7 step +loop_101(r) lo8(step)
add A, L ; 1:4 step +loop_101(r)
ld L, A ; 1:4 step +loop_101(r)
ld A, high step ; 2:7 step +loop_101(r) hi8(step)
adc A, H ; 1:4 step +loop_101(r)
ld H, A ; 1:4 step +loop_101(r) HL = index-stop+step
sbc A, A ; 1:4 step +loop_101(r) save carry to sign
add HL, BC ; 1:11 step +loop_101(r) HL = index+step
ex DE, HL ; 1:4 step +loop_101(r)
if (((step) & 0x8000) = 0)
jp p, do101save1 ; 3:10 step +loop_101(r)
else
jp m, do101save1 ; 3:10 step +loop_101(r)
endif
leave101: ; step +loop_101(r)
inc HL ; 1:6 step +loop_101(r)
exx ; 1:4 step +loop_101(r) ( -- ) R:( stop index -- )
exit101: ; step +loop_101(r)
; seconds: 1 ;[50:280]
To same jen znam pocatek, puvodni varianta
Kód:
dworkin@dw-A15:~/Programovani/ZX/M4_FORTH-Version-2023-7-23-/M4$ ../check_word.sh 'PUSH(begin) DO(R) PUSH(step) ADDLOOP'
;[15:95] begin do_101(r) ( stop begin -- ) ( R: -- stop begin )
ex (SP),HL ; 1:19 begin do_101(r)
exx ; 1:4 begin do_101(r)
pop DE ; 1:10 begin do_101(r) DE = stop
dec HL ; 1:6 begin do_101(r)
ld (HL),D ; 1:7 begin do_101(r)
dec L ; 1:4 begin do_101(r)
ld (HL),E ; 1:7 begin do_101(r)
dec HL ; 1:6 begin do_101(r)
ld (HL),high begin ; 2:10 begin do_101(r) hi index
dec L ; 1:4 begin do_101(r)
ld (HL),low begin ; 2:10 begin do_101(r) lo index
exx ; 1:4 begin do_101(r)
ex DE, HL ; 1:4 begin do_101(r)
do101: ; begin do_101(r)
;[38:170] step +loop_101(r)
exx ; 1:4 step +loop_101(r)
ld BC, step ; 3:10 step +loop_101(r) BC = step
ld E,(HL) ; 1:7 step +loop_101(r)
ld A, E ; 1:4 step +loop_101(r)
add A, C ; 1:4 step +loop_101(r)
ld (HL),A ; 1:7 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld D,(HL) ; 1:7 step +loop_101(r) DE = index
ld A, D ; 1:4 step +loop_101(r)
adc A, B ; 1:4 step +loop_101(r)
ld (HL),A ; 1:7 step +loop_101(r)
inc HL ; 1:6 step +loop_101(r)
ld A, E ; 1:4 step +loop_101(r)
sub (HL) ; 1:7 step +loop_101(r)
ld E, A ; 1:4 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld A, D ; 1:4 step +loop_101(r)
sbc A,(HL) ; 1:7 step +loop_101(r)
ld D, A ; 1:4 step +loop_101(r) DE = index-stop
ld A, E ; 1:4 step +loop_101(r)
add A, C ; 1:4 step +loop_101(r)
ld A, D ; 1:4 step +loop_101(r)
adc A, B ; 1:4 step +loop_101(r)
xor D ; 1:4 step +loop_101(r)
jp m, $+10 ; 3:10 step +loop_101(r)
dec L ; 1:4 step +loop_101(r)
dec HL ; 1:6 step +loop_101(r)
dec L ; 1:4 step +loop_101(r)
exx ; 1:4 step +loop_101(r)
jp do101 ; 3:10 step +loop_101(r) ( -- ) R:( stop index -- stop index+step )
leave101: ; step +loop_101(r)
inc HL ; 1:6 step +loop_101(r)
exx ; 1:4 step +loop_101(r) ( -- ) R:( stop index -- )
exit101: ; step +loop_101(r)
; seconds: 1 ;[53:265]
Nova varianta kdyz znam pocatek
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(begin) DO(R) PUSH(step) ADDLOOP'
;[18:107] begin do_101(r) ( stop -- ) ( R: -- stop index )
ex [SP],HL ; 1:19 begin do_101(r)
ex DE, HL ; 1:4 begin do_101(r)
exx ; 1:4 begin do_101(r)
pop DE ; 1:10 begin do_101(r) DE = stop
dec HL ; 1:6 begin do_101(r)
ld [HL],D ; 1:7 begin do_101(r)
dec L ; 1:4 begin do_101(r)
ld [HL],E ; 1:7 begin do_101(r)
ld DE,begin ; 3:10 begin do_101(r) DE = index
inc L ; 1:4 begin do_101(r)
do101save1: ; begin do_101(r) R:( stop index -- stop index )
dec L ; 1:4 begin do_101(r)
do101save2: ; begin do_101(r)
dec HL ; 1:6 begin do_101(r)
ld [HL],D ; 1:7 begin do_101(r)
dec L ; 1:4 begin do_101(r)
ld [HL],E ; 1:7 begin do_101(r)
exx ; 1:4 begin do_101(r)
;[28:138] step +loop_101(r)
exx ; 1:4 step +loop_101(r)
ld E,[HL] ; 1:7 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld D,[HL] ; 1:7 step +loop_101(r) DE = index
inc HL ; 1:6 step +loop_101(r)
ld C,[HL] ; 1:7 step +loop_101(r)
inc L ; 1:4 step +loop_101(r)
ld B,[HL] ; 1:7 step +loop_101(r) BC = stop
ex DE, HL ; 1:4 step +loop_101(r)
or A ; 1:4 step +loop_101(r)
sbc HL, BC ; 2:15 step +loop_101(r) HL = index-stop
ld A, low step ; 2:7 step +loop_101(r) lo8(step)
add A, L ; 1:4 step +loop_101(r)
ld L, A ; 1:4 step +loop_101(r)
ld A, high step ; 2:7 step +loop_101(r) hi8(step)
adc A, H ; 1:4 step +loop_101(r)
ld H, A ; 1:4 step +loop_101(r) HL = index-stop+step
sbc A, A ; 1:4 step +loop_101(r) save carry to sign
add HL, BC ; 1:11 step +loop_101(r) HL = index+step
ex DE, HL ; 1:4 step +loop_101(r)
if (((step) & 0x8000) = 0)
jp p, do101save1 ; 3:10 step +loop_101(r)
else
jp m, do101save1 ; 3:10 step +loop_101(r)
endif
leave101: ; step +loop_101(r)
inc HL ; 1:6 step +loop_101(r)
exx ; 1:4 step +loop_101(r) ( -- ) R:( stop index -- )
exit101: ; step +loop_101(r)
; seconds: 1 ;[49:255]
atd. Je toho mnohem vic. Nebudu to ukazovat vsechno.
Puvodni test na rekurzivni smycky byl velky po kompilaci 29208 bajtu. Nove je to 28140 bajtu.
PS: Cilem je to dostat do stavu kdy budu moci pouzit casto pouzivane slovo "DO I" a diky tomu ze "DO" ted uklada aktualizovany "index" to bude o dost snazsi.
Puvodni:
Kód:
dworkin@dw-A15:~/Programovani/ZX/M4_FORTH-Version-2023-7-23-/M4$ ../check_word.sh 'DO(R) I'
;[15:116] do_101(r) ( stop index -- ) ( R: -- stop index )
ex (SP),HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
dec HL ; 1:6 do_101(r)
ld (HL),D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld (HL),E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
do101: ; do_101(r)
; i_101(r) ( -- i )
;[9:64] i_101(r) ( -- i ) ( R: i -- i )
exx ; 1:4 i_101(r)
ld E,(HL) ; 1:7 i_101(r)
inc L ; 1:4 i_101(r)
ld D,(HL) ; 1:7 i_101(r)
dec L ; 1:4 i_101(r)
push DE ; 1:11 i_101(r)
exx ; 1:4 i_101(r)
ex DE, HL ; 1:4 i_101(r)
ex (SP), HL ; 1:19 i_101(r)
; seconds: 0 ;[24:180]
Nove je to diky komplikovanejsimu DO delsi:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO(R) I'
;[19:132] do_101(r) ( stop index -- ) ( R: -- stop index )
ex [SP],HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
exx ; 1:4 do_101(r)
inc L ; 1:4 do_101(r)
do101save1: ; do_101(r) R:( stop index -- stop index )
dec L ; 1:4 do_101(r)
do101save2: ; do_101(r)
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
exx ; 1:4 do_101(r)
; i_101(r) ( -- i )
;[9:64] i_101(r) ( -- i ) ( R: i -- i )
exx ; 1:4 i_101(r)
ld E,[HL] ; 1:7 i_101(r)
inc L ; 1:4 i_101(r)
ld D,[HL] ; 1:7 i_101(r)
dec L ; 1:4 i_101(r)
push DE ; 1:11 i_101(r)
exx ; 1:4 i_101(r)
ex DE, HL ; 1:4 i_101(r)
ex [SP], HL ; 1:19 i_101(r)
; seconds: 1 ;[28:196]
ale umozni me to predelat na
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO(R) I'
;[19:132] do_101(r) ( stop index -- ) ( R: -- stop index )
ex [SP],HL ; 1:19 do_101(r)
push DE ; 1:11 do_101(r)
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r) DE = stop
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
pop DE ; 1:10 do_101(r) DE = index
exx ; 1:4 do_101(r)
pop DE ; 1:10 do_101(r)
exx ; 1:4 do_101(r)
inc L ; 1:4 do_101(r)
do101save1: ; do_101(r) R:( stop index -- stop index )
dec L ; 1:4 do_101(r)
do101save2: ; do_101(r)
dec HL ; 1:6 do_101(r)
ld [HL],D ; 1:7 do_101(r)
dec L ; 1:4 do_101(r)
ld [HL],E ; 1:7 do_101(r)
push DE ; 1:11 do_101(r) !!!
exx ; 1:4 do_101(r)
ex DE, HL ; 1:4 i_101(r)
ex [SP], HL ; 1:19 i_101(r)
;[22:166]