Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

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 volkerpz9001:programmieren [2020/09/09 11:17] (aktuell) – [Der OS-Rahmen] volkerp
Zeile 20: Zeile 20:
 {{:z9001:f83.gif|}} {{:z9001:f83.gif|}}
  
-Beim [[sonstiges:kctreffen2012|]] gab es eine kleine Einführung ins FG-FORTH F83 {{:sonstiges:z9001_f83.pdf|}}.+Beim [[sonstiges:kctreffen2012|]] gab es eine kleine Einführung ins FG-FORTH FORTH83 {{:sonstiges:z9001_f83.pdf|}}.
  
  
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 über den Programmnamen aufgerufen werden. Außerdem können Parameter übergeben werden (s. z.B. Code von OS-SAVE).+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 über den Kommandoname aufgerufen werden. Außerdem können Parameter übergeben werden (s. z.B. Code von OS-SAVE).
  
-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: ...
 </code> </code>
 +
 +**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:
 </file> </file>
  
 +Beispiel 3: Testprogramm für Parameterübergabe TESTPARA
 +
 +Es werden Parametertyp, Parameterwert, eventuelle Fehler sowie der Inhalt des Buffers CONBU nach jedem Holen des nächsten Parameters mit GVAL angezeigt.
 +
 +<file z80>
 +; Testprogramm für GVAL-Funktion (Parameterübergabe an Programme)
 +
 + cpu z80
 +
 +CONBU: EQU 80H ;CCP ZEICHENKETTENPUFFER
 +INTLN: equ 0100h ; interner Zeichenkettenpuffer
 +OCRLF: EQU 0F2FEH
 +OUTA: EQU 0F305H
 +OSPAC: EQU 0F310H
 +GVAL equ 0F1EAh
 +
 + org 300h
 +
 +;-------------------------------------------------------------------------------
 +; Kommando-Rahmen
 +;-------------------------------------------------------------------------------
 +
 + jp para
 + db "TESTPARA", 0
 + db 0
 +
 +;-------------------------------------------------------------------------------
 +; TESTPARA
 +;-------------------------------------------------------------------------------
 +
 +para: ex af, af' ;'
 + jr c, ende ; keine weiteren Parameter
 +
 +next_param:
 + call anz_conbu ; Anzeige 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
 +;    CY  0 kein Fehler
 +;        1 Fehler im Parameter
 +;     Konvertierte Dezimalzahl, wenn Z = 1 und CY = 0
 +;     den Parameter begrenzendes Trennzeichen
 +;     Länge des Parameters
 +;    HL  Adresse des nächsten Zeichens in CONBU
 +;    CY’ 0 weitere Parameter in CONBU (ist in Doku falsch!)
 +;        1 keine weiteren Parameter (ist in Doku falsch!)
 +;    A’ den Parameter begrenzendes Trennzeichen
 +;    INTLN  Länge des Parameters
 +;    INTLN+1. . . übernommener Parameter
 +;    CONBU übernommener Parameter und Trennzeichen gelöscht mit
 +; Leerzeichen
 +
 + jr z,zahl_parameter
 +
 + call prnst
 + db "Text ", 0
 + jr para1
 +zahl_parameter:
 + push af
 + call prnst
 + db "Zahl ", 0
 + pop af
 +
 + jr nc, para1 ; Fehler in Zahl?
 + call prnst
 + db "mit Fehler! ",0
 +
 +para1: call prnst
 + db "Laenge=", 0
 + ld a, (INTLN) ; Länges des Parameters
 + add a,'0'
 + call OUTA
 + call OSPAC
 +
 + ld a, (INTLN)
 + or A
 + jr z,para2 ; bei Länge 0 nicht anzeigen
 +
 + ld de, INTLN+1
 + ld c,9
 + call 5 ; Anzeige Text
 +
 +para2 call OCRLF
 + ex af, af' ;'
 + jr c, ende ; wenn kein Parameter folgt
 + jr next_param
 +;
 +;
 +ende: call anz_conbu
 + call prnst
 + db "-- kein weiterer Parameter --"
 + db 0dh,0ah,0
 +;
 + or a
 + ret
 +;
 +
 +;------------------------------------------------------------------------------
 +;Ausgabe String, bis 0
 +;-------------------------------------------------------------------------------
 +;
 +prnst: EX (SP),HL ;Adresse hinter CALL
 +PRS1: LD A,(HL)
 + INC HL
 + or A ;Ende (A=0=?
 + JR Z, PRS2 ;ja
 + CALL OUTA
 + JR PRS1 ;nein
 +PRS2: EX (SP),HL ;neue Returnadresse
 + RET
 +
 +
 +;-------------------------------------------------------------------------------
 +; Anzeige CONBU
 +;-------------------------------------------------------------------------------
 +anz_conbu: call prnst
 + db "CONBU >", 0
 +
 + ld de, CONBU+2
 +anz ld c,9
 + call 5
 + ld a, '<'
 + call outa
 + call OCRLF
 + ret
 +
 +;------------------------------------------------------------------------------
 +
 +
 + end
 +</file>
  
 ===== 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 
-[[:sonstiges:assembler#arnold-assembler]]. Kleine in Perl geschriebene Hilfstools unterstützen den Prozess und erzeugen z.B. gleich tap-Dateien, die im Emulator geladen werden können oder mit KCSAVE {{:z9001:kcsave.rar|}} als Audiosignal am realen KC geladen werden können.+[[:sonstiges:assembler#arnold-assembler]]. Kleine in Perl geschriebene Hilfstools unterstützen den Prozess und erzeugen z.B. gleich tap-Dateien, die im Emulator geladen werden können oder mit KCSAVE {{:programme:kcsave.rar|}} als Audiosignal am realen KC geladen werden können.
  
 {{:sonstiges:emulat4.gif}} {{:sonstiges:emulat4.gif}}
  • z9001/programmieren.1371020145.txt.gz
  • Zuletzt geändert: 2013/06/12 06:55
  • von volkerp