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) |