Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
z9001:programmieren [2013/03/25 19:02] – 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 63: | 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 81: | 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)). |
+ | |||
+ | **erneuter Aufruf** | ||
+ | |||
+ | 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 <> 0 erwartet. Das OS gibt dann eine entsprechende Fehlermeldung aus (s. Doku OS, 2.2.3. Fehlerbehandlung, | ||
+ | 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. | Folgendes Programm gibt den Text "Hallo User!" auf den Bildschirm aus. | ||
- | Das Programm wird mit dem Kommando | + | Das Programm wird mit dem Kommando |
- | <code z80> | + | <file z80> |
- | ORG 300h | + | 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 | ||
+ | [[: | ||
+ | {{: |