Folytassuk a "mesedélutánt"
némi gyakorlatiasabb részekkel, Povi már biztos nagyon várja
Én ezt a rutin használom a Spectrum átirat betöltõimben videó szegmens igénylésre:
VID LD HL,VEGE
LD (HL),0
KER EXOS 24
JR Z,NAMIVAN
CP 7FH
JP NZ,HIBA
NAMIVAN EX AF,AF'
LD A,C
CP 0FCH
JR NC,NEMKER
INC HL
LD (HL),C
JR KER
NEMKER EX AF,AF'
PUSH BC
PUSH AF
VISSZA LD C,(HL)
EXOS 25
DEC HL
JR Z,VISSZA
POP AF
POP BC
OR A
RET
A rutin a VEGE címtõl (amely logikusan a programkód után helyezkedik el) tárolja el a felesleges szegmenseket. Miután akadt egy (amely lehet megosztott is), a felesleget visszaadja az EXOS-nak.
Elõször a képernyõnek kérünk egy teljes szegmenst:
CALL VID
JP NZ,HIBA
LD A,C
CP 255
JP Z,HIBA
LD (VIDS),A
LD DE,0
RRA
RR D
RRA
RR D
LD (VIDCIM1),DE
A kapott szegmensszámból kiszámoljuk a terület kezdetének címét, erre késöbb az LPT generáláskor szükség lesz.
Késöbb kérünk egy LPT szegmenst is, ami lehet megosztott is, ha elfér benne az LPT tábla (azaz az EXOS határ beállítható a megfelelõ helyre.)
CALL VID
JR Z,NEMHIBA
CP 7FH
JP NZ,HIBA
LD DE,200*16
EXOS 23
JP NZ,HIBA
LD C,255
NEMHIBA LD A,C
LD (LPTS),A
NEMHIBA1 LD DE,(VIDCIM2)
LD HL,0
RRA
RR H
RRA
RR H
ADD HL,DE
LD (VIDCIM2),HL
Itt is kiszámoljuk a videó címet, ezúttal az LPT tábla kezdetét. A figyelmes szemlélõ észreveheti, hogy itt még játékba áll a VIDCIM2-n korábban lévõ érték. Ez alapban nulla, viszont 64K-s gépen úgy fog átrendezõdni a memória, hogy nem a szegmens elejére kerül az LPT tábla, ekkor a szükséges eltolás mértéke került már ekkora a VIDCIM2-re.
Ezekután nézzük meg, hogyan változik a SpV-ban is közölt LPT generáló rutin, ime az eredeti rutin kezdete:
LD A,0FCH
OUT (0B1H),A
LD A,192
LD DE,4000H
EXX
LD DE,4000H
LD HL,4004H
LD BC,13
És ez lesz belõle:
LD A,(LPTS)
OUT (0B1H),A
LD A,192
LD DE,(VIDCIM2)
RES 7,D
SET 6,D
EXX
LD DE,(VIDCIM1)
LD IX,VIDCIM1
LD HL,(VIDCIM2)
RES 7,H
SET 6,H
INC HL
INC HL
INC HL
INC HL
LD BC,13
A fix szegmensszám helyett az eltároltat használjuk. A DE fog mutatni az LPT elejére az 1-es lapon, de a korábban említett esetleges eltolás miatt ezt az LPT videócímébõl számoljuk vissza 1-es lapi címre. Az EXX utáni DE a videó memóriánk kezdetére fog mutatni, ez az eredeti rutinban fix 4000H volt, mivel az FDH volt fixen erre a célra használva. A HL pedig szintén az LPT területre fog mutatni, 4 bájt eltolással, õ az LPT sorokba való címbeírásnál van használva.
Nem esett még szó az IX-rõl, õ videó memóriánk címét tároló változóra mutat. Azért mert, még egy helyen hozzá kellett nyulni az eredeti rutinhoz, még pedig az attributtum címek kiszámolásánál:
LD A,D
RRA
RRA
RRA
AND 3
OR 58H
LD (HL),A
Módosítva:
LD A,D
RRA
RRA
RRA
AND 3
OR 18H
OR (IX+1)
LD (HL),A
Ezekután már csak az LPT aktiváló OUT utasításokat kell módosítani, az eredeti nagyon egyszerû, mivel a fix 0000H videó címet használja:
XOR A
OUT (82H),A
LD A,192
OUT (83H),A
És módosítva, hogy a kiszámolt LPT címünket használja:
XOR A
LD HL,VIDCIM2+1
RRD
RLCA
RLCA
RLCA
RLCA
OUT (82H),A
OR 0C0H
RRD
OUT (83H),A
Megjegyzés, ez a módszer elrontja a VIDCIM2 változó értékét, de erre az adott esetben úgysincs többé szükség.
De itt egy másik módszer is, itt az eredeti EXOS LPT visszaállítására van használva:
LD HL,(0BFF4H)
SET 6,H
LD B,4
FORG4 SRL H
RR L
DJNZ FORG4
LD A,L
OUT (82H),A
LD A,H
OR 0C0H
OUT (83H),A
A címet az EXOS LP_POINTER változójából olvassuk ki (tehát legyen belapozva a rendszerszegmens a 2. lapra), az utána következõ SET 6 azért van, hogy videócímre konvertáljuk az EXOS változót, ha saját kiszámolt videócímünket használjuk, akkor erre nincs szükség.
Ha van érdeklõdés, folytathatom azzal, hogyan lesz egy 48K-s átírat számára 3 szabadon használható szegmensünk 64K-s gépen, amikor csak kettõ van szabadon, és még az LPT táblának is kéne egy