MILC logo

IndexVorigeVolgendeLeeg

Softscroll in ML
Genic Clubguide, 00-00-00


    
                 SOFT-SCROLL IN MACHINETAAL

Verbaast u zich ook altijd over die enorm mooie scrolls  die
we de laatste tijd in vele demo's te zien krijgen?  Door  de
vele  vragen  over  hoe  deze  scrolls  zelf  kunnen  worden
ontworpen, hebben we besloten dit  eens  uit  de  doeken  te
doen.  Voor  degenen  die   niet   in   machinetaal   kunnen
programmeren maar toch wel  eens  een  mooie  scroll  willen
demonstreren in een eigen (basic) demo, is de machinetaal zo
geschreven dat iedereen deze  routine  kan  gebruiken.  Want
helaas, om de uitleg te begrijpen is kennis van machine taal
wel aanbevolen.


                        DE INTERRUPT

Om een perfecte scroll te krijgen is het  aanbevolen  om  de
Machinetaal-routine  via  een  interrupt  aan   te   sturen.
Aangezien de interrupt vrij constant wordt  aangeroepen  zal
de scroll dan ook  vrij  constant  scrollen.  Zie  voor  een
uitgebreide uitleg over de interrupt de cursus op  ClubGuide
vier en vijf.

De eigenlijke routine bestaat  alleen  maar  uit  een  COPY-
instructie. Daar komen echter nog diverse tellers bij. Onder
andere een om bij te houden welke (grafische) letter op  dat
moment op het scherm wordt gezet.

                       COPY-INSTRUCTIE

Om een snelle scroll te krijgen  maken  we  gebruik  van  de
snelste methode om een grafisch deel te  copi‰ren.  Namelijk
direct via de OUT-poorten. Om deze instructies te  begrijpen
verwijs ik u naar het artikel over het direct aansturen  van
de VDP. Maar als u zich aan de juist volgorde van de routine
houd kan er (haast) niks misgaan.

Hieronder volgen  de  registers  die  gevuld  moeten  worden
voordat een copy instructie werkt zo als hij moet werken.


VDP  reg - bit: 7    6    5    4    3    2    1    0
-----------------------------------------------------
33   32  -     SX7  SX6  SX5  SX4  SX3  SX3  SX1  SX0
34   33  -      0    0    0    0    0    0    0   SX8
35   34  -     SY7  SY6  SY5  SY4  SY3  SY2  SY1  SY0
36   35  -      0    0    0    0    0    0    0   SY8
37   36  -     DX7  DX6  DX5  DX4  DX3  DX2  DX1  DX0
38   37  -      0    0    0    0    0    0    0   DX8
39   38  -     DY7  DY6  DY5  DY4  DY3  DY2  DY1  DY0
40   39  -      0    0    0    0    0    0    0   DY8
41   40  -     NX7  NX6  NX5  NX4  NX3  NX2  NX1  NX0
42   41  -      0    0    0    0    0    0    0   NX8
43   42  -     NY7  NY6  NY5  NY4  NY3  NY2  NY1  NY0
44   43  -      0    0    0    0    0    0    0   NY8
45   44  -     CH3  CH2  CH1  CH0  CL3  CL2  CL1  CL0
46   45  -      0   MXC  MXD  MXS   Y    X   E/N  M/M
47   46  -     CM3  CM2  CM1  CM0  LO3  LO2  LO1  LO0
-----------------------------------------------------

SX8-SX0        -Origineel X-coordinaat
SY8-SY0        -Origineel Y-coordinaat
DX8-DX0        -Beeld X-coordinaat
DY8-DY0        -Beeld y-coordinaat
NX8-NX0        -Aantal horizontale punten
NY8-NY0        -Aantal verticale punten
CH3-CH0        -Kleurcode
CL3-CL0        -Kleurcode
Y              -Richting Y-coordinaat
X              -Richting X-coordinaat
E/N            -Gelijk/Niet gelijk (0=gelijk)
M/M            -Major-Minor (0=X-as is major richting
                             1=Y-as is major richting)
CM3-CM0        -Copy van? naar? (D0h is Vram to Vram)


Inderdaad een hele waslijst, uitprinten  is  dan  ook  zeker
aanbevolen. Maar waar hebben we  deze  informatie  eigenlijk
voor nodig? Welnu, ten eerste moeten in deze registers de  X
en de  Y  coordinaten  worden  gezet  van  het  te  copi‰ren
gedeelte en de coordinaten van het punt waar het  blok  naar
toe moet worden gecopieerd. Ook  belangrijk  is  het  aantal
punten dat moet worden gecopieerd. We zullen  een  en  ander
aan de hand van een voorbeeld proberen duidelijk te maken:


                    EEN PRAKTIJKVOORBEELD

