Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste ÜberarbeitungBeide Seiten der Revision | ||
z9001:programmieren [2013/06/25 10:52] – [FORTH] volkerp | z9001:programmieren [2017/11/08 06:31] – [Der OS-Rahmen] volkerp | ||
---|---|---|---|
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. | ||
+ | |||
+ | **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). | ||
Zeile 172: | Zeile 180: | ||
</ | </ | ||
+ | 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 ===== |