Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
z9001:programmieren [2013/03/25 18:55] – angelegt volkerp | z9001:programmieren [2025/02/23 12:41] (aktuell) – [Der OS-Rahmen] volkerp | ||
---|---|---|---|
Zeile 18: | Zeile 18: | ||
Es gibt verschiedene FORTH-Versionen. Bekannt ist das f.i.g.-FORTH **FORTH** und das [[forth: | Es gibt verschiedene FORTH-Versionen. Bekannt ist das f.i.g.-FORTH **FORTH** und das [[forth: | ||
- | Beim [[sonstiges: | + | {{: |
+ | |||
+ | Beim [[sonstiges: | ||
===== PASCAL ===== | ===== PASCAL ===== | ||
- | Für den KC gibt es das KC-PASCAL, eine Variante des bekannten Hisoft-PASCAL, | + | Für den KC gibt es das KC-PASCAL, eine Variante des bekannten Hisoft-PASCAL, |
Zeile 37: | Zeile 40: | ||
==== Systemfunktionen ==== | ==== Systemfunktionen ==== | ||
- | Zur systemunabhängigen Programmierung werden vom Betriebssystem | + | Zur systemunabhängigen Programmierung werden vom Betriebssystem 33 Systemrufe bereitgestellt. Diese werden analog CP/M über CALL 0005 aufgerufen. Die Auswahl des gewünschten Systemrufes erfolgt über das C-Register, dessen Inhalt den Systemruf adressiert. Verschiedene Systemrufe erwarten Eingabeparameter bzw. liefern Parameter zurück. |
- | + | ||
- | Der Aufruf dieser Systemrufe erfolgt | + | |
- | Parameter zurück. | + | |
Eingabeparameter: | Eingabeparameter: | ||
Zeile 66: | Zeile 66: | ||
==== Der OS-Rahmen ==== | ==== Der OS-Rahmen ==== | ||
- | Damit eigene Programme vom OS aus gestartet werden können, wird ein spezieller Code benötigt, der sogenannte OS-Rahmen. Damit erscheinen Programme als transiente Kommandos im OS und könne | + | Damit eigene Programme vom OS aus gestartet werden können, wird ein spezieller Code benötigt, der sogenannte OS-Rahmen. Damit erscheinen Programme als transiente Kommandos im OS und können |
- | Das Kommando muß auf einer integralen 100H-Grenze (300h ... 0BF00h) beginnen. Es können beliebig viele Kommandos in einem OS-Rahmen angegeben werden. | + | Ein OS-Rahmen muss auf einer integralen 100H-Grenze (300h ... 0BF00h) beginnen. Es können beliebig viele Kommandos in einem OS-Rahmen angegeben werden. |
<code z80> | <code z80> | ||
Zeile 84: | Zeile 84: | ||
</ | </ | ||
+ | **Kommandozeile** | ||
- | ==== Beispiel ==== | + | Die eingegebene Kommandozeile wird im Puffer CONBU abgelegt, am Ende wird ein Nullbyte angefügt. Mit GVAL werden die einzelnen Parameter nacheinander geholt, d.h. nach INTLN kopiert und in CONBU wird der Parameter durch Leerzeichen ersetzt. Nach Start des Programms ist der Programmname bereits nicht mehr in CONBU lesbar((steht aber noch in INTLN)). |
- | <code z80> | + | **erneuter Aufruf** |
- | ORG 300h | + | |
+ | Ein Warmstart kann erkannt werden, indem beim Einsprung HL auf den Einsprungswert verglichen wird (AUSF, AUSF2,..). Ist er gleich, wurde das Programm nicht von Kassette geladen (oder vom Megamodul), sondern ist bereits im Speicher abgelegt und wurde von dort gestartet (mittels Routine CPROM). | ||
+ | |||
+ | **Programmende** | ||
+ | |||
+ | Bei Programmende wird im Fehlerfall ein gesetztes Carry-Bit und in Register A ein Fehlercode | ||
+ | XOR A ; Cy=0, A=0 | ||
+ | RET | ||
+ | enden, wenn keine Fehlermeldung erfolgen soll. | ||
+ | |||
+ | |||
+ | ==== Beispiele ==== | ||
+ | |||
+ | Folgendes Programm gibt den Text "Hallo User!" auf den Bildschirm aus. | ||
+ | Das Programm wird mit dem Kommando TEST gestartet. | ||
+ | |||
+ | < | ||
+ | cpu z80 | ||
+ | org 300h | ||
+ | |||
+ | Beispiel: | ||
+ | ;Löschen Bildschirm in Hintergrundfarbe blau | ||
+ | ;Ausgabe einer Kopfzeile in der Farbe rot | ||
+ | ; Start im OS mit TEST | ||
+ | |||
+ | jp main | ||
+ | db " | ||
+ | db 0 ; Ende des Headers | ||
+ | |||
+ | main: | ||
+ | ld c,9 | ||
+ | call 5 | ||
+ | jp 0 | ||
+ | |||
+ | ; | ||
+ | TEXT: DB 15H ; | ||
+ | DB 4 ;Farbe BLAU | ||
+ | DB 0CH ;Code für CLEAR SCREEN | ||
+ | DB 14H ; | ||
+ | DB 1 ;Farbe ROT | ||
+ | DB "Hallo User!" | ||
+ | DA 0A0DH ;CRLF | ||
+ | DB 0 ;Ende der Zeichenkette | ||
- | JP HALLO | + | end |
- | DB ' | + | </ |
- | DB 0 | + | |
- | HALLO: LD DE, TEXT ; Adr. des Textes | + | Beispiel2: Tastaturabfrage |
- | LD C, 9 ; PRNST | + | |
- | CALL 5 | + | |
- | RET | + | |
- | ; auszugebender Text | + | <file z80> |
- | TEXT: | + | cpu z80 |
- | DA 0A0DH ; CRLF | + | org 300h |
- | DB 0 ; Ende der Zeichenkette | + | |
- | </code> | + | ;Ausgabe Taste hexadezimal |
+ | ; Start im OS mit TEST | ||
+ | |||
+ | jp main | ||
+ | db " | ||
+ | db 0 ; Ende des Headers | ||
+ | |||
+ | main: | ||
+ | call 5 | ||
+ | push af | ||
+ | call out_a | ||
+ | pop af | ||
+ | |||
+ | ; | ||
+ | |||
+ | or a | ||
+ | jr z, | ||
+ | ld c,1 ; CONSI | ||
+ | call 5 ; sonst Taste aus Puffer holen | ||
+ | |||
+ | jr main | ||
+ | |||
+ | ; Ausgabe A hexadezimal ASCII 2 Stellen | ||
+ | out_a: | ||
+ | and 0F0h | ||
+ | rlca | ||
+ | rlca | ||
+ | rlca | ||
+ | rlca | ||
+ | call out_a1 | ||
+ | pop af | ||
+ | and 0Fh | ||
+ | out_a1: | ||
+ | cp 3Ah ; ' | ||
+ | jr c, out_a2 | ||
+ | add a, 7 | ||
+ | ; Zeichenausgabe A | ||
+ | out_a2: | ||
+ | ld c,2 ; CONSO | ||
+ | call 5 | ||
+ | ret | ||
+ | |||
+ | end | ||
+ | </file> | ||
+ | |||
+ | Beispiel 3: Testprogramm für Parameterübergabe TESTPARA | ||
+ | |||
+ | Es werden Parametertyp, | ||
+ | |||
+ | <file z80> | ||
+ | ; Testprogramm für GVAL-Funktion (Parameterübergabe an Programme) | ||
+ | |||
+ | cpu z80 | ||
+ | |||
+ | CONBU: | ||
+ | INTLN: | ||
+ | OCRLF: | ||
+ | OUTA: | ||
+ | OSPAC: | ||
+ | GVAL equ 0F1EAh | ||
+ | |||
+ | org 300h | ||
+ | |||
+ | ; | ||
+ | ; Kommando-Rahmen | ||
+ | ; | ||
+ | |||
+ | jp para | ||
+ | db " | ||
+ | db 0 | ||
+ | |||
+ | ; | ||
+ | ; TESTPARA | ||
+ | ; | ||
+ | |||
+ | para: | ||
+ | jr c, ende ; keine weiteren Parameter | ||
+ | |||
+ | next_param: | ||
+ | call anz_conbu ; | ||
+ | |||
+ | ;nächsten Parameter holen | ||
+ | call gval | ||
+ | |||
+ | ; GVAL | ||
+ | ; Funktion: Löschen internen Puffer (INTLN). | ||
+ | ; Übernahme Parameter aus CONBU nach INTLN | ||
+ | ; Test auf Parameterart | ||
+ | ; Konvertieren Parameter, wenn dieser ein Wert ist | ||
+ | ; Return | ||
+ | ; Parameter: Z 1 Parameter war Dezimalzahl | ||
+ | ; 0 Parameter war keine Zahl | ||
+ | ; | ||
+ | ; 1 Fehler im Parameter | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; CY’ 0 weitere Parameter in CONBU (ist in Doku falsch!) | ||
+ | ; 1 keine weiteren Parameter (ist in Doku falsch!) | ||
+ | ; A’ den Parameter begrenzendes Trennzeichen | ||
+ | ; | ||
+ | ; | ||
+ | ; CONBU übernommener Parameter und Trennzeichen gelöscht mit | ||
+ | ; Leerzeichen | ||
+ | |||
+ | jr z, | ||
+ | |||
+ | call prnst | ||
+ | db " | ||
+ | jr para1 | ||
+ | zahl_parameter: | ||
+ | push af | ||
+ | call prnst | ||
+ | db " | ||
+ | pop af | ||
+ | |||
+ | jr nc, para1 ; Fehler in Zahl? | ||
+ | call prnst | ||
+ | db " | ||
+ | |||
+ | para1: | ||
+ | db " | ||
+ | ld a, (INTLN) ; Länges des Parameters | ||
+ | add a,' | ||
+ | call OUTA | ||
+ | call OSPAC | ||
+ | |||
+ | ld a, (INTLN) | ||
+ | or A | ||
+ | jr z, | ||
+ | |||
+ | ld de, INTLN+1 | ||
+ | ld c,9 | ||
+ | call 5 ; | ||
+ | |||
+ | para2 call OCRLF | ||
+ | ex af, af' | ||
+ | jr c, ende ; wenn kein Parameter folgt | ||
+ | jr next_param | ||
+ | ; | ||
+ | ; | ||
+ | ende: | ||
+ | call prnst | ||
+ | db " | ||
+ | db 0dh, | ||
+ | ; | ||
+ | or a | ||
+ | ret | ||
+ | ; | ||
+ | |||
+ | ; | ||
+ | ;Ausgabe String, bis 0 | ||
+ | ; | ||
+ | ; | ||
+ | prnst: | ||
+ | PRS1: | ||
+ | INC HL | ||
+ | or A ; | ||
+ | JR Z, PRS2 ; | ||
+ | CALL OUTA | ||
+ | JR PRS1 ; | ||
+ | PRS2: | ||
+ | RET | ||
+ | |||
+ | |||
+ | ; | ||
+ | ; Anzeige CONBU | ||
+ | ; | ||
+ | anz_conbu: | ||
+ | db " | ||
+ | |||
+ | ld de, CONBU+2 | ||
+ | anz ld c, | ||
+ | call 5 | ||
+ | ld a, '<' | ||
+ | call outa | ||
+ | call OCRLF | ||
+ | ret | ||
+ | |||
+ | ; | ||
+ | |||
+ | |||
+ | end | ||
+ | </ | ||
+ | |||
+ | ===== Programmerstellung am PC ===== | ||
+ | |||
+ | Bei großen Programmen ist es leichter diese am PC zu schreiben und zu assemblieren. Ich nutze dafür den | ||
+ | [[: | ||
+ | {{: |