###   Projekte und Informationen rund um den KC85   ### 

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.