Pokračování článku o loaderech na ZX Spectru. Držte si klobouky a vytáhněte kalkulačky, pojedeme z kopce!

Minule jsem skončil s tím, že příště bude potřeba počítat a vážit každý takt. Naším spojencem nejbližším bude tentokrát čekací smyčka v rutině LD_EDGE_1. Připomeňme si ji:

LD_EDGE_2:        
          CALL    LD_EDGE_1 ;Zde se v podstatě volá ještě jednou LD_EDGE_1 a
          RET     NC ;návrat pokud došlo k chybě.
LD_EDGE_1:        
          LD      A,$16 ;7T
LD_DELAY:         
          DEC     A ;4T
          JR      NZ,LD_DELAY ;12T / 7T
          AND     A ;4T
 
LD_SAMPLE:       
          ......

Vidíte ji tam u LD_DELAY? Ano? Tak to je ona! Zabere 7T + 21*(4T+12T) + (4T+7T) = 354T, což je docela dost taktů na to, aby se v nich dalo něco rozumně dělat. Co třeba? No, nejčastěji nějaké počítadlo toho, kolik ještě zbývá nahrát.

Grafický ukazatel

U textovky Poradce jsem použil, kromě děsivého blikání, taky jakýsi „teploměr“, který ukazoval, kolik ještě zbývá nahrát. Je to takové to vlevo…

Tenhle efekt je jednodušší, než byste možná čekali. Délka sloupečku je téměř přesně „délka souboru / 512“ (píšu „téměř přesně“, protože jsem ho tehdy namaloval o kousek kratší…) Takže si vezmu vyšší bajt zbývajícího počtu bajtů (ten je ve dvojici registrů DE), vydělím dvěma, přičtu offset odspodu obrazovky, převedu si souřadnici na adresu v obrazovce a daný bajt maskuju s hodnotou %11100111 – tedy vše zůstává, jen dva body uprostřed, které jsou shodou okolností zrovna ten „teploměr“, se umáznou. K přepočtu použiju dokonce rutinu PIXEL-ADD ($22AA) z ROMky Spectra, která vezme souřadnice v B a C (stejný souřadný systém jako má PLOT) a z nich spočítá adresu na obrazovce (HL) a masku bodu (A).

LD_EDGE_2:        
          CALL    LD_EDGE_1 
          RET     NC 
LD_EDGE_1:        
          JP      LD_OWN 
LD_BACK:          
          LD      A,03 ;7T
LD_DELAY:         
          DEC     A ;4T
          JR      NZ,LD_DELAY ;12T/7T
                  ;7T + 2*(4+12) + (4+7) = 50T
          AND     A 
LD_SAMPLE:        
          INC     B 
          RET     Z 
          LD      A,7f 
          IN      A,(fe) 
          RRA     
          RET     NC 
          XOR     C 
          AND     20 
          JR      Z,LD_SAMPLE 
          LD      A,C 
          CPL     
          LD      C,A 
          LD      A,06 
          RRCA    
          AND     07 
          OR      08 
          OUT     (fe),A 
          SCF     
          RET     

LD_OWN:           
          PUSH    DE ;11T
          PUSH    HL ;11T
          PUSH    BC ;11T
          PUSH    AF ;11T
          LD      B,D ;4T
          SRL     B ;8T
          NOP     ;4T
          INC     B ;4T
          INC     B ;4T
          LD      C,00 ;7T
          CALL    22aa ;17T + 132T rutina
          LD      A,(HL) ;7T
          AND     e7 ;7T
          LD      (HL),A ;7T
          POP     AF ;10T
          POP     BC ;10T
          POP     HL ;10T
          POP     DE ;10T
          JP      LD_BACK ;10T

Jak vidíte, zasáhnul jsem do časovací smyčky tak, že na začátek jsem si odskočil do vlastní rutiny pro obsluhu onoho efektu (i s odskokem to je 305T), a po návratu mám ještě stále dost času, takže si počkám dalších 50T, což dává výsledných 355T, a to je skoro přesně to naše Magické Číslo!

Číselný ukazatel