De volgende assembler listing staat ook op de disk onder  de
naam SCROLL.ASM (op te starten met SCROLL.MSX)

ORG &HC500             Begin op adres:&HC500
LD HL,&HFD9F
LD DE,&HC50E
LD BC,&H0005
LDIR                   Bewaar oude interrupt
JP ZETINT
NOP
NOP                    Hier komt de oude interrupt
NOP                   te staan
NOP
NOP
ZETINT DI             Zet interrupts uit en
LD HL,SCROLL          Zet nieuwe interrupt
LD A,&HCD             Zet nieuwe interrupt
LD (&HFD9F),A
LD (&HFDA0),HL
LD A,&HC9
LD (&HFDA2),A
EI                    Zet interrupt weer aan
RET                   Einde instellingen



VDPRD LD A,02         VDP status lezer
OUT (&H99),A
LD A,&H8F               Dit hoeft u niet te
OUT (&H99),A            begrijpen.
IN A,(&H99)
EX AF,AF'               (Zie voor uitleg VDP-cursus)
XOR A
OUT (&H99),A
LD A,&H8F
OUT (&H99),A
EX AF,AF'
RET                   Keer terug.


SCROLL DI             Geen andere interrups.
LOOP1 CALL VDPRD
RRA
JR C,LOOP1
CALL ZETRGS
LD HL,&HD000       Register waarden vanaf &hD000
LD C,&H9B
LD B,15               15 Registers vullen.
OTIR                     Copieer (van page:1)
LD A,(&HD013)
INC A                 verhoog teller *2
INC A
LD (&HD013),A
LD A,(&HC5A6)         Letter opkomst teller.
DEC A
LD (&HC5A6),A
JP NZ,ZETFNT          Indien niet nul dan verder

LD A,8                Zet teller op 8
LD (&HC5A6),A
LD HL,(&HC5A7)        Adres tekst teller.
INC HL
LD (&HC5A79,HL
LD A,(HL)
CP 255
JR NZ,XYZET
LD HL,&HE000          Tekst van af &hE000 opnieuw
LD (&HD5A7),HL
LD A,(HL)
XYZET PUSH AF
SLA A                 Bereken X-coordinaat page:1
SLA A                   (coordinaat)
SLA A
SLA A
LD (&HD013),A
POP AF
AND &HF0              Bereken Y-coordinaat page:1
LD (&HD015),A

ZETFNT CALL VDPRD     Kijk of VDP klaar is
RRA
JR C,ZETFNT
CALL ZETRGS           Zet registers om te copieren
LD HL,&HD014
LD C,&H9B
LD B,15
OTIR                  Copy nieuw stukje letter
EI
RET                   KLAAR!

ZETRGS LD A,&H20      Zet register om te copieren
OUT (&H99),A
LD A,&H91
OUT (&H99),A
RET
NOP                   opkomst teller
NOP                   Adres waar de tekst te vinden
NOP                   is.
END

Inderdaad, een hele listing voor een scrollroutine. Maar het
loont de moeite want hiermee onstaat een mooie animatie. Het
programma werkt als volgt:

Allereerst word de oude interupt  bewaart  en  word  er  een
nieuwe opgezet, die naar de scroll routine springt.

VDPRD : leest de VDP en kijkt of deze klaar is met de  vorige
        copy.

SCROLL: dit is het eigenlijke gedeelte om  te  scrollen.  de
        OTIR zorgt er voor dat de data vanaf &hD000 naar  de
        registers wordt geschreven.

Het volgende deel onderzoekt welke letter er op  het  moment
moet worden gecopieerd. Als de letter nog niet  helemaal  is
gecopieerd dan wordt  het  volgende  karakter  ingelezen  en
worden  de  X  en  Y-coordinaten  van  de  volgende   letter
berekend. Vervolgens wordt een stuk letter van  twee  pixels
breed gecopieerd.

ZETRGS: Zorgt dat de VDP klaar staat om te copi‰ren.


Met  deze  informatie  moet  u  in  staat  zijn  het  begrip
soft-scroll te begrijpen. Om de routine te gebruiken moet er
op  pagina  1  een  FONT  (letterset)  worden  gezet.   Deze
letterset is precies zo opgebouwd als de  normale  letterset
dus ieder karakter kan gebruikt  worden!  De  scroll  is  te
laden vanuit de program-loader. Veel succes met de routine!

R. v/d Meulen

    

Index

Vorige

Volgende