Sprungverteiler

Der Sprungverteiler ist kein Programm im eigentliche Sinne. Er wird installiert, um Standard-Routinen (z.B. Headersave, Druckertreiber, aber auch Tastatur- und Spielhebelabfragen) von Anwenderprogrammen (z.B.KC-BASIC+, Microword u. a.) zu erreichen, gleich, wo die jeweilige Routine im Speicher steht. Der Sprungverteiler ist im Speicherbereich FFB7H bis FFFFH einzutragen. In FFB7H steht nur ein Return (C9).

Voraussetzung für die Nutzung des Sprungverteilers ist natürlich ein bestückter Speicher (RAM oder ROM) im o. g. Bereich.

Ein Anwendungsbeispiel soll die Einbindung des Sprungverteilers illustrieren: Es soll mit dem Microword ein Text von der Kassette eingelesen werde. Mit „R„ ruft man LORUF des Headersave über den Sprungverteiler auf (Adr.: FFF1H): Im „Brosig“-Monitor steht hier ein JMP FAACH (C3 AC FA). Kommt das Headersave auf E000 bis E3FFH zum Einsatz, ist auf FFF1H ein JMP E000H (C3 00 E0) einzutragen. Microword findet LORUF in beiden Fällen ohne Änderung.

Wer den Sprungverteiler nutzen will, muß sich diesen in den RAM eintragen oder beim 4-KByte-Monitor in den EPROM brennen. Nicht genutzte Routinen erhalten ein JMP FFB7H (C3 B7 FF), also einen Rücksprung in das aufrufende Programm. Mit diesen Hinweisen sollte es möglich sein, den in [1] ausführlich erläuterten Sprungverteiler praktisch zu nutzen. (K.-J. Hofmann)

DIREKTANSPRÜNGE: Wer keine Möglichkeit hat, sich diesen SV einzutragen (z.B. 16-K), kann sich auch die Aufruf-Adressen der Standard-Routinen (z.B. LORUF/SARUF des HEADERSAVE) direkt eintragen. In allen Beschreibungen stehen die jeweiligen Adressen, wo diese Sprünge eingetragen werden. Hierbei bleiben ein eingetragenes CDH (CALL) oder C3H (JMP) stehen, es kommt der niederwertige, dann der höherwertige Teil der Rufadressen. Die Rufadressen stehen ebenfalls immer in den Beschreibungen zu diesen Standard-Programmen. Es ist deshalb immer sinnvoll, sich alle Beschreibungen gründlich durch zu lesen.

s.a. [1] Lühne, V.: Sprungverteiler für Z 1013-Betriebssystemerweiterungen, FUNKAMATEUR 37 (1988), H.10, S.484

* Sprungverteiler für Z 1013-Erweiterungen *

Der Zusatzsprungverteiler wurde entsprechend einer Einigung innerhalb der Interessengemeinschaft Heimcomputer des IZ an der TU Dresden folgendermaßen festgelegt:

Beginnt auf Adresse

FFFFH

abwärtsführend:

FFFDH - JMP INKEY

  holt ein Zeichen von Tastatur in den Akku;
  kommt beim 2. Aufruf nur zurück, wenn Taste
  zwischendurch losgelassen wurde 

FFFAH - JMP POLL

  bringt immer ein Zeichen im Akku zurück, egal 
  ob Taste losgelassen wurde oder nicht

FFF7H - JMP STAT

  übergibt Tastaturstatus im Akku
   A=0   - keine Taste gedrückt
   A=FFH - Taste gedrückt
  die Abfrage erfolgt ohne Rücksicht, ob die
  Taste schon vor dem Aufruf gedrückt war und
  hinterlässt trotz gedrückter Taste den Status
  'letztes Zeichen war 0' ((Zelle 4)=0) um eine
  evtl. nachfolgenden INKEY-Routine nicht zu 
  sperren

FFF4H - JMP SARUF

  ruft die SAVE-Routine des Headersave
  ! zerstört 1. Registersatz + AF'
  Parameterübergabe:
  Zellen 1BH - anfadr.
         1DH - endadr.
         23H - strtadr.
  Akku   3AH - Wiederholen der SAVE-Funktion mit
               gleichem Kopf
  H(IY)  Typvorgabe (in ASCII), sonst 0

FFF1H - JMP LORUF

  ruft LOAD-Routine des Headersave
  ! zerstört 1. Registersatz + AF'
  Parameterübergabe:
  Zellen 1BH - neue Anfangsadresse des Files
               sonst 0
  Akku   0   - ohne signifikante Kontrolle
         4EH - mit signifikanter Kopfkontrolle
               (Typ) + Namenabfrage
  H(IY)  0   - Typ wird abgefragt 
         Typkennzeichen (in ASCII), keine Typabfr. 
  L(IY)  20H - Freigabe Autostart bei COM-Files 
  

