5.3 ** Vector-Aufrufe
Alphabetische Übersicht (MINERVA-Vectoren klein
geschrieben):
S NUR im Supervisor-Betrieb und NICHT aus Interrupt- Routine heraus,
U NICHT im Supervisor-Betrieb aufzurufen.
F intern supervisor mit erzwungener Rückkehr in den user-Modus
+ Vectoren ab $124 gelten mit $4000(An).
BP - BV
|
bp.chan |
$140 |
|
+ |
Kanalnummer holen, Vorgabe #1 |
|
bp.chand |
$142 |
|
+ |
dto., Vorgabe wählbar |
|
bp.chnew |
$146 |
|
+ |
neuen Basic-Kanal aufmachen |
|
bp.chnid |
$144 |
|
+ |
Kanal-ID überprüfen |
|
bp.fname |
$148 |
|
+ |
Parameter als Filenamen holen |
|
BP.INIT |
$110 |
|
|
Einfügen neuer Basic-Befehle |
|
BP.LET |
$120 |
|
|
Variablenzuweisung |
|
BV.CHRIX |
$11A |
|
|
Speicherzuweisung im Rechnerstack |
CA - CN
|
CA.GTFP |
$114 |
|
|
f.p.-Zahl holen |
|
CA.GTINT |
$112 |
|
|
16-Bit-Ganzzahl holen |
|
CA.GTLIN |
$118 |
|
|
32-Bit-Ganzzahl holen |
|
CA.GTSTR |
$116 |
|
|
Zeichenkette holen |
|
ca.cnvrt |
$14a |
|
+ |
Datentyp umwandeln |
|
ca.eval |
$14e |
|
+ |
(der Sinn bleibt dunkel) |
|
ca.opexe |
$14c |
|
+ |
(dto.) |
|
CN.BTOIB |
$104 |
|
|
ASCII nach Binär, 8-Bit-Zahl |
|
CN.BTOIL |
$108 |
|
|
dto., 32-Bit |
|
CN.BTOIW |
$106 |
|
|
dto., 16-Bit |
|
CN.DATE |
$0EC |
|
|
Datum in sec als 32-Bit-Zahl |
|
CN.DAY |
$0EE |
|
|
Wochentag |
|
CN.DTOF |
$100 |
|
|
ASCII nach f.p.-Zahl |
|
CN.DTOI |
$102 |
|
|
dto., 16-Bit |
|
CN.FTOD |
$0F0 |
|
|
f.p. nach ASCII |
|
CN.HTOIB |
$10A |
|
|
ASCII nach sedecimal, 8-Bit-Zahl |
|
CN.HTOIL |
$10E |
|
|
dto., 32-Bit |
|
CN.HTOIW |
$10C |
|
|
dto., 16-Bit |
|
CN.ITOBB |
$0F4 |
|
|
binär nach ASCII, 8-Bit-Zahl |
|
CN.ITOBL |
$0F8 |
|
|
dto., 32-Bit |
|
CN.ITOBW |
$0F6 |
|
|
dto., 16-Bit |
|
CN.ITOD |
$0F2 |
|
|
16-Bit-Ganzzahl nach ASCII |
|
CN.ITOHB |
$0FA |
|
|
sedecimal nach ASCII, 8-Bit-Zahl |
|
CN.ITOHL |
$0FE |
|
|
dto., 32-Bit |
|
CN.ITOHW |
$0FC |
|
|
dto., 16-Bit |
|
|
|
|
|
|
GO |
|
|
|
|
|
|
go.new |
$13e |
|
+ |
NEW ausführen |
IO - IP
|
IO.NAME |
$122 |
|
|
Analyse eines Devicenamen |
|
IO.QEOF |
$0E4 |
|
|
Queue EOF markieren |
|
IO.QIN |
$0E0 |
|
|
Byte in Queue ablegen |
|
IO.QOUT |
$0E2 |
|
|
Byte einer Queue entnehmen |
|
IO.QSET |
$0DC |
|
|
Queue einrichten, Länge D1.W |
|
io.qsetl |
$16c |
|
|
Qeue einrichten, Läge D1.L |
|
IO.QTEST |
$0DE |
|
|
Status einer Queue prüfen |
|
IO.SERIO |
$0EA |
S |
|
Allgemeine I/O-Bearbeitung |
|
IO.SERQ |
$0EB |
S |
|
Direkte Queue-Bearbeitung |
|
ip.kbend |
$152 |
S |
+ |
abschließende Tastatur-Auswertung |
|
ip.kbrd |
$150 |
S |
+ |
Tastatur lesen |
MD - MI - MM
|
MD.READ |
$124 |
|
+ |
einen Sector lesen |
|
MD.SECTR |
$12A |
|
+ |
Sectorheader lesen |
|
MD.VERIN |
$128 |
|
+ |
Sector kontrollieren |
|
MD.WRITE |
$126 |
|
+ |
einen Sector schreiben |
|
MM.ALCHP |
$0C0 |
S |
|
Common Heap-Zuweisung |
|
mm.aclr |
$168 |
|
+ |
Speicherbereich löschen |
|
MM.ALLOC |
$0D8 |
|
|
Heap-Bereich reservieren |
|
MM.LNKFR |
$0DA |
|
|
Speicher an Heap zurückgeben |
|
mm.move |
$158 |
|
+ |
Speichertransfer absolut |
|
mm.mrtoa |
$15a |
U F |
+ |
dto., rel nach abs |
|
mm.mator |
$15c |
U F |
+ |
dto., abs nach rel |
|
mm.rclr |
$16a |
U F |
+ |
Speicherbereich relA6 löschen |
|
mm.mrtor |
$15e |
U F |
+ |
dto., rel nach rel |
|
MM.RECHP |
$0C2 |
S |
|
Bereich des Common Heap freigeben |
RI
|
RI.EXEC |
$11C |
|
|
eine Rechneroperation ausführen |
|
RI.EXECB |
$11E |
|
|
Rechneroperationen ausführen |
SB
|
sb.start |
$154 |
|
+ |
Basic-Job starten |
UT
|
UT.CON |
$0C6 |
|
|
Consolfenster einrichten |
|
UT.CSTR |
$0E6 |
|
|
zwei Strings vergleichen |
|
UT.ERR0 |
$0CA |
|
|
Fehlermeldung an Kanal 0 oder 1 |
|
UT.ERR |
$0CC |
|
|
dto., an beliebigen Kanal |
|
ut.istr |
$13c |
|
+ |
INSTR-Operation ausführen |
|
UT.LINK |
$0D2 |
|
|
Posten in Liste einfügen |
|
UT.MINT |
$0CE |
|
|
Integer nach ASCII |
|
UT.MTEXT |
$0D0 |
|
|
einen Text ausgeben |
|
UT.SCR |
$0C8 |
|
|
Bildschirmfenster einrichten |
|
UT.UNLNK |
$0D4 |
|
|
Listenelement entfernen |
|
UT.WINDW |
$0C4 |
|
|
Fenster beliebiger Art einrichten |
|
v.vres |
$170 |
S |
+ |
Kaltstart (undokumentiert) |
|
v.mres |
$172 |
S |
+ |
Kaltstart ohne Speichertest (undokumentiert) |
Die Namen für SQ nach
{15}:
BI.INIPR |
$0110 |
CV.IBBIN |
$00F4 |
MEM.ALHP |
$00D8 |
BI.SPRM |
$0120 |
CV.IBHEX |
$00FA |
MEM.AUHP |
$00D8 |
CA.FLOAT |
$08 |
CV.ILBIN |
$00F8 |
MEM.LLST |
$00D2 |
CA.INT |
$04 |
CV.ILDAT |
$00EC |
MEM.RCHP |
$00C2 |
CA.MOP |
$011E |
CV.ILDAY |
$00EE |
MEM.REHP |
$00DA |
CA.NINT |
$02 |
CV.ILHEX |
$00FE |
MEM.RLST |
$00D4 |
CA.NLINT |
$06 |
CV.IWBIN |
$00F6 |
MEM.RUHP |
$00DA |
CA.OP |
$011C |
CV.IWDEC |
$00F2 |
OPW.CON |
$00C6 |
CV.BINIB |
$0104 |
CV.IWHEX |
$00FC |
OPW.SCR |
$00C8 |
CV.BINIL |
$0108 |
IOQ.GBYT |
$00E2 |
OPW.WIND |
$00C4 |
CV.BINIW |
$0106 |
IOQ.PBYT |
$00E0 |
UT.WERMS |
$00CC |
CV.DECFP |
$0100 |
IOQ.SEOF |
$00E4 |
UT.WERSY |
$00CA |
CV.DECIW |
$0102 |
IOQ.SETQ |
$00DC |
UT.WINT |
$00CE |
CV.HEXIB |
$010A |
IOQ.TEST |
$00DE |
UT.WTEXT |
$00D0 |
CV.HEXIL |
$010E |
IOU.DNAM |
$0122 |
CV.HEXIW |
$010C |
MEM.ACHP |
$00C0 |
|
|
|
|
mem.achp |
MM.ALCHP |
sm |
192 $0C0 |
|
Speicherzuweisung im Heap |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
benötigter Platz |
D1 |
zugeteilter Platz |
|
|
|
D2, D3 |
verdorben |
|
|
|
A0 |
Basisadresse |
|
|
|
A1 - A3 |
verdorben |
|
A6 |
Sysvari |
A6 |
NUR nach {15}: verdorben |
ERR.OM -3 (nur D0, nicht Flags)
Die Anforderung muß mindestens 16 Bytes für einfache
Definitionen oder 24 Bytes für IOSS Kanäle umfassen. In A0 kehrt
die Adresse des Headers zurück, nicht die des freien Bereichs. Der
freie Block wird gelöscht.
mem.rchp |
MM.RECHP |
sm |
194 $0C2 |
|
Rückgabe einer Heap-Zuweisung |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
A0 |
Anfang des Speicherblocks |
A0 - A3 |
verdorben |
|
|
|
A6 |
NUR nach {15}: verdorben |
opw.wind |
UT.WINDW |
st |
196 $0C4 |
|
Fenster mit angegebenem Namen
einrichten |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
A0 |
Ptr auf Namen |
A0 |
Kanal ID |
|
A1 |
Ptr auf Parameterblock |
A1 - A3 |
verdorben |
ERR.BN -12
ERR.OM -3
ERR.NO -6
ERR.OR -4 (Fenster in Standardmaßen geöffnet, A0
gültig)
A1 zeigt auf 4 Parameterbytes für Farben und Breite:
00(A1) Border
01(A1) Breite
02(A1) Paper, zugleich Strip
03(A1) Ink
opw.con |
UT.CON |
st |
198 $0C6 |
|
Consolfenster nach Parametertabelle
einrichten |
opw.scr |
UT.SCR |
st |
200 $0C8 |
|
Richtet ein Bildschirmfenster vom SCR-Typen
ein |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
|
|
A0 |
Kanal ID |
|
A1 |
Ptr auf Parameterblock |
A1 - A3 |
verdorben |
ERR.OM -3
ERR.NO -6
ERR.OR -4 (Fenster in Standardmaßen geöffnet, A0
gültig)
A1 zeigt auf 4 Parameterbytes für Farben und Breite:
00(A1) .b Borderfarbe
01(A1) .b Borderbreite
02(A1) .b Papier, zugleich Strip
03(A1) .b Ink
04(A1) .w Fensterbreite
06(A1) .w Fensterhöhe
08(A1) .w X-Ursprung
0A(A1) .w Y-Ursprung
ut.wersy |
UT.ERR0 |
st |
202 $0CA |
|
Schreibt Fehlermeldung in Kanal mit ID
$00000000 |
ut.werms |
UT.ERR |
st |
204 $0CC |
|
Schreibt Fehlermeldung in angegebenen
Kanal |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
D0 |
Fehlercode oder Adresse |
|
|
|
A0 |
UT.ERR: Kanal ID |
|
|
Gelegentlich keine oder fehlerhafte Ausgabe. Hierzu s. UT.MTEXT.
ut.wint |
UT.MINT |
st |
206 $0CE |
|
Ganzzahl in ASCII-Zeichen gewandelt in einen
Kanal schreiben |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1.W |
Ganzzahl |
D1, D2 |
verdorben |
|
|
|
D3 |
-1 (wenn A0<>0, sonst =0) |
|
A0 |
Kanal-ID |
|
|
|
|
|
A1 - A3 |
verdorben |
ERR.NC -1
ERR.NO -6
ERR.DF -11
Wenn A0 die ID des Kommandokanals enthält und dieser in Gebrauch ist,
wird die Ausgabe umgeleitet (s. UT.MTEXT).
ut.wtext |
UT.MTEXT |
st |
208 $0D0 |
|
Sendet einen Text in einen Kanal |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1, D2 |
verdorben |
|
|
|
D3 |
0 nach A0 = 0, sonst -1 |
|
A0 |
Kanal ID |
|
|
|
A1 |
Adresse des Textes |
A1 |
verdorben |
ERR.NC -1
ERR.NO -6
ERR.DF -11
Interrupt-Routinen, Routinen im Supervisor-Mode, UT.ERR0 und UT.ERR
können UT.MTEXT mit A0=0 aufrufen.
Wenn der Kommandokanal in Gebrauch ist, wird die Ausgabe an einen Kanal
mit ID $00010001 geleitet. Existiert der nicht, geht die Fehlermeldung
u.U. verloren.
mem.list |
UT.LINK |
st |
210 $0D2 |
|
Fügt einen Ptr in eine verkettete Liste
ein |
mem.rlst |
UT.UNLNK |
st |
212 $0D4 |
|
Herausnehmen eines Ptr aus einer verketteten
Liste |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
A0 |
Adr des Ptr |
|
|
|
A1 |
Ptr auf vorangehenden Ptr |
A1 |
nachgestellt |
UT.LINK: Beim ersten Eintrag Platz für 4 Bytes sicherstellen.
UT.UNLK: A1 muß auf den vorangehenden Eintrag zeigen.
mem.alhp |
MM.ALLOC |
gu |
216 $0D8 |
|
Zuweisung eines Blocks im
User-Heap |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
geforderter PLatz |
D1 |
zugeteilter Platz |
|
|
|
D2 - D3 |
verdorben |
|
A0 |
Ptr auf Ptr auf freien Platz |
A0 |
Anfang des Blocks |
|
|
|
A1 - A3 |
verdorben |
|
A6 |
Sysvari |
|
|
ERR.OM -3 (Flags müssen abgefragt werden)
Im Speicher gelangen an Position
0(A0) Bereichslänge
4(A0) zu seiner Adresse relativer Ptr auf den nächsten freien
Bereich.
MT.ALLOC ist eine "atomic" Version dieses Vectors.
mem.rehp |
MM.LNKFR |
gu |
218 $0DA |
|
Rückgabe an den User-Heap |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
Länge des Bereiches |
D1 - D3 |
verdorben |
|
A0 |
Adresse des neuen Platzes |
A0 - A3 |
verdorben |
|
A1 |
Ptr auf Ptr auf freien Platz |
|
|
MT.LNKFR ist eine "atomic" Version dieses Vectors.
ioq.setq |
IO.QSET |
gu |
220 $0DC |
|
Einrichten einer Queue |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
Pufferlänge < 32768 |
D1 |
verdorben (nicht MI, SQ) |
|
A2 |
Ptr auf Headerposition |
|
|
|
|
|
A3 |
verdorben |
A2 zeigt auf einen verfügbaren Speicherbereich der Größe
16 + Pufferlänge.
ioq.test |
IO.QTEST |
gu |
222 $0DE |
|
Status einer Queue lesen |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 |
nächstes zu lesendes Byte |
|
|
|
D2 |
freier Platz |
|
A2 |
Adr des Queue-Headers |
|
|
|
|
|
A3 |
verändert |
ERR.NC -1 Queue ist leer
ERR.EF -10
ioq.pbyt |
IO.QIN |
gu |
224 $0E0 |
|
Ein Byte in eine Queue schreiben |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1.B |
Datenbyte |
|
|
|
A2 |
Ptr auf Queue-Header |
|
|
|
|
|
A3 |
verändert |
ERR.NC -1 Queue ist voll
EOF weist die Eingabe ab, liefert aber keinen Fehlercode.
Der EOF-Zustand kann durch IO.QTEST oder in Bit #7(A2) geprüft
werden.
ioq.gbyt |
IO.QOUT |
gu |
226 $0E2 |
|
Ein Byte aus der Queue holen |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1.B |
geholtes Byte |
|
A2 |
Ptr auf Queue-Header |
|
|
|
|
|
A3 |
verändert |
ERR.NC -1 Queue ist leer
ERR.EF -10
ioq.seof |
IO.QEOF |
gu |
228 $0E4 |
|
Queue EOF markieren |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
A2 |
Ptr auf Queue-Header |
|
|
ERR.NC -1 Queue ist voll
ut.cstr |
UT.CSTR |
bu |
230 $0E6 |
|
Vergleichen zweier Strings. rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D0.B |
Vergleichstyp |
D0 |
Ergebnisflag -1,0 oder 1 |
|
A0 |
Adr(A6) des ersten String |
|
|
|
A1 |
Adr(A6) des zweiten String |
|
|
Der Vergleichstyp ist im User Guide beschrieben:
|
|
|
|
0 |
Zeichen für Zeichen, mit Unterscheidung der
Schreibweise |
|
1 |
wie 0, Schreibweise Groß oder Klein gleichgültig |
|
2 |
wie 0, Ziffernfolgen werden als Zahlen eingeordnet |
|
3 |
wie 1, Ziffernfolgen werden als Zahlen eingeordnet |
Das Ergebnis entspricht dem Vorzeichen der Subtraktion des zweiten vom
ersten String bis einschließlich des ersten abweichenden Zeichens.
iou.ssq |
IO.SERQ |
sm |
232 $0E8 |
|
Direkte I/O-Queue-Bedienung |
iou.ssio |
IO.SERIO |
sm |
234 $0EA |
|
Allgemeine serielle I/O-Behandlung |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
D0 |
Op-Code zur Trap #3 |
D0 |
Fehlermeldung |
|
D1 |
Standard IOSS Wert |
D1 |
Standard IOSS Wert |
|
D2 |
Standard IOSS Wert |
D2 |
Standard IOSS Wert |
|
D3.W |
Wartezeit |
D3 |
verdorben |
|
A0 |
Kanal-ID |
|
|
|
A1 |
Standard IOSS Wert |
A1 |
Standard IOSS Wert |
|
A2 |
|
A2, A3 |
verdorben |
ERR.BP -15 Op-Code falsch
Op-Codes in D0:
|
00 |
IO.PEND |
07 |
IO.SSTRG |
|
01 |
IO.FBYTE |
$46 |
FS.HEADS |
|
02 |
IO.FLINE |
$47 |
FS.HEADR |
|
03 |
IO.FSTRG |
$48 |
FS.LOAD |
|
05 |
IO.SBYTE |
$49 |
FS.SAVE |
IO.SERQ erfordert im Kanaldefinitionsblock:
28(Def.Blockbasis) Adresse einer Eingabe-Queue oder Null,
32(Def.Blockbasis) Adresse einer Ausgabe-Queue oder Null.
IO.SERIO kehrt hinter eine Tabelle aus drei Langwortadressen zurück,
in der die Routinen auf anstehende Dateneingabe, zum Holen eines Byte und
zum Senden mit ihrer absoluten Adresse verzeichnet sind. Näheres im
Abschnitt 3.3.2.3.3.
cv.ildat |
CN.DATE |
bu |
236 $0EC |
|
Datum und Zeit in ASCII wandeln. rel
A6 |
cv.ilday |
CN.DAY |
bu |
238 $0EE |
|
Tag als ASCII-String aus dem Datum ermitteln, rel
A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
QL-Datum in Sekunden |
D1 |
|
|
A1 |
Ptr auf Pufferanfang(A6) |
A1 |
Ptr auf den String |
Im Puffer sind 22 Bytes Platz (6 Bytes für CN.DAY) bereitzuhalten.
cv.fpdec |
CN.FTOD |
bu |
240 $0F0 |
|
Fließkommazahl in ASCII-String wandeln. rel
A6 |
cv.iwdec |
CN.ITOD |
bu |
242 $0F2 |
|
Ganzzahl in ASCII-String. rel A6 |
cv.ibbin |
CN.ITOBB |
bu |
244 $0F4 |
|
Byte in binären ASCII-String. rel
A6 |
cv.iwbin |
CN.ITOBW |
bu |
246 $0F6 |
|
Wort in binären ASCII-String. rel
A6 |
cv.ilbin |
CN.ITOBL |
bu |
248 $0F8 |
|
Langwort in binären ASCII-String. rel
A6 |
cv.ibhex |
CN.ITOHB |
bu |
250 $0FA |
|
Byte in Sedezimalen ASCII-String. rel A6 |
cv.iwhex |
CN.ITOHW |
bu |
252 $0FC |
|
Wort in Sedezimalen ASCII-String. rel A6 |
cv.ilhex |
CN.ITOHL |
bu |
254 $0FE |
|
Langwort in Sedezimalen ASCII-String. rel
A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
A0 |
Ptr auf Puffer |
A0 |
Ptr zum Puffer |
|
A1 |
Ptr auf Zahl im RI-Stack |
A1 |
Ptr auf Stapel |
|
|
|
A2, A3 |
verdorben |
|
A6 |
Referenzadresse |
|
|
NOERR
Die Zahl auf 0(A1,A6.L) geht als String nach 0(A0,A6.L).
Nur MINERVA: D1 gibt die Länge des erzeugten String an.
cv.decfp |
CN.DTOF |
bu |
256 $100 |
|
Dezimaler ASCII String in Fließkommazahl. rel
A6 |
cv.deciw |
CN.DTOI |
bu |
258 $102 |
|
Dezimaler ASCII String in 16-Bit-Zahl. rel A6 |
cv.binib |
CN.BTOIB |
bu |
260 $104 |
|
8 Bit binärer ASCII-String in Byte. rel A6 |
cv.biniw |
CN.BTOIW |
bu |
262 $106 |
|
16 Bit binärer ASCII-String in Wort. rel
A6 |
cv.binil |
CN.BTOIL |
bu |
264 $108 |
|
32 Bit binärer ASCII-String in Langwort. rel
A6 |
cv.hexib |
CN.HTOIB |
bu |
266 $10A |
|
2 Zeichen sedezimaler ASCII-String in Byte. rel
A6 |
cv.hexiv |
CN.HTOIW |
bu |
268 $10C |
|
4 Zeichen Sedezimaler ASCII-String in Wort. rel
A6 |
cv.hexil |
CN.HTOIL |
bu |
270 $10E |
|
8 Zeichen sedezimaler ASCII-String in Langwort. rel
A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
D7 |
0 oder Pufferend-Ptr |
|
|
|
A0 |
Ptr auf String im Puffer |
A0 |
Ptr zum Puffer |
|
A1 |
Ptr auf RI-Stack |
A1 |
Anfang der Zahl |
|
|
|
A2, A3 |
verdorben |
|
A6 |
Referenzadresse |
|
|
ERR.XP -17 Umwandlung mißlungen
Bei Fehlern bleiben A0 und A1 unverändert.
Der String auf 0(A0,A6.L) geht als Zahl nach 0(A1,A6.L).
Im Puffer (A1,A6.L) muß ausreichend Platz zum Rechnen sein.
sb.inipr |
BP.INIT |
bp |
272 $110 |
|
Installieren einer Anzahl Basicerweiterungen. {4.5.2} |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D2 |
verdorben - nur nach {2} |
|
A1 |
Adr der Definitionsliste |
A1 |
verdorben |
|
|
|
A4 |
verdorben (?) |
sb.gtint |
CA.GTINT |
bp |
274 $112 |
|
16-Bit-Zahlen Basicparameter holen. {4.5.4.2} rel A6 |
sb.gtfp |
CA.GTFP |
bp |
276 $114 |
|
Fließkommazahlen dto. {4.5.4.3} rel A6 |
sb.gtstr |
CA.GTSTR |
bp |
278 $116 |
|
Strings dto. {4.5.4.5} rel A6 |
sb.gtlin |
CA.GTLIN |
bp |
280 $118 |
|
Lange Ganzzahl dto. {4.5.4.4} rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1, D2 |
verdorben |
|
|
|
D4, D6 |
verdorben |
|
|
|
D3.W |
Zahl der geholten Parameter |
|
|
|
A0 |
verdorben |
|
|
|
A1 |
RI-Stack, erster Parameter |
|
|
|
A2 |
verdorben |
|
A3 |
Ptr Untergrenze Name Table |
|
|
|
A5 |
dto, Obergrenze |
|
|
|
A6 |
Referenzadresse |
A6 |
Referenz, u.U. verändert |
ERR.BP -15
ERR.XP -17
Separatoren-Markierungen der Name-Table werden verdorben.
Der lesende Basic-Job, und im Gefolge evtl. auch die anderen, kann durch
den Aufruf seine Lage und die Ptr-Relationen verändern. Allein die
Tiefe des RI-Stack bleibt mit Sicherheit erhalten, nicht seine Position.
qa.resri |
BV.CHRIX |
bp |
282 $11A |
|
Reserviert Platz im Arithmetikstapel. {4.5.6} rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
geforderte Anzahl Bytes |
D1 - D3 |
verdorben |
|
A1 |
|
A1 |
nur SQ {15}: verdorben (auch ATARI-e, wenn kein Parm angekommen
ist) |
SMSQ ohne Möglichkeit der
Fehlerbehandlung
ERR.OM -3 nur nach {15}
ERR.NC -1 bei MINERVA keine Fehlersituation
Nach {4} sind die weiteren Routinen zur Speicherveränderung auch der
anderen Bereiche ebenfalls vectorisiert und wie die anderen Vectoren
aufzurufen. Obgleich offiziell nicht dokumentiert, greifen allgemein
verbreitete Erweiterungen darauf zurück (.B. TK2). Es steht daher zu
hoffen, daß sie auch in künftigen Systemen in gleicher Form
vorhanden sein werden. Abweichungen im SQ existieren u.a. wegen seiner
Natur als Zwischencode compilierenden Systems.
Bei einigen der Aufrufe wird im Rom bereits eine Anzahl Bytes in D1
vorgegeben (s.u.), andere verlangen die Angabe gesondert. Die in {4}
angegebenen Vectoren liegen in diesen fällen auf 2 Bytes höherer
Adresse. Es wird sinnvoll sein, wo vorhanden, die geforderte Länge in
Vielfachen der - systemabhängigen - Zahlen anzugeben, diese also den
Rom-Daten zu entnehmen und sie nicht als bekannt vorauszusetzen.
Die Offsets nach {4, 2/92} mit d1.l Bytes und Laufpointer :
-2 |
-2 |
BV.CHRRX |
RI Stack |
60 Bytes - NUR(?) MINERVA (1.89) |
bv.rip |
88 |
$58 |
0 |
00 |
BV.CHRIX |
RI Stack |
|
bv.rip |
88 |
$58 |
4 |
04 |
BV.CHBTX |
Backtrack Stack |
$0C Bytes |
bv.btp |
72 |
$48 |
6 |
06 |
BV.CHBTX |
Backtrack Stack |
|
bv.btp |
72 |
$48 |
10 |
$0A |
BV.CHTGX |
Temp. Graph Stack |
$04 |
bv.tgp |
80 |
$50 |
12 |
$0C |
BV.CHTGX |
Temp. Graph Stack |
|
bv.tgp |
80 |
$50 |
16 |
$10 |
BV.CHNTX |
Name Table |
$08 |
bv.ntp |
28 |
$1C |
18 |
$12 |
BV.CHNTX |
Name Table |
|
bv.ntp |
28 |
$1C |
22 |
$16 |
BV.CHRTX |
Return Table |
$18 (MI) |
bv.rtp |
60 |
$3c |
|
|
|
|
$16 (MGG) |
|
|
|
24 |
$18 |
BV.CHRTX |
Return Table |
|
bv.rtp |
60 |
$3c |
28 |
$1C |
BV.CHBFX |
Basic-Puffer |
|
bv.bfp |
4 |
04 |
32 |
$20 |
BV.CHTKX |
Token-Liste |
|
bv.tkp |
12 |
$0C |
36 |
$24 |
BV.CHNLX |
Namen-Liste |
|
bv.nlp |
36 |
$24 |
40 |
$28 |
BV.CHVVX |
Variablenwerte |
(nicht SQ) |
bv.vvp |
44 |
$2C |
44 |
$2C |
BV.CHCHX |
Kanaltabelle |
|
bv.chp |
52 |
$34 |
48 |
$30 |
BV.CHLNX |
Zeilennummern |
(nicht SQ) |
bv.lnp |
68 |
$44 |
52 |
$34 |
BV.CHPFX |
Programm |
|
bv.pfp |
20 |
$14 |
Die neu angegebenen Vectoren werden aufgerufen
|
|
move.l |
#space,d1 |
geforderte bereichsgröße |
|
|
move.w |
$011a,a2 |
bv.chrix |
|
|
jmp |
ofs(a2) |
ausführung mit offset dazu |
qa.op |
RI.EXEC |
ar |
284 $11C |
|
Führt eine arithmetische Operation aus. {4.5.7} rel A6 |
qa.mop |
RI.EXECB |
ar |
286 $11E |
|
Führt eine Gruppe arithmetischer Operationen
aus. rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D0.W |
RI.EXEC: RI-Opcode (s.u.) |
|
|
|
D7 |
RI.EXP {1} bis QDOS 1.03 & MINERVA: 0 |
|
A1 |
RI-Stack rel(A6) |
A1 |
justiert |
|
A3 |
RI.EXECB: Codetabelle abs. |
|
|
|
A4 |
Variable rel(A6) |
|
|
ERR.OV -18
Die kleingeschriebenen Op-Codes gelten nur für MINERVA.
Abgekürzt:
tos Top Of Stack, das unmittelbar zugängliche Element,
nos Next On Stack, das danach eingetragene Element.
top Top Of Stack nach einer Operation
Name |
Code |
Stack |
Funktion |
RI.TERM |
00 |
0 |
Beendet die Rechenoperationen. |
ri.one |
01 |
-6 |
Constante Eins ablegen |
RI.NINT |
02 |
+4 |
gerundete Integer |
ri.zero |
03 |
-6 |
Constante Null ablegen |
RI.INT |
04 |
+4 |
gekappte Integer |
ri.n |
05 |
-6 |
Byte in f.p.-Zahl -128 bis 127 |
RI,.NLINT |
06 |
+2 |
f.p. in gerundete lange Integer |
ri.k |
07 |
-6 |
(?) s. Handbuch |
RI.FLOAT |
08 |
-4 |
Integer nach f.p. |
ri.flong |
09 |
-2 |
lange Integer nach f.p. |
RI.ADD |
10 |
+6 |
top := tos + nos |
RI.SUB |
12 |
+6 |
top := nos - tos |
ri.halve |
13 |
0 |
top := tos / 2 |
RI.MULT |
14 |
+6 |
top := tos * nos |
ri.doubl |
15 |
0 |
top := tos * 2 |
RI.DIV |
16 |
-6 |
top := nos / tos |
ri.recip |
17 |
0 |
tos := 1 / tos |
RI.ABS |
18 |
0 |
tos := | tos | |
ri.roll |
19 |
0 |
tos: fp1 fp2 fp3 => tos: fp2 fp3 fp1 (?) |
RI.NEG |
20 |
0 |
tos := - tos |
ri.over |
21 |
-6 |
tos: fp1 fp2 => tos: fp2 fp1 fp2 |
RI.DUP |
22 |
-6 |
tos: fp1 => tos: fp1 fp1 |
ri.swap |
23 |
0 |
tos: fp1 fp2 => tos: fp2 fp1 |
RI.COS |
24 |
0 |
cosinus |
RI.SIN |
26 |
0 |
sinus |
RI.TAN |
28 |
0 |
tangens |
RI.ASIN |
30 |
0 |
arcus sinus |
RI.ACOS |
32 |
0 |
arcus cosinu |
RI.ATAN |
34 |
0 |
arcus tangens |
ri.arg |
35 |
+6 |
tos, nos: k * cis( arg ) |
RI.ACOT |
36 |
0 |
arcus cotangens |
ri.mod |
37 |
+6 |
sqrt( tos^2 + nos°2 ) |
RI.SQRT |
38 |
0 |
Quadratwurzel |
ri.sqar |
39 |
0 |
Quadrat |
RI.LN |
40 |
0 |
logarithmus naturalis (braucht ca 60 Bytes RI-Stack!) |
RI.LOG10 |
42 |
0 |
lg |
RI.EXP |
44 |
0 |
Exponentialfunktion |
ri.power |
45 |
+2 |
nos(fp) ^ tos(Integer) |
RI.POWFP |
46 |
+6 |
nos ^ tos |
sb.putp |
BP.LET |
bp |
288 $120 |
|
Variable als Parameter neu besetzen {4.5.4.6} rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
|
|
A0 - A2 |
verdorben |
|
A3 |
Untergrenze der NameTable |
|
|
iou.dnam |
IO.NAME |
gu |
290 $122 |
|
Decodiert einen Devicenamen. {3.3.2.3.3} |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 - D3 |
verdorben |
|
A0 |
Ptr auf Namen |
|
|
|
|
|
A1 - A2 |
verdorben |
|
A3 |
Ptr auf Zwischenspeicher |
|
|
Fehlermeldungen in Gestalt justierter Return-Adressen.
Alle folgenden Vectoren sind mit Offset $4000 aufzurufen.
Sie sind für SQ sämtlich nicht definiert.
|
MD.READ |
md |
292 $124 |
|
Liest einen Sektor vom Microdrive. Offset
$4000 |
|
MD.WRITE |
md |
294 $126 |
|
Schreibt einen Sektor auf Microdrive. Offset
$4000 |
|
MD.VERIN |
md |
296 $128 |
|
Vergleicht einen Sektor. Offset $4000 |
|
MD.SECTR |
md |
298 $12A |
|
Liest Sektorheader vom Microdrive. Offset
$4000 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 |
Filenummer |
|
|
|
D2 |
Blocknummer |
|
|
|
D0, D3-D7 |
verdorben |
|
A0 |
|
A0 |
verdorben |
|
A1 |
Pufferanfang |
A1 |
Pufferende |
|
|
|
A2 |
verdorben |
|
A3 |
$18020 |
|
|
|
|
|
A4, A5 |
verdorben |
MD.WRITE: |
(A7) |
{Filenr .b | Blocknr. .b} |
|
|
Der Stackpointer wird für die Rückkehr entsprechend justiert:
0(A7) Fehlerausgang; bei MD.SECTR unbrauchbarer Datenträger
2(A7) Ausführung fehlerfrei; bei MD.SECTR: Header-Fehler
4(A7) nur MD.SECTR: Ausführung fehlerfrei.
MD.WRITE geht stets ohne Fehler nach (A7).
An den Plätzen $12C bis $013A stehen Vectoren des Basic zur
Intialisierung, Syntaxprüfung und der Listenausgabe. Details werden
dazu 'offiziell' nicht genannt.
Die folgenden Vectoren gelten nur für MINERVA.
|
UT.ISTR |
|
316 $13C |
|
INSTR-Operation Typ 3 rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D1 |
Position des String |
|
A0 |
zu suchender String |
|
|
|
A1 |
abzusuchender String |
|
|
D1 = 0 Fehlanzeige,
D1 sonst ab 1 zählende Position, wo der gesuchte String in (A1)+
gefunden wurde.
|
GO.NEW |
|
318 $13E |
|
NEW-Befehl ausführen |
|
|
|
|
|
Die "meisten Register" werden verdorben.
|
BP.CHAN |
|
320 $140 |
|
Kanalnummer holen, Vorgabe #1 rel A6 |
|
BP.CHAND |
|
322 $142 |
|
dto., mit anzugebender Vorgabe rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
ggf. Kanalnummer |
D1 |
Kanalnummer (erhalten) |
|
|
|
A0 |
ID, wenn Kanal existiert |
|
|
|
A2 |
Definitionsblock dazu |
|
A3 |
Basicparameter |
A3 |
angepasst |
|
A5 |
dto., Obergrenze |
|
|
ERR.NO -6
Erwartet eine Kanalnummer mit '#' als 16-Bit-Zahl oder verwendet die
Vorgabe. Diese (bei BP.CHAND) oder Kanal #1 wird dann nach D1.w
übergeben.
HINWEIS:
'fast-return' unter unklaren (nicht dokumentierten) Umständen - s.
"bp.fname".
|
BP.CHNID |
|
324 $144 |
|
Kanal suchen und ID liefern rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
Kanalnummer |
|
|
|
|
|
A0 |
Kanal-ID |
|
|
|
A2 |
Basic-Definitionsblock |
ERR.NO -6, bei ungesetztem X-Flag weist A2 über die
Kanaltabelle.
|
BP.CHNEW |
|
326 $146 |
|
Neuen Basic-Kanal einbauen rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
Kanalnummer |
D1 |
|
|
A0 |
Kanal-ID |
A0 |
|
ERR.EX -8 wenn der Kanal schon vorhanden war.
|
BP.FNAME |
|
328 $148 |
|
einen String / Variablennamen als Filenamen
holen. rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
A1 |
RI-Ptr auf den Namen |
A1 |
|
|
A3 |
Parameterptr |
A3 |
weitergezählt (außer ERR.BP) |
|
A5 |
Parameterptr, Obergrenze |
|
|
"Fehlermeldungen verschiedener Art."
HINWEIS (minerva 1.89, 1.97, andere ungeprüft):
Für einen QDOS-Vector nicht gerade geistreich (zumal undokumentiert)
kehrt der Aufruf nur, wenn keine Parameter vorhanden
sind, mit ERR.BP dorthin zurück, was als nächster
Stackposten für die Rückkehradresse zur
übergeordneten Routine gehalten wird - welche er keineswegs auch
wirklich sein muß! Ebenfalls nur dann wird auch A3 nicht
justiert.
Einheitliches Abfangen von Parameterfehlern z.B.:
get_fname
pea error_exit(pc)
move.w bp_fname,a1
jsr $4000(a1)
addq.l #4,sp
bne.s error_exit ? fehler im parameter
.. name in ordnung ..
error_exit
.. fehlerbehandlung ..
|
CA.CNVRT |
|
330 $14A |
|
Datentyp wandeln rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D0 |
geforderter Typ |
|
|
|
A1 |
RI-Stackpointer |
A1 |
angepaßt |
|
A5 |
Parameterptr, Obergrenze |
|
|
ERR.XP -17 Wandlung mißlungen
Für den angeforderten Typ gelten 1, 2 und 3, dazu 4 zur Ermittlung
eines Flag vom Wert 0 oder 1.
RI-Stack wird dem erwarteten Typ entsprechend angepaßt.
Der Typ der oberen Eintragung der Namentabelle wird umgewandelt.
Die Eintragung muß im RI-Stack liegen, der Typ in den 4
niederwertigen Bits auf -7(a6,a5.l) mit 0 oder 1 für Strings, 2
für f.p.-Zahlen, 3 für 16-Bit Ganzzahlen.
|
CA.OPEXE |
|
332 $14C |
|
Operator ausführen |
|
CA.EVAL |
|
334 $14E |
|
Obere Übergabestack-Eintragung/RI-Wert
ausrechnen |
|
|
|
|
|
"Ausführung einer monadischen oder dyadischen Operation. Derzeit
keine weiteren Angaben ..."
|
IP.KBRD |
|
336 $150 |
|
erweiterte KEYROW-Funktion
Supervisor-Mode |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
D1 |
keyrow-Daten |
D0, D1 |
verdorben |
|
D2 |
shift-Daten |
D2 |
verdorben |
|
|
|
D6 |
verdorben |
|
|
|
A1 |
verdorben |
|
A2 |
Tastatur-Queue |
A2 |
|
|
Bits
D1 |
Funktion |
Bits
D2 |
Funktion |
|
31..6 |
belanglos |
31 .. 3 |
belanglos |
|
5 .. 3 |
7 - Zeilennummer |
2 |
CTRL |
|
2 .. 0 |
Spaltennummer |
1 |
SHIFT |
|
|
|
0 |
ALT |
Allgemeines Lesen der Tastatur.
Aufruf zur Darstellung anderer Tastaturen.
Sämtliche möglichen Codes werden empfangen, ggf. doppelte
Codes nach ALT (255), diese werden auch von der automatischen
Tastenwiederholung erfasst.
|
IP.KBEND |
|
338 $152 |
|
Tastenabfrage beenden |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
|
|
D0 - D2 |
verdorben |
|
D3 |
übersprungene Poll-Aufrufe |
|
|
|
D5 Bit#4 |
Flag bei gedrückter Taste |
D5 |
verdorben |
|
A2 |
Tastatur-Queue |
|
|
|
|
|
A3 |
verdorben |
Sinnfällig scheint, daß auch dieser Aufruf im SUPERVISOR-
Betrieb erfolgen muß. Es gibt aber keinen Hinweis darauf im
Handbuch.
Ist zur Anzeige vom Code zur Bedienung fremder Tastaturen aufzurufen,
ob eine Taste noch festgehalten wird. Danach sind alle
KEYROW-entsprechenden Daten mittels IP.KBENC greifbar.
Nur Bit 4 aus D5 ist auswertbar, 0 bedeutet, daß die letzte Taste
freigegeben wurde.
|
SB.START |
|
340 $154 |
|
einen Basic-Job einrichten rel A6 |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
|
|
|
A0 |
ID des Befehlskanals - Interpreter-Flag |
|
|
A1 |
Größe des verfügbaren
Speicherbereichs |
|
MultiBASIC-Job durch direktes Anspringen - JMP $4000(An).
Das zweite Lang(?)-Wort im Programmspeicher des Jobs muß die
Differenz der Job-Basis zu den BASIC-Tabellen (A6) enthalten.
- A0
Mit Kanal-ID beginnt der Job, die Quelle zu interpretieren. Bei Null
und ohne Kanalübergabe mit dem Job-Aufruf wird das
standardmäßige Monitor- oder FS-Bild eingerichtet.
- A5
Größe des Arbeitsspeichers, -1(a6,a5.l) zeigt auf das
letzte Byte.
- A6
ist auf die Basis des eigenen Arbeitsspeichers zu setzen.
- A7
zeigt auf die Übergabeparameter aus dem EXEC-Aufruf.
|
MM.MOVE |
|
344 $158 |
|
Datentransport im Speicher absolut
adressiert |
|
MM.MRTOA |
|
346 $15A |
|
dto., von relativer an absolute Adresse
User-Mode |
|
MM.MATOR |
|
48 $15C |
|
dto., von absoluter an relative Adresse,
User-Mode |
|
MM.MRTOR |
|
350 $15E |
|
dto., von relativer an relative Adresse,
User-Mode |
|
MM.ACLR |
|
$168 |
|
Speicherbereich läschen |
|
MM.RCLR |
|
$16a |
|
wie MM.ACLR, Bereich an relativer Adresse,
User-Mode |
|
|
|
|
|
|
IN: |
|
OUT: |
|
|
|
|
D0 |
Null |
|
D1 |
Anzahl Bytes >0 |
|
|
|
A0 |
Zielpointer |
|
|
|
A1 |
Quellenpointer |
außer MM.ACLR, MM.RCLR |
|
|
A6 |
Referenz |
außer MM.MOVE, MM.ACLR |
|
Transport stets "nichtüberschreibend". Auch ungerade Adressen in A0
und A1 sind erlaubt.
Aus dem Basic kann MM.MOVE aufgerufen werden:
10 mm_move=peek_w(344):mm_move=mm_move+16384
20 CALL
mm_move,anzahlbytes,2,3,4,5,6,7,zieladresse,quellenadresse