Pokud chcete ukazovat místo nějakého ubývajícího sloupečku raději číslo, bude to náročnější. Každá číslice se totiž musí vykreslit na obrazovku, což je osm zápisů na každou číslici, při trojmístném počítadle to je už docela hodně, to se do 354T nevejde. Musíte proto rozsekat algoritmus na části, které se do tohoto časového limitu vejdou, a postupně je volat. Neocenitelným pomocníkem vám bude druhá sada registrů a indexregistr IY.

Velmi pěkná počítadla měly hry od Hewson a české programy od Universum (tuším), používaly vlastní font a měly i efekt přetáčení číslic. Já jsem u další textovky měl jen prosté počítání „počtu bajtů / 64“, což se mi pro 48kB blok vejde stále do tří číslic. Na začátku jsem si požadované číslice připravil (desítkově!) do registrů D a E (resp. do těch zrcadlových):

PUSH    DE 
          EXX     
          POP     HL 
          LD      DE,00 
          LD      BC,$40
LD_DIV:          
          AND     A 
          SBC     HL,BC 
          JR      C,b0be 
          LD      A,E 
          ADD     A,01 
          DAA     
          LD      E,A 
          LD      A,D 
          ADC     A,00 
          DAA     
          LD      D,A 
          JR      LD_DIV 
LD_DIV2:          
          LD      H,3d 
          LD      BC,4001 
          EXX     
          LD      IY, LD_CHARS ; bude dal...

Efekt neprobíhal přímo v LD_EDGE, ale v LD_8_BITS. I když LD_EDGE bylo upravené tak, aby používalo při načítání bajtů výrazně jiné časovací hodnoty:

LD      B,b0 
          LD      L,01 
LD_8_BITS:        
          CALL    LD_EDGE_2M
          RET     NC 
          LD      A,d4 
          CP      B 
          RL      L 
          LD      B,b0 
          JP      NC,LD_LONGWAY 
          LD      A,H 
          XOR     L 
          LD      H,A 
;... zbytek normálně...

;LD_EDGE_2M : 468 + 58 * B
;zkraceno o 462T
LD_EDGE_2M:       
          CALL    LD_EDGE_1M 
          RET     NC 
          LD      A,10 
          DEC     A 
          JR      NZ,b157 ;  254T
LD_EDGE_1M:       
          AND     A 
          INC     B 
          RET     Z 
          LD      A,7f 
          IN      A,(fe) 
          RRA     
          XOR     C 
          AND     20 
          JR      Z,b15b 
          LD      A,C 
          CPL     
          LD      C,A 
          AND     04 
          OR      08 
          OUT     (fe),A 
          SCF     
          RET     


Samotný efekt se pak odehrával takto:

LD_LONGWAY:       
          EXX     
          DEC     C 
          JP      Z,LD_SUB1 
          JP      (IY) 

LD_RETHERE:       
          POP     IY 
          EXX     
          JP      LD_8_BITS 

LD_SUB1:          
          LD      C,07 
          DEC     B 
          JP      Z,LD_SUB2 
          LD      A,04 
          DEC     A 
          JR      NZ,b1a9 ;wait 59T
          EXX     
          JP      LD_8_BITS 

LD_SUB2:          
          LD      A,E 
          SUB     01 
          DAA     
          LD      E,A 
          LD      A,D 
          SBC     A,B ;v B je 0
          DAA     
          LD      D,A 
          LD      B,$40 
          LD      IY,LD_CHARS 
          LD      HL,$3d00 
          EXX     
          JP      LD_8_BITS 

                  ;1. cislice
