ASM-Programmiertips
von Ralf Kästner
Dies soll kein Programmierkurs in Assembler werden aber speziell für Hans Wermeling die beiden gewünschten Routinen. Es sind ja oft die kleinen Details, welche einem das Programmieren erleichtern.
Das neue EDAS 1.64 bietet die Möglichkeit Quelltextteile zusammenzufügen oder einzeln abzuspeichern, so daß es endlich auch unter CAOS möglich ist, eigene Bibliotheken aufzubauen. Für immer wiederkehrende Aufgaben benutzt man zweckmäßigerweise dann auch immer die gleichen, schon bewährten und vor allem ausgetesteten Routinen.
Zwei dieser kleinen nützlichen Helfer möchte ich deshalb heute vorstellen.
Für die Ausgabe von programminternen Werten, welche meist in binärer Form vorliegen, ist das erste Progrämmchen gedacht. Es erwartet eine ganze Dualzahl (ohne Vorzeichen) im Register HL bzw. A und wandelt sie direkt in die dezimale ASCII-Darstellung um, welche von links nach rechts ziffernweise auf das aktuelle Ausgabegerät (i.d.R. Bildschirm) ausgegeben wird.
Im rufenden Programm muß sichergestellt werden, daß die beiden Wertebereiche (0...999 bzw. 0...99) eingehalten werden. Da nur Additions- und Subtraktionsbefehle verwendet werden, geht das ziemlich schnell. Je nach Anforderung an die Ausgabe kann man zwei- oder dreistellig ausgeben, indem man die entsprechende Einsprungadresse nutzt. Vor dem Aufruf mit CALL muß man den Cursor (0B7A0H) auf die gewünschte Position der ersten Ziffer einstellen.
;------------------------------------------- ; Ausgabe von Dezimalzahlen ;------------------------------------------- ; Eintritt für dreistellige Zahlen ; ; PE: HL - Wert (0...3E7H bzw. 0...999) ; PA: Ausgabe von 3 Dezimalziffern ; VR: A,BC ; SHWRT PUSH DE LD DE,064H LD B,D ;=0 SHWR1 OR A SBC HL,DE JR C,SHWR2 INC B ;100er JR SHWR1 SHWR2 ADD HL,DE LD A,L ;merken CALL SHWR6 ;100er ausgeben POP DE ; ; Eintritt für zweistellige Zahlen ; ; PE: A - Wert (0...63H bzw. 0..99) ; PA: Ausgabe von 2 Dezimalziffern ; VR: A,BC ; SHW99 LD C,00AH CALL SHWR3 LD B,A ;1er JR SHWR6 SHWR3 LD B,000H SHWR4 SUB C JR C,SHWR5 INC B ;10er JR SHWR4 SHWR5 ADD C ;zurueck SHWR6 PUSH AF ;merken LD A,030H ADD B CALL 0F003H DEFB 24H ;Ziffer ausgeben POP AF RET ;-------------------------------------------
Das zweite Unterprogramm stellt den BASIC-RND(X) Befehl zur Verfügung. In der Zelle RNDMX gibt man die Obergrenze für die zu erzeugenden Zufallszahlen (2...255 möglich) vor. Persönliche Zufallsanpassungen kann jeder selbst vornehmen. Die alte Zufallszahl wird zunächst als Basis für den "neuen Zufall" verwendet.
Durch Multiplikation und Addition werden hinreichend große Zahlen erzeugt, wobei der Überlauf des Akkus verloren geht. Durch Zugriff auf das Refresh-Register R wird der Zufall noch weiter verfeinert, abschließend wird von der entstandenen Zahl der Inhalt von RNDMX heruntersubtrahiert, so daß man in den gewünschten Bereich gelangt.
Die Wirkung dieser Routine kann man in der Sprühdose von "UNIPIC" erkennen, dort werden die X- und Y-Koordinaten getrennt für den Sprühbereich von 8*8 Pixel errechnet.
;------------------------------------------- ; Erzeugung von Zufallszahlen ;------------------------------------------- ; ; PE: / ; PA: A - Zufallszahl ; VR: AF, HL, DE, BC ; RNDMX DEFB 7 ;Vorgabe Obergrenze Zufallszahl RNDOM DEFB 0 ;Zufallmerker ; ZUFAL LD A,(RNDOM) INC A ;0 LD D,A LD C,16 CALL 0F003H DEFB 41H ADD B LD C,A LD A,R ADD C PUSH AF LD A,(RNDMX) INC A LD B,A POP AF ZUFA1 SUB B CP B JR NC,ZUFA1 LD (RNDOM),A RET ;-------------------------------------------
Soweit für heute, vielleicht hat ja der eine oder andere auch interessante Routinen oder Tricks auf Lager. Das ist sicher für andere User ebenfalls interessant. Es sollte auch nicht auf eine Programmiersprache beschränkt bleiben. Es steigert sicherlich den Abwechslungsreichtum und den allgemeinen Wissensstand der gesamten KC-Gemeinde, wenn diese Rubrik in der Zukunft von vielen Beiträgen und Ideen ALLER KC-Anwender gefüttert wird.
Man könnte ja auch seine HILFE- bzw. SUCHE-Meldung betreffs Programmierung kleiner Probleme hier plazieren. Ich bin selbst auch noch lernfähig und -willig und ich bin auch zukünftig bereit, mir geläufige und bekannte Sachen an dieser Stelle zu erklären, mir ist allerdings die Zeit auch zu schade, Beiträge auf Verdacht zu schreiben, man muß schon ungefähr wissen, was von Interesse ist.