Adresse PC-1350 |
Adresse PC-1360 |
Beschreibung |
| 0436 | 00B5 | Tastaturabfrage (PC-1360: identisch zu 1E9C); siehe 46C0 ROM-Bank 0 |
| 804E | 0594 | FAC 1 = FAC 2 ^ FAC 1; (*01)(*01b) |
| 11B0 | 088A | FAC 1 = (18/19); Bereich 0 bis 65535 (*01)(*01a) |
| 11B7 | 0891 | FAC 1 = (18/19); Bereich -32768 bis 32767 (*01)(*01a) |
| 162B | 090E | (18) = FAC 1; Bereich 0 bis 255 (*01)(*01a) |
| 162F | 0912 | (18/19) = FAC 1; Bereich -32768 bis 32767 (*01)(*01a) |
| 163A | 091D | (18/19) = FAC 1; Bereich 0 bis 65535 (*01)(*01a) |
| 01AD | 0A74 | FAC 1 = FAC 2 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01B6 | 0A7D | FAC 1 = FAC 2 (*01)(*01b) |
| 01D5 | 0A82 | FAC 1 = FAC 3 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01DE | 0A8B | FAC 1 = FAC 3 (*01)(*01b) |
| 01BB | 0A90 | FAC 1 = FAC 4 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01C4 | 0A99 | FAC 1 = FAC 4 (*01)(*01b) |
| 01C9 | 0AA0 | FAC 2 = FAC 1 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01D2 | 0AA9 | FAC 2 = FAC 1 (*01)(*01b) |
| 019F | 0AAE | FAC 2 = FAC 4 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01A8 | 0AB7 | FAC 2 = FAC 4 (*01)(*01b) |
| 01E6 | 0ABA | FAC 3 = FAC 1 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01EF | 0AC3 | FAC 3 = FAC 1 (*01)(*01b) |
| 01F2 | 0AC6 | FAC 4 = FAC 1 inkl. Vorzeichen in (31) (*01)(*01a) |
| 01FB | 0ACF | FAC 4 = FAC 1 (*01)(*01b) |
| 0193 | 0AD2 | FAC 4 = FAC 2 inkl. Vorzeichen in (31) (*01)(*01a) |
| 019C | 0ADB | FAC 4 = FAC 2 (*01)(*01b) |
| 01E3 | 0ADE | FAC 3 = FAC 2 (*01)(*01b) |
| 0202 | 0B8A | FAC 1 <-> FAC 2 inkl. Vorzeichen in (31) (*01)(*01a) |
| 020F | 0B97 | FAC 1 <-> FAC 2 (*01)(*01b) |
| 013F | 0BDB | FAC 1 = 0; (31) inkl. Vorzeichen in (31) (*01)(*01a) |
| 0142 | 0BDE | FAC 1 = 0 (*01)(*01b) |
| 0133 | 0BE5 | FAC 2 = 0; (31) inkl. Vorzeichen in (31) (*01)(*01a) |
| 0139 | 0BEB | FAC 3 = 0; (31) inkl. Vorzeichen in (31) (*01)(*01a) |
| 0166 | 0BF1 | Mantisse von FAC 1 = 0; Vorz. und Exp. bleiben (*01) |
| 0160 | 0BFB | Mantisse von FAC 2 = 0; Vorz. und Exp. bleiben (*01) |
| 0163 | 0BFE | Mantisse von FAC 4 = 0; Vorz. und Exp. bleiben (*01) |
| 017D | 0C01 | Vorz. und Exp. von FAC 1 = 0 (*01)(*01b) |
| 017A | 0C08 | Vorz. und Exp. von FAC 2 = 0 (*01)(*01b) |
| 0153 | 0C0B | FAC 2 = 1 inkl. Vorzeichen in (31) (*01)(*01a) |
| 06B9 | 0C18 | FAC 2 = 0.6 inkl. Vorzeichen in (31) (*01)(*01a) |
| 0732 | 0C24 | Konstanten zum Umrechnen der Winkelarten: |
| | DEG: FAC 2 = 0.434294481903 inkl. Vorzeichen in (31) (*01)(*01a) |
| | GRAD: FAC 2 = 0.9 inkl. Vorzeichen in (31) (*01)(*01a) |
| | RAD: FAC 2 = 57.2957795131 inkl. Vorzeichen in (31) (*01)(*01a) |
| 0BEC | 0C54 | FAC 2 = PI = 3.141592653 inkl. Vorzeichen in (31) (*01)(*01a) |
| 0301 | 0D42 | (31)=Vorzeichen FAC 1 und FAC 2; (FE71)=SP+2 (PC-1350: (6F3F)=SP+2); (30)=00 (*01)(*01b) |
| 0310 | 0D64 | (31)=Vorzeichen FAC 1; (FE71)=SP+2 (PC-1350: (6F3F)=SP+2); (30)=00 (*01)(*01b) |
| 0328 | 0D69 | Vorzeichen aus (31) -> FAC 1 und FAC 2 (*01)(*01b) |
| 0333 | 0D74 | Vorzeichen aus (31) -> FAC 1 (*01)(*01b) |
| 10E4 | 10B9 | ERROR 2 |
| 10EC | 10C0 | ERROR 1 |
| 10F0 | 10C8 | ERROR 3 |
| 10F4 | 10CD | ERROR 4 |
| 10F8 | 10D2 | ERROR 5 |
| 10FC | 10D7 | ERROR 6 |
| 10E6 | 10BB | ERROR A (1 <= A <= 9) |
| 1100 | 10DC | ERROR 7 |
| 1104 | 10E1 | ERROR 8 |
| 1108 | 10E6 | ERROR 9 |
| 027D | 1108 | D = AE |
| 0282 | 110D | S = AE |
| 0287 | 1112 | S = AE+1 |
| 028D | 1118 | D = AE+1 |
| 0297 | 111E | S = AE-1 |
| 02B5 | 1124 | D = AE-1 |
| 1414 | 112A | D = S |
| 1419 | 112F | S = D |
| 1553 | 1134 | (0C/0D) = S |
| 1558 | 1139 | (0C/0D) = D |
| 113E | D <-> (0C/0D) |
| 161A | 1143 | S <-> (0C/0D) |
| 170E | 1148 | A = (0A); (0A) = (06) |
| 1713 | 114D | (0B) = (06); A = (06) |
| 115C | 1153 | push S |
| 1167 | 115E | pop S |
| 141E | 1188 | (38/39) = S |
| 140B | 1192 | S = (38/39) |
| 108E | 1197 | S <-> (38/39) |
| 119C | S <-> D |
| 11A6 | 11A1 | S = (1D/1E)-1 == STR 2 (*01) |
| 11AA | 11A5 | S = (15/16)-1 == STR 1 (*01) |
| 98B0 | 11AB | AE = (FFDB/DC) (PC:1350: 6F05/06) Beginn des letzten MERGE-Blocks |
| 98B6 | 11B1 | AE = (FFD9/DA) (PC:1350: 6F03/04) Ende Basic-Speicher |
| 0293 | 11B7 | S = FD1F (PC-1350: 6EAF) Inputbuffer (ASCII oder Token) |
| 029D | 11C1 | S = FBFF (PC-1350: 767F) Operanden-Stack |
| 02A3 | 11C7 | S = FD7F (PC-1350: 6CFF) Displaybuffer |
| 02AA | 11CE | D = FD7F (PC-1350: 6CFF) Displaybuffer |
| 02B1 | 11D5 | D = FD1F (PC-1350: 6EAF) Inputbuffer |
| 02BB | 11DF | D = FBFF (PC-1350: 767F) Operanden-Stack |
| 11E5 | S = (FEF0/F1) Beginn Basicprogramm |
| 1471 | 11EB | S = (FFD7/D8) (PC-1350: 6F01/02) Beginn Basic-Speicher |
| 11F1 | (FFDB/DC) = (FFD7/D8) über AE |
| 11FC | (FEF0/F1) = (FFDB/DC) über AE |
| 1207 | (FEF0/F1) = (FFD7/D8) über (0A/0B) |
| 1D84 | 1212 | (2AB4/B5) = S (PC-1350: (6F20/21) = S); S für Auswertung speichern (*03) |
| 1D89 | 1217 | S = (2AB4/B5) (PC-1350: S = (6F20/21)); S = wieder herstellen nach Ende eines Basic-Befehls (*03) |
| 1175 | 1233 | E mal (+D) = (+S) |
| 1265 | FDE8..EF = 00 Zwischenspeicher FAC 1 (*01) |
| 126E | FAC 4 = FAC 1 (*01)(*01b) |
| 1275 | FAC 1 = FAC 4 (*01)(*01b) |
| 127C | FAC 2 = FAC 1 (*01)(*01b) |
| 12DB | A = (+S) aus beiden Banken (*02) |
| 12FC | A = (-S) aus beiden Banken (*02) |
| 131B | (+D) = A in beide Banken (*02) |
| 133C | (-D) = A in beide Banken (*02) |
| 13A3 | (5E) AND FB; PC AND FB; RAM Bank 0 aktivieren |
| 13A9 | (5E) OR 04; PC OR 04; RAM Bank 1 aktivieren |
| 13AF | A * 2 ms warten |
| 09E8 | 13B7 | 6 ms warten |
| 04AD | 13C4 | CR = 00; Display aus |
| 04B1 | 13C8 | CR = 01; Display an |
| 1441 | FAC 1 = 00; FAC 2 = 00; FAC 3 = 00 (*01)(*01b) |
| 1C44 | 1448 | FD80..AF = 20 (PC-1350: 6D00..6D2F); 1.+2. Zeile Displaybuffer löschen |
| 1C3F | 144D | FD98..AF = 20 (PC-1350: 6D18..6D2F); 2.Zeile Displaybuffer löschen |
| 1C36 | 1452 | FD80..97 = 20 (PC-1350: 6D00..6D17); 1.Zeile Displaybuffer löschen |
| 1D3B | 1483 | (10)..(27) <-> FDC8..DF (PC-1350: 6D48..5F); 4.Zeile Displaybuffer |
| 1D43 | 148B | (10)..(27) <-> FD80..97 (PC-1350: 6D00..17); 1.Zeile Displaybuffer |
| 1D48 | 1490 | (10)..(27) <-> FD98..AF (PC-1350: 6D18..2F); 2.Zeile Displaybuffer |
| 1D4D | 1495 | (10)..(27) <-> FDB0..C7 (PC-1350: 6D30..47); 3.Zeile Displaybuffer |
| 1E0C | 14B6 | FD80..DF = 20 (PC-1350: 6D00..5F); Displaybuffer (24x4) löschen |
| 14BF | FD80..A3 = 20 (PC-1350: 6D00..23); Displaybuffer (18x2) löschen |
| 1C1C | 14C8 | FD20..6F = 0D (PC-1350: 6EB0..FF); Eingabebuffer löschen |
| 1517 | BIT(FF30),80; SIO geöffnet |
| 15C5 | 2A98..AF = 00; Printer-Buffer CE-126P |
| 1CD0 | 16B5 | D = Adresse Displayspeicher-1 der Zeile A 2800/2840/281E/285E (PC-1350: 7000/7040/701E/705E) |
| 1CEF | 16D4 | D = Adresse Displayspeicher-1 für Cursor X=(FD10)/Y=(FD11) (PC-1350: X=7881/Y=7880) |
| 1D5A | 1710 | D = Adresse Displaybuffer der Zeile Cursor Y=(FD11) (PC-1350: 7880) |
| 1D70 | 1726 | D = FD80 (PC-1350: 6D00); 1. Zeile Displaybuffer |
| 1D74 | 1731 | D = FD98 (PC-1350: 6D18); 2. Zeile Displaybuffer |
| 1735 | D = FD92; 2. Zeile Displaybuffer (18x2) |
| 1D78 | 1739 | D = FDB0 (PC-1350: 6D30); 3. Zeile Displaybuffer |
| 1D7C | 173D | D = FDC8 (PC-1350: 6D48); 4. Zeile Displaybuffer |
| 15EC | 17C4 | FEE0..E3 = 00 (PC-1350: 6F39..3C); USING-Format löschen |
| 1410 | 18A3 | CMP (14),D0; Test FAC 1 auf String |
| D986 | 18AD | A = '<' oder '>', je nach Bit 6 von (&FFEC; PC-1350: &6F16); TEXT-Modus |
| 10C1 | 18D9 | FAC 1 = (POP Wert Operandenstack (&FC00; PC-1350: &7680)) (*01)(*01b) |
| 10AA | 18DD | FAC 2 = (POP Wert Operandenstack (&FC00; PC-1350: &7680)) (*01)(*01b) |
| 1737 | 19B0 | (+D) = 2D; -"" |
| 19F7 | (P) = 0; (P+1) = 0 |
| 1DF3 | 1A18 | Zeile ausgeben, A=0..3, A=4->gesamter Bildschirm, siehe ROM Bank 1, 4004 |
| 805A | 1E80 | FAC 1 = FAC 2 + FAC 1 (*01), PC-1360:(*01a), PC-1350:(*01b) |
| 8057 | 1E84 | FAC 1 = FAC 2 - FAC 1 (*01), PC-1360:(*01a), PC-1350:(*01b) |
| 8060 | 1E88 | FAC 1 = FAC 2 * FAC 1 (*01), PC-1360:(*01a), PC-1350:(*01b) |
| 8066 | 1E8C | FAC 1 = FAC 2 / FAC 1 (*01), PC-1360:(*01a), PC-1350:(*01b) |
| 04B1 | 1E94 | Display einschalten == JP,13C8 |
| 04AD | 1E98 | Display ausschalten == JP,13C4 |
| 0436 | 1E9C | Tastaturabfrage (PC-1360: identisch zu 00B5); siehe 46C0 ROM-Bank 0 |
| 89AC | 1EC0 | FAC 1 = EXP(FAC 1) (*01)(*01a) |
| 89BA | 1EC4 | FAC 1 = SIN(FAC 1) (*01)(*01a) |
| 89C1 | 1EC8 | FAC 1 = COS(FAC 1) (*01)(*01a) |
| 89C8 | 1ECC | FAC 1 = TAN(FAC 1) (*01)(*01a) |
| 89CF | 1ED0 | FAC 1 = ASN(FAC 1) (*01)(*01a) |
| 89D6 | 1ED4 | FAC 1 = ACS(FAC 1) (*01)(*01a) |
| 89DD | 1ED8 | FAC 1 = ATN(FAC 1) (*01)(*01a) |
| 89EB | 1EDC | FAC 1 = DEG(FAC 1) (*01)(*01a) |
| 89F2 | 1EE0 | FAC 1 = DMS(FAC 1) (*01)(*01a) |
| 8E9F | 1EE4 | FAC 1 = ABS(FAC 1) (*01)(*01a) |
| 8E7B | 1EE8 | FAC 1 = INT(FAC 1) (*01)(*01a) |
| 8A00 | 1EEC | FAC 1 = SGN(FAC 1) (*01)(*01a) |
| 89F9 | 1EF0 | FAC 1 = RND(FAC 1) (*01)(*01a) |
| 89B3 | 1EF4 | FAC 1 = SQR(FAC 1) (*01)(*01a) |
| 89A5 | 1EF8 | FAC 1 = LOG(FAC 1) (*01)(*01a) |
| 899D | 1EFC | FAC 1 = LN(FAC 1) (*01)(*01a) |
| 8B1E | 1F00 | FAC 1 = ASC(STR 1) (*01)(*01a) |
| 8B3E | 1F04 | STR 1 = CHR$(FAC 1) (*01)(*01a) |
| 8BA6 | 1F08 | STR 1 = STR$(FAC 1) (*01)(*01a) |
| 8C02 | 1F0C | FAC 1 = VAL(STR 1) (*01)(*01a) |
| 142B | | RAM Bank 1 einschalten |
| 1438 | | RAM Bank 0 einschalten |
| 144D | | (+S) aus RAM Bank 0 (S < &8000) oder 1 (S >= &8000) |
| 1454 | | Wenn S >= &8000 dann RAM Bank 1 einschalten |
| 153B | | X = 783C (Statusanzeige Display) |
| (*01) |
Hierbei werden folgende interne Variablen/Adresse genutzt
| Variable | Adresse | Vorzeichen |
| FAC 1 | 10..17 | (31) Bit0 = &01 wenn Mantisse negativ |
| FAC 2 | 18..1F | (31) Bit1 = &02 wenn Mantisse negativ |
| FAC 3 | 20..27 | (31) Bit2 = &04 wenn Mantisse negativ |
| FAC 4 | 28..2F | (31) Bit3 = &08 wenn Mantisse negativ |
| STR 1 | 14 = D0 | |
| 15 = Adresse LO | |
| 16 = Adresse HI | |
| 17 = Länge | |
| STR 2 | 1C..1F | |
FAC 1..4 sind BCD in exakt der Form, wie sie auch in den Variablen gespeichert werden
(31) und Spalte Vorzeichen: siehe (*01a) und (*01b)
Bei keiner der Funktionen darf davon ausgegangen werden, dass nach dem Aufruf FAC 1..4 (STR 1..2) erhalten bleiben. Diese werden ggf. für interne Zwecke bei der Berechnung genutzt.
(die in in den ROM-Routinen genutzten Flags in (33) und (37) müssen beim Aufruf nicht gesetzt sein, sie dienen den
ROM-Routinen nur intern als temporäre Flags).
Einige Beispiele:
| Zahl | Fließkommaformat (BCD) |
| 6 | 00 00 60 00 00 00 00 00 |
| 60 | 00 10 60 00 00 00 00 00 |
| 0.6 | 99 90 60 00 00 00 00 00 |
| 0.06 | 99 80 60 00 00 00 00 00 |
| -0.6 | 99 98 60 00 00 00 00 00 |
| -6 | 00 08 60 00 00 00 00 00 |
Nibble 0-2 beschreiben den Exponenten:
Bei positiven Zahl: 0 0 0 bis 0 9 9 -> Zahl = Mantisse*10^0 bis 10^99
Bei negativer Zahl: 9 9 9 bis 9 0 1 -> Zahl = Mantisse*10^-(1000-999) bis 10^-(1000-901) (== 10^-1 bis 10^-99)
Nibble 3-15 beschreiben die Mantisse:
Bei positiver Zahl: Nibble 3 == 0
Bei negativer Zahl: Nibble 3 == 8
Nibble 4-15 entspricht dee Mantisse (führende Nullen werden durch den Exponenten dargestellt).
Nibble 14-15 wird nur intern zu Rundungen genutzt, aber nicht ausgegeben.
|
| (*01a) |
Das Vorzeichen für FAC 1..4 in (31) muss vor Aufruf nicht gesetzt werden.
Funktionen, die mit (*01a) markiert sind, setzen (31) selber aus dem FAC, wenn es intern benötigt wird, und kopieren (31) ggf. nach einer Berechnung wieder in den FAC zurück.
|
| (*01b) |
Das Vorzeichen für FAC 1..4 muss vor Aufruf nach (31) kopiert und sollte in FAC 1..4 gelöscht sein.
Hierzu kann 0D64/0D42 (PC-1360) bzw. 0310/0301 (PC-1350) genutzt werden.
(31) ist nach Ausführung der Funktionn führend und ist ggf. von (31) in den FAC zurück zu kopieren.
Hierzu kann 0D74/0D69 (PC-1360) bzw. 0333/0328 (PC-1350) genutzt werden.
Funktionen, die mit (*01b) markiert sind, setzen (31) nicht (z.B. Kopieren oder FAC X=0) oder nur, wenn es intern bei einer Berechnung gesetzt wird.
|
| (*02) |
Wenn der Basicspeicher logisch bei < &8000 startet (MEM "B" oder MEM "D"):
- Adresse &0000 bis &7FFF:
- RAM-Bank 0 aktivieren
- (Adresse + &8000) lesen/schreiben
- RAM-Bank 1 aktivieren
- Adresse &8000 bis &FFFF:
- (Adresse) lesen/schreiben aus RAM-Bank 1
Sonst (MEM "C"):
-
(Adresse) lesen/schreiben aus RAM-Bank 0
|
| (*03) |
PC-1360: 2AB4/B5 , PC-1350: 6F20/21
S wird nach der Auswertung aller Parameter des aktuellen Basic-Befehls an der Adresse abgelegt.
Der Basic-Interpreter führt die Analyse des Basic-Programms an (S+1) fort.
Beispiel:
Eine Assembler-Programm erwartet, getrennt durch ein Komma, einen numerischen Parameter:
Beispiel PC-1360 (Adresse: 8100)
100: CALL &8100,G
LD A,(+S)
CMP A,2C
JP Z,+0C ; Komma gefunden
; Error 1 (kein Komma gefunden)
POP A ; Rücksprungadresse von Basic-Befehl CALL löschen
POP A
DEC S ; S auf das zuletzt gelesenen Zeichen zurücksetzen
JSR 1212 ; 2AB4/B5 = S
SET C ; C=1 als Flag, dass ein Fehler aufgetreten ist
JP,10C0 ; Programm mit ERROR 1 beenden
JSR,4016 ; FAC1 = Ausdruck ab (S+1), ROM-Bank 0 (im Beispiel der Wert der Variable G)
JSR 1212 ; 2AB4/B5 = S
.... ; FAC1 verwenden
RET ; Basicerweiterung (also den CALL-Aufruf) beenden
Beispiel PC-1350 (Adresse: 6100)
100: CALL &6100,G
LD A,(+S)
CMP A,2C
JP Z,+0C ; Komma gefunden
; Error 1 (kein Komma gefunden)
POP A ; Rücksprungadresse von Basic-Befehl CALL löschen
POP A
DEC S ; S auf das zuletzt gelesenen Zeichen zurücksetzen
JSR 1D84 ; 6F20/21 = S
SET C ; C=1 als Flag, dass ein Fehler aufgetreten ist
JP,10EC ; Programm mit ERROR 1 geenden
JSR,8039 ; FAC1 = Ausdruck ab (S+1) (im Beispiel der Wert der Variable G)
JSR 1D84 ; 6F20/21 = S
.... ; FAC1 verwenden
RET ; Basicerweiterung (also den CALL-Aufruf) beenden
|