LD_CHARS:         
          LD      A,E 
          ADD     A,A 
          ADD     A,A 
          ADD     A,A 
          OR      $81 
          LD      L,A 
          LD      A,(HL) 
          LD      (50fd),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (51fd),A 
          INC     L 
          LD      A,(HL) 
          LD      (52fd),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (53fd),A 
          INC     L 
          LD      A,(HL) 
          LD      (54fd),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (55fd),A 
          INC     L 
          LD      A,(HL) 
          LD      (56fd),A 
          CALL    LD_RETHERE 

                  ;2. cislo
          LD      A,E 
          AND     $f0 
          RRA     
          OR      $81 
          LD      L,A 
          LD      A,(HL) 
          LD      (50fc),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (51fc),A 
          INC     L 
          LD      A,(HL) 
          LD      (52fc),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (53fc),A 
          INC     L 
          LD      A,(HL) 
          LD      (54fc),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (55fc),A 
          INC     L 
          LD      A,(HL) 
          LD      (56fc),A 
          CALL    LD_RETHERE 

                  ;3. cislo
          LD      A,D 
          ADD     A,A 
          ADD     A,A 
          ADD     A,A 
          OR      $81 
          LD      L,A 
          LD      A,(HL) 
          LD      (50fb),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (51fb),A 
          INC     L 
          LD      A,(HL) 
          LD      (52fb),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (53fb),A 
          INC     L 
          LD      A,(HL) 
          LD      (54fb),A 
          CALL    LD_RETHERE 
          INC     L 
          LD      A,(HL) 
          LD      (55fb),A 
          INC     L 
          LD      A,(HL) 
          LD      (56fb),A 
          LD      (56fb),A 
          NOP     
          LD      IY,LD_CHARS 
          EXX     
          JP      LD_8_BITS 

 

K tomu samozřejmě pár vysvětlivek:

V registrech DE je vlastní počítadlo, uložené v BCD kódování. V registru C je počítadlo bitů, v registru B počítadlo bajtů. Jakmile dopočítají do nuly, proběhne snížení počítadla o 1, úprava výsledku instrukcí DAA a příprava na samotný tisk znaků. Do HL je uložena hodnota $3D00, což je shodou okolností adresa ROM, kde jsou uloženy číslice, a do IY je uložena adresa rutiny LD_CHARS, která číslice vykresluje.

Když rozsekáte rutinu na kousky, máte dvě možnosti. Buď upravujete kód a přepisujete adresu, kam se má příště skočit, nebo si adresu uchováváte nějak jinak. Tady to je v registru IY. Jednoduchým trikem CALL LD_RETHERE (Jako že RET HERE, vrať se sem) skočíte zpátky do LD_8_BITS, a zároveň se návratová adresa dostane do IY, takže při příštím volání bude JP (IY) směřovat na další kousek. Všimněte si, že tisk znaků je právě voláním LD_RETHERE rozsekán na malé kousky.

Ukazatel času a další

Když počítáte čas, je to složitější než počítat bajty. Musíte totiž buď počítat každý bit jinak (jedničkový je dvakrát tak delší než nulový), anebo využít přerušení (ano, přerušení v loaderu!)

Hledal jsem ukázku toho prvního přístupu, ale než jsem ji stihnul okomentovat, ozval se mi Busy, že našel zdroják svého loaderu k Overscanu, a jestli bych ho nechtěl publikovat. Takže s Busyho laskavým svolením: Overscan loader!

(Počítání času i grafické efekty jsou v ceně!)

A tady je zdroják i s Busyho komentáři (Díky!) Protože to je dlouhé, tak se s vámi rozloučím už zde a popřeju hodně zdaru při vlastním experimentování.

