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.