De mitõl is zenél a csillagos betöltõ?
Attól, hogy a közvetlen port mûveleteket kicseréltük a Geco-tól kapott rutinra
amit ha jól sejtem egy Spectrum 128K program átíratából szedett ki
Mondjuk fogalmam sincs hogy mit csinál, lényeg az, hogy mûködik. A funkciója az, hogy az eredetileg egy megadott AY register irásának az eredményét szimulálja a DAVE-el.
Elöször is lássuk, hogy néz ki CPC eredetiben egy ilyen register írás, a POPUP.000 fáljban 75B9H-tól helyezkedett el egy ilyen. (Ez fut a megszakítási rutinban.)
[asm]L75B9 LD HL,78B6H
LD D,0BH
L75BE LD E,(HL)
LD B,0F4H
OUT (C),D
LD BC,0F600H
OUT (C),C
LD A,0C0H
OUT (C),A
OUT (C),C
LD B,0F4H
OUT (C),E
LD B,0F6H
ADD A,A
OUT (C),A
OUT (C),C
DEC HL
DEC D
JP P,L75BE
RET[/asm]
Az LD B,0F4H utasítástól DEC HL elötti OUT-ig történik 1 azaz egy! darab AY regiszter írása! Normális HW-en az ilyesmihez elegendõ egy darab OUT utasítás is
A regiszter száma a D-ben van, az ciklikusan csökken, az írandó adatot a HL-el címzet táblázatból veszi. Tehát az R11-tõl lefelé végig írkálja az összes AY regisztert.
Közvetlen ezután található egy másik port piszkáló rutin:
[asm]
L75DF LD DE,0D00H
L75E2 CALL L75EC
DEC D
JP P,L75E2
LD DE,L073F
L75EC LD B,0F4H
OUT (C),D
LD BC,0F600H
OUT (C),C
LD A,0C0H
OUT (C),A
OUT (C),C
LD B,0F4H
OUT (C),E
LD B,0F6H
ADD A,A
OUT (C),A
OUT (C),C
RET
[/asm]
Az egy darab AY regiszter írására szolgáló részt ugye most már mindenki felismeri
megnézve a ciklust, látható, hogy R13-tól lefelé az összes regiszter nullázza, végül az R7-et 3FH-ra állítja. Elég könnyen ki lehet találni, hogy ez egy hang reset rutin lesz
Geco-tól kapott rutin bekerült a betöltõbe, PORTOUT címen, ennek a címét induláskor B900H-ra helyezzük el.
Az elsõ program rész így módosul:
[asm]
L75B9 LD HL,78B6H
LD D,0BH
LD E,(HL)
LD A,D
LD C,E
CALL 0B900H
NOP
...
NOP
RET
[/asm]
Ezután már zenélni fog
A második, hang reset program részt egy olyanra cseréljük, ami nulláza a DAVE összes hang portját.
[asm]
L75DF LD BC,10AFH
XOR A
L75E3 OUT (C),A
DEC D
DJNZ L75E3
NOP
...
NOP
RET
[/asm]
Ezután pedig el kéne hallgatnia kilépéskor... de nem teszi, az utolsó hang tutul továbbra is... ami nem véletlen, mert hiába van ez a hang reset rutin itt, soha nem kerül meghívásra...
Megnézve, hogy mi történik továbblépésnél, a 8A70H címen található egy ilyen:
[asm]
LD HL,8A23H
CALL 0BCDDH
CALL 0BCA7H
[/asm]
Az elsõ két utasítás a felhasználói megszakitási rutint láncolja ki, ez már le van kezelve a betöltõnkben.
A második CALL viszont a ROM hang reset rutinja! Olyanunk még nincs... Ezt a CALL-t átírva 75DFH-ra, máris mûködésbe lép az imént átírt hang reset rutin, és innentõl elmarad a végtelen tutulás