5b00            *a
5b00            *s
5b00            ;==============================================================;
5b00            ;== Verzia 16 == Loader pre Overscan == 12.08.1991 Busy soft ==;
5b00            ;==============================================================;
5b00            znaky  =    #8800	Modifikovany znakovy font
5b00                   org  #8200,0
8200 f3         p      di
8201 310082            ld   sp,p
8204 fd217f00          ld   iy,#7f	Inicializacia casovacov pre cas a auto kitt
8208 210080            ld   hl,#8000	Inicializacia IM2 vektora
820b 110180            ld   de,#8001
820e 011001            ld   bc,#0110
8211 3681              ld   (hl),#81
8213 edb0              ldir
8215 212183            ld   hl,rut	Presun obsluznej rutinky IM2
8218 118181            ld   de,#8181
821b 010800            ld   bc,load-rut
821e edb0              ldir
8220 067f       i      ld   b,#7f
8222 216711            ld   hl,#1167
8225 11d685            ld   de,k
8228 d5                push de
8229 7e         ll14   ld   a,(hl)	Zaplacanie pameti blbostami
822a ad                xor  l		(pre oklamanie nepriatela)
822b 12                ld   (de),a
822c 02                ld   (bc),a
822d a9                xor  c
822e 0b                dec  bc
822f 02                ld   (bc),a
8230 0b                dec  bc
8231 13                inc  de
8232 2b                dec  hl
8233 7c                ld   a,h
8234 b5                or   l
8235 20f2              jr   nz,ll14
8237 e1                pop  hl
8238 012a7a            ld   bc,-k
823b edb0              ldir
823d 3e80       rst    ld   a,#80	Spustenie IM2
823f ed47              ld   i,a
8241 ed5e              im2
8243 fb                ei
8244 cd0c85            call zn		Konverzia znakoveho fontu
8247 3e48              ld   a,#48
8249 32b784            ld   (n20+2),a
824c 210040            ld   hl,#4000	Priprava obrazovky
824f 110140            ld   de,#4001
8252 010018            ld   bc,#1800
8255 71                ld   (hl),c
8256 edb0              ldir
8258 010603            ld   bc,#0306
825b 71                ld   (hl),c
825c edb0              ldir
825e 21a341     o      ld   hl,#41a3	Stvorceky pod kitt efekt
8261 0e06              ld   c,#06
8263 061a       ll11   ld   b,#1a
8265 e5                push hl
8266 367e       ll10   ld   (hl),#7e
8268 2c                inc  l
8269 10fb              djnz ll10
826b e1                pop  hl
826c 24                inc  h
826d 0d                dec  c
826e 20f3              jr   nz,ll11
8270 210059            ld   hl,#5900	Cerveny ramik uprostred
8273 011208            ld   bc,#0812
8276 5d                ld   e,l
8277 73         ll12   ld   (hl),e
8278 2c                inc  l
8279 71                ld   (hl),c
827a 7d                ld   a,l
827b c61d              add  a,#1d
827d 6f                ld   l,a
827e 71                ld   (hl),c
827f 2c                inc  l
8280 73                ld   (hl),e
8281 2c                inc  l
8282 10f3              djnz ll12
8284 21e15a            ld   hl,#5ae1
8287 1e44              ld   e,#44
8289 cd0083            call sap
828c 21e158            ld   hl,#58e1
828f cdfe82            call pas
8292 21015a            ld   hl,#5a01
8295 cdfe82            call pas
8298 215f85            ld   hl,firma	Vypis textov
829b cd0783            call text
829e 217685            ld   hl,demo
82a1 cd0783            call text
82a4 219185            ld   hl,loatim
82a7 cd0783            call text
82aa cd2983            call load		Zavolanie loadera
82ad 08                ex   af,af
82ae af                xor  a
82af cdf884            call out		Border 0
82b2 08                ex   af,af
82b3 3839              jr   c,ok		Ak sa blok nahral dobre tak skok
82b5 af         error  xor  a		Ak nastala chyba pri loade
82b6 210048            ld   hl,#4800	tak vypis oznam
82b9 77         ll13   ld   (hl),a
82ba 23                inc  hl
82bb cb64              bit  4,h
82bd 28fa              jr   z,ll13
82bf 112548            ld   de,#4825
82c2 212515            ld   hl,#1525
82c5 cd0b83            call txt
82c8 21d285            ld   hl,krik
82cb cd0b83            call txt
82ce 21a585            ld   hl,rew
82d1 cd0783            call text
82d4 21b785            ld   hl,reload
82d7 cd0783            call text
82da af                xor  a
82db 32b784            ld   (n20+2),a
82de 06ff       press  ld   b,#ff	Cakanie na stlacenie klavesy
82e0 cdcf83            call mmm		Pocas cakania volame loader
82e3 af                xor  a		aby efekty stale bezali
82e4 dbfe              in   a,(#fe)
82e6 f6e0              or   #e0
82e8 3c                inc  a
82e9 28f3              jr   z,press
82eb c33d82            jp   rst
82ee             
82ee 210058     ok     ld   hl,#5800	Ak sa blok nahral poriadku
82f1 110158            ld   de,#5801	zmazeme vsetky atributy
82f4 0603              ld   b,#03
82f6 edb0              ldir
82f8 cde6c3            call 50150        Dekomprimacia dema
82fb c376e9            jp   59766	Spustenie dema
82fe             
82fe 1e12       pas    ld   e,#12	Nejake pomocne podprogramy
8300 061e       sap    ld   b,#1e	pre kreslenie ramikov
8302 73         pp1    ld   (hl),e
8303 2c                inc  l
8304 10fc              djnz pp1
8306 c9                ret
8307             
8307 5e         text   ld   e,(hl)	Vypis textu
8308 23                inc  hl		HL = adresa textu
8309 56                ld   d,(hl)	DE = pozicia textu na obrazovke
830a 23                inc  hl
830b e5         txt    push hl
830c d5                push de
830d 6e                ld   l,(hl)
830e 2688              ld   h,>znaky
8310 0608              ld   b,#08
8312 7e         xtx    ld   a,(hl)	Vypis jedneho znaku
8313 12                ld   (de),a
8314 14                inc  d
8315 24                inc  h
8316 10fa              djnz xtx
8318 d1                pop  de
8319 e1                pop  hl
831a 1c                inc  e
831b cb7e              bit  7,(hl)	Text konci znakom s nastavenym bit7=1
831d 23                inc  hl
831e 28eb              jr   z,txt
8320 c9                ret
8321             
8321 08         rut    ex   af,af	Rutinka beziaca z prerusenia
8322 fd24              inc  yh		YH = casovac pre kitt efekt
8324 fd2c              inc  yl		YL = casovac pre pocitanie a vypis casu nahravania
8326 08                ex   af,af
8327 fb                ei
8328 c9                ret
8329             
8329 af         load   xor  a		POZOR, tu zacina loader !!
832a cdf884            call out
832d 211f40     rohy   ld   hl,#401f	Vykreslenie useknutych rohov
8330 11ff57            ld   de,#57ff
8333 7b                ld   a,e
8334 77                ld   (hl),a
8335 12                ld   (de),a
8336 d9                exx
8337 010207            ld   bc,#0702
833a 210040            ld   hl,#4000
833d 11e057            ld   de,#57e0
8340 77                ld   (hl),a
8341 12                ld   (de),a
8342 7e         rr1    ld   a,(hl)
8343 24                inc  h
8344 15                dec  d
8345 cb27              sla  a
8347 77                ld   (hl),a
8348 12                ld   (de),a
8349 d9                exx
834a 7e                ld   a,(hl)
834b 24                inc  h
834c 15                dec  d
834d cb3f              srl  a
834f 77                ld   (hl),a
8350 12                ld   (de),a
8351 d9                exx
8352 10ee              djnz rr1
8354            nnn
8354 3ef8       rrr    ld   a,#f8	Chytanie uvodneho tonu
8356 32f484            ld   (xor+1),a
8359 2600              ld   h,#00
835b 06ff       djnz   ld   b,#ff
835d cdcf83            call mmm
8360 25                dec  h
8361 20f8              jr   nz,djnz
8363 cdcf83            call mmm
8366 30ec              jr   nc,nnn
8368 cdcb83            call ppp
836b 30e7              jr   nc,nnn
836d 069c       sss    ld   b,#9c
836f cdcb83            call ppp
8372 30e0              jr   nc,nnn
8374 3ec6              ld   a,#c6
8376 b8                cp   b
8377 30db              jr   nc,rrr
8379 24                inc  h
837a 20f1              jr   nz,sss
837c 3efc              ld   a,#fc
837e 32f484            ld   (xor+1),a
8381 06c9       ttt    ld   b,#c9
8383 cdcf83            call mmm
8386 30cc              jr   nc,nnn
8388 78                ld   a,b
8389 fed4              cp   #d4
838b 30f4              jr   nc,ttt
838d cdcf83            call mmm
8390 d0                ret  nc
8391 79                ld   a,c		Uvodny ton a sync-pulz OK a mozeme loadovat
8392 ee03              xor  #03
8394 4f                ld   c,a
8395 cdb583            call byte         Load flagbajtu
8398 d0                ret  nc
8399             
8399 dd21e6c3   loa    ld   ix,50150	Samotna slucka loadujuca bajty dema
839d 116a24            ld   de,9322
83a0            ;      ld   ix,#4000	Pri testovani efektov v loaderi
83a0            ;      ld   de,#1b00	sa blok nahraval do obrazovky
83a0 cdb583     loa1   call byte
83a3 d0                ret  nc
83a4 dd7500            ld   (ix+#00),l
83a7 dd23              inc  ix
83a9 1b                dec  de
83aa 7a                ld   a,d
83ab b3                or   e
83ac 20f2              jr   nz,loa1
83ae cdb583            call byte          load parity
83b1 d0                ret  nc
83b2 fe01              cp   #01
83b4 c9                ret
83b5             
83b5 06b2       byte   ld   b,#b2	Loadnutie jedneho bajtu
83b7 2e01              ld   l,#01
83b9 cdcb83     loa9   call ppp
83bc d0                ret  nc
83bd 3ecb       kk     ld   a,#cb
83bf b8                cp   b
83c0 cb15              rl   l
83c2 06b0              ld   b,#b0
83c4 30f3              jr   nc,loa9
83c6 7c                ld   a,h
83c7 ad                xor  l
83c8 67                ld   h,a
83c9 37                scf
83ca c9                ret
83cb             
83cb cdcf83     ppp    call mmm		Loadnutie jedneho bitu
83ce d0                ret  nc
83cf d9         mmm    exx		Loadnutie jednej polperiody
83d0 c3                db   #c3		Namiesto cakacej slucky su tu moje speci-rutinky
83d1 ec83       skok   dw   n1		Skok na cast kodu ktora sa prave ma vykonat
83d3             
83d3 7e         n1sub  ld   a,(hl)              /0
83d4 81                add  a,c		Prepocet casoveho udaja
83d5 fe0a              cp   #0a
83d7 0e00              ld   c,#00
83d9 3802              jr   c,n1aa
83db 0c                inc  c
83dc af                xor  a
83dd 77         n1aa   ld   (hl),a
83de 23                inc  hl                  \50
83df 7e                ld   a,(hl)
83e0 81                add  a,c
83e1 fe06              cp   #06
83e3 0e00              ld   c,#00
83e5 3802              jr   c,n1bb
83e7 0c                inc  c
83e8 af                xor  a
83e9 77         n1bb   ld   (hl),a
83ea 23                inc  hl                  \100
83eb c9                ret                      \110+call=117
83ec             
83ec fd7d       n1     ld   a,yl
83ee fe33              cp   51                  \29
83f0 3866              jr   c,n10	Test, ci uz uplynula sekunda
83f2 0e01              ld   c,#01	aby sme mohli vypisat dalsi cas
83f4 fd7d              ld   a,yl
83f6 d632              sub  50
83f8 fd6f              ld   yl,a
83fa 215a85            ld   hl,cas              \76
83fd cdd383            call n1sub
8400 3e04              ld   a,#04
8402 110784            ld   de,n3
8405 181a              jr   jpde                \222 +/-
8407             
8407 23         n3     inc  hl		Kazdu sekundu sa tiez zmeni
8408 cdd383            call n1sub	efektik v strednej tretinke
840b ed5f              ld   a,r
840d 32b984            ld   (udaj+1),a
8410 3a5b85            ld   a,(cas+1)
8413 0f                rrca
8414 9f                sbc  a,a
8415 e60f              and  #0f
8417 f607              or   #07
8419 32cc84            ld   (rot),a
841c 3e05              ld   a,#05
841e 112a84            ld   de,n2
8421 ed53d183   jpde   ld   (skok),de
8425 1ef9              ld   e,#f9
8427 c3e084            jp   wait                \222 +/-
842a             
842a 2b         n2     dec  hl
842b cb7e              bit  7,(hl)              \32
842d 2808              jr   z,n2aa	Priprava na vypis jedneho znaku
842f 3e0e              ld   a,14
8431 01ec83            ld   bc,n1
8434 c3dc84            jp   buduci
8437 e5         n2aa   push hl
8438 6e                ld   l,(hl)
8439 2688              ld   h,>znaky
843b 1650              ld   d,#50
843d 0602              ld   b,#02               /2*88=202
843f 7e         dd1    ld   a,(hl)	Samotne vyprintenie jedneho znaku
8440 12                ld   (de),a
8441 24                inc  h
8442 14                inc  d
8443 7e                ld   a,(hl)
8444 12                ld   (de),a
8445 24                inc  h
8446 14                inc  d
8447 7e                ld   a,(hl)
8448 12                ld   (de),a
8449 24                inc  h
844a 14                inc  d
844b 7e                ld   a,(hl)
844c 12                ld   (de),a
844d 24                inc  h
844e 14                inc  d
844f 10ee              djnz dd1
8451 1c                inc  e
8452 e1                pop  hl
8453 3e01              ld   a,#01               \299
8455 c3e084            jp   wait
8458             
8458 fd7c       n10    ld   a,yh		Auto-Kitt efekt
845a fe02              cp   #02                 \56
845c 3857              jr   c,n20	Test ci uz mame robit dalsiu fazu
845e c3                db   #c3
845f 9584       jump   dw   n12                 \73
8461             
8461 21a358     n11    ld   hl,#58a3
8464 3647              ld   (hl),#47
8466 2c         incdec inc  l
8467 7d                ld   a,l
8468 326284            ld   (n11+1),a
846b 216684            ld   hl,incdec           \124
846e febc              cp   #bc
8470 3f                ccf
8471 3802              jr   c,iidd
8473 fea4              cp   #a4
8475 9f         iidd   sbc  a,a                 \151
8476 e601              and  #01
8478 ae                xor  (hl)
8479 77                ld   (hl),a
847a 218484            ld   hl,jr+1
847d 3e03              ld   a,#03
847f ae                xor  (hl)
8480 77                ld   (hl),a
8481 3ea2              ld   a,#a2               \210
8483 1803       jr     jr   #03
8485 329684            ld   (n12+1),a
8488 fd2600            ld   yh,#00
848b 3e02              ld   a,#02
848d 219584            ld   hl,n12
8490 225f84     buduce ld   (jump),hl
8493 184b              jr   wait                \267
8495             
8495 216458     n12    ld   hl,#5864            \73
8498 7d                ld   a,l
8499 febc              cp   #bc                 \94
849b 3011              jr   nc,n12bb
849d 014104            ld   bc,#0441            \111
84a0 7e         n12aa  ld   a,(hl)              /47
84a1 b9                cp   c
84a2 3801              jr   c,#01
84a4 3d                dec  a
84a5 77                ld   (hl),a
84a6 2c                inc  l
84a7 10f7              djnz n12aa               \4*47=188
84a9 229684            ld   (n12+1),hl
84ac 1835              jr   end
84ae             
84ae 3e08       n12bb  ld   a,#08
84b0 216184            ld   hl,n11
84b3 18db              jr   buduce              /\174
84b5             
84b5 210048     n20    ld   hl,#4800	Zaplacanie strednej tretiny obrazovky
84b8 3e33       udaj   ld   a,#33               \82
84ba 772c772c          dw   #2c77,#2c77	8*[INC C : LD (HL),A]
84be 772c772c          dw   #2c77,#2c77
84c2 772c772c          dw   #2c77,#2c77         8*11=88
84c6 772c772c          dw   #2c77,#2c77         \
84ca 2002              jr   nz,n21              /
84cc 0f         rot    rrca
84cd 24                inc  h
84ce cba4       n21    res  4,h
84d0 cbdc              set  3,h
84d2 22b684            ld   (n20+1),hl
84d5 32b984            ld   (udaj+1),a
84d8 3e03              ld   a,3
84da 1804              jr   wait                \68
84dc             
84dc ed43d183   buduci ld   (skok),bc	Nastavenie ktora cast kodu sa ma volat nabuduce
84e0 3d         wait   dec  a
84e1 20fd              jr   nz,wait
84e3 d9         end    exx		Vsetky casti kodu trvaju 200 cyklov (+/- autobus)
84e4 a7         zzz    and  a		Koniec mojich speci-rutiniek v loaderi
84e5 04         l222   inc  b
84e6 c8                ret  z
84e7 3eff              ld   a,#ff	#FF namiesto #7F nereaguje na medzeru
84e9 dbfe              in   a,(#fe)
84eb 1f                rra
84ec d0                ret  nc
84ed a9                xor  c
84ee e620              and  #20
84f0 28f3              jr   z,l222
84f2 79                ld   a,c
84f3 eefc       xor    xor  #fc		#FC namiesto CPL zabezpeci krajsie farby
84f5 4f                ld   c,a		uvodny ton cerveno-zlty a bajty modro-modre
84f6 e607              and  #07
84f8 320058     out    ld   (#5800),a           +52
84fb 321f58            ld   (#581f),a	Nastavenie rohovych atributov
84fe f608              or   #08
8500 d3fe              out  (#fe),a
8502 e607              and  #07
8504 32e05a            ld   (#5ae0),a
8507 32ff5a            ld   (#5aff),a
850a 37                scf
850b c9                ret
850c             
850c 110088     zn     ld   de,znaky	Konverzia znakoveho fontu
850f d5         ll1    push de		Z romkoveho fontu vytvori kontury
8510 7b                ld   a,e		a tiez font preorganizuje tak aby
8511 fe20              cp   ' '		print rutinky bezali rychlejsie
8513 3002              jr   nc,#02
8515 c630              add  a,'0'
8517 87                add  a,a
8518 6f                ld   l,a
8519 260f              ld   h,#0f
851b 29                add  hl,hl
851c 29                add  hl,hl
851d cd4985            call read
8520 4f                ld   c,a
8521 23                inc  hl
8522 cd5085            call write
8525 0606              ld   b,#06
8527 cd4985     ll2    call read
852a 4f                ld   c,a
852b 2b                dec  hl
852c cd4985            call read
852f b1                or   c
8530 4f                ld   c,a
8531 23                inc  hl
8532 23                inc  hl
8533 cd5085            call write
8536 10ef              djnz ll2
8538 cd4985            call read
853b 4f                ld   c,a
853c 2b                dec  hl
853d cd4985            call read
8540 23                inc  hl
8541 cd5485            call rit
8544 d1                pop  de
8545 1c                inc  e
8546 20c7              jr   nz,ll1
8548 c9                ret
8549             
8549 7e         read   ld   a,(hl)
854a 0f                rrca
854b 0f                rrca
854c b6                or   (hl)
854d 07                rlca
854e b6                or   (hl)
854f c9                ret
8550             
8550 cd4985     write  call read
8553 2b                dec  hl
8554 b1         rit    or   c
8555 ae                xor  (hl)
8556 12                ld   (de),a
8557 23                inc  hl
8558 14                inc  d
8559 c9                ret
855a 00000a00   cas    db   0,0,10,0,0	Buffer pre casovy udaj
            855f 4550       firma  dw   #5045
8561 42757379          db   'Busy software '
            6    
            2    
            856f 70726573          db   'presen','t'+#80
            8576 8350       demo   dw   #5083
8578 3e3e3e20          db   '>>> THE OVER'
            0    
            8584 5343414e          db   'SCAN DEMO <<'
            d    
            8590 bc                db   '<'+#80
8591 e250       loatim dw   #50e2
8593 4c6f6164          db   'Loading'
            859a 20636361          db   ' cca 1 min'
            d    
            85a4 ae                db   '.'+#80
85a5 8848       rew    dw   #4888
85a7 52657769          db   'Rewing the tape'
            4    
            4    
            85b6 ac                db   ','+#80
85b7 c448       reload dw   #48c4
85b9 70726573          db   'press any key '
            e    
            5    
            85c7 616e6420          db   'and reload'
            f    
            85d1 ae                db   '.'+#80
85d2 202121a1   krik   db   ' !!','!'+#80
85d6            k
85d6            l      =    k-p		Navestie "l" bude celkova dlzka kodu
85d6             
85d6                   org  #6000,0	Dalsie rutinky nemaju ziadny ucel
6000 f3         mrs    di		sluzili ako pomoc pri odladovani
6001 ed56              im1
6003 af                xor  a
6004 ed47              ld   i,a
6006 c3b3f4            jp   #f4b3	Skok do MRS
6009             
6009 cd0c85     zs     call zn		Test konverzie znakoveho fontu
600c 210088            ld   hl,znaky	Zobrazenie vsetkych znakov
600f 110040            ld   de,#4000	na obrazovke
6012 010008            ld   bc,#0800
6015 edb0              ldir
6017 c9                ret
6018             
6018 3e0c       poke   ld   a,12		Nastavi testovaci IM2 vektor do romky
601a d317              out  (23),a	(Outy su pre zapis do romky na MB01)
601c 218181            ld   hl,#8181
601f 22ff3a            ld   (#3aff),hl
6022 3e04              ld   a,4
6024 d317              out  (23),a
6026 c9                ret
6027                   end