FFEEH - JMP ZMINI

  Initialisierung der Z-Monitorrufe auf B0H

FFEBH - JMP DRDEL

  setzt den logischen Druckertreiber zurück

FFE8H - JMP DRAKK

  übergibt den Akkuinhalt an den logischen 
  Druckertreiber

FFE5H - JMP BSDR

  druckt den Inhalt des BWS und kehrt in das
  rufende Programm zurück

FFE2H - JMP HARDC

  übergibt den Akkuinhalt an logischen Drucker-
  treiber wenn ein Flag im Rechner gesetzt ist;
  wandelt CR (0DH) in NL (1EH/0DH-0AH)
  ! nur verwenden, wenn Programm eine eigene
  Bildschirmverwaltung hat

FFDFH - JMP DRZEL

  wie DRAKK, nur das der Inhalt von 1BH übergeben 
  wird (vorgesehen, um im BASIC mit POKE zu drucken)

FFDCH - JMP BEEP

  erzeugen eines kurzen Signals

FFD9H - JMP ASTA

  Ausgabe Akkuinhalt als ASCII-Zeichen an PUNCH

FFD6H - JMP BSTA

  Ausgabe Akkuinhalt als Byte an PUNCH

FFD3H - JMP AIN

  Eingabe eines ASCII-Zeichens vom LBL in den Akku

FFD0H - JMP BIN

  Eingabe eines Bytes vom LBL in den Akku

FFCDH - JMP DRINI

  Initialisierung des logischen Druckertreibers

FFCAH - JMP ZEIDR

  übergibt ein Zeichen im Akku an physischen
  Druckertreiber

FFC7H - JMP BLMK

  Lesen eines Blocks vom Headersave
  Parameterübergabe:
   Zellen 25H/26H * Kopfinhalt des zu lesenden Bl.
   HL             * Ladeadresse des Blocks
  Return:
   Zellen 25H/26H * Kopfinhalt + 20H
   HL             * HL:=HL+20H
  Abbruch des Lesens bei Kopfinhalt=0FFFFH 
  oder DMA > Endadr in ARG2 (1DH)

FFC4H - JMP BSMK

  Schreiben eines Blocks im Headersave
  Parameterübergabe:
   HL  * Quelladresse Block
   IX  * Kopfinhalt
   DE  * Anzahl der Sync.-Bits
  Return:
   HL  * HL:=HL+20H

FFC1H - JMP SUCHK

  Suchen eines Kopfblocks und Übergabe des Inhalts
  im Kopfpuffer (E0-FF), keine Auswertung

FFBEH - JMP AKP

  Aufbereitung Kopfpuffer mit Namenabfrage
  Parameterübergabe wie bei SARUF

FFBBH - JMP GETST

  Abfrage der Joysticks und Übergabe des Er-
  gebnisses in BC (B-links,C-rechts) mit folgen-
  den Bit-Bedeutungen (Belegung mit 1):
    Bit 0 - links
        1 - rechts
        2 - runter
        3 - hoch
        4 - Aktionstaste
     Z-Flag=1, wenn keine Betätigung vorliegt
    CY-Flag=1, wenn Spielhebel nicht angeschlossen

FFB8H - JMP SOUND

  Ausgabe einer vollen Periode auf die Tonband-
  buchse, sowie auf Bit 7 vom Systemport (User-P)
  Übergabe der Periodendauer in C mit 
  T=n*33mks+20mks (2MHz)

DRZEL - eigentlich, um aus BASIC heraus zu drucken; wird m.E. nicht genutzt

BSDR - Bildschirmkopie drucken. im BROSIG-Monitor ist bereits eine Routine enthalten, die allerdings den Bildschirm nur bis zum Cursor bzw. dem Graphikzeichen 0FFH druckt und außerdem die Verarbeitung von Graphikzeichen dem Drucker überläßt.

HARDC - soll A drucken, wenn Flag im Speicher gesetzt ist. welche Speicheradresse gemeint ist, wird leider nicht spezifiert. Ich denke, daß es 006EH, Bit 0 sein könnte. Das ist das Druckflag für den Original-10k-BASIC-Interpreter von Riesa, allerdings müßte dann das Zeichen im Register E übergeben werden, nicht in A !?

In practic 1/90, S. 41 wurde eine Erweiterung des Sprungverteilers für BASICODE-Save und -Load vorgeschlagen. Das hat aber keinerlei praktische Anwendung mehr erfahren. Es gab auch keine Hinweise zu Aufrufparametern und auch keine Referenzimplementierung.

FFB5H - JMP BSAVE:

 Saven im BASIC-Code-Format 

FFB2H - JMP BLOAD:

 Laden im BASIC-Code-Format 

(vp)