Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
z9001:programmieren [2013/06/12 06:55] – Link mit z9001:weitere_module geändert zu z9001:module_sonstige volkerp | z9001:programmieren [2025/02/23 12:41] (aktuell) – [Der OS-Rahmen] volkerp | ||
---|---|---|---|
Zeile 20: | Zeile 20: | ||
{{: | {{: | ||
- | Beim [[sonstiges: | + | Beim [[sonstiges: |
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 83: | Zeile 83: | ||
AUSF: ... | AUSF: ... | ||
</ | </ | ||
+ | |||
+ | **Kommandozeile** | ||
+ | |||
+ | 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. | ||
Zeile 172: | Zeile 187: | ||
</ | </ | ||
+ | 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 ;ja | ||
+ | CALL OUTA | ||
+ | JR PRS1 ; | ||
+ | PRS2: | ||
+ | RET | ||
+ | |||
+ | |||
+ | ; | ||
+ | ; Anzeige CONBU | ||
+ | ; | ||
+ | anz_conbu: | ||
+ | db " | ||
+ | |||
+ | ld de, CONBU+2 | ||
+ | anz ld c,9 | ||
+ | call 5 | ||
+ | ld a, '<' | ||
+ | call outa | ||
+ | call OCRLF | ||
+ | ret | ||
+ | |||
+ | ; | ||
+ | |||
+ | |||
+ | end | ||
+ | </ | ||
===== Programmerstellung am PC ===== | ===== Programmerstellung am PC ===== | ||
Bei großen Programmen ist es leichter diese am PC zu schreiben und zu assemblieren. Ich nutze dafür den | Bei großen Programmen ist es leichter diese am PC zu schreiben und zu assemblieren. Ich nutze dafür den | ||
- | [[: | + | [[: |
{{: | {{: |