MILC logo

IndexVorigeVolgendeLeeg

Case in MT
Genic Clubguide, 00-00-00


    
VOOR DE MACHINETAALPROGRAMMEURS:

                 E E N   C A S E   I N   M T
                =============================

Deze tekst gaat  over  het  programmeren  van  een  CASE  in
machinetaal. Enige kennis over de Z80-machinetaal is vereist
om deze tekst goed te kunnen begrijpen.

Iedereen heeft het wel eens, je maakt een menuutje of gewoon
een Ja/Nee vraag, dan moet je je programma toch netjes op de
invoer laten reageren, zonder al te veel  vergelijkingen  en
jumps. Bij twee of drie mogelijkheden is  het  nog  redelijk
eenvoudig en netjes te maken, maar worden het er  meer,  dan
loopt menig programmeur al gauw op de klippen. Niet omdat ze
het niet kunnen programmeren, maar omdat het een  chaos  van
jumps en vergelijkingen wordt.

Even een voorbeeld, we laten een programma  reageren  op  de
vraag of er ge'exit' moet worden. De vraag kan met  J  en  N
worden beantwoord. Ook de j en de n dus. We gaan  ervan  uit
dat de tekst al op het scherm staat en  dat  er  alleen  nog
maar op de  invoer  hoeft  te  worden  gewacht.  De  routine
READKEY wacht op een toets en geeft deze terug  in  register
A.

Methode1:

VRAAG         CALL READKEY
              CP "J"
              JR Z,JA
              CP "j"
              JR Z,JA
              CP "N"
              JR Z,NEE
              CP "n"
              JR Z,NEE
              JR VRAAG

JA            LD HL,0
              RET

NEE           LD HL,-1
              RET

Dit is toch wel  de  meest  'smerige'  methode  die  ik  kon
bedenken. Het is dat ik  JR  opdrachten  in  plaats  van  JP
opdachten heb gebruik, anders was het nog 'viezer'.

Maar waarom is het nu vies? Ten eerste omdat er veel te veel
vergelijkingen en jumps in  staan.  4  Vergelijkingen  en  5
jumps is echt te veel. Ten tweede omdat het te veel  opcodes
inneemt.

We nemen nog een voorbeeld, iets netter dit keer:

VRAAG         CALL READKEY
              LD HL,0
              CP "J"
              RET Z
              CP "j"
              RET Z
              LD HL,-1
              CP "N"
              RET Z
              CP "n"
              RET Z
              JR LUS

Maar toch nog steeds te lang. We hebben van de  5  jumps  nu
wel  1  jump  gemaakt,  maar  er   zitten   nog   steeds   4
vergelijkingen. We gaan de routine nog een keer  verkleinen.
Stel we moeten de routine veranderen van J en N naar Y en N,
dan moeten we 2 vergelijkingen veranderen, dus we  gaan  een
'UPCASE' inbouwen, die van kleine letters hoofletters maakt:

VRAAG         CALL READKEY
              AND A
              JR M,VRAAG
              RES 5,A
              LD HL,0
              CP "J"
              RET Z
              CP "N"
              JR NZ,VRAAG
              DEC HL
              RET

De AND A instructie kijkt niet alleen of A nul is, maar  zet
ook  de  M  vlag  als  a  een  negatief  getal  is  in   het
twee-complement, oftewel als bit 7 geset is. Als bit 7 geset
is, dan is A dus groten dan 127. Die tekens hebben we zo wie
zo niet nodig, dus dan springen we weer naar de lus. De rest
spreekt voor zich. Merk op dat de instructie DEC  HL  alleen
maar wordt gebruikt als er op de [N]  wordt  gedrukt,  omdat
hij niet in de lus is opgenomen.

Nog een routine, waarbij er  uit  A,  B  of  C  gekozen  kan
worden. Let op de eenmalige vergelijking!

VRAAG         CALL READKEY
              LD HL,0
              SUB "A"
              RET Z
              INC HL
              DEC A
              RET Z
              DEC A
              JR NZ,VRAAG
              INC HL
              RET

Als laatste wil ik nog een multiple case behandelen. Hierbij
is mogelijk om oneindig veel 'aansluitingen' te maken en die
heel eenvoudig uit te breiden. Deze methode vreet  wat  meer
bytes als hij maar een of twee keer gebruikt wordt, maar als
hij meerdere keren  aangeroepen  wordt,  door  verschillende
menuutjes en er zijn veel mogelijkheden vanuit de menuutjes,
dan is deze routine zeer bruikbaar.

De menuopties moeten met een DEFB voor de toets en een  DEFW
voor het adres worden gedefineerd. Register IX moet  bij  de
aanroep naar de tabel met de codes wijzen. De tabel moet met
een 0 (DEFB 0) worden afgesloten.

TERUGKEYS is er alleen om uit de  lus  te  kunnen  naar  een
hoger menu. De labels OPTIE1, OPTIE2 en OPTIE3  zijn  zomaar
namen.

MENULUS       CALL READKEY
              CALL TERUGKEYS
              RET Z
              LD IX,_MENUKEYS
              CALL KEYHAN
              JR MENULUS

TERUGKEYS     CP 27
              RET Z
              CP 13
              RET Z
              CP " "
              RET

_MENUKEYS     DEFB "A"
              DEFW OPTIE1

              DEFB "E"
              DEFW OPTIE2

              DEFB "Q"-"@"   ;CTRL-Q
              DEFW OPTIE3

              DEFB 0

KEYHAN        LD C,A
KEYHAN_LUS    LD A,(IX+0)
              LD L,(IX+1)
              LD H,(IX+2)
              CP C
              JR Z,KEYHAN_EXEC
              INC IX
              INC IX
              INC IX
              AND A
              JR NZ,KEYHAN_LUS
              RET

KEYHAN_EXEC   JP (HL)


Veel sucses met  het  versnellen  /  verfraaien  van  jullie
programma's,

                                       Ramon van der Winkel

Via BBS Waterland (02990-40202/45740): Post  aan  RAMON  VAN
DER WINKEL, bord MSX.



Nvdr. Deze  tekst is ook te vinden op de BBS Waterland en is 
geschreven  door Ramon  van der Winkel die GENIC toestemming 
heeft gegeven voor deze publicatie.

Aan de publicatie van dit artikel hebben meegewerkt:

Ramon van der Winkel  (De schrijver van het artikel)
Rudy Oppers           (De man van de modem)
Alex van der Wal      (Initiatiefnemer)

    

Index

Vorige

Volgende