; this is a fixed version of the zx spectrum rom disassembly ; ; modification history: ; ; ???.95 downloaded this file from ftp.nvg.unit.no KIO ! ; dec.95 reformatted text KIO ! ; removed line numbers (which were a mess at line 10000 and over) ; removed page breaks ; apr.96 nmi routine disassembly corrected KIO ! ; missing line for address $3686 inserted PFE: EQU 0FEH ;Port 0000 ORG 0 0000 F3 RESET: DI 0001 AF XOR A 0002 11FFFF LD DE,0FFFFH ;oberste moegliche Ramzelle 0005 C3CB11 JP RESET1 0008 2A5D5C ERRAUS: LD HL,(CHADD) ;der Errorzeiger wird auf die 000B 225F5C LD (XPTR),HL ;Eingabe gesetzt,welche nicht 000E 1843 JR ERROR ;mehr interpretiert werden kann 0010 C3F215 PRTOUT: JP AUSGA2 ;Buchstaben in Reg A ausdrucken 0013 DEFS 5 0018 2A5D5C GETAKT: LD HL,(CHADD) ;holt aktuelles Zeichen aus 001B 7E LD A,(HL) ;Programm oder bei Eingabe 001C CD7D00 AUSWER: CALL BASZCP ;Pruefen auf Stuerzeichen 001F D0 RET NC ;druckbares Zeichen/ Basictoken 0020 CD7400 GETNXT: CALL NEXZEI ;holt naechstes Zeichen 0023 18F7 JR AUSWER 0025 DEFS 3 0028 C35B33 CALRUF: JP RECHNE ;zur Rechnerroutine 002B DEFS 5 0030 C5 REST30: PUSH BC ;reserviere Speicherplatz im 0031 2A615C LD HL,(WORKSP) ;Workspace, Anzahl = BC 0034 E5 PUSH HL 0035 C39E16 JP RESERV ;Interrupt - Routine (Uhr und Tastatur) 0038 F5 INTERR: PUSH AF 0039 E5 PUSH HL 003A 2A785C LD HL,(FRAMES) ;3 Byte Bildzaehler (Uhr) 003D 23 INC HL ;Zeit in 1/50 Sekunden 003E 22785C LD (FRAMES),HL 0041 7C LD A,H 0042 B5 OR L 0043 2003 JR NZ,M0048 0045 FD3440 INC (IY+40H) ;wenn Null drittes Byte ;inkrementieren 0048 C5 M0048: PUSH BC 0049 D5 PUSH DE 004A CDBF02 CALL KEYBOA ;Tastaturabfrage 004D D1 POP DE 004E C1 POP BC 004F E1 POP HL 0050 F1 POP AF 0051 FB EI 0052 C9 RET 0053 E1 ERROR: POP HL ;Adresse der Fehlerstelle laden 0054 6E LD L,(HL) ;die dort stehende Fehlernummer 0055 FD7500 M0055: LD (IY+0),L ;in 'ERRNR' schreiben 0058 ED7B3D5C LD SP,(ERRSP) ;Stackpointer restaurieren 005C C3C516 JP CLRCAL 005F DEFS 7 0066 F5 NMI: push af ; korr. 11.apr.96 KIO ! 0067 E5 push hl ; " 0068 2AB05C ld hl,($5cb0) ; " 006B 7C LD A,H ;falls HL=0, dann Kaltstart 006C B5 OR L 006D 2001 JR NZ,M0070 ;sonst passiert nichts 006F E9 JP (HL) 0070 E1 M0070: POP HL 0071 F1 POP AF 0072 ED45 RETN 0074 2A5D5C NEXZEI: LD HL,(CHADD) ;Programmzeiger erhoehen 0077 23 M0077: INC HL 0078 225D5C M0078: LD (CHADD),HL ;Adr. des naechsten zu ;interpret. Zeichens 007B 7E LD A,(HL) ;neues Zeichen laden 007C C9 RET ;Vergleich der Basic - Zeichen 007D FE21 BASZCP: CP 21H ;Rueckkehr, wenn >=21H 007F D0 RET NC ;also bei allen druckbaren ;Zeichen oder Tokens 0080 FE0D CP 0DH ;oder CR 0082 C8 RET Z 0083 FE10 CP 10H ;Return mit Carry bei 0...0FH 0085 D8 RET C 0086 FE18 CP 18H 0088 3F CCF 0089 D8 RET C ;Return mit Carry bei 18...20H ;Beeinflussung von CHADD, dem aktuellen Basic-Zeichenzeiger 008A 23 INC HL ;bei 10...17H inkrementieren 008B FE16 CP 16H ;16 u. 17H ausblenden 008D 3801 JR C,M0090 ;bei 10...15H nicht inkrementieren 008F 23 INC HL 0090 37 M0090: SCF 0091 225D5C LD (CHADD),HL ;naechstes zu interpret. Zeichen 0094 C9 RET ;======================================================= 0095 BF M0095: DEFB '?'+80H 0096 524EC4 DEFM 'RND'+80H 0099 494E4B45 DEFM 'INKEY$'+80H 009F 50C9 DEFB 'PI'+80H 00A1 46CE DEFB 'FN'+80H 00A3 504F494E DEFM 'POINT'+80H 00A8 53435245 DEFM 'SCREEN$'+80H 00AF 415454D2 DEFM 'ATTR'+80H 00B3 41D4 DEFB 'AT'+80H 00B5 5441C2 DEFM 'TAB'+80H 00B8 56414CA4 DEFM 'VAL$'+80H 00BC 434F44C5 DEFM 'CODE'+80H 00C0 5641CC DEFM 'VAL'+80H 00C3 4C45CE DEFM 'LEN'+80H 00C6 5349CE DEFM 'SIN'+80H 00C9 434FD3 DEFM 'COS'+80H 00CC 5441CE DEFM 'TAN'+80H 00CF 4153CE DEFM 'ASN'+80H 00D2 4143D3 DEFM 'ACS'+80H 00D5 4154CE DEFM 'ATN'+80H 00D8 4CCE DEFB 'LN'+80H 00DA 4558D0 DEFM 'EXP'+80H 00DD 494ED4 DEFM 'INT'+80H 00E0 5351D2 DEFM 'SQR'+80H 00E3 5347CE DEFM 'SGN'+80H 00E6 4142D3 DEFM 'ABS'+80H 00E9 504545CB DEFM 'PEEK'+80H 00ED 49CE DEFB 'IN'+80H 00EF 5553D2 DEFM 'USR'+80H 00F2 535452A4 DEFM 'STR$'+80H 00F6 434852A4 DEFM 'CHR$'+80H 00FA 4E4FD4 DEFM 'NOT'+80H 00FD 4249CE DEFM 'BIN'+80H 0100 4FD2 DEFB 'OR'+80H 0102 414EC4 DEFM 'AND'+80H 0105 3CBD DEFB '<='+80H 0107 3EBD DEFB '>='+80H 0109 3CBE DEFB '<>'+80H 010B 4C494EC5 DEFM 'LINE'+80H 010F 544845CE DEFM 'THEN'+80H 0113 54CF DEFB 'TO'+80H 0115 535445D0 DEFM 'STEP'+80H 0119 44454620 DEFM 'DEF FN'+80H 011F 4341D4 DEFM 'CAT'+80H 0122 464F524D DEFM 'FORMAT'+80H 0128 4D4F56C5 DEFM 'MOVE'+80H 012C 45524153 DEFM 'ERASE'+80H 0131 4F50454E DEFM 'OPEN #'+80H 0137 434C4F53 DEFM 'CLOSE #'+80H 013E 4D455247 DEFM 'MERGE'+80H 0143 56455249 DEFM 'VERIFY'+80H 0149 424545D0 DEFM 'BEEP'+80H 014D 43495243 DEFM 'CIRCLE'+80H 0153 494ECB DEFM 'INK'+80H 0156 50415045 DEFM 'PAPER'+80H 015B 464C4153 DEFM 'FLASH'+80H 0160 42524947 DEFM 'BRIGHT'+80H 0166 494E5645 DEFM 'INVERSE'+80H 016D 4F5645D2 DEFM 'OVER'+80H 0171 4F55D4 DEFM 'OUT'+80H 0174 4C505249 DEFM 'LPRINT'+80H 017A 4C4C4953 DEFM 'LLIST'+80H 017F 53544FD0 DEFM 'STOP'+80H 0183 524541C4 DEFM 'READ'+80H 0187 444154C1 DEFM 'DATA'+80H 018B 52455354 DEFM 'RESTORE'+80H 0192 4E45D7 DEFM 'NEW'+80H 0195 424F5244 DEFM 'BORDER'+80H 019B 434F4E54 DEFM 'CONTINUE'+80H 01A3 4449CD DEFM 'DIM'+80H 01A6 5245CD DEFM 'REM'+80H 01A9 464FD2 DEFM 'FOR'+80H 01AC 474F2054 DEFM 'GO TO'+80H 01B1 474F2053 DEFM 'GO SUB'+80H 01B7 494E5055 DEFM 'INPUT'+80H 01BC 4C4F41C4 DEFM 'LOAD'+80H 01C0 4C4953D4 DEFM 'LIST'+80H 01C4 4C45D4 DEFM 'LET'+80H 01C7 50415553 DEFM 'PAUSE'+80H 01CC 4E4558D4 DEFM 'NEXT'+80H 01D0 504F4BC5 DEFM 'POKE'+80H 01D4 5052494E DEFM 'PRINT'+80H 01D9 504C4FD4 DEFM 'PLOT'+80H 01DD 5255CE DEFM 'RUN'+80H 01E0 534156C5 DEFM 'SAVE'+80H 01E4 52414E44 DEFM 'RANDOMIZE'+80H 01ED 49C6 DEFB 'IF'+80H 01EF 434CD3 DEFM 'CLS'+80H 01F2 445241D7 DEFM 'DRAW'+80H 01F6 434C4541 DEFM 'CLEAR'+80H 01FB 52455455 DEFM 'RETURN'+80H 0201 434F50D9 DEFM 'COPY'+80H ;====================================== ;Tabelle der Zuordnung Keyboard Matrix - ASCII 0205 42485936 KEYTAB: DEFM 'BHY65TGV' ;Reihe 1 020D 4E4A5537 DEFM 'NJU74RFC' ;Reihe 2 0215 4D4B4938 DEFM 'MKI83EDX' ;Reihe 3 021D 0E DEFB 0EH ;Symbol Shift Reihe 4 021E 4C4F3932 DEFM 'LO92WSZ' 0225 20 DEFM ' ' ;Reihe 5 0226 0D DEFB 0DH ;Enter 0227 50303151 DEFM 'P01QA' ;===================================== ;Tabellen der Basic - Tokens ;gruene Befehle auf den Tasten A....Z 022C E3 DEFB 0E3H ;READ 022D C4 DEFB 0C4H ;BIN 022E E0 DEFB 0E0H ;LPRINT 022F E4 DEFB 0E4H ;DATA 0230 B4 DEFB 0B4H ;TAN 0231 BC DEFB 0BCH ;SGN 0232 BD DEFB 0BDH ;ABS 0233 BB DEFB 0BBH ;SQR 0234 AF DEFB 0AFH ;CODE 0235 B0 DEFB 0B0H ;VAL 0236 B1 DEFB 0B1H ;LEN 0237 C0 DEFB 0C0H ;USR 0238 A7 DEFB 0A7H ;PI 0239 A6 DEFB 0A6H ;INKEY$ 023A BE DEFB 0BEH ;PEEK 023B AD DEFB 0ADH ;TAB 023C B2 DEFB 0B2H ;SIN 023D BA DEFB 0BAH ;INT 023E E5 DEFB 0E5H ;RESTORE 023F A5 DEFB 0A5H ;RND 0240 C2 DEFB 0C2H ;CHR$ 0241 E1 DEFB 0E1H ;LLIST 0242 B3 DEFB 0B3H ;COS 0243 B9 DEFB 0B9H ;EXP 0244 C1 DEFB 0C1H ;STR$ 0245 B8 DEFB 0B8H ;LN ;die roten Befehle unter den Tasten A....Z 0246 7E DEFB 07EH ;Schlangenlinie 0247 DC DEFB 0DCH ;BRIGHT 0248 DA DEFB 0DAH ;PAPER 0249 5C DEFB 05CH ;Schraegstrich rueckwaerts 024A B7 DEFB 0B7H ;ATN 024B 7B DEFB 07BH ;geschweifte Klammer auf 024C 7D DEFB 07DH ; " " zu 024D D8 DEFB 0D8H ;CIRCLE 024E BF DEFB 0BFH ;IN 024F AE DEFB 0AEH ;VAL$ 0250 AA DEFB 0AAH ;SCREEN$ 0251 AB DEFB 0ABH ;ATTR 0252 DD DEFB 0DDH ;INVERSE 0253 DE DEFB 0DEH ;OVER 0254 DF DEFB 0DFH ;OUT 0255 7F DEFB 07FH ;COPYRIGHT 0256 B5 DEFB 0B5H ;ASN 0257 D6 DEFB 0D6H ;VERIFY 0258 7C DEFB 07CH ;Strich 0259 D5 DEFB 0D5H ;MERGE 025A 5D DEFB 05DH ;eckige Klammer auf 025B DB DEFB 0DBH ;FLASH 025C B6 DEFB 0B6H ;ACS 025D D9 DEFB 0D9H ;INK 025E 5B DEFB 05BH ;eckige Klammer zu 025F D7 DEFB 0D7H ;BEEP ;Befehle ueber den Tasten 0....9 0260 0C DEFB 0CH ;DELETE 0261 07 DEFB 07H ;EDIT 0262 06 DEFB 06H ;SHIFT LOCK 0263 04 DEFB 04H ;VIDEO NORMAL 0264 05 DEFB 05H ;INVERSE VIDEO 0265 08 DEFB 08H ;Cursor nach links 0266 0A DEFB 0AH ; " " unten 0267 0B DEFB 0BH ; " " oben 0268 09 DEFB 09H ; " " rechts 0269 0F DEFB 0FH ;Grafik ;rote Befehle auf den Tasten A....Z 026A E2 DEFB 0E2H ;STOP 026B 2A DEFB 02AH ;* 026C 3F DEFB 03FH ;? 026D CD DEFB 0CDH ;STEP 026E C8 DEFB 0C8H ;>= 026F CC DEFB 0CCH ;TO 0270 CB DEFB 0CBH ;THEN 0271 5E DEFB 05EH ;Pfeil nach oben 0272 AC DEFB 0ACH ;AT 0273 2D DEFB 02DH ;- 0274 2B DEFB 02BH ;+ 0275 3D DEFB 03DH ;= 0276 2E DEFB 02EH ;. 0277 2C DEFB 02CH ;, 0278 3B DEFB 03BH ;; 0279 22 DEFB 022H ;" 027A C7 DEFB 0C7H ;<= 027B 3C DEFB 03CH ;< 027C C3 DEFB 0C3H ;NOT 027D 3E DEFB 03EH ;> 027E C5 DEFB 0C5H ;OR 027F 2F DEFB 02FH ;/ 0280 C9 DEFB 0C9H ;<> 0281 60 DEFB 060H ;POUND SIGN 0282 C6 DEFB 0C6H ;AND 0283 3A DEFB 03AH ;: ;rote Befehle unter den Tasten 0....9 0284 D0 DEFB 0D0H ;FORMAT 0285 CE DEFB 0CEH ;DEF FN 0286 A8 DEFB 0A8H ;FN 0287 CA DEFB 0CAH ;LINE 0288 D3 DEFB 0D3H ;OPEN 0289 D4 DEFB 0D4H ;CLOSE 028A D1 DEFB 0D1H ;MOVE 028B D2 DEFB 0D2H ;ERASE 028C A9 DEFB 0A9H ;POINT 028D CF DEFB 0CFH ;CAT ;==================================== ;Keyboard - Abfrageroutine ;Output: E = Taste als Wert 0....27H ; D = Shift - Funktion 028E 2E2F KEY: LD L,2FH ;Zeiger auf Ende der ;Keycode-Tabelle +8 0290 11FFFF LD DE,0FFFFH ;keine Taste 0293 01FEFE LD BC,0FEFEH ;C = I/O-Port der Tastatur ;B = Maske mit einer Null ;zum Abfragen der 1. Spalte 0296 ED78 NXTREI: IN A,(C) ;Abfrage 0298 2F CPL ;'1' = Tastendruck 0299 E61F AND 1FH ;5 Tasten in einer Spalte 029B 280E JR Z,NOKEY 029D 67 LD H,A ;Matrixwert in H 029E 7D LD A,L ;Startwert aus L holen 029F 14 TEST3: INC D ;D haelt 0FFH bei 1-2 ge- ;drueckten Tasten 02A0 C0 RET NZ ;bei mehr als zwei gedr. Tasten 02A1 D608 KEINTA: SUB 8 ;A = Tabellenzeiger des Keycodes 02A3 CB3C SRL H ;Tastendruck suchen 02A5 30FA JR NC,KEINTA 02A7 53 LD D,E ;fuer zwei zulaessige Tasten ;nochmals 0FFH laden 02A8 5F LD E,A ;Tastencode 0....27H in E 02A9 20F4 JR NZ,TEST3 ;nochmals Taste in laufender ;Reihe suchen 02AB 2D NOKEY: DEC L ;naechste Reihe 02AC CB00 RLC B ;Maske in B schieben 02AE 38E6 JR C,NXTREI ;wenn die Null aus B in Carry gelangt, fertig 02B0 7A LD A,D ;Test auf Funktionstasten 02B1 3C INC A ;bei einer Taste steht hier 0FFH 02B2 C8 RET Z ;wenn nur eine Taste gedrueckt 02B3 FE28 CP 28H ;Taste 'CAPS SHIFT' ? 02B5 C8 RET Z 02B6 FE19 CP 19H ;Taste 'SYMBOL SHIFT' ? 02B8 C8 RET Z 02B9 7B LD A,E ;E und D vertauschen 02BA 5A LD E,D 02BB 57 LD D,A 02BC FE18 CP 18H ;Taste 'SYMBOL SHIFT' ? 02BE C9 RET ;ZERO gesetzt bei 'SYMBOL ;SHIFT + andere Taste ;Aufruf der Tastaturabfrage und Auswertung der Eingaben ;erfolgt im Interrupt, alle 1/50 Sekunden 02BF CD8E02 KEYBOA: CALL KEY ;Tastaturabfrage 02C2 C0 RET NZ ;hier erfolgt weitere Auswertung in den Faellen: ;kein oder einfacher Tastendruck ;'CAPS SHIFT' + andere Taste ;'SYMBOL SHIFT' + andere Taste ;die Tastaturauswertung benutzt die 8 Bytes 'KSTATE' ;in zwei Gruppen zu 4 Bytes, um zwei folgende ;gedrueckte Tasten verarbeiten zu koennen ;Byte 0: Belegtkennung (FF = frei, 0 = belegt) ;Byte 1: Repeat-Zaehler (5...0) ;Byte 2: REPDEL (Wartezeit vom Beginn des Repeat) ;Byte 3: Code der gedrueckten Taste, ASCII oder Token 02C3 21005C LD HL,KSTATE ;2*4 Speicher fuer Tastatur 02C6 CB7E M02C6: BIT 7,(HL) ;Tastaturspeicher frei ? 02C8 2007 JR NZ,BLOCK2 ;wenn frei 02CA 23 INC HL 02CB 35 DEC (HL) ;DEC Repeat-Zaehler 02CC 2B DEC HL 02CD 2002 JR NZ,BLOCK2 02CF 36FF LD (HL),0FFH ;Block freigeben 02D1 7D BLOCK2: LD A,L 02D2 21045C LD HL,KSTATE+4 ;Block 2 anwaehlen 02D5 BD CP L ;war es schon Block 2 ? 02D6 20EE JR NZ,M02C6 ;nein 02D8 CD1E03 CALL M031E 02DB D0 RET NC ;Ende, wenn keine Taste 02DC 21005C LD HL,KSTATE 02DF BE CP (HL) ;ist es noch dieselbe Taste ? 02E0 282E JR Z,KEYREP ;wenn ja, Repeat 02E2 EB EX DE,HL 02E3 21045C LD HL,KSTATE+4 ;Block 2 pruefen 02E6 BE CP (HL) 02E7 2827 JR Z,KEYREP 02E9 CB7E BIT 7,(HL) ;Block 2 frei ? 02EB 2004 JR NZ,M02F1 02ED EB EX DE,HL ;KSTATE in HL zurueckladen 02EE CB7E BIT 7,(HL) ;Freipruefung 02F0 C8 RET Z ;Ende der Tastaturabfrage ;bei belegt ;neue Taste gedrueckt 02F1 5F M02F1: LD E,A 02F2 77 LD (HL),A ;Byte 0 02F3 23 INC HL ;HL zeigt auf Byte 1 02F4 3605 LD (HL),5 ;Repeat-Zaehler = 5 02F6 23 INC HL ;Byte 2 02F7 3A095C LD A,(REPDEL) ;Zeitkonstante bis Repeat 02FA 77 LD (HL),A 02FB 23 INC HL ;Byte 3 02FC FD4E07 LD C,(IY+7) ;Mode 02FF FD5601 LD D,(IY+1) ;Flags 0302 E5 PUSH HL 0303 CD3303 CALL M0333 ;Tastencode (Token) erzeugen 0306 E1 POP HL 0307 77 LD (HL),A ;in Byte 3 speichern 0308 32085C M0308: LD (LASTK),A ;und in LASTK 030B FDCB01EE SET 5,(IY+1) ;neuer Tastencode liegt vor 030F C9 RET ;Repeat - Funktion 0310 23 KEYREP: INC HL ;zeigt auf Repeat - Zaehler 0311 3605 LD (HL),5 ;wieder = 5 0313 23 INC HL ;zeigt auf Wartezeit 0314 35 DEC (HL) 0315 C0 RET NZ 0316 3A0A5C LD A,(REPPER) ;Zeitkonstante bei Repeat 0319 77 LD (HL),A ;in Byte 2 031A 23 INC HL ;Byte 3 = Tastencode 031B 7E LD A,(HL) 031C 18EA JR M0308 ;setze letzten Tastendruck 031E 42 M031E: LD B,D ;Funktionstaste merken 031F 1600 LD D,0 0321 7B LD A,E 0322 FE27 CP 27H ;'CAPS SHIFT' 0324 D0 RET NC ;oder keine Taste: RETURN 0325 FE18 CP 18H ;'SYMBOL SHIFT' 0327 2003 JR NZ,M032C 0329 CB78 BIT 7,B ;RETURN bei 'SYMBOL SHIFT' 032B C0 RET NZ ;allein 032C 210502 M032C: LD HL,KEYTAB ;Tastaturtabelle 032F 19 ADD HL,DE ;aktuelles Zeichen als ASCII- 0330 7E LD A,(HL) ;Wert aus der Tabelle holen 0331 37 SCF ;CARRY = Zeichen gefunden 0332 C9 RET ;---------------------------------------------------- ;Auswertung des ermittelten Tastencodes ;und Bildung der Basictoken je nach Eingabemodus ;(Cursor Mode K,L,C und E) 0333 7B M0333: LD A,E ;ASCII-Code der Taste 0334 FE3A CP 3AH ;Ziffer, Space, Enter oder 0336 382F JR C,M0367 ;Shift, dann Sprung 0338 0D DEC C ;nur A....Z 0339 FA4F03 JP M,M034F 033C 2803 JR Z,M0341 033E C64F ADD A,4FH ;revers Buchstaben liegen ab 90H 0340 C9 RET ;gruene Tokens ueber Tasten A....Z 0341 21EB01 M0341: LD HL,1EBH 0344 04 INC B 0345 2803 JR Z,TABDIR ;rote Tokens unter den Tasten A....Z 0347 210502 LD HL,KEYTAB ;Tastaturtabelle ;endgueltiges Token wird aus der ;entsprechenden Tabelle geladen 034A 1600 TABDIR: LD D,0 ;E = ASCII - Wert 034C 19 ADD HL,DE ;HL = Basisadresse -41H bzw. 30H 034D 7E LD A,(HL) 034E C9 RET ;rote Tokens auf den Tasten A....Z 034F 212902 M034F: LD HL,229H 0352 CB40 BIT 0,B 0354 28F4 JR Z,TABDIR ;'SYMBOL SHIFT' + Buchstabe 0356 CB5A BIT 3,D ;K - Modus 0358 280A JR Z,M0364 035A FDCB305E BIT 3,(IY+30H) ;FLAGS2 pruefen auf 'CAPS LOCK' 035E C0 RET NZ 035F 04 INC B ;SHIFT ? 0360 C0 RET NZ 0361 C620 ADD A,20H ;ASCII - Wert fuer Kleinschreibung 0363 C9 RET 0364 C6A5 M0364: ADD A,0A5H ;direkt erzeugbare Tokens 0366 C9 RET ;durch Addition (E6H) 0367 FE30 M0367: CP 30H ;Zeichen <30H ? 0369 D8 RET C 036A 0D DEC C ;Modus 036B FA9D03 JP M,M039D ;bei K,L,C 036E 2019 JR NZ,M0389 ;bei G ;rote Tokens unter den Tasten 0....9 0370 215402 LD HL,254H 0373 CB68 BIT 5,B 0375 28D3 JR Z,TABDIR ;ohne 'CAPS SHIFT' 0377 FE38 CP 38H 0379 3007 JR NC,M0382 037B D620 SUB 20H ;aus 30H..37H wird 10H..17H 037D 04 INC B 037E C8 RET Z ;wenn ohne SHIFT 037F C608 ADD A,8 ;Farbcode 18H..1FH 0381 C9 RET ;Tasten 8 und 9 (Codes fuer BRIGHT und FLASH) 0382 D636 M0382: SUB 36H ;erzeuge 2 oder 3 ohne SHIFT 0384 04 INC B 0385 C8 RET Z ;ohne SHIFT 0386 C6FE ADD A,0FEH ;erzeuge 0 oder 1 mit SHIFT 0388 C9 RET ;Grafikzeichen auf den Tasten 0....9 0389 213002 M0389: LD HL,230H ;(mit 'CAPS SHIFT') 038C FE39 CP 39H ;Test auf 'GRAPHICS' 038E 28BA JR Z,TABDIR 0390 FE30 CP 30H ;Test auf 'DELETE' 0392 28B6 JR Z,TABDIR 0394 E607 AND 7 ;nur Tasten '1...7' 0396 C680 ADD A,80H ;80H..87H sind die Grafikzeichen 0398 04 INC B 0399 C8 RET Z ;wenn kein SHIFT 039A EE0F XOR 0FH ;erzeuge Steuerzeichen ueber den ;Tasten 1...8 (Codes:88H..8FH) 039C C9 RET 039D 04 M039D: INC B 039E C8 RET Z ;wenn kein SHIFT 039F CB68 BIT 5,B ;'CAPS SHIFT' ? ;Befehle ueber den Tasten 0....9 03A1 213002 LD HL,230H 03A4 20A4 JR NZ,TABDIR 03A6 D610 SUB 10H ;aus 30H..39H wird 20H..29H 03A8 FE22 CP 22H ;'AT-SIGN' ? 03AA 2806 JR Z,M03B2 03AC FE20 CP 20H ;unterstreichen ? 03AE C0 RET NZ 03AF 3E5F LD A,5FH ;UNDERLINE 03B1 C9 RET 03B2 3E40 M03B2: LD A,40H 03B4 C9 RET ;----------------------------------------------------- ;Lautsprecher = Routinen ;Bit 4 von Port 0FEH steuert den Lautsprecher ;High = stromlos 03B5 F3 PIEPEN: DI ;Tastatur und Uhr gesperrt 03B6 7D LD A,L 03B7 CB3D SRL L 03B9 CB3D SRL L 03BB 2F CPL 03BC E603 AND 3 03BE 4F LD C,A 03BF 0600 LD B,0 03C1 DD21D103 LD IX,3D1H ;Basisadresse der Zeitschleife 03C5 DD09 ADD IX,BC 03C7 3A485C LD A,(BORDCR) ;Bordercolor * 8 03CA E638 AND 38H ;Lautsprecher aktivieren 03CC 0F RRCA ;in Bit 0...2 von A 03CD 0F RRCA 03CE 0F RRCA 03CF F608 OR 8 ;Kassettenausgang abschalten 03D1 00 NOP 03D2 00 NOP 03D3 00 NOP 03D4 04 INC B 03D5 0C INC C 03D6 0D HALBZE: DEC C ;Zeitschleife fuer halbe Periode 03D7 20FD JR NZ,HALBZE 03D9 0E3F LD C,3FH 03DB 05 DEC B 03DC C2D603 JP NZ,HALBZE 03DF EE10 XOR 10H ;Bit 4 invertieren 03E1 D3FE OUT (0FEH),A 03E3 44 LD B,H ;B wieder laden 03E4 4F LD C,A ;A retten 03E5 CB67 BIT 4,A ;Mitte des Zyklus ? 03E7 2009 JR NZ,TONMIT ;ja 03E9 7A LD A,D ;DE = 0 ? 03EA B3 OR E 03EB 2809 JR Z,TONEND ;0 = Pieper Ende 03ED 79 LD A,C ;A zurueck 03EE 4D LD C,L 03EF 1B DEC DE ;Schleifenzaehler - 1 03F0 DDE9 JP (IX) 03F2 4D TONMIT: LD C,L 03F3 0C INC C 03F4 DDE9 JP (IX) ;weiter 03F6 FB TONEND: EI 03F7 C9 RET ;Befehlsausfuehrung 'BEEP' 03F8 EF M03F8: RST CALRUF ;Aufruf Calculator ;um die Werte fuer Tonhoehe ;(P bzw I=INT(P)) und die ;Zeit T zu berechnen 03F9 31 DEFB 031H 03FA 27 DEFB 027H 03FB C0 DEFB 0C0H 03FC 03 DEFB 003H 03FD 34 DEFB 034H 03FE EC DEFB 0ECH 03FF 6C DEFB 06CH 0400 98 DEFB 098H 0401 1F DEFB 01FH 0402 F5 DEFB 0F5H 0403 04 DEFB 004H 0404 A1 DEFB 0A1H 0405 0F DEFB 00FH 0406 38 DEFB 038H 0407 21925C LD HL,MEMBOT 040A 7E LD A,(HL) ;Exponent von I holen 040B A7 AND A 040C 205E JR NZ,ERRTON ;nicht 0: ERROR 040E 23 INC HL 040F 4E LD C,(HL) ;Vorzeichenbyte 0410 23 INC HL 0411 46 LD B,(HL) ;Low-Byte 0412 78 LD A,B 0413 17 RLA 0414 9F SBC A,A ;Test -128<=I<=+127 ? 0415 B9 CP C 0416 2054 JR NZ,ERRTON 0418 23 INC HL 0419 BE CP (HL) 041A 2050 JR NZ,ERRTON 041C 78 LD A,B ;Low-Byte in A 041D C63C ADD A,3CH ;-60 bis +67 041F F22504 JP P,M0425 ;ok 0422 E26C04 JP PO,ERRTON ;Oktave des Tons in B suchen 0425 06FA M0425: LD B,0FAH ;6 Oktaven unter mittlerem C 0427 04 OKTAV: INC B ;beginnen 0428 D60C SUB 12 ;pro Oktave 12 Toene abziehen 042A 30FB JR NC,OKTAV 042C C60C ADD A,12 ;A: Zeiger auf Halbton dieser Oktave 042E C5 PUSH BC ;Nr der Okt. 042F 216E04 LD HL,TONC 0432 CD0634 CALL M3406 ;Halbton in A in den 0435 CDB433 CALL M33B4 ;Calculator-Stack 0438 EF RST CALRUF ;Tonhoehe berechnen 0439 04 DEFB 4 043A 38 DEFB 38H 043B F1 POP AF ;Oktav-Nr 043C 86 ADD A,(HL) ;add. Exponent = *2 043D 77 LD (HL),A 043E EF RST CALRUF 043F C0 DEFB 0C0H ;Frequenz in MEM0 0440 02 DEFB 2 0441 31 DEFB 31H 0442 38 DEFB 38H 0443 CD941E CALL INTEG1 ;Zeit muss < 10 sein 0446 FE0B CP 11 0448 3022 JR NC,ERRTON ;sonst Error 044A EF RST CALRUF ;Berechnung Frequenz*Zeit 044B E0 DEFB 0E0H ;ermittelte Frequenz holen 044C 04 DEFB 4H ;T * F 044D E0 DEFB 0E0H 044E 34 DEFB 34H 044F 80 DEFB 80H 0450 43 DEFB 43H 0451 55 DEFB 55H 0452 9F DEFB 9FH 0453 80 DEFB 80H 0454 01 DEFB 1H 0455 05 DEFB 5H 0456 34 DEFB 34H 0457 35 DEFB 35H 0458 71 DEFB 71H 0459 03 DEFB 3H 045A 38 DEFB 38H 045B CD991E CALL M1E99 ;Zeitschleifenwert holen 045E C5 PUSH BC ;und retten 045F CD991E CALL M1E99 ;Frequenz * Zeit --> BC 0462 E1 POP HL 0463 50 LD D,B 0464 59 LD E,C ;DE=Anzahl der Durchlaeufe 0465 7A LD A,D 0466 B3 OR E 0467 C8 RET Z 0468 1B DEC DE 0469 C3B503 JP PIEPEN ;Tonausgabe 046C CF ERRTON: RST ERRAUS 046D 0A DEFB 0AH ;Halbtontabelle 046E 8902D012 TONC: DEFB 89H,2,0D0H,12H,86H 0473 890A9760 TONCIS: DEFB 89H,0AH,97H,60H,75H 0478 8912D517 TOND: DEFB 89H,12H,0D5H,17H,1FH 047D 891B9041 TONDIS: DEFB 89H,1BH,90H,41H,2 0482 8924D053 TONE: DEFB 89H,24H,0D0H,53H,0CAH 0487 892E9D36 TONF: DEFB 89H,2EH,9DH,36H,0B1H 048C 8938FF49 TONFIS: DEFB 89H,38H,0FFH,49H,3EH 0491 8943FF6A TONG: DEFB 89H,43H,0FFH,6AH,73H 0496 894FA700 TONGIS: DEFB 89H,4FH,0A7H,0,54H 049B 895C0000 TONA: DEFB 89H,5CH,0,0,0 04A0 896914F6 TONB: DEFB 89H,69H,14H,0F6H,24H 04A5 8976F110 TONH: DEFB 89H,76H,0F1H,10H,5 ;Diese Routine wird nicht benutzt !!! 04AA CDFB24 CALL 24FBH 04AD 3A3B5C LD A,(FLAGS) ;Bit 1= Printer ein 04B0 87 ADD A,A 04B1 FA8A1C JP M,M1C8A 04B4 E1 POP HL 04B5 D0 RET NC 04B6 E5 PUSH HL 04B7 CDF12B CALL M2BF1 04BA 62 LD H,D 04BB 6B LD L,E 04BC 0D DEC C 04BD F8 RET M 04BE 09 ADD HL,BC 04BF CBFE SET 7,(HL) 04C1 C9 RET ;Kassettenrekorder ;Byte abspeichern ; ret nc -> break ; ret c -> ok 04C2 213F05 M04C2: LD HL,SAVLOA ;Returnadresse fuer SAVE, LOAD 04C5 E5 PUSH HL 04C6 21801F LD HL,1F80H ;Konstante fuer 5 s Headerton 04C9 CB7F BIT 7,A 04CB 2803 JR Z,M04D0 ;Header speichern 04CD 21980C LD HL,0C98H ;Konstante fuer 2 s 04D0 08 M04D0: EX AF,AF' ;Programm-Header-Flag retten 04D1 13 INC DE 04D2 DD2B DEC IX 04D4 F3 DI 04D5 3E02 LD A,2 ;Bordercolour rot und 'MIC' ein 04D7 47 LD B,A 04D8 10FE HEADER: DJNZ HEADER ;Bitperiode Headerton 04DA D3FE OUT (0FEH),A ; 'MIC' ein/ausschalten 04DC EE0F XOR 0FH 04DE 06A4 LD B,0A4H ;Konstante Bitperiode 04E0 2D DEC L 04E1 20F5 JR NZ,HEADER 04E3 05 DEC B 04E4 25 DEC H ;Wiederholung bis HL < 0 04E5 F2D804 JP P,HEADER ;Synchronimpuls senden 04E8 062F LD B,2FH 04EA 10FE SYNC1: DJNZ SYNC1 ;'MIC' aus 04EC D3FE OUT (0FEH),A ;'MIC' ein und rot 04EE 3E0D LD A,0DH ;fuer 'MIC' ein und 'CYAN' 04F0 0637 LD B,37H 04F2 10FE SYNC2: DJNZ SYNC2 04F4 D3FE OUT (0FEH),A ;'MIC' aus und 'CYAN' 04F6 010E3B LD BC,3B0EH 04F9 08 EX AF,AF' 04FA 6F LD L,A ;Flag in L 04FB C30705 JP M0507 04FE 7A BYTEAU: LD A,D 04FF B3 OR E 0500 280C JR Z,M050E ;Bytes Ende und Parity senden 0502 DD6E00 LD L,(IX+0) ;sonst naechstes Byte 0505 7C M0505: LD A,H ;"Parity"-Bildung in A 0506 AD XOR L ;mit aktuellem Byte 0507 67 M0507: LD H,A 0508 3E01 LD A,1 ;'MIC' ein und 'blau' 050A 37 SCF ;Endemarkierung 050B C32505 JP SAVE8 ;Fuer 8 Bit setzen und senden 050E 6C M050E: LD L,H ;Ende-"parity" nach L 050F 18F4 JR M0505 0511 79 BITEND: LD A,C ;Teil 2 des Bits senden und hierfuer 0512 CB78 BIT 7,B ;Zero setzen 0514 10FE BITANF: DJNZ BITANF ;Zeitschleife 0516 3004 JR NC,BITOUT ;wenn Nullbit 0518 0642 LD B,42H 051A 10FE BITSET: DJNZ BITSET ;bei 1 weiter verzoegern 051C D3FE BITOUT: OUT (0FEH),A ;Teil1: 'MIC' ein und blau ;Teil2: 'MIC' aus und gelb 051E 063E LD B,3EH 0520 20EF JR NZ,BITEND ;Teil2 ausgeben 0522 05 DEC B 0523 AF XOR A ;CY=0 0524 3C INC A ;'MIC' ein mit blau ;Beim ersten Bit eines Byte ist Carry gesetzt, sonst immer ;geloescht --> Begrenzung auf 8 Bit beim Rotieren des L-Reg. 0525 CB15 SAVE8: RL L ;Bit 7 der Ausgabe ins Carry 0527 C21405 JP NZ,BITANF ;weiter bis 8 Bit fertig 052A 1B DEC DE ;Bytezaehler 052B DD23 INC IX ;Adresse naechstes Byte 052D 0631 LD B,31H 052F 3E7F LD A,7FH 0531 DBFE IN A,(0FEH) ;Break-Taste? 0533 1F RRA 0534 D0 RET NC ;ja 0535 7A LD A,D 0536 3C INC A 0537 C2FE04 JP NZ,BYTEAU ;Ausgabe bis DE=FFFFH 053A 063B LD B,3BH 053C 10FE SAVEDE: DJNZ SAVEDE ;etwas verzoegern 053E C9 RET ;Nach SAVE oder LOAD hierhin zurueckkehren 053F F5 SAVLOA: PUSH AF ;CY retten 0540 3A485C LD A,(BORDCR) ;original Bordercolor 0543 E638 AND 38H ;nehmen und in Bit 0..2 0545 0F RRCA 0546 0F RRCA 0547 0F RRCA 0548 D3FE OUT (0FEH),A ;Border original 054A 3E7F LD A,7FH 054C DBFE IN A,(0FEH) ;Breaktaste? 054E 1F RRA 054F FB EI 0550 3802 JR C,M0554 ;nein 0552 CF RST ERRAUS ;Meldung 0553 0C DEFB 0CH 0554 F1 M0554: POP AF ;Flags 0555 C9 RET ; ----- UP for LOAD and VERIFY ------------------------------------------------- ; ; in: A = blocktype byte ; CY = load ; NC = verify ; DE = length (D must not be $ff) ; IX = address ; out: CY,NZ = ok (kio) ; NC,Z = error (FLANK1, FLANK2: pulse too long) (kio) ; NC,NZ = verify_error, break oder wrong_block_type (kio) ; AF,BC,DE,HL,AF',IX modified ; irpt disabled SAVLOA enabled irpt wieder. außer der Stack wird überschrieben... (kio) 0556 14 M0556: INC D ;Zero loeschen 0557 08 EX AF,AF' ;und Flags retten 0558 15 DEC D ;D regen. 0559 F3 DI 055A 3E0F LD A,0FH ;Border colour weiss 055C D3FE OUT (0FEH),A 055E 213F05 LD HL,SAVLOA ;Returnadr. 0561 E5 PUSH HL 0562 DBFE IN A,(0FEH) ;1 * zum Initialisieren lesen 0564 1F RRA 0565 E620 AND 20H ; 'EAR'-Bit merken 0567 F602 OR 2 ;Border-Colour rot 0569 4F LD C,A ;retten (22H = aus, 2 = ein) 056A BF CP A ;fuer Uebersprung RET NZ 056B C0 LOABRK: RET NZ ;EXIT bei Break 056C CDE705 LOABEG: CALL FLANK1 ;CY geloescht: keine Flanke 056F 30FA JR NC,LOABRK ;gefunden oder Break gedrueckt 0571 211504 LD HL,415H 0574 10FE LDWART: DJNZ LDWART ;Warteschleife etwa 1 s 0576 2B DEC HL 0577 7C LD A,H 0578 B5 OR L 0579 20F9 JR NZ,LDWART 057B CDE305 CALL FLANK2 ;noch mal auf 2 Flanken warten 057E 30EB JR NC,LOABRK ;falls nicht, Error ;Nur ein Headersignal akzeptieren 0580 069C HEADIN: LD B,9CH ;Zeitkonstante 0582 CDE305 CALL FLANK2 ;2 Flanken erwarten 0585 30E4 JR NC,LOABRK ;falls nicht Error 0587 3EC6 LD A,0C6H ;max. Zeitabstand 0589 B8 CP B ;ca. 3000 T Zyklen 058A 30E0 JR NC,LOABEG ;sonst noch mal suchen 058C 24 INC H ;256 Doppelflanken abwarten 058D 20F1 JR NZ,HEADIN ;Jetzt wird ein Synchronimpuls erwartet 058F 06C9 SYNWAR: LD B,0C9H ;Zeitkonstante 0591 CDE705 CALL FLANK1 0594 30D5 JR NC,LOABRK 0596 78 LD A,B ;2 kurz aufeinander folgende 0597 FED4 CP 0D4H ;Flanken bilden den Sync-Impuls 0599 30F4 JR NC,SYNWAR 059B CDE705 CALL FLANK1 ;abfallende Sync-Flanke 059E D0 RET NC ;muss existieren ;Die Bytes koennen geladen oder verifiziert werden 059F 79 LD A,C ;Border Colours auf blau 05A0 EE03 XOR 3 ;bzw. gelb schalten 05A2 4F LD C,A 05A3 2600 LD H,0 ;fuer Parity-Pruefung 05A5 06B0 LD B,0B0H ;Zeitkonstante fuer FLAG-Byte 05A7 181F JR M05C8 05A9 08 M05A9: EX AF,AF' ;Flags holen 05AA 2007 JR NZ,LOAFLG ;nur bei Flagpruefung (1. Byte) 05AC 300F JR NC,VERIFY 05AE DD7500 LD (IX+0),L ;geladenes Byte speichern 05B1 180F JR LADWEI ;und naechstes laden 05B3 CB11 LOAFLG: RL C ;CY retten 05B5 AD XOR L ;erstes Byte = Typ-Flag 05B6 C0 RET NZ ;nein Error 05B7 79 LD A,C ;sonst CY wiederholen 05B8 1F RRA 05B9 4F LD C,A 05BA 13 INC DE ;dieses INC wird unten wieder 05BB 1807 JR M05C4 ;rueckgaengig gemacht 05BD DD7E00 VERIFY: LD A,(IX+0) ;bei Verify Originalbyte holen 05C0 AD XOR L ;und vergleichen 05C1 C0 RET NZ ;Verify-Error (Carry geloescht) 05C2 DD23 LADWEI: INC IX ;Adresse fuer Load/Verify erhoehen 05C4 1B M05C4: DEC DE ;Zaehler -1 05C5 08 EX AF,AF' ;Flags retten 05C6 06B2 LD B,0B2H ;Zeitkonstante 05C8 2E01 M05C8: LD L,1 ;Endekennung beim 9. Schieben 05CA CDE305 BITHOL: CALL FLANK2 ;Laenge der Pulse holen 05CD D0 RET NC ;Zeitueberschreitung 05CE 3ECB LD A,0CBH ;Zeitvergleich, um daraus eine 0 05D0 B8 CP B ;oder 1 im CY zu gewinnen und 05D1 CB15 RL L ;in L zu schieben 05D3 06B0 LD B,0B0H ;Zeitkonstante naechstes Bit 05D5 D2CA05 JP NC,BITHOL ;Byte noch nicht kompl. 05D8 7C LD A,H ;Parity holen 05D9 AD XOR L ;und neues bilden 05DA 67 LD H,A ;neues Parity 05DB 7A LD A,D 05DC B3 OR E 05DD 20CA JR NZ,M05A9 ;Ende noch nicht erreicht 05DF 7C LD A,H ;letztes Parity-Byte muss 0 05E0 FE01 CP 1 ;sein: CY gesetzt 05E2 C9 RET ;sonst Carry geloescht: Error ;Pegelwechsel (Flanken) am Kassettenrekordereingang erfassen ;B: Zeitzaehler ;Innerhalb dieser festgelegten Zeit muessen die geforderten ;Flanken auftreten --> sonst Error mit CY=0 ; NC & Z -> error (kio) ; NC & NZ -> break (kio) ; CY -> ok (kio) 05E3 CDE705 FLANK2: CALL FLANK1 ;Auf 2 Flanken pruefen 05E6 D0 RET NC ;Error 05E7 3E16 FLANK1: LD A,16H ;1 Flanke pruefen 05E9 3D WARTLD: DEC A ;warten 05EA 20FD JR NZ,WARTLD 05EC A7 AND A ;CY=0 05ED 04 FLANKE: INC B ;Zeitzaehler 05EE C8 RET Z ;Zeitende: CY Z 05EF 3E7F LD A,7FH 05F1 DBFE IN A,(0FEH) ;Breaktaste und 'EAR' 05F3 1F RRA ;Break gedrueckt: 05F4 D0 RET NC ; NC & NZ 05F5 A9 XOR C ;Flanke aufgetreten ? 05F6 E620 AND 20H 05F8 28F3 JR Z,FLANKE ;nein: weiter warten ;Innerhalb der erlaubten Zeit wurde Flanke erkannt 05FA 79 LD A,C 05FB 2F CPL ;C = Flankenart 05FC 4F LD C,A 05FD E607 AND 7 ;Bordercolour ausblenden 05FF F608 OR 8 ;MIC aus 0601 D3FE OUT (0FEH),A 0603 37 SCF ;CY=1: OK 0604 C9 RET ;Einsprung bei LOAD, SAVE, VERIFY & MERGE ;Unterscheidung der Befehle Mittels TADDR 0605 F1 KASHAU: POP AF ;Ret-Adr. vernichten 0606 3A745C LD A,(TADDR) ;Naechster Token in der Tabelle 0609 D6E0 SUB 0E0H ;-E0H, um 0 fuer SAVE, 1 fuer LOAD, ;2 fuer VERIFY und 3 fuer MERGE zu ;erhalten 060B 32745C LD (TADDR),A 060E CD8C1C CALL PAR0A ;Namensparameter in Calc.-Stack 0611 CD3025 CALL M2530 ;Syntaxpruefung? 0614 283C JR Z,M0652 ;ja 0616 011100 LD BC,17 ;Namenslaenge: 17 0619 3A745C LD A,(TADDR) ;Adresse des naechsten Tokens ;in der Tabelle 061C A7 AND A 061D 2802 JR Z,KASPAC ;bei SAVE 061F 0E22 LD C,34 ;sonst Laenge 34 0621 F7 KASPAC: RST REST30 ;Speicher reservieren 0622 D5 PUSH DE ;Startadresse in IX 0623 DDE1 POP IX 0625 060B LD B,11 0627 3E20 LD A,' ' 0629 12 CLRNAM: LD (DE),A ;Filename loeschen 062A 13 INC DE 062B 10FC DJNZ CLRNAM 062D DD3601FF LD (IX+1),255 ;zeigt 'kein Name' an 0631 CDF12B CALL M2BF1 ;Namensparameter holen 0634 21F6FF LD HL,-10 0637 0B DEC BC 0638 09 ADD HL,BC ;Laenge=10? 0639 03 INC BC 063A 300F JR NC,M064B ;<=10 063C 3A745C LD A,(TADDR) ;falls nicht SAVE: 063F A7 AND A 0640 2002 JR NZ,NAMOK ;mehr zulassen 0642 CF NAMERR: RST ERRAUS 0643 0E DEFB 0EH ;'INVALD FILE NAME' 0644 78 NAMOK: LD A,B 0645 B1 OR C 0646 280A JR Z,M0652 ;ohne Namensangabe 0648 010A00 LD BC,10 ;Name auf 10 begrenzen 064B DDE5 M064B: PUSH IX ;Adresse des Namens 064D E1 POP HL ;in HL 064E 23 INC HL 064F EB EX DE,HL 0650 EDB0 LDIR ;Namen umspeichern 0652 DF M0652: RST GETAKT ;naechstes Zeichen lesen 0653 FEE4 CP 0E4H ;Token 'DATA' ? 0655 2049 JR NZ,M06A0 ;nein 0657 3A745C LD A,(TADDR) ;auf MERGE pruefen 065A FE03 CP 3 065C CA8A1C JP Z,M1C8A ;'MERGE' mit 'DATA': ERROR 065F E7 RST GETNXT ;naechstes Zeichen 0660 CDB228 CALL M28B2 ;in Variablentabelle suchen 0663 CBF9 SET 7,C ;Bit 7 des Arraynamens setzen 0665 300B JR NC,M0672 ;bei vorhandenen Array 0667 210000 LD HL,0 ;neues Array 066A 3A745C LD A,(TADDR) ;Adresse des naechsten Tokens ;in der Tabelle 066D 3D DEC A 066E 2815 JR Z,M0685 ;nur 'LOAD' zugelassen 0670 CF RST ERRAUS 0671 01 DEFB 1 ;'VARIABLE NOT FOUND' 0672 C28A1C M0672: JP NZ,M1C8A 0675 CD3025 CALL M2530 ;bei Syntaxpruefung 0678 2818 JR Z,M0692 ;Sprung 067A 23 INC HL ;sonst Laengenbyte LOW 067B 7E LD A,(HL) 067C DD770B LD (IX+0BH),A 067F 23 INC HL ;und HIGH in den 0680 7E LD A,(HL) ;Workspace 0681 DD770C LD (IX+0CH),A 0684 23 INC HL 0685 DD710E M0685: LD (IX+0EH),C ;Arrayname speichern 0688 3E01 LD A,1 ;Zahlenarray 068A CB71 BIT 6,C 068C 2801 JR Z,M068F 068E 3C INC A ;Buchstabenarray 068F DD7700 M068F: LD (IX+0),A ;erstes Headerbyte 0692 EB M0692: EX DE,HL 0693 E7 RST GETNXT ;naechste Zeichen 0694 FE29 CP ')' 0696 20DA JR NZ,M0672 ;ERROR C 0698 E7 RST GETNXT 0699 CDEE1B CALL M1BEE ;Aussprung bei Syntaxpruefung 069C EB EX DE,HL 069D C35A07 JP M075A ;weiter 06A0 FEAA M06A0: CP 0AAH ;ist Token ='SCREEN$' ? 06A2 201F JR NZ,M06C3 ;nein 06A4 3A745C LD A,(TADDR) 06A7 FE03 CP 3 ;bei MERGE ist 'SCREEN$' als 06A9 CA8A1C JP Z,M1C8A ;Name nicht zugelassen 06AC E7 RST GETNXT 06AD CDEE1B CALL M1BEE 06B0 DD360B00 LD (IX+0BH),0 ;Laenge des Display- und 06B4 DD360C1B LD (IX+0CH),1BH ;Attributspeichers = 1B00H 06B8 210040 LD HL,BILD ;Video - RAM 06BB DD750D LD (IX+0DH),L 06BE DD740E LD (IX+0EH),H 06C1 184D JR M0710 06C3 FEAF M06C3: CP 0AFH ;Token = 'CODE' ? 06C5 204F JR NZ,M0716 ;nein 06C7 3A745C LD A,(TADDR) ;bei MERGE ist 'CODE' 06CA FE03 CP 3 06CC CA8A1C JP Z,M1C8A ;nicht zugelassen 06CF E7 RST GETNXT 06D0 CD4820 CALL M2048 ;Eingabeende ? 06D3 200C JR NZ,M06E1 ;nein 06D5 3A745C LD A,(TADDR) ;bei SAVE ist 'CODE' 06D8 A7 AND A 06D9 CA8A1C JP Z,M1C8A ;nicht zugelassen 06DC CDE61C CALL M1CE6 ;0 auf Calculatorstack fuer Start 06DF 180F JR M06F0 ;Startadresse suchen 06E1 CD821C M06E1: CALL PAR06 ;erste Zahl holen 06E4 DF RST GETAKT ;naechstes Zeichen 06E5 FE2C CP ',' 06E7 280C JR Z,M06F5 06E9 3A745C LD A,(TADDR) ;ERROR, falls bei 'SAVE' 06EC A7 AND A ;nur die Startadresse 06ED CA8A1C JP Z,M1C8A ;und keine Laenge 06F0 CDE61C M06F0: CALL M1CE6 ;0 als Laenge auf Calculatorstack 06F3 1804 JR M06F9 06F5 E7 M06F5: RST GETNXT ;naechstes Zeichen und die 06F6 CD821C CALL PAR06 ;Laenge holen 06F9 CDEE1B M06F9: CALL M1BEE ;weiter zum naechsten Befehl, ;falls Syntaxpruefung 06FC CD991E CALL M1E99 ;Laenge ins BC Register 06FF DD710B LD (IX+0BH),C ;und in Header 0702 DD700C LD (IX+0CH),B 0705 CD991E CALL M1E99 ;ebenso mit der Startadresse 0708 DD710D LD (IX+0DH),C 070B DD700E LD (IX+0EH),B 070E 60 LD H,B ;Startadresse als Pointer in HL 070F 69 LD L,C 0710 DD360003 M0710: LD (IX+0),3 ;Typ '3' fuer SCREEN$ und CODE 0714 1844 JR M075A 0716 FECA M0716: CP 0CAH ;Token = 'LINE' ? 0718 2809 JR Z,M0723 ;ja 071A CDEE1B CALL M1BEE ;naechster Befehl bei Syntaxpruef. 071D DD360E80 LD (IX+0EH),80H ;falls keine weiteren Parameter 0721 1817 JR M073A 0723 3A745C M0723: LD A,(TADDR) ;pruefen ob 'SAVE', denn eine 0726 A7 AND A ;Zeilennummer muss folgen 0727 C28A1C JP NZ,M1C8A ;nicht 'SAVE' 072A E7 RST GETNXT 072B CD821C CALL PAR06 ;Zeilennummer auf Calc-Stack 072E CDEE1B CALL M1BEE ;bei Syntaxpruefung EXIT 0731 CD991E CALL M1E99 ;sonst Zeilennummer in BC 0734 DD710D LD (IX+0DH),C 0737 DD700E LD (IX+0EH),B 073A DD360000 M073A: LD (IX+0),0 ;'LINE' und ohne weitere Angaben ;sind vom Typ '0' 073E 2A595C LD HL,(ELINE) ;Zeiger auf Variablenende 0741 ED5B535C LD DE,(PROG) ;Zeiger auf Start des Basicprogrammes 0745 37 SCF 0746 ED52 SBC HL,DE 0748 DD750B LD (IX+0BH),L ;Laenge von Programm + Variablenspeicher 074B DD740C LD (IX+0CH),H 074E 2A4B5C LD HL,(VARS) ;Beginn der Variablen 0751 ED52 SBC HL,DE 0753 DD750F LD (IX+0FH),L ;Programmlaenge 0756 DD7410 LD (IX+10H),H 0759 EB EX DE,HL ;HL=Programmanfang ;Der Header ist fertig: ;IX+ 0: Typ ;IX+ 1 bis 10: Name bzw. IX+1=FF, wenn kein Name ;IX+ 11,12: Laenge Programm +Variablenspeicher ;IX+ 13,14: Zeilen-Nr. ;IX+ 15,16: Programmlaenge 075A 3A745C M075A: LD A,(TADDR) ;Adresse des naechsten Tokens ;in der Tabelle 075D A7 AND A ;SAVE? 075E CA7009 JP Z,M0970 ;ja 0761 E5 PUSH HL ;Pointer fuer LOAD etc. retten 0762 011100 LD BC,011H 0765 DD09 ADD IX,BC ;Adr des 2. Headers 0767 DDE5 M0767: PUSH IX 0769 111100 LD DE,17 ;17 Bytes laden 076C AF XOR A ;HEADER anmerken 076D 37 SCF ;LOAD anmerken 076E CD5605 CALL M0556 ;HEADER laden 0771 DDE1 POP IX ;2. Headeradr. zurueck 0773 30F2 JR NC,M0767 ;Header noch nicht gefunden 0775 3EFE LD A,0FEH ;Kanal S oefffnen 0777 CD0116 CALL OPKAN 077A FD365203 LD (IY+52H),3 ;Scrolling-Zaehler setzen 077E 0E80 LD C,80H ;Default fuer Haeder falsch 0780 DD7E00 LD A,(IX+0) ;Die beiden Haeder vergleichen 0783 DDBEEF CP (IX-11H) 0786 2002 JR NZ,M078A ;noch nicht richtig 0788 0EF6 LD C,-10 ;10 Zeichen muessen stimmen 078A FE04 M078A: CP 4 ;Typ > 4 ist Unsinn 078C 30D9 JR NC,M0767 ;noch mal Header laden 078E 11C009 LD DE,M09C0 ;Basisadr. Meldungen 0791 C5 PUSH BC 0792 CD0A0C CALL PRTMEL ;Typ anzeigen 0795 C1 POP BC 0796 DDE5 PUSH IX 0798 D1 POP DE ;Zeiger auf geladenen Haeder 0799 21F0FF LD HL,-16 079C 19 ADD HL,DE ;HL: Zeiger auf 1.Header 079D 060A LD B,10 ;10 Zeichen pruefen 079F 7E LD A,(HL) 07A0 3C INC A ;war Name angegeben? 07A1 2003 JR NZ,M07A6 ;ja 07A3 79 LD A,C ;nein: Name stimmt immer 07A4 80 ADD A,B 07A5 4F LD C,A 07A6 13 M07A6: INC DE 07A7 1A LD A,(DE) ;1. Zeichen vergleichen 07A8 BE CP (HL) ;und anzeigen 07A9 23 INC HL 07AA 2001 JR NZ,M07AD ;Haeder stimmen nicht 07AC 0C INC C ;sonst Zaehler+1 07AD D7 M07AD: RST PRTOUT ;Ausgabe B-mal 07AE 10F6 DJNZ M07A6 07B0 CB79 BIT 7,C ;C>=0? (Header OK?) 07B2 20B3 JR NZ,M0767 ;nein: noch mal holen ;Weiter, wenn der richtige Header gefunden wurde 07B4 3E0D LD A,0DH 07B6 D7 RST PRTOUT ; ausgeben 07B7 E1 POP HL ;Pointer 07B8 DD7E00 LD A,(IX+0) ;SCREEN oder 07BB FE03 CP 3 ;CODE 07BD 280C JR Z,M07CB ;ja 07BF 3A745C LD A,(TADDR) ;Adresse des naechsten Tokens ;in der Tabelle 07C2 3D DEC A ;LOAD-Befehl? 07C3 CA0808 JP Z,M0808 ;ja 07C6 FE02 CP 2 ;MERGE-Befehl? 07C8 CAB608 JP Z,M08B6 ;ja ;Verify-Routine 07CB E5 M07CB: PUSH HL ;Pointer 07CC DD6EFA LD L,(IX-6) 07CF DD66FB LD H,(IX-5) ;HL: Laenge 07D2 DD5E0B LD E,(IX+0BH) 07D5 DD560C LD D,(IX+0CH) ;DE: Laenge des geladenen Haeders 07D8 7C LD A,H 07D9 B5 OR L ;Laenge = 0 ? 07DA 280D JR Z,M07E9 ;ja 07DC ED52 SBC HL,DE ;Neue Laenge > alte Laenge? 07DE 3826 JR C,M0806 ;ja, Error 07E0 2807 JR Z,M07E9 ;gleiche Laenge --> ok 07E2 DD7E00 LD A,(IX+0) 07E5 FE03 CP 3 ;Bei Verify muessen Laengen ;uebereinstimmen 07E7 201D JR NZ,M0806 ;sonst --> Error 07E9 E1 M07E9: POP HL ;Startpointer 07EA 7C LD A,H 07EB B5 OR L ; = 0? 07EC 2006 JR NZ,M07F4 ;nein 07EE DD6E0D LD L,(IX+0DH) ;Startpointer des geladenen 07F1 DD660E LD H,(IX+0EH) ;Haeders benutzen 07F4 E5 M07F4: PUSH HL 07F5 DDE1 POP IX 07F7 3A745C LD A,(TADDR) ;Adresse des naechsten Tokens ;in der Tabelle 07FA FE02 CP 2 07FC 37 SCF ;CY: LOAD 07FD 2001 JR NZ,M0800 07FF A7 AND A ;NC: VERIFY 0800 3EFF M0800: LD A,0FFH ;UP-Ruf fuer alle Ladevorgaenge (LOAD, VERIFY, MERGE) 0802 CD5605 M0802: CALL M0556 0805 D8 RET C ;kein Fehler 0806 CF M0806: RST ERRAUS ;Meldung: 0807 1A DEFB 1AH ;'TAPE LOADING ERROR' ;LOAD-Routine 0808 DD5E0B M0808: LD E,(IX+11) ;Laenge aus geladenem Header 080B DD560C LD D,(IX+12) 080E E5 PUSH HL ;Zielpointer 080F 7C LD A,H 0810 B5 OR L ;=0? (nichtdeklariertes Array?) 0811 2006 JR NZ,M0819 ;nein 0813 13 INC DE ;ja 0814 13 INC DE 0815 13 INC DE ;+3 fuer Name und Laenge 0816 EB EX DE,HL 0817 180C JR M0825 0819 DD6EFA M0819: LD L,(IX-6) ;Laenge Programm + Variable 081C DD66FB LD H,(IX-5) 081F EB EX DE,HL 0820 37 SCF 0821 ED52 SBC HL,DE ;wird zusaetzlicher Speicherpl. ben.? 0823 3809 JR C,M082E ;nein 0825 110500 M0825: LD DE,5 0828 19 ADD HL,DE ;+ 5 Byte 0829 44 LD B,H 082A 4D LD C,L 082B CD051F CALL M1F05 ;Speicherplatztest 082E E1 M082E: POP HL ;Startadresse 082F DD7E00 LD A,(IX+0) 0832 A7 AND A ;wird BASIC-Progr. geladen? 0833 283E JR Z,M0873 ;ja 0835 7C LD A,H 0836 B5 OR L ;neues ARRAY? 0837 2813 JR Z,M084C ;ja 0839 2B DEC HL ;nein 083A 46 LD B,(HL) 083B 2B DEC HL 083C 4E LD C,(HL) ;BC=Laenge des bereits ex. Arrays 083D 2B DEC HL ;HL - Zeiger zum alten Namen 083E 03 INC BC 083F 03 INC BC ;Laenge + 3 fuer Namen und Laenge 0840 03 INC BC 0841 DD225F5C LD (XPTR),IX ;IX zwischenspeichern 0845 CDE819 CALL RAUS2 ;altes Array wegwerfen 0848 DD2A5F5C LD IX,(XPTR) ;IX regen. 084C 2A595C M084C: LD HL,(ELINE) ;Zeiger auf Endemarkierung (80H) 084F 2B DEC HL ; der Variablen 0850 DD4E0B LD C,(IX+0BH) 0853 DD460C LD B,(IX+0CH) ;Laenge des neuen Arrays 0856 C5 PUSH BC 0857 03 INC BC 0858 03 INC BC 0859 03 INC BC ;+3 fuer Name und Laenge 085A DD7EFD LD A,(IX-3) ;Name aus altem Haeder fuer das neue 085D F5 PUSH AF ; Array 085E CD5516 CALL MACHPL ;BC Speicherplaetze beschaffen 0861 23 INC HL 0862 F1 POP AF 0863 77 LD (HL),A ;Name des Arrays einschreiben 0864 D1 POP DE ;Laenge 0865 23 INC HL 0866 73 LD (HL),E 0867 23 INC HL 0868 72 LD (HL),D ; einschreiben 0869 23 INC HL ;Zeiger auf 1. Platz der vom Band ; geladen wird 086A E5 PUSH HL 086B DDE1 POP IX ;Startadr. 086D 37 SCF ;LOAD 086E 3EFF LD A,0FFH ; und Daten anmerken 0870 C30208 JP M0802 ;zur Laderoutine ;Laden eines BASIC-Programms mit Variablen 0873 EB M0873: EX DE,HL ;DE: Zieladresse 0874 2A595C LD HL,(ELINE) ;Variablenende suchen 0877 2B DEC HL 0878 DD225F5C LD (XPTR),IX ;Zwischenspeichern 087C DD4E0B LD C,(IX+11) 087F DD460C LD B,(IX+12) ;Laenge des neuen Headers 0882 C5 PUSH BC 0883 CDE519 CALL RAUS1 ;derzeitiges Programm wegwerfen 0886 C1 POP BC ;Laenge 0887 E5 PUSH HL ;Zeiger auf Start 0888 C5 PUSH BC 0889 CD5516 CALL MACHPL ;BC Speicherplaetze freimachen 088C DD2A5F5C LD IX,(XPTR) ;IX regen. 0890 23 INC HL 0891 DD4E0F LD C,(IX+15) 0894 DD4610 LD B,(IX+16) 0897 09 ADD HL,BC 0898 224B5C LD (VARS),HL ;VARS neu setzen 089B DD660E LD H,(IX+14) 089E 7C LD A,H 089F E6C0 AND 0C0H ;Zeilen-Nr. angeben? 08A1 200A JR NZ,M08AD ;nein 08A3 DD6E0D LD L,(IX+0DH) ;NEWPPC und 08A6 22425C LD (NEWPPC),HL ;NSPPC neu setzen 08A9 FD360A00 LD (IY+0AH),0 08AD D1 M08AD: POP DE ;Laenge und 08AE DDE1 POP IX ;Startadresse holen 08B0 37 SCF ;'LOAD' und 08B1 3EFF LD A,0FFH ;Daten anmerken 08B3 C30208 JP M0802 ;zur Laderoutine ;Merge - Routine 08B6 DD4E0B M08B6: LD C,(IX+0BH) ;Laenge des 08B9 DD460C LD B,(IX+0CH) ;Datenblockes holen 08BC C5 PUSH BC 08BD 03 INC BC ;Laenge + 1 Speicherplaetze 08BE F7 RST REST30 ;im Workspace beschaffen 08BF 3680 LD (HL),80H ;Endemarkierung 08C1 EB EX DE,HL ;Startadresse in HL 08C2 D1 POP DE ;Laenge in DE 08C3 E5 PUSH HL 08C4 E5 PUSH HL 08C5 DDE1 POP IX ;Startadr. in IX 08C7 37 SCF ;laden 08C8 3EFF LD A,0FFH ;und Daten anmerken 08CA CD0208 CALL M0802 ;Laderoutine 08CD E1 POP HL ;neuer Start 08CE ED5B535C LD DE,(PROG) ;DE zeigt auf alten Start ;die neuen Zeilen werden in das alte Programm eingefuegt 08D2 7E M08D2: LD A,(HL) 08D3 E6C0 AND 0C0H ;fertig ? 08D5 2019 JR NZ,M08F0 ;ja 08D7 1A M08D7: LD A,(DE) ;Zeilennummer HIGH vergleichen 08D8 13 INC DE ;und beide Pointer + 1 08D9 BE CP (HL) 08DA 23 INC HL 08DB 2002 JR NZ,M08DF ;nicht gleich 08DD 1A LD A,(DE) ;Zeilenummer LOW vergleichen 08DE BE CP (HL) 08DF 1B M08DF: DEC DE ;beide Pointer 08E0 2B DEC HL ;wieder original 08E1 3008 JR NC,M08EB ;Platz fuer neue Zeile gefunden 08E3 E5 PUSH HL ;sonst Start der naechsten 08E4 EB EX DE,HL ;Zeile suchen 08E5 CDB819 CALL M19B8 08E8 E1 POP HL 08E9 18EC JR M08D7 ;im alten Programm weitersuchen 08EB CD2C09 M08EB: CALL M092C ;neue Zeile einfuegen 08EE 18E2 JR M08D2 ;und weitersuchen 08F0 7E M08F0: LD A,(HL) ;Variablennamen holen 08F1 4F LD C,A 08F2 FE80 CP 80H ;fertig ? 08F4 C8 RET Z ;ja 08F5 E5 PUSH HL ;aktuellen neuen Pointer retten 08F6 2A4B5C LD HL,(VARS) ;alten Pointer holen 08F9 7E M08F9: LD A,(HL) ;Variablenname und 08FA FE80 CP 80H ;-Ende pruefen 08FC 2825 JR Z,M0923 ;Ende erreicht 08FE B9 CP C ;stimmt Name ? 08FF 2808 JR Z,M0909 ;ja 0901 C5 M0901: PUSH BC ;Variablenname retten 0902 CDB819 CALL M19B8 ;naechste alte Variable suchen 0905 C1 POP BC 0906 EB EX DE,HL ;Pointer wieder richtig 0907 18F0 JR M08F9 ;und weitersuchen 0909 E6E0 M0909: AND 0E0H ;langer Variablenname ? 090B FEA0 CP 0A0H 090D 2012 JR NZ,M0921 ;nein 090F D1 POP DE ;zeigt auf 1. Buchstaben 0910 D5 PUSH DE ;des neuen Namens 0911 E5 PUSH HL 0912 23 M0912: INC HL 0913 13 INC DE 0914 1A LD A,(DE) ;den Rest des Namens 0915 BE CP (HL) ;vergleichen 0916 2006 JR NZ,M091E ;nicht gefunden 0918 17 RLA ;letztes Zeichen ? 0919 30F7 JR NC,M0912 ;nein 091B E1 POP HL ;Adresse des alten Namens 091C 1803 JR M0921 ;ersetzen 091E E1 M091E: POP HL 091F 18E0 JR M0901 ;weitersuchen 0921 3EFF M0921: LD A,0FFH ;Variable ersetzen ;A=80H Variable hinzufuegen 0923 D1 M0923: POP DE ;Adresse neu holen 0924 EB EX DE,HL ;Pointer richtig setzen 0925 3C INC A ;Zero fuer ersetzen = 1 0926 37 SCF ;Variablenbehandlung 0927 CD2C09 CALL M092C ;Variable eintragen 092A 18C4 JR M08F0 ;naechste Variable suchen ;Subroutine zum Einfuegen einer Zeile oder Variablen ;bei 'MERGE' 092C 2010 M092C: JR NZ,M093E ;hinzufuegen 092E 08 EX AF,AF' ;Flags retten 092F 225F5C LD (XPTR),HL ;'neu'-Pointer retten 0932 EB EX DE,HL 0933 CDB819 CALL M19B8 ;naechste Zeile/Variable suchen 0936 CDE819 CALL RAUS2 ;alte Zeile/Variable entfernen 0939 EB EX DE,HL ;Pointer und 093A 2A5F5C LD HL,(XPTR) 093D 08 EX AF,AF' ;Flags zurueck 093E 08 M093E: EX AF,AF' 093F D5 PUSH DE ;Zieladresse speichern 0940 CDB819 CALL M19B8 ;naechste Zeile/Variable und ;deren Laenge suchen 0943 225F5C LD (XPTR),HL ;Zeile/Variable 'neu' retten 0946 2A535C LD HL,(PROG) ;Prog zwischenspeichern 0949 E3 EX (SP),HL ;und Pointer 'neu' holen 094A C5 PUSH BC ;Laenge retten 094B 08 EX AF,AF' 094C 3807 JR C,M0955 ;wenn Variable neu 094E 2B DEC HL ;neuer Zeile vor der Zieladresse 094F CD5516 CALL MACHPL ;den Platz frei machen 0952 23 INC HL 0953 1803 JR M0958 0955 CD5516 M0955: CALL MACHPL ;Platz fuer neue Variable machen 0958 23 M0958: INC HL ;erste freie Stelle 0959 C1 POP BC ;Laenge holen 095A D1 POP DE ;PROG holen und 095B ED53535C LD (PROG),DE ;Pointer 'neu' retten 095F ED5B5F5C LD DE,(XPTR) ;neuen Pointer holen 0963 C5 PUSH BC ;Laenge und 0964 D5 PUSH DE ;Pointer 'neu' retten 0965 EB EX DE,HL ;Pointer richtig setzen zum 0966 EDB0 LDIR ;Kopieren der Zeile/Variablen 0968 E1 POP HL ;Pointer 'neu' 0969 C1 POP BC ;Laenge 096A D5 PUSH DE ;Pointer 'alt' 096B CDE819 CALL RAUS2 ;Zeile/Variable aus Workspace 096E D1 POP DE ;entfernen,Pointer 'alt' 096F C9 RET ;zurueckholen und fertig ;UP fuer SAVE 0970 E5 M0970: PUSH HL 0971 3EFD LD A,0FDH ;Kanal K oeffnen 0973 CD0116 CALL OPKAN 0976 AF XOR A ;0 = erste Meldung 0977 11A109 LD DE,KASMEL ;Adresse fuer Kassettenmeldung 097A CD0A0C CALL PRTMEL ;Ausgabe 'Start Tape' 097D FDCB02EE SET 5,(IY+2) ;merken: Bildschirm loeschen 0981 CDD415 CALL WARTA ;auf Tastendruck warten 0984 DDE5 PUSH IX ;Headeradresse retten 0986 111100 LD DE,17 ;17 Bytes Header 0989 AF XOR A ;0 = Header 098A CDC204 CALL M04C2 ;Header abspeichern 098D DDE1 POP IX ;Headeradresse 098F 0632 LD B,50 ;Verzoegerung 1 Sek. 0991 76 M0991: HALT 0992 10FD DJNZ M0991 0994 DD5E0B LD E,(IX+0BH) ;DE = Laenge des zu speichern- 0997 DD560C LD D,(IX+0CH) ;den Datenblockes 099A 3EFF LD A,0FFH ;FF = Datenblock 099C DDE1 POP IX ;Datenanfang 099E C3C204 JP M04C2 ;abspeichern ;Meldungen fuer Kassettenbetrieb 09A1 80 KASMEL: DEFB 80H 09A2 53746172 DEFM 'Start tape, then press any key' 09C0 AE M09C0: DEFB 0AEH 09C1 0D DEFB 0DH 09C2 50726F67 DEFM 'Program:' 09CA A0 DEFB 0A0H 09CB 0D DEFB 0DH 09CC 4E756D62 DEFM 'Number array:' 09D9 A0 DEFB 0A0H 09DA 0D DEFB 0DH 09DB 43686172 DEFM 'Character array:' 09EB A0 DEFB 0A0H 09EC 0D DEFB 0DH 09ED 42797465 DEFM 'Bytes:' 09F3 A0 DEFB 0A0H ;========================================== ;Ausgaberoutinen fuer Bildschirm und Drucker ;A enthaelt auszugebendes Zeichen, ein Token oder Steuerzeichen 09F4 CD030B AUSGAB: CALL POSHOL ;Printposition holen 09F7 FE20 CP ' ' ;alle druckbaren Zeichen und 09F9 D2D90A JP NC,PRTCHA ;Tokens 09FC FE06 CP 6 ;fuer 0-5 ? drucken 09FE 3869 JR C,PRTFRA 0A00 FE18 CP 18H ;desgleichen fuer 18H-1FH 0A02 3065 JR NC,PRTFRA 0A04 210B0A LD HL,CONTRO-6 ;Adr. der Control-Zeichen- 0A07 5F LD E,A ;Tabelle (6-17H ist zugelassen) 0A08 1600 LD D,0 0A0A 19 ADD HL,DE 0A0B 5E LD E,(HL) ;Offset holen 0A0C 19 ADD HL,DE ;fuer Return-Adresse addieren 0A0D E5 PUSH HL ;in Stack 0A0E C3030B JP POSHOL ;Printposition holen ;Tabelle der Offsets fuer Control-Zeichen 0A11 4E CONTRO: DEFB M0A5F-$ ;Print Komma 0A12 57 DEFB PRTFRA-$ ;Edit 0A13 10 DEFB M0A23-$ ;Cursor nach links 0A14 29 DEFB M0A3D-$ ;Cursor nach rechts 0A15 54 DEFB PRTFRA-$ ;Cursor nach unten 0A16 53 DEFB PRTFRA-$ ;Cursor nach oben 0A17 52 DEFB PRTFRA-$ ;Delete 0A18 37 DEFB M0A4F-$ ;Enter 0A19 50 DEFB PRTFRA-$ ;nicht benutzt 0A1A 4F DEFB PRTFRA-$ ;nicht benutzt 0A1B 5F DEFB M0A7A-$ ;Ink 0A1C 5E DEFB M0A7A-$ ;Paper 0A1D 5D DEFB M0A7A-$ ;Flash 0A1E 5C DEFB M0A7A-$ ;Bright 0A1F 5B DEFB M0A7A-$ ;Inverse 0A20 5A DEFB M0A7A-$ ;Over 0A21 54 DEFB M0A75-$ ;At 0A22 53 DEFB M0A75-$ ;Tab ;Cursor nach links ;B enthaelt die Zeilennummer und C die Spaltenposition ;die Zeilennummer wird von unten und die Spalte von ;rechts gezaehlt 0A23 0C M0A23: INC C 0A24 3E22 LD A,34 ;linker Rand erreicht ? 0A26 B9 CP C 0A27 2011 JR NZ,M0A3A ;nein 0A29 FDCB014E BIT 1,(IY+1) ;Printerausgabe ? 0A2D 2009 JR NZ,M0A38 ;ja 0A2F 04 INC B ;sonst Zeile 1 hoeher 0A30 0E02 LD C,2 ;Spalte = 2 0A32 3E18 LD A,24 ;Bildschirmoberkante erreicht ? 0A34 B8 CP B 0A35 2003 JR NZ,M0A3A ;nein 0A37 05 DEC B ;Zeile wie vorher 0A38 0E21 M0A38: LD C,33 ;erste Spalte 0A3A C3D90D M0A3A: JP M0DD9 ;Cursor 1 nach rechts ;BC wie oben bei Einstieg ;diese Routine entspricht im BASIC: PRINT OVER1;CHR$32; 0A3D 3A915C M0A3D: LD A,(PFLAG) ;Printerflag 0A40 F5 PUSH AF 0A41 FD365701 LD (IY+57H),1 ;PFLAG auf OVER 1 setzen 0A45 3E20 LD A,' ' 0A47 CD650B CALL M0B65 ;Leerzeichen ausgeben 0A4A F1 POP AF 0A4B 32915C LD (PFLAG),A ;Printerflag zurueck 0A4E C9 RET ;Behandlung von Carriage Return ;bei Printerausgabe wird Printerbuffer ausgegeben ;bei Display " " erst getestet, ob der ;Bildschirm nach oben gerollt (SCROLL) werden muss 0A4F FDCB014E M0A4F: BIT 1,(IY+1) ;Printer ? 0A53 C2CD0E JP NZ,M0ECD ;ja 0A56 0E21 LD C,33 ;linken Rand setzen 0A58 CD550C CALL M0C55 ;evtl. Scrolling durchfuehren 0A5B 05 DEC B ;1 Zeile nach unten 0A5C C3D90D JP M0DD9 ;'PRINT KOMMA' Subroutine ;Tabausgabe: Spalte 0 oder 16 0A5F CD030B M0A5F: CALL POSHOL ;Zeile und Spalte in BC holen 0A62 79 LD A,C 0A63 3D DEC A ;2 Spalten nach rechts 0A64 3D DEC A 0A65 E610 AND 10H ;0 oder 16 wird daraus 0A67 185A JR TABFIL ;SPACE daraus machen 0A69 3E3F PRTFRA: LD A,'?' ;nicht druckbare Zeichen 0A6B 186C JR PRTCHA ;durch ? ersetzen ;Steuerzeichen mit Operanden behandeln ;bei 2 Operanden (AT und TAB): Einstieg 0A75H ; 1 Operand (INK bis OVER): Einstieg 0A7AH ;Steuerzeichen immer in TVDATA merken, bei 2 Operanden ;den ersten in TVDATA+1 merken (Ausgabe auf 0A6DH) 0A6D 11870A ZWEIOP: LD DE,EINOP 0A70 320F5C LD (TVDATA+1),A ;erster Operand 0A73 180B JR AUSSET ;Einstieg bei AT und TAB 0A75 116D0A M0A75: LD DE,ZWEIOP 0A78 1803 JR M0A7D 0A7A 11870A M0A7A: LD DE,EINOP 0A7D 320E5C M0A7D: LD (TVDATA),A ;Steuerzeichen speichern 0A80 2A515C AUSSET: LD HL,(CURCHL) ;aktiven Ausgabekanal 0A83 73 LD (HL),E ;neu setzen 0A84 23 INC HL 0A85 72 LD (HL),D 0A86 C9 RET 0A87 11F409 EINOP: LD DE,AUSGAB ;Operanden geholt und Ausgabe 0A8A CD800A CALL AUSSET ;wieder normal 0A8D 2A0E5C LD HL,(TVDATA) ;Steuerzeichen und OP1 0A90 57 LD D,A ;letzten Operand retten 0A91 7D LD A,L ;Steuerzeichen: 0A92 FE16 CP 16H ;INK bis OVER ? 0A94 DA1122 JP C,M2211 ;ja 0A97 2029 JR NZ,PRTTAB ;bei TAB ;Behandlung von AT 0A99 44 LD B,H ;Zeilennummer (1. Oper.) 0A9A 4A LD C,D ;Spalten " 0A9B 3E1F LD A,31 ;da rueckwaerts gezaehlt wird, 0A9D 91 SUB C ;umrechnen 0A9E 380C JR C,M0AAC ;bei Bereichsueberschreitung 0AA0 C602 ADD A,2 0AA2 4F LD C,A 0AA3 FDCB014E BIT 1,(IY+1) ;Printerausgabe ? 0AA7 2016 JR NZ,M0ABF ;ja: LPRINT AT 0AA9 3E16 LD A,22 ;Zeilennummer umrechnen 0AAB 90 SUB B 0AAC DA9F1E M0AAC: JP C,M1E9F ;ERROR: INTEGER OUT OF RANGE 0AAF 3C INC A 0AB0 47 LD B,A 0AB1 04 INC B 0AB2 FDCB0246 BIT 0,(IY+2) ;unterer Teil ? 0AB6 C2550C JP NZ,M0C55 ;ja, evtl. Scrolling 0AB9 FDBE31 CP (IY+31H) ;innerhalb des Bildschirmes ? 0ABC DA860C JP C,M0C86 ;nein: OUT OF SCREEN 0ABF C3D90D M0ABF: JP M0DD9 ;restliche Parameter setzen ;TAB-Ausfuehrung 0AC2 7C PRTTAB: LD A,H ;1. Oper. 0AC3 CD030B TABFIL: CALL POSHOL ;Position holen 0AC6 81 ADD A,C ;Spalte addieren 0AC7 3D DEC A ;Spaceanzahl berechnen 0AC8 E61F AND 1FH 0ACA C8 RET Z ;falls keine Space 0ACB 57 LD D,A 0ACC FDCB01C6 SET 0,(IY+1) ;fuehrende Space unterdruecken 0AD0 3E20 PRTSPA: LD A,' ' 0AD2 CD3B0C CALL M0C3B ;ausgeben 0AD5 15 DEC D 0AD6 20F8 JR NZ,PRTSPA 0AD8 C9 RET ;druckbare Zeichen bzw. Tokens ausgeben 0AD9 CD240B PRTCHA: CALL M0B24 ;neue Zeilen- und Spaltennummer, sowie Pixel-Adresse ;in den Systemvariablen setzen 0ADC FDCB014E NEUSTO: BIT 1,(IY+1) ;Printer ? 0AE0 201A JR NZ,M0AFC ;ja 0AE2 FDCB0246 BIT 0,(IY+2) ;bei unterem Bildschirmteil 0AE6 2008 JR NZ,M0AF0 ;springen 0AE8 ED43885C LD (SPOSN),BC ;Werte des Hauptteiles speichern 0AEC 22845C LD (DFCC),HL 0AEF C9 RET 0AF0 ED438A5C M0AF0: LD (SPOSNL),BC ;Werte unterer Teil speichern 0AF4 ED43825C LD (ECHOE),BC 0AF8 22865C LD (DFCCL),HL 0AFB C9 RET 0AFC FD7145 M0AFC: LD (IY+45H),C ;Printer Buffer Pointer 0AFF 22805C LD (PRCC),HL ;neu setzen 0B02 C9 RET ;Bildschirm- oder Printerposition in BC und HL holen 0B03 FDCB014E POSHOL: BIT 1,(IY+1) ;Printer ? 0B07 2014 JR NZ,M0B1D ;ja 0B09 ED4B885C LD BC,(SPOSN) ;Hauptschirmparameter 0B0D 2A845C LD HL,(DFCC) ;laden 0B10 FDCB0246 BIT 0,(IY+2) 0B14 C8 RET Z ;Return bei Hauptbildschirm 0B15 ED4B8A5C LD BC,(SPOSNL) ;sonst untere Schirmparameter 0B19 2A865C LD HL,(DFCCL) ;laden 0B1C C9 RET 0B1D FD4E45 M0B1D: LD C,(IY+45H) ;Printerbufferwerte holen 0B20 2A805C LD HL,(PRCC) 0B23 C9 RET ;Zeichen oder Tokens ausgeben 0B24 FE80 M0B24: CP 80H ;normales Zeichen 20H...7FH ? 0B26 383D JR C,M0B65 ;ja 0B28 FE90 CP 90H 0B2A 3026 JR NC,PRTOU ;alle Tokens und Zeichen >80H 0B2C 47 LD B,A ;hier nur 80H...8FH 0B2D CD380B CALL M0B38 ;Grafikzeichen generieren 0B30 CD030B CALL POSHOL ;HL wieder holen 0B33 11925C LD DE,MEMBOT ;Calculatorspeicher 0B36 1847 JR M0B7F ;aus den Bits 0..3 wird das Grafikzeichen generiert 0B38 21925C M0B38: LD HL,MEMBOT ;Calculatorspeicher zum zwischenspeichern ;des Grafikzeichens 0B3B CD3E0B CALL M0B3E ;2 * aufrufen 0B3E CB18 M0B3E: RR B ;Bit 0 oder 2 auswerten 0B40 9F SBC A,A ;A enthaelt 0FH, falls Bit gesetzt 0B41 E60F AND 0FH ;war, sonst 00 0B43 4F LD C,A 0B44 CB18 RR B ;Bit 1 oder 3 auswerten 0B46 9F SBC A,A 0B47 E6F0 AND 0F0H ;A wird F0H oder 00 0B49 B1 OR C 0B4A 0E04 LD C,4 ;Bitmuster 4 * speichern 0B4C 77 M0B4C: LD (HL),A 0B4D 23 INC HL 0B4E 0D DEC C 0B4F 20FB JR NZ,M0B4C 0B51 C9 RET ;Token Codes und UDG 0B52 D6A5 PRTOU: SUB 0A5H 0B54 3009 JR NC,PRTTO ;wenn Token Codes 0B56 C615 ADD A,15H ;UDGs jetzt 00...0FH 0B58 C5 PUSH BC ;Position 0B59 ED4B7B5C LD BC,(UDG) ;Adresse der User Grafikzeichen 0B5D 180B JR M0B6A 0B5F CD100C PRTTO: CALL PRTTOK ;Token in Befehl umwandeln 0B62 C3030B JP POSHOL ;normales Zeichen ausgeben 0B65 C5 M0B65: PUSH BC ;Position 0B66 ED4B365C LD BC,(CHARS) ;Zeichensatzadresse -256 0B6A EB M0B6A: EX DE,HL 0B6B 213B5C LD HL,FLAGS 0B6E CB86 RES 0,(HL) ;fuehrende Space zulassen 0B70 FE20 CP ' ' 0B72 2002 JR NZ,PRTREA 0B74 CBC6 SET 0,(HL) 0B76 2600 PRTREA: LD H,0 ;Zeichen berechnen und ausgeben 0B78 6F LD L,A 0B79 29 ADD HL,HL 0B7A 29 ADD HL,HL 0B7B 29 ADD HL,HL 0B7C 09 ADD HL,BC 0B7D C1 POP BC 0B7E EB EX DE,HL ;DE --> Beginn des Zeichens ;alle 8*8 Zeichen ausgeben 0B7F 79 M0B7F: LD A,C ;Spalte 0B80 3D DEC A 0B81 3E21 LD A,33 ;erste Spalte 0B83 200E JR NZ,M0B93 0B85 05 DEC B ;neue Zeile 0B86 4F LD C,A 0B87 FDCB014E BIT 1,(IY+1) ;Printer ? 0B8B 2806 JR Z,M0B93 ;nein 0B8D D5 PUSH DE ;Startadresse 0B8E CDCD0E CALL M0ECD ;Printerbuffer ausgeben 0B91 D1 POP DE 0B92 79 LD A,C ;neue Spalte 0B93 B9 M0B93: CP C ;neue Zeile ? 0B94 D5 PUSH DE ;Zeichenadresse 0B95 CC550C CALL Z,M0C55 ;neue Zeile: evtl. Scrolling 0B98 D1 POP DE 0B99 C5 PUSH BC 0B9A E5 PUSH HL 0B9B 3A915C LD A,(PFLAG) ;Printerflag 0B9E 06FF LD B,0FFH 0BA0 1F RRA ;PFLAG Bit 0 ? 0BA1 3801 JR C,M0BA4 0BA3 04 INC B ;OVER1: B=FFH, sonst 0 0BA4 1F M0BA4: RRA ;PFLAG Bit 2 ? 0BA5 1F RRA 0BA6 9F SBC A,A 0BA7 4F LD C,A ;INVERSE1: C=FFH, sonst 0 0BA8 3E08 LD A,8 ;Pixelzaehler 0BAA A7 AND A ;Reset Carry 0BAB FDCB014E BIT 1,(IY+1) ;Printer ? 0BAF 2805 JR Z,M0BB6 ;nein 0BB1 FDCB30CE SET 1,(IY+30H) ;Printerbuffer nicht leer 0BB5 37 SCF ;Printer wird benutzt 0BB6 EB M0BB6: EX DE,HL ;Ziel- und Basisadr. tauschen ;8-fach Schleife zur Ausgabe des Zeichens 0BB7 08 M0BB7: EX AF,AF' 0BB8 1A LD A,(DE) 0BB9 A0 AND B ;OVER: 0 Zeichen wie Space 0BBA AE XOR (HL) 0BBB A9 XOR C ;INVERSE beruecksichtigen 0BBC 12 LD (DE),A 0BBD 08 EX AF,AF' 0BBE 3813 JR C,M0BD3 ;wenn Printer 0BC0 14 INC D 0BC1 23 M0BC1: INC HL 0BC2 3D DEC A 0BC3 20F2 JR NZ,M0BB7 ;noch nicht 8* 0BC5 EB EX DE,HL 0BC6 25 DEC H 0BC7 FDCB014E BIT 1,(IY+1) ;Attribut-Byte nur bei 0BCB CCDB0B CALL Z,M0BDB ;Bildschirmhandling bearbeiten 0BCE E1 POP HL 0BCF C1 POP BC 0BD0 0D DEC C ;Spalte +1 0BD1 23 INC HL ;Ziel +1 0BD2 C9 RET 0BD3 08 M0BD3: EX AF,AF' 0BD4 3E20 LD A,32 ;Offset 0BD6 83 ADD A,E 0BD7 5F LD E,A 0BD8 08 EX AF,AF' 0BD9 18E6 JR M0BC1 ;Subroutine zum Setzen der Attribute 0BDB 7C M0BDB: LD A,H ;Highteil des Zieles 0BDC 0F RRCA ;dividiert durch 8 0BDD 0F RRCA 0BDE 0F RRCA 0BDF E603 AND 3 0BE1 F658 OR 58H ;Highbyte des Attributspeichers 0BE3 67 LD H,A 0BE4 ED5B8F5C LD DE,(ATTRT) ;D = ATTRT E = MASKT 0BE8 7E LD A,(HL) ;altes Attribut 0BE9 AB XOR E 0BEA A2 AND D 0BEB AB XOR E 0BEC FDCB5776 BIT 6,(IY+57H) 0BF0 2808 JR Z,M0BFA ;bei Paper9 springen 0BF2 E6C7 AND 0C7H ;alte Farbe ausbleden 0BF4 CB57 BIT 2,A ;INK = dunkel ? 0BF6 2002 JR NZ,M0BFA ;nein 0BF8 EE38 XOR 38H ;Papercolor = weiss 0BFA FDCB5766 M0BFA: BIT 4,(IY+57H) ;INK = 9 ? 0BFE 2808 JR Z,M0C08 ;nein 0C00 E6F8 AND 0F8H ;altes INKCOLOUR wegwerfen 0C02 CB6F BIT 5,A ;bei Papercol. = weiss 0C04 2002 JR NZ,M0C08 ;INKCOL.= dunkel 0C06 EE07 XOR 7 ;sonst umgedreht 0C08 77 M0C08: LD (HL),A ;Attributwert speichern 0C09 C9 RET ;Subroutine zum ausgeben von Meldungen und Tokens ;DE enthaelt die Basisadresse der jeweiligen Tabelle ;und A die Nummer der Meldung oder des Tokens 0C0A E5 PRTMEL: PUSH HL 0C0B 2600 LD H,0 ;nachfolgende Space unterdruecken 0C0D E3 EX (SP),HL 0C0E 1804 JR M0C14 0C10 119500 PRTTOK: LD DE,095H ;Adresse Tokentabelle 0C13 F5 PUSH AF 0C14 CD410C M0C14: CALL M0C41 ;Start in der Tabelle suchen 0C17 3809 JR C,M0C22 ;ausgeben 0C19 3E20 LD A,' ' 0C1B FDCB0146 BIT 0,(IY+1) ;Leerzeichen ausgeben ? 0C1F CC3B0C CALL Z,M0C3B ;Ausgabe der Meldung oder Tokens, bis ein Zeichen mit Bit 7=1 0C22 1A M0C22: LD A,(DE) ;Zeichen aus Tabelle 0C23 E67F AND 7FH 0C25 CD3B0C CALL M0C3B ;Ausgabe 0C28 1A LD A,(DE) 0C29 13 INC DE ;Pointer+1 0C2A 87 ADD A,A ;Bit 7 ? 0C2B 30F5 JR NC,M0C22 ;nein 0C2D D1 POP DE ;D=0 Meldung, sonst ;D=0...5AH fuer Tokens 0C2E FE48 CP 48H 0C30 2803 JR Z,M0C35 ;wenn letztes Zeichen $ war 0C32 FE82 CP 82H 0C34 D8 RET C ;falls kleiner 41H war 0C35 7A M0C35: LD A,D ;bei Meldungen 'RND', 'INKEY$' 0C36 FE03 CP 3 ;und 'PI' RETURN 0C38 D8 RET C 0C39 3E20 LD A,' ' ;sonst Space ausgeben ;Ausgabe eines Zeichens in Register A und ;retten der Register BC,DE und HL 0C3B D5 M0C3B: PUSH DE 0C3C D9 EXX 0C3D D7 RST PRTOUT ;Ausgabe eines Zeichens 0C3E D9 EXX 0C3F D1 POP DE 0C40 C9 RET ;in Tabelle (=DE) den Start der Meldung oder des ;Tokens suchen 0C41 F5 M0C41: PUSH AF ;A=Nummer 0C42 EB EX DE,HL ;HL=Anfang der Tabelle 0C43 3C INC A ;fuer Suchschleife 0C44 CB7E M0C44: BIT 7,(HL) ;bei jedem gesetztem Bit 7 0C46 23 INC HL ;A dekrementieren bis 0 0C47 28FB JR Z,M0C44 0C49 3D DEC A ;A=0 Meldung gefunden 0C4A 20F8 JR NZ,M0C44 0C4C EB EX DE,HL ;DE zeigt auf Meldung 0C4D F1 POP AF ;Nummer 0C4E FE20 CP 32 ;Nummer <32 0C50 D8 RET C ;RETURN 0C51 1A LD A,(DE) ;sonst erstes Zeichen laden 0C52 D641 SUB 41H ;auf >41H pruefen 0C54 C9 RET ;Subroutine zum Testen, ob ein Scrolling notwendig ist. ;Register B enthaelt die zu testende Zeilennummer 0C55 FDCB014E M0C55: BIT 1,(IY+1) ;Printer ? 0C59 C0 RET NZ ;ja 0C5A 11D90D LD DE,M0DD9 ;Returnadresse 0C5D D5 PUSH DE 0C5E 78 LD A,B 0C5F FDCB0246 BIT 0,(IY+2) ;Test TV-Flag: Sprung, 0C63 C2020D JP NZ,M0D02 ;falls 'INPUT AT' 0C66 FDBE31 CP (IY+31H) ;Zeilennummer > als DFSZ? 0C69 381B JR C,M0C86 ;ja, ERROR 0C6B C0 RET NZ ;wenn < DFSZ ;weiter wenn =DFSZ 0C6C FDCB0266 BIT 4,(IY+2) ;automatisches Listing ? 0C70 2816 JR Z,M0C88 ;nein 0C72 FD5E2D LD E,(IY+2DH) ;Zeilenzaehler holen 0C75 1D DEC E 0C76 285A JR Z,M0CD2 ;falls =0 Scrolling 0C78 3E00 LD A,0 ;Kanal k eroeffnen 0C7A CD0116 CALL OPKAN 0C7D ED7B3F5C LD SP,(LISTSP) ;Returnadresse bei LIST 0C81 FDCB02A6 RES 4,(IY+2) ;automatisches Listen beendet 0C85 C9 RET 0C86 CF M0C86: RST ERRAUS ;Meldung 'OUT OF SCREEN' 0C87 04 DEFB 4 0C88 FD3552 M0C88: DEC (IY+52H) ;Scroll-Zaehler-1 0C8B 2045 JR NZ,M0CD2 ;zumm direkten Scrolling ;Ausgabe der Meldung 'SCROLL ?' 0C8D 3E18 LD A,24 0C8F 90 SUB B ;Scroll-Zaehler 0C90 328C5C LD (SCRCT),A ;zuruecksetzen 0C93 2A8F5C LD HL,(ATTRT) ;ATTRT und MASKT retten 0C96 E5 PUSH HL 0C97 3A915C LD A,(PFLAG) ;PFLAG retten 0C9A F5 PUSH AF 0C9B 3EFD LD A,0FDH ;Kanal k oeffnen 0C9D CD0116 CALL OPKAN 0CA0 AF XOR A ;A=0=erste Meldung 0CA1 11F80C LD DE,SCROLL 0CA4 CD0A0C CALL PRTMEL ;laden und Ausgabe 0CA7 FDCB02EE SET 5,(IY+2) ;merke: unt. Teil nach Tasten- ;druck loeschen 0CAB 213B5C LD HL,FLAGS 0CAE CBDE SET 3,(HL) ;L-Modus 0CB0 CBAE RES 5,(HL) ;'keine Taste bisher' anmerken 0CB2 D9 EXX 0CB3 CDD415 CALL WARTA ;1 Zeichen holen 0CB6 D9 EXX 0CB7 FE20 CP 20H ;falls Tastendruck 'BREAK' 0CB9 2845 JR Z,M0D00 ;'STOP', 'N' oder 'n' war 0CBB FEE2 CP 0E2H ;Meldung 'BREAK - CONT repeats' 0CBD 2841 JR Z,M0D00 ;ausgeben 0CBF F620 OR 20H 0CC1 FE6E CP 6EH 0CC3 283B JR Z,M0D00 0CC5 3EFE LD A,0FEH ;sonst Kanal 'S' eroeffnen 0CC7 CD0116 CALL OPKAN 0CCA F1 POP AF 0CCB 32915C LD (PFLAG),A 0CCE E1 POP HL 0CCF 228F5C LD (ATTRT),HL ;Bildschirm rollen und Parameter neu setzen 0CD2 CDFE0D M0CD2: CALL M0DFE ;ganzen Bildschirm rollen 0CD5 FD4631 LD B,(IY+31H) 0CD8 04 INC B ;Zeilennummer oberer Teil neu 0CD9 0E21 LD C,21H ;erste Spalte 0CDB C5 PUSH BC 0CDC CD9B0E CALL M0E9B ;fuer diesen Teil entsprechendes 0CDF 7C LD A,H ;Attribute suchen 0CE0 0F RRCA 0CE1 0F RRCA 0CE2 0F RRCA 0CE3 E603 AND 3 0CE5 F658 OR 58H 0CE7 67 LD H,A 0CE8 11E05A LD DE,5AE0H ;Zeiger auf erstes Attribut der ;untersten Zeile 0CEB 1A LD A,(DE) 0CEC 4E LD C,(HL) 0CED 0620 LD B,32 ;32 * tauschen 0CEF EB EX DE,HL 0CF0 12 M0CF0: LD (DE),A 0CF1 71 LD (HL),C 0CF2 13 INC DE 0CF3 23 INC HL 0CF4 10FA DJNZ M0CF0 0CF6 C1 POP BC ;Zeilen/Spalennummer der untersten Zeile 0CF7 C9 RET ;Meldung 'SCROLL?' 0CF8 80 SCROLL: DEFB 80H 0CF9 7363726F DEFM 'scroll' 0CFF BF DEFB '?'+80H 0D00 CF M0D00: RST ERRAUS ;Meldung: 0D01 0C DEFB 0CH ;'BREAK - CONT repeats' ;unteren Bildschirm behandeln 0D02 FE02 M0D02: CP 2 ;unterer Teil zu gross ? 0D04 3880 JR C,M0C86 ;ERROR 0D06 FD8631 ADD A,(IY+31H) 0D09 D619 SUB 19H ;Scrolling notwendig ? 0D0B D0 RET NC ;nein 0D0C ED44 NEG ;A=Anzahl der Scrolls 0D0E C5 PUSH BC ;Zeile/Spalte 0D0F 47 LD B,A 0D10 2A8F5C LD HL,(ATTRT) ;ATTRT, MASKT und 0D13 E5 PUSH HL 0D14 2A915C LD HL,(PFLAG) ;PFLAG retten 0D17 E5 PUSH HL 0D18 CD4D0D CALL AKTCOL 0D1B 78 LD A,B ;Scrollingzahl in A 0D1C F5 M0D1C: PUSH AF 0D1D 216B5C LD HL,DFSZ ;Zeilenanzahl+1 im unteren Bildschirmteil 0D20 46 LD B,(HL) 0D21 78 LD A,B 0D22 3C INC A ;DFSZ + 1 0D23 77 LD (HL),A 0D24 21895C LD HL,SPOSN+1 ;Zeile/Spalte fuer Print 0D27 BE CP (HL) ;unteren Teil scrollen ? 0D28 3803 JR C,M0D2D ;ja 0D2A 34 INC (HL) ;SPOSN-High +1 0D2B 0618 LD B,18H ;ganzen Bildschirm scrollen 0D2D CD000E M0D2D: CALL M0E00 ;B Zeilen scrollen 0D30 F1 POP AF ;Scrollzaehler 0D31 3D DEC A 0D32 20E8 JR NZ,M0D1C ;nochmal 0D34 E1 POP HL 0D35 FD7557 LD (IY+57H),L ;PFLAG 0D38 E1 POP HL 0D39 228F5C LD (ATTRT),HL ;ATTRT und MASKT 0D3C ED4B885C LD BC,(SPOSN) 0D40 FDCB0286 RES 0,(IY+2) 0D44 CDD90D CALL M0DD9 ;DFCC neu berechnen 0D47 FDCB02C6 SET 0,(IY+2) ;Behandlung unterer Teil 0D4B C1 POP BC ;Zeile/Spalte 0D4C C9 RET ;Subroutine holt die aktuellen Farben in die ;'transparenten' Variablen ATTRT und MASKT 0D4D AF AKTCOL: XOR A 0D4E 2A8D5C LD HL,(ATTRP) ;aktuelle ATTRP und MASKP 0D51 FDCB0246 BIT 0,(IY+2) 0D55 2804 JR Z,M0D5B ;oberer Bildschirmteil 0D57 67 LD H,A ;A und 0D58 FD6E0E LD L,(IY+0EH) ;BORDCR benutzen fuer 0D5B 228F5C M0D5B: LD (ATTRT),HL ;ATTRT und MASKT ;PFLAG neu setzen (fuer unteren Teil A=0) 0D5E 21915C LD HL,PFLAG 0D61 2002 JR NZ,M0D65 ;Sprung bei unteren Teil 0D63 7E LD A,(HL) ;oberer Teil: alten Wert holen 0D64 0F RRCA ;ungerade Bits (7,5,...) 0D65 AE M0D65: XOR (HL) ;in die geraden kopieren 0D66 E655 AND 55H ;loeschen der geraden Bits 0D68 AE XOR (HL) ;bei unteren Bildschirm 0D69 77 LD (HL),A 0D6A C9 RET ;'CLS'-Befehl 0D6B CDAF0D M0D6B: CALL M0DAF ;ganzen Bildschirm loeschen 0D6E 213C5C M0D6E: LD HL,TVFLAG ;unteren Teil nach Tastendruck 0D71 CBAE RES 5,(HL) ;nicht loeschen 0D73 CBC6 SET 0,(HL) ;unteren Teil setzen 0D75 CD4D0D CALL AKTCOL ;BORDCR nach ATTRT kopieren 0D78 FD4631 LD B,(IY+31H) ;laden DFSZ und unteren Teil 0D7B CD440E CALL M0E44 ;des Bildschirmes loeschen 0D7E 21C05A LD HL,5AC0H ;Adresse Attribut der Zeile 22 0D81 3A8D5C LD A,(ATTRP) ;ATTRP als Atribut fuer 0D84 05 DEC B ;unteren Teil 0D85 1807 JR M0D8E ;in die Schleife 0D87 0E20 M0D87: LD C,32 ;32 Zeichen pro Zeile 0D89 2B M0D89: DEC HL 0D8A 77 LD (HL),A ;Werte setzen 0D8B 0D DEC C 0D8C 20FB JR NZ,M0D89 0D8E 10F7 M0D8E: DJNZ M0D87 0D90 FD363102 LD (IY+31H),2 ;2 Zeilen als unteren Teil setzen 0D94 3EFD M0D94: LD A,0FDH ;Kanal K oeffnen 0D96 CD0116 CALL OPKAN 0D99 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse 0D9C 11F409 LD DE,AUSGAB ;Ausgabeadresse 0D9F A7 AND A 0DA0 73 M0DA0: LD (HL),E 0DA1 23 INC HL 0DA2 72 LD (HL),D 0DA3 23 INC HL 0DA4 11A810 LD DE,TASTIN ;Eingabeadresse 0DA7 3F CCF 0DA8 38F6 JR C,M0DA0 0DAA 012117 LD BC,1721H ;Zeile/Spalte der ersten unteren Zeile 0DAD 182A JR M0DD9 ;Bildschirm loeschen 0DAF 210000 M0DAF: LD HL,0 ;'COORDS' loeschen 0DB2 227D5C LD (COORDS),HL ;Koordinaten des letzten Plot 0DB5 FDCB3086 RES 0,(IY+30H) ;FLAGS2: Bildschirm geloescht 0DB9 CD940D CALL M0D94 ;Ein/Ausgabeadresse und Kanal K ;original setzen 0DBC 3EFE LD A,0FEH ;Kanal S oeffnen 0DBE CD0116 CALL OPKAN 0DC1 CD4D0D CALL AKTCOL ;permanente Werte benutzen 0DC4 0618 LD B,24 ;24 Zeilen des Bildschirmes loeschen 0DC6 CD440E CALL M0E44 0DC9 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse 0DCC 11F409 LD DE,AUSGAB 0DCF 73 LD (HL),E 0DD0 23 INC HL 0DD1 72 LD (HL),D 0DD2 FD365201 LD (IY+52H),1 ;Scrollzaehler Reset 0DD6 012118 LD BC,1821H ;erste Zeile, erste Spalte ;Printposition auf Bildschirm setzen ;Einsprung mit Zeilen-/Spaltennummer in BC oder, falls ;Printer angesprochen, Spaltenposition in C fuer Printer 0DD9 21005B M0DD9: LD HL,PTRBUF ;Druckerpuffer 0DDC FDCB014E BIT 1,(IY+1) ;Printer ? 0DE0 2012 JR NZ,M0DF4 ;ja 0DE2 78 LD A,B ;Zeile 0DE3 FDCB0246 BIT 0,(IY+2) ;Hauptbildschirmteil ? 0DE7 2805 JR Z,M0DEE ;ja 0DE9 FD8631 ADD A,(IY+31H) ;+ DFSZ 0DEC D618 SUB 24 ;- 24 weil von unten gezaehlt wird 0DEE C5 M0DEE: PUSH BC 0DEF 47 LD B,A 0DF0 CD9B0E CALL M0E9B ;Adresse der Zeile berechnen 0DF3 C1 POP BC 0DF4 3E21 M0DF4: LD A,33 0DF6 91 SUB C ;Spaltenzahl umrechnen 0DF7 5F LD E,A 0DF8 1600 LD D,0 0DFA 19 ADD HL,DE 0DFB C3DC0A JP NEUSTO ;Subroutine zum Rollen (Scrolling) des Bildschirmes ;B = Anzahl der gerollten Zeilen 0DFE 0617 M0DFE: LD B,23 ;Einstieg nach 'SCROLL ?' 0E00 CD9B0E M0E00: CALL M0E9B ;Startadresse der Zeile suchen 0E03 0E08 LD C,8 ;8 Pixel-Zeilen 0E05 C5 M0E05: PUSH BC ;Zeilen/Pixelzaehler 0E06 E5 PUSH HL ;Startadresse 0E07 78 LD A,B 0E08 E607 AND 7 ;oberste Zeile eines Bildschirmdrittels ? 0E0A 78 LD A,B 0E0B 200C JR NZ,M0E19 ;nein 0E0D EB M0E0D: EX DE,HL 0E0E 21E0F8 LD HL,0F8E0H 0E11 19 ADD HL,DE ;Adresse berechnen 0E12 EB EX DE,HL 0E13 012000 LD BC,32 ;32 Zeichen 0E16 3D DEC A 0E17 EDB0 LDIR ;Pixel-Zeilen innerhalb der Bildschirmdrittel scrollen 0E19 EB M0E19: EX DE,HL 0E1A 21E0FF LD HL,0FFE0H 0E1D 19 ADD HL,DE ;Adresse berechnen 0E1E EB EX DE,HL 0E1F 47 LD B,A ;Zeilennummer 0E20 E607 AND 7 ;Anzahl, der in diesem Bilddrittel 0E22 0F RRCA ;vorhandenen Zeichen berechnen 0E23 0F RRCA 0E24 0F RRCA 0E25 4F LD C,A ;in C 0E26 78 LD A,B ;Zeilennummer 0E27 0600 LD B,0 ;BC = Anzahl 'ALLE ZEICHEN' 0E29 EDB0 LDIR 0E2B 0607 LD B,7 0E2D 09 ADD HL,BC ;HL+700H fuer naechstes Drittel 0E2E E6F8 AND 0F8H ;naechstes Drittel bearbeiten ? 0E30 20DB JR NZ,M0E0D ;ja ;die obige Routine muss 8 mal, fuer jede Pixelzeile einmal, ;durchlaufen werden 0E32 E1 POP HL ;Startadresse 0E33 24 INC H ;+1 fuer naechste Pixelzeile 0E34 C1 POP BC ;Pixelzaehler 0E35 0D DEC C 0E36 20CD JR NZ,M0E05 ;noch nicht 8* ;die Attribute muessen auch noch gescrollt werden 0E38 CD880E CALL M0E88 ;Attributadresse berechnen 0E3B 21E0FF LD HL,0FFE0H ;Differenz von 32 fuer Attribute 0E3E 19 ADD HL,DE ;von DE abziehen 0E3F EB EX DE,HL 0E40 EDB0 LDIR ;Attribute verschieben 0E42 0601 LD B,1 ;unterste Zeile loeschen ;diese Routine loescht B Zeilen von unten 0E44 C5 M0E44: PUSH BC ;Zeilennummer 0E45 CD9B0E CALL M0E9B ;Adresse in HL berechnen 0E48 0E08 LD C,8 ;8 Pixelzeilen 0E4A C5 M0E4A: PUSH BC ;Zeilennummer, Pixelzaehler 0E4B E5 PUSH HL ;Startadresse 0E4C 78 LD A,B ;Zeilenzahl 0E4D E607 M0E4D: AND 7 0E4F 0F RRCA ;Zeilenzahl berechnen und in 0E50 0F RRCA 0E51 0F RRCA 0E52 4F LD C,A ;C 0E53 78 LD A,B 0E54 0600 LD B,0 0E56 0D DEC C ;Zeichenzahl - 1 0E57 54 LD D,H 0E58 5D LD E,L 0E59 3600 LD (HL),0 ;ein Pixel loeschen 0E5B 13 INC DE 0E5C EDB0 LDIR ;weiter loeschen 0E5E 110107 LD DE,701H ;fuer Pixelreihe im naechsten 0E61 19 ADD HL,DE ;Drittel 0E62 3D DEC A ;Zeilenzahl - 1 0E63 E6F8 AND 0F8H ;nur den Drittelzaehler 0E65 47 LD B,A ;in B bringen 0E66 20E5 JR NZ,M0E4D ;weitere Drittel bearbeiten ;pruefen ob 8* die Routine durchlaufen wurde 0E68 E1 POP HL ;Startadresse 0E69 24 INC H 0E6A C1 POP BC ;Zeilen/Pixelzaehler 0E6B 0D DEC C ;Pixel - 1 0E6C 20DC JR NZ,M0E4A ;noch nicht 8* 0E6E CD880E CALL M0E88 ;Adresse und Zahl der Attribut- ;bytes suchen 0E71 62 LD H,D 0E72 6B LD L,E 0E73 13 INC DE 0E74 3A8D5C LD A,(ATTRP) ;ATTRP fuer Hauptteil benutzen 0E77 FDCB0246 BIT 0,(IY+2) ;TVFLAG: Hauptteil Bildschirm ? 0E7B 2803 JR Z,M0E80 ;ja 0E7D 3A485C LD A,(BORDCR) ;sonst Bordercolor benutzen 0E80 77 M0E80: LD (HL),A ;erstes setzen 0E81 0B DEC BC 0E82 EDB0 LDIR ;Rest setzen 0E84 C1 POP BC 0E85 0E21 LD C,33 ;Spaltenzahl auf erste setzen 0E87 C9 RET ;Berechne zu einer Bildschirmstelle die Adresse ;der Attribut-Informationen 0E88 7C M0E88: LD A,H ;hoeheres Byte laden 0E89 0F RRCA ;* 32 0E8A 0F RRCA 0E8B 0F RRCA 0E8C 3D DEC A ;- 1 0E8D F650 OR 50H ;Basisadresse der Attributinform. 0E8F 67 LD H,A ;hoeheres Byte berechnet 0E90 EB EX DE,HL ;Low-Byte bleibt 0E91 61 LD H,C ;C ist immer 0 0E92 68 LD L,B ;Zeilennummer 0E93 29 ADD HL,HL ;* 32 0E94 29 ADD HL,HL 0E95 29 ADD HL,HL 0E96 29 ADD HL,HL 0E97 29 ADD HL,HL 0E98 44 LD B,H ;in BC 0E99 4D LD C,L 0E9A C9 RET ;bilde Speicheradresse einer Punktreihe des Schirmes in HL 0E9B 3E18 M0E9B: LD A,18H 0E9D 90 SUB B ;Zeile wird von unten gezaehlt 0E9E 57 LD D,A ;* 32 0E9F 0F RRCA 0EA0 0F RRCA 0EA1 0F RRCA 0EA2 E6E0 AND 0E0H ;nur 3 Bits gueltig 0EA4 6F LD L,A 0EA5 7A LD A,D 0EA6 E618 AND 18H 0EA8 F640 OR BILD/256 ;Startadresse des Bildschirmes 0EAA 67 LD H,A 0EAB C9 RET ;COPY SCREEN 0EAC F3 M0EAC: DI 0EAD 06B0 LD B,0B0H ;176 (22*8) Druckzeilen ;zu je einer Nadel 0EAF 210040 LD HL,BILD ;Video - RAM 0EB2 E5 NXLINE: PUSH HL 0EB3 C5 PUSH BC 0EB4 CDF40E CALL PRLINE ;eine Nadelzeile ausgeben 0EB7 C1 POP BC 0EB8 E1 POP HL 0EB9 24 INC H ;256 Bytes weiter: naechste Zeile 0EBA 7C LD A,H 0EBB E607 AND 7 0EBD 200A JR NZ,NXLIN1 ;noch innerhalb einer Zeile 0EBF 7D LD A,L 0EC0 C620 ADD A,32 ;32 Bytes weiter: naechste Zeile 0EC2 6F LD L,A 0EC3 3F CCF ;L uebergelaufen ? 0EC4 9F SBC A,A ;bei Ueberl. FFH sonst 0 0EC5 E6F8 AND 0F8H ;Bit 0..3 zaehlen Nadelzeilen 0EC7 84 ADD A,H ;F8H addieren wenn L=0 0EC8 67 LD H,A 0EC9 10E7 NXLIN1: DJNZ NXLINE 0ECB 180D JR M0EDA ;Ende COPY ; Printerbuffer 5B00H...5BFFH ausdrucken 0ECD F3 M0ECD: DI 0ECE 21005B LD HL,PTRBUF ;Druckerpuffer 0ED1 0608 LD B,8 ;8 Nadeln 0ED3 C5 M0ED3: PUSH BC 0ED4 CDF40E CALL PRLINE 0ED7 C1 POP BC 0ED8 10F9 DJNZ M0ED3 0EDA 3E04 M0EDA: LD A,4 ;Abschaltbit fuer Drucker 0EDC D3FB OUT (0FBH),A ;ausgeben 0EDE FB EI 0EDF 21005B M0EDF: LD HL,PTRBUF ;Druckerpuffer 0EE2 FD7546 LD (IY+46H),L ;ganzen Printerbuffer loeschen 0EE5 AF XOR A 0EE6 47 LD B,A 0EE7 77 CLRPRB: LD (HL),A 0EE8 23 INC HL 0EE9 10FC DJNZ CLRPRB ;255 Nullen 0EEB FDCB308E RES 1,(IY+30H) ;FLAGS2: Printerbuffer leer 0EEF 0E21 LD C,33 0EF1 C3D90D JP M0DD9 ;Ausgabe einer Druckerzeile (32 Bytes Nadelgrafik) 0EF4 78 PRLINE: LD A,B ;Anzahl der noch zu druckenden 0EF5 FE03 CP 3 ;Nadelreihen 0EF7 9F SBC A,A 0EF8 E602 AND 2 ;wenn nur noch 2 Zeilen 0EFA D3FB OUT (0FBH),A ;Printermotor bremsen 0EFC 57 LD D,A 0EFD CD541F M0EFD: CALL M1F54 ;Stoptaste ? 0F00 380A JR C,M0F0C 0F02 3E04 LD A,4 ;Abschaltbit fuer Printer 0F04 D3FB OUT (0FBH),A 0F06 FB EI 0F07 CDDF0E CALL M0EDF ;Clear Printerbuffer 0F0A CF RST ERRAUS ;Meldung: 0F0B 0C DEFB 0CH ;'BREAK - CONT REPEATS' 0F0C DBFB M0F0C: IN A,(0FBH) ;Druckerstatus 0F0E 87 ADD A,A ;Bit 6 muss 0 sein, sonst 0F0F F8 RET M ;kein Drucker da 0F10 30EB JR NC,M0EFD ;warten wenn Bit 7 0 war ;alles zur Ausgabe bereit 0F12 0E20 LD C,32 ;32 Bytes 0F14 5E PRTBYT: LD E,(HL) ;auszugebendes Byte 0F15 23 INC HL 0F16 0608 LD B,8 0F18 CB12 PRTBIT: RL D ;Bit 7 von Port FBH = Nadel 0F1A CB13 RL E ;E bitweise ausgeben 0F1C CB1A RR D 0F1E DBFB M0F1E: IN A,(0FBH) 0F20 1F RRA ;Bit 0 = Drucker Ready 0F21 30FB JR NC,M0F1E 0F23 7A LD A,D 0F24 D3FB OUT (0FBH),A ;OUT Nadel 0F26 10F0 DJNZ PRTBIT 0F28 0D DEC C ;naechstes Byte 0F29 20E9 JR NZ,PRTBYT 0F2B C9 RET ;================================================== ;Editieren einer Bildschirmzeile ;Aufruf durch Hauptroutine zum eingeben einer Basiczeile ;oder bei einem Inputbefehl in einem Programm 0F2C 2A3D5C M0F2C: LD HL,(ERRSP) ;Errorstackpointer retten 0F2F E5 PUSH HL 0F30 217F10 M0F30: LD HL,M107F ;Return fuer Editorerror 0F33 E5 PUSH HL 0F34 ED733D5C LD (ERRSP),SP ;Errorstackpointer setzen 0F38 CDD415 M0F38: CALL WARTA ;ein Zeichen von Tastatur 0F3B F5 PUSH AF 0F3C 1600 LD D,0 0F3E FD5EFF LD E,(IY-1) ;Tastenklick 0F41 21C800 LD HL,0C8H ;Tonhoehe 0F44 CDB503 CALL PIEPEN 0F47 F1 POP AF ;Zeichen 0F48 21380F LD HL,M0F38 ;als RETURN 0F4B E5 PUSH HL 0F4C FE18 CP 18H ;alle Zeichen, Tokens und 0F4E 3031 JR NC,M0F81 ;Grafikzeichen uebernehmen 0F50 FE07 CP 7 ;Komma ebenfalls 0F52 382D JR C,M0F81 0F54 FE10 CP 10H ;Editorzeichen ? 0F56 383A JR C,M0F92 ;ja ;Steuerzeichen 'INK' bis 'TAB' 0F58 010200 LD BC,2 ;2 Plaetze bei 'INK' und 'PAPER' 0F5B 57 LD D,A 0F5C FE16 CP 16H ;'INK' und 'PAPER' ? 0F5E 380C JR C,M0F6C ;ja 0F60 03 INC BC ;fuer 'AT' und 'TAB' 3 Plaetze 0F61 FDCB377E BIT 7,(IY+37H) ;'INPUT LINE' ? 0F65 CA1E10 JP Z,M101E ;nein 0F68 CDD415 CALL WARTA ;naechstes Zeichen 0F6B 5F LD E,A ;in E 0F6C CDD415 M0F6C: CALL WARTA ;naechstes Zeichen fuer Steuercodes 0F6F D5 PUSH DE 0F70 2A5B5C LD HL,(KCUR) ;Kursoradresse 0F73 FDCB0786 RES 0,(IY+7) ;'K' - Modus 0F77 CD5516 CALL MACHPL ;2 oder 3 Plaetze besorgen 0F7A C1 POP BC ;Steuercodes 0F7B 23 INC HL 0F7C 70 LD (HL),B ;speichern 0F7D 23 INC HL ;bei 'INK' und 'PAPER' 0F7E 71 LD (HL),C ;wird der Zweite wieder ueberschrieben 0F7F 180A JR M0F8B ;Routine fuegt ein Zeichen zu einer Editor- oder ;Inputzeile hinzu 0F81 FDCB0786 M0F81: RES 0,(IY+7) ;K-Modus 0F85 2A5B5C LD HL,(KCUR) ;Kursoradresse 0F88 CD5216 CALL NUREIN ;1 Speicherplatz besorgen 0F8B 12 M0F8B: LD (DE),A 0F8C 13 INC DE ;Kursor + 1 0F8D ED535B5C LD (KCUR),DE ;Kursoradresse 0F91 C9 RET ;Editiersteuerzeichen behandeln 0F92 5F M0F92: LD E,A 0F93 1600 LD D,0 ;Code in DE 0F95 21990F LD HL,M0FA0-7 ;Adresse Editorzeichen 0F98 19 ADD HL,DE ;Adresse Zeichen 0F99 5E LD E,(HL) ;Offset holen 0F9A 19 ADD HL,DE ;Routineadresse 0F9B E5 PUSH HL 0F9C 2A5B5C LD HL,(KCUR) ;Kursoradresse 0F9F C9 RET ;in die Routine ;Offset der Editorsteuerzeichen 0FA0 09 M0FA0: DEFB M0FA9-$ ;EDIT 0FA1 66 DEFB M1007-$ ;CURSOR LINKS 0FA2 6A DEFB M100C-$ ;CURSOR RECHTS 0FA3 50 DEFB M0FF3-$ ;CURSOR DOWN 0FA4 B5 DEFB M1059-$ ;CURSOR UP 0FA5 70 DEFB M1015-$ ;DELETE 0FA6 7E DEFB M1024-$ ;ENTER 0FA7 CF DEFB M1076-$ ;SYMBOL SHIFT 0FA8 D4 DEFB M107C-$ ;GRAPHICS 0FA9 2A495C M0FA9: LD HL,(EPPC) ;Zeilennummer 0FAC FDCB376E BIT 5,(IY+37H) ;'INPUT MODUS' ? 0FB0 C29710 JP NZ,M1097 ;ja 0FB3 CD6E19 CALL M196E ;Startadresse der Zeile suchen 0FB6 CD9516 CALL ZSUCHE ;Zeilennummer dazu 0FB9 7A LD A,D ;Zeilennummer = 0 ? 0FBA B3 OR E 0FBB CA9710 JP Z,M1097 ;nur Editorbereich loeschen 0FBE E5 PUSH HL ;Adresse Zeile 0FBF 23 INC HL 0FC0 4E LD C,(HL) ;Laenge Zeile 0FC1 23 INC HL 0FC2 46 LD B,(HL) 0FC3 210A00 LD HL,10 0FC6 09 ADD HL,BC ;10 + Laenge 0FC7 44 LD B,H 0FC8 4D LD C,L 0FC9 CD051F CALL M1F05 ;Speicherplatztest 0FCC CD9710 CALL M1097 ;Editorbereich loeschen 0FCF 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse 0FD2 E3 EX (SP),HL 0FD3 E5 PUSH HL 0FD4 3EFF LD A,0FFH ;Kanal R oeffnen, um die Zeile 0FD6 CD0116 CALL OPKAN ;in den Editorbereich zu kopieren 0FD9 E1 POP HL ;Startadresse Zeile 0FDA 2B DEC HL 0FDB FD350F DEC (IY+0FH) ;Zeilennummer-1 0FDE CD5518 CALL M1855 ;Basiczeile listen 0FE1 FD340F INC (IY+0FH) ;Zeilennummer+1 0FE4 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 0FE7 23 INC HL ;Zeilennummer und Laenge uebergehen 0FE8 23 INC HL 0FE9 23 INC HL 0FEA 23 INC HL 0FEB 225B5C LD (KCUR),HL ;Kursoradresse 0FEE E1 POP HL ;vorherige Kanaladresse 0FEF CD1516 CALL M1615 ;holen und Flags setzen 0FF2 C9 RET ;zur Editorschleife ;Cursor-Down-Routine 0FF3 FDCB376E M0FF3: BIT 5,(IY+37H) ;INPUT MODUS ? 0FF7 2008 JR NZ,M1001 ;ja 0FF9 21495C LD HL,EPPC ;aktuelle Editorzeile 0FFC CD0F19 CALL M190F ;naechste Zeilennummer suchen 0FFF 186D JR M106E ;Listing ausgeben 1001 FD360010 M1001: LD (IY+0),16 ;ERRNR: Stop in Input 1005 181D JR M1024 ;Cursor eins nach links 1007 CD3110 M1007: CALL M1031 ;Cursor bewegen 100A 1805 JR SETKCU ;und KCUR setzen ;Cursor eins nach rechts 100C 7E M100C: LD A,(HL) ;aktuelles Zeichen=0DH ? 100D FE0D CP 0DH 100F C8 RET Z ;ja 1010 23 INC HL ;Kursor auf naechstes Zeichen 1011 225B5C SETKCU: LD (KCUR),HL ;Kursoradresse 1014 C9 RET ;loeschen eines Zeichens beim Editieren 1015 CD3110 M1015: CALL M1031 ;Cursor nach links 1018 010100 LD BC,1 ;1 Zeichen entfernen 101B C3E819 JP RAUS2 101E CDD415 M101E: CALL WARTA ;2 Zeichen von der 1021 CDD415 CALL WARTA ;Tastatur wegwerfen 1024 E1 M1024: POP HL ;Aufruf von Editor und 1025 E1 POP HL ;Editor-Error wegwerfen 1026 E1 M1026: POP HL ;alter Wert von ERRSP 1027 223D5C LD (ERRSP),HL ;Errorstackpointer 102A FDCB007E BIT 7,(IY+0) ;Fehler ? 102E C0 RET NZ ;nein 102F F9 LD SP,HL ;Sprung in Errorroutine 1030 C9 RET ;Cursor nach links bis maximal an den Anfang der Zeile ;bewegen. HL zeigt auf Cursorposition. 1031 37 M1031: SCF ;DE auf ELINE (editieren) oder 1032 CD9511 CALL EDDE ;auf WORKSP (INPUT) setzen 1035 ED52 SBC HL,DE ;CARRY =1, wenn Cursor am 1037 19 ADD HL,DE ;Anfang der Zeile 1038 23 INC HL 1039 C1 POP BC ;eine Returnadresse wegwerfen 103A D8 RET C ;RET in Editorschleife, wenn ;Cursor am Zeilenanfang 103B C5 PUSH BC 103C 44 LD B,H ;Cursoradresse in BC 103D 4D LD C,L 103E 62 M103E: LD H,D ;Zeichenadresse nach HL 103F 6B LD L,E 1040 23 INC HL 1041 1A LD A,(DE) ;Zeichen 1042 E6F0 AND 0F0H ;>0F0H 1044 FE10 CP 10H ;und <20H ? 1046 2009 JR NZ,M1051 ;nein 1048 23 INC HL ;Parameter+1 1049 1A LD A,(DE) 104A D617 SUB 17H 104C CE00 ADC A,0 ;16H und 17H wird 0 104E 2001 JR NZ,M1051 1050 23 INC HL 1051 A7 M1051: AND A 1052 ED42 SBC HL,BC 1054 09 ADD HL,BC ;HL wie vorher 1055 EB EX DE,HL 1056 38E6 JR C,M103E 1058 C9 RET ;Cursor eins nach oben bewegen 1059 FDCB376E M1059: BIT 5,(IY+37H) ;FLAGX: INPUT MODUS ? 105D C0 RET NZ ;ja 105E 2A495C LD HL,(EPPC) ;aktuelle Editorzeile 1061 CD6E19 CALL M196E ;Startadresse holen 1064 EB EX DE,HL ;HL eine Zeile davor 1065 CD9516 CALL ZSUCHE ;Zeilennummer holen 1068 214A5C LD HL,EPPC+1 106B CD1C19 CALL M191C ;Zeilennummer speichern 106E CD9517 M106E: CALL LISTAU ;ein Listing ausgeben 1071 3E00 LD A,0 ;Kanal K wieder eroeffnen 1073 C30116 JP OPKAN 1076 FDCB377E M1076: BIT 7,(IY+37H) ;FLAGX 107A 28A8 JR Z,M1024 ;bei 'INPUT LINE' nicht springen 107C C3810F M107C: JP M0F81 ;Einstieg, wenn ein Fehler beim Editieren auftrat 107F FDCB3066 M107F: BIT 4,(IY+48) ;Kanal K ? 1083 28A1 JR Z,M1026 ;nein 1085 FD3600FF LD (IY+0),0FFH ;Fehlernummer loeschen 1089 1600 LD D,0 108B FD5EFE LD E,(IY-2) ;ein Piepser als 108E 21901A LD HL,1A90H 1091 CDB503 CALL PIEPEN ;Warnung ausgeben 1094 C3300F JP M0F30 ;in Editor ;Editorbereich oder Workspace loeschen 1097 E5 M1097: PUSH HL ;Pointer auf freien Platz 1098 CD9011 CALL EDHLDE ;DE auf erstes und HL auf 109B 2B DEC HL ;letztes Zeichen setzen 109C CDE519 CALL RAUS1 ;Speicher freigeben 109F 225B5C LD (KCUR),HL ;Kursoradresse 10A2 FD360700 LD (IY+7),0 ;Modus 'K' 10A6 E1 POP HL 10A7 C9 RET ;diese Routine holt die letzte gedrueckte Taste und ;wertet 'CAPS LOCK', Modusaenderungen und Colorparameter ;direkt aus 10A8 FDCB025E TASTIN: BIT 3,(IY+2) ;Moduswechsel ? 10AC C41D11 CALL NZ,M111D ;ja, Editorzeile anzeigen 10AF A7 AND A 10B0 FDCB016E BIT 5,(IY+1) ;CARRY und ZERO = 0 wenn, 10B4 C8 RET Z ;keine Taste gedrueckt 10B5 3A085C LD A,(LASTK) ;Tastencode 10B8 FDCB01AE RES 5,(IY+1) ;abgeholt 10BC F5 PUSH AF 10BD FDCB026E BIT 5,(IY+2) ;unteren Bildschirm loeschen ? 10C1 C46E0D CALL NZ,M0D6E ;ja 10C4 F1 POP AF 10C5 FE20 CP ' ' ;alle ASCII-Zeichen und Tokens 10C7 3052 JR NC,M111B ;uebernehmen 10C9 FE10 CP 10H ;Steuerzeichen 10H...1FH ? 10CB 302D JR NC,M10FA ;ja 10CD FE06 CP 6 ;'MODE'-Zeichen und 'CAPS'-Lock 10CF 300A JR NC,MODCAP ;ja 10D1 47 LD B,A ;FLASH, BRIGHT und INVERSE 10D2 E601 AND 1 ;Bit0 fuer aus oder ein 10D4 4F LD C,A 10D5 78 LD A,B 10D6 1F RRA ;FLASH=12H, BRIGHT=13H, INVERSE=14H 10D7 C612 ADD A,12H 10D9 182A JR M1105 10DB 2009 MODCAP: JR NZ,MODES 10DD 216A5C LD HL,FLAGS2 ;Flags Teil 2 10E0 3E08 LD A,8 ;Bit 3 von FLAGS2 10E2 AE XOR (HL) ;invertieren 10E3 77 LD (HL),A 10E4 180E JR M10F4 10E6 FE0E MODES: CP 0EH ;nur 0EH (SYMBOL SHIFT) und 10E8 D8 RET C ;0FH (GRAPHICS) weiter 10E9 D60D SUB 0DH 10EB 21415C LD HL,MODE ;Tastenmodus (K,L,C,E,G) 10EE BE CP (HL) ;Modus geaendert ? 10EF 77 LD (HL),A 10F0 2002 JR NZ,M10F4 ;ja 10F2 3600 LD (HL),0 ;sonst L-Modus 10F4 FDCB02DE M10F4: SET 3,(IY+2) ;Modus kann sich geandert haben 10F8 BF CP A ;CARRY = 0 10F9 C9 RET 10FA 47 M10FA: LD B,A 10FB E607 AND 7 ;Bit 0...2 10FD 4F LD C,A 10FE 3E10 LD A,10H ;Codes fuer 'INK' 1100 CB58 BIT 3,B ;ungeshifteter Code ? 1102 2001 JR NZ,M1105 ;nein 1104 3C INC A ;A='PAPER'-Code 1105 FD71D3 M1105: LD (IY-2DH),C ;Parameter speichern 1108 110D11 LD DE,TASTI2 ;Input aendern 110B 1806 JR M1113 110D 3A0D5C TASTI2: LD A,(KDATA) ;noch eine Taste als Parameter 1110 11A810 LD DE,TASTIN ;holen und Input wieder normal 1113 2A4F5C M1113: LD HL,(CHANS) ;aktuelle Kanaladresse 1116 23 INC HL ;auf Input zeigen lassen 1117 23 INC HL 1118 73 LD (HL),E ;neuen Input-Einsprung speichern 1119 23 INC HL 111A 72 LD (HL),D 111B 37 M111B: SCF 111C C9 RET ;diese Routine wird immer aufgerufen, wenn der ;Editor- oder Inputbereich in den unteren ;Bildschirmteil geschrieben werden soll 111D CD4D0D M111D: CALL AKTCOL ;aktuelle Farben bleiben 1120 FDCB029E RES 3,(IY+2) ;keine Mode-Aenderung 1124 FDCB02AE RES 5,(IY+2) ;unteren Teil nicht loeschen 1128 2A8A5C LD HL,(SPOSNL) ;akt. Werte des unteren Teil 112B E5 PUSH HL ;retten 112C 2A3D5C LD HL,(ERRSP) ;Errorstackpointer 112F E5 PUSH HL 1130 216711 LD HL,EDERR ;Fehlerreturnadresse 1133 E5 PUSH HL 1134 ED733D5C LD (ERRSP),SP ;Errorstackpointer 1138 2A825C LD HL,(ECHOE) ;Position fuer Input 113B E5 PUSH HL 113C 37 SCF 113D CD9511 CALL EDDE 1140 EB EX DE,HL ;HL = Anfang; DE = Ende 1141 CD7D18 CALL M187D ;Zeile ausgeben 1144 EB EX DE,HL 1145 CDE118 CALL M18E1 ;Cursor anzeigen 1148 2A8A5C LD HL,(SPOSNL) ;SPOSNL mit ECHOE austauschen 114B E3 EX (SP),HL 114C EB EX DE,HL 114D CD4D0D CALL AKTCOL ;akt. Farben noch mal setzen ;den Rest einer Zeile mit Leerzeichen fuellen 1150 3A8B5C RESTLE: LD A,(SPOSNL+1) ;akt. Bildschirmzeile 1153 92 SUB D ;mit der Alten vergleichen 1154 3826 JR C,M117C ;Leerzeichenausgabe nicht noetig 1156 2006 JR NZ,REST1 ;nicht die gleiche Zeile 1158 7B LD A,E ;alte minus 1159 FD9650 SUB (IY+50H) ;neue Spaltenposition 115C 301E JR NC,M117C 115E 3E20 REST1: LD A,' ' 1160 D5 PUSH DE 1161 CDF409 CALL AUSGAB 1164 D1 POP DE 1165 18E9 JR RESTLE ;Fehlerbehandlung im Editor 1167 1600 EDERR: LD D,0 1169 FD5EFE LD E,(IY-2) ;= RASP 116C 21901A LD HL,1A90H 116F CDB503 CALL PIEPEN ;Warnton 1172 FD3600FF LD (IY+0),0FFH ;Errornummer loeschen 1176 ED5B8A5C LD DE,(SPOSNL) ;akt. Wert SPOSNL fuer 117A 1802 JR M117E ;ECHOE holen ;normaler Ausstieg bei Ausgabe der Editor- oder Inputzeile 117C D1 M117C: POP DE 117D E1 POP HL 117E E1 M117E: POP HL 117F 223D5C LD (ERRSP),HL ;Errorstackpointer 1182 C1 POP BC ;SPOSNL alt 1183 D5 PUSH DE ;SPOSNL neu 1184 CDD90D CALL M0DD9 ;Systemvariable setzen 1187 E1 POP HL ;SPOSNL neu in ECHOE 1188 22825C LD (ECHOE),HL ;Position fuer Input 118B FD362600 LD (IY+26H),0 ;Errorzeiger loeschen 118F C9 RET ;HL auf die letzte Position, DE auf die Erste entweder ;des Editor- oder des Workspacebereichs setzen 1190 2A615C EDHLDE: LD HL,(WORKSP) ;derzeitiger Workspace 1193 2B DEC HL ;Ende Editorbereich 1194 A7 AND A 1195 ED5B595C EDDE: LD DE,(ELINE) ;Anfang Editorbereich 1199 FDCB376E BIT 5,(IY+37H) ;Editormode Return 119D C8 RET Z 119E ED5B615C LD DE,(WORKSP) ;sonst DE auf Workspace 11A2 D8 RET C 11A3 2A635C LD HL,(STKBOT) ;Anfang des Calculatorstacks 11A6 C9 RET ;Routine holt die versteckten Floatingpoint-Zahlen ;einer BASIC-Zeile zurueck 11A7 7E HOLFLO: LD A,(HL) 11A8 FE0E CP 0EH ;Floatingpoint-Zahl ? 11AA 010600 LD BC,6 ;wenn ja, 6 Plaetze 11AD CCE819 CALL Z,RAUS2 ;beschaffen 11B0 7E LD A,(HL) 11B1 23 INC HL 11B2 FE0D CP 0DH ;Ende ? 11B4 20F1 JR NZ,HOLFLO ;nein 11B6 C9 RET ;=================================================== ;Systeminitialisierung bei Befehl 'NEW' oder durch ;RESET beim Einschalten ;Unterscheidung durch Reg A: FFH = 'NEW' 11B7 F3 NEW: DI 11B8 3EFF LD A,0FFH 11BA ED5BB25C LD DE,(RAMTOP) ;letzte Speicheradresse fuer Basic 11BE D9 EXX 11BF ED4BB45C LD BC,(PRAMT) ;letzte Speicheradresse 11C3 ED5B385C LD DE,(RASP) ;Laenge Warnton 11C7 2A7B5C LD HL,(UDG) ;Adresse der User Grafikzeichen 11CA D9 EXX ;======================================================= ;Resetroutine mit Vorbereitung aller Pointer nach Start ;======================================================= 11CB 47 RESET1: LD B,A ;bei Kaltstart B=0 11CC 3E07 LD A,7 11CE D3FE OUT (PFE),A 11D0 3E3F LD A,3FH 11D2 ED47 LD I,A 11D4 00 NOP 11D5 00 NOP 11D6 00 NOP 11D7 00 NOP 11D8 00 NOP 11D9 00 NOP 11DA 62 LD H,D 11DB 6B LD L,E 11DC 3602 M11DC: LD (HL),2 11DE 2B DEC HL 11DF BC CP H 11E0 20FA JR NZ,M11DC 11E2 A7 RAMTES: AND A 11E3 ED52 SBC HL,DE 11E5 19 ADD HL,DE 11E6 23 INC HL 11E7 3006 JR NC,RAMFER 11E9 35 DEC (HL) 11EA 2803 JR Z,RAMFER 11EC 35 DEC (HL) 11ED 28F3 JR Z,RAMTES 11EF 2B RAMFER: DEC HL 11F0 D9 EXX 11F1 ED43B45C LD (PRAMT),BC ;letzte Speicheradresse 11F5 ED53385C LD (RASP),DE ;Laenge Warnton 11F9 227B5C LD (UDG),HL ;Adresse der User Grafikzeichen 11FC D9 EXX 11FD 04 INC B 11FE 2819 JR Z,SETTOP 1200 22B45C LD (PRAMT),HL ;letzte Speicheradresse 1203 11AF3E LD DE,3EAFH ;Zeichengenerator laden 1206 01A800 LD BC,0A8H 1209 EB EX DE,HL 120A EDB8 LDDR 120C EB EX DE,HL 120D 23 INC HL 120E 227B5C LD (UDG),HL ;Adresse der User Grafikzeichen 1211 2B DEC HL 1212 014000 LD BC,040H 1215 ED43385C LD (RASP),BC ;Laenge Warnton 1219 22B25C SETTOP: LD (RAMTOP),HL ;letzte Speicheradresse fuer Basic 121C 21003C LD HL,CHARR0-256 121F 22365C LD (CHARS),HL ;Zeichensatzadresse -256 1222 2AB25C LD HL,(RAMTOP) ;letzte Speicheradresse fuer Basic 1225 363E LD (HL),3EH 1227 2B DEC HL 1228 F9 LD SP,HL 1229 2B DEC HL 122A 2B DEC HL 122B 223D5C LD (ERRSP),HL ;Errorstackpointer 122E ED56 IM 1 1230 FD213A5C LD IY,ERRNR 1234 FB EI 1235 21B65C LD HL,KANMEM 1238 224F5C LD (CHANS),HL ;Pointer fuer Kanaldaten 123B 11AF15 LD DE,INIKAN 123E 011500 LD BC,21 1241 EB EX DE,HL 1242 EDB0 LDIR 1244 EB EX DE,HL 1245 2B DEC HL 1246 22575C LD (DATADD),HL ;Zeiger auf Endbyte der letzten Daten 1249 23 INC HL 124A 22535C LD (PROG),HL ;Start des Basicprogrammes 124D 224B5C LD (VARS),HL ;Beginn der Variablen 1250 3680 LD (HL),80H 1252 23 INC HL 1253 22595C LD (ELINE),HL ;Adresse des eingegebenen Befehls 1256 360D LD (HL),0DH 1258 23 INC HL 1259 3680 LD (HL),80H 125B 23 INC HL 125C 22615C LD (WORKSP),HL ;derzeitiger Workspace 125F 22635C LD (STKBOT),HL ;Anfang des Calculatorstacks 1262 22655C LD (STKEND),HL ;Anfang des freien Speichers 1265 3E38 LD A,38H 1267 328D5C LD (ATTRP),A ;aktuelle Farben permanent 126A 328F5C LD (ATTRT),A ;aktuelle Farben temporaer 126D 32485C LD (BORDCR),A ;Bordercolor * 8 1270 212305 LD HL,523H 1273 22095C LD (REPDEL),HL ;Zeitkonstante bis Repeat 1276 FD35C6 DEC (IY-3AH) 1279 FD35CA DEC (IY-36H) 127C 21C615 LD HL,STDATA 127F 11105C LD DE,STRMS ;Tabelle der offenen Kanaele 1282 010E00 LD BC,0EH 1285 EDB0 LDIR 1287 FDCB01CE SET 1,(IY+1) 128B CDDF0E CALL M0EDF 128E FD363102 LD (IY+31H),2 1292 CD6B0D CALL M0D6B 1295 AF XOR A 1296 113815 LD DE,COPRIG-1 1299 CD0A0C CALL PRTMEL 129C FDCB02EE SET 5,(IY+2) 12A0 1807 JR M12A9 ;=================================================== ;Hauptschleife des Ausfuehrprogramms 12A2 FD363102 HAUPT: LD (IY+31H),2 12A6 CD9517 CALL LISTAU 12A9 CDB016 M12A9: CALL CLREDI 12AC 3E00 HAUEDI: LD A,0 12AE CD0116 CALL OPKAN 12B1 CD2C0F CALL M0F2C 12B4 CD171B CALL M1B17 12B7 FDCB007E BIT 7,(IY+0) 12BB 2012 JR NZ,KORRIN 12BD FDCB3066 BIT 4,(IY+30H) 12C1 2840 JR Z,M1303 12C3 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 12C6 CDA711 CALL HOLFLO 12C9 FD3600FF LD (IY+0),0FFH 12CD 18DD JR HAUEDI 12CF 2A595C KORRIN: LD HL,(ELINE) ;Adresse des eingegebenen Befehls 12D2 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 12D5 CDFB19 CALL M19FB 12D8 78 LD A,B 12D9 B1 OR C 12DA C25D15 JP NZ,EINFUE 12DD DF RST GETAKT 12DE FE0D CP 0DH 12E0 28C0 JR Z,HAUPT 12E2 FDCB3046 BIT 0,(IY+30H) 12E6 C4AF0D CALL NZ,M0DAF 12E9 CD6E0D CALL M0D6E 12EC 3E19 LD A,19H 12EE FD964F SUB (IY+4FH) 12F1 328C5C LD (SCRCT),A ;Scrollzaehler 12F4 FDCB01FE SET 7,(IY+1) 12F8 FD3600FF LD (IY+0),0FFH 12FC FD360A01 LD (IY+0AH),1 1300 CD8A1B CALL M1B8A ;Rueckkehr nach Ausfuehrung der Zeile bzw. Programm ;an diese Stelle zur Ausgabe einer Meldung ;der Interrupt muss freigegeben sein ! 1303 76 M1303: HALT 1304 FDCB01AE RES 5,(IY+1) 1308 FDCB304E BIT 1,(IY+30H) 130C C4CD0E CALL NZ,M0ECD 130F 3A3A5C LD A,(ERRNR) 1312 3C INC A 1313 F5 M1313: PUSH AF 1314 210000 LD HL,0 1317 FD7437 LD (IY+37H),H 131A FD7426 LD (IY+26H),H 131D 220B5C LD (DEFADD),HL ;Argument fuer Funktionen 1320 210100 LD HL,1 1323 22165C LD (STRMS+6),HL ;Tabelle der offenen Kanaele 1326 CDB016 CALL CLREDI 1329 FDCB37AE RES 5,(IY+37H) 132D CD6E0D CALL M0D6E 1330 FDCB02EE SET 5,(IY+2) 1334 F1 POP AF 1335 47 LD B,A 1336 FE0A CP 0AH 1338 3802 JR C,ERRAU 133A C607 ADD A,7 133C CDEF15 ERRAU: CALL M15EF 133F 3E20 LD A,' ' 1341 D7 RST PRTOUT 1342 78 LD A,B 1343 119113 LD DE,MELDU 1346 CD0A0C CALL PRTMEL 1349 AF XOR A 134A 113615 LD DE,MELDS-1 134D CD0A0C CALL PRTMEL 1350 ED4B455C LD BC,(PPC) ;aktuelle Nr. der Basiczeile 1354 CD1B1A CALL M1A1B 1357 3E3A LD A,':' 1359 D7 RST PRTOUT 135A FD4E0D LD C,(IY+0DH) 135D 0600 LD B,0 135F CD1B1A CALL M1A1B 1362 CD9710 CALL M1097 1365 3A3A5C LD A,(ERRNR) 1368 3C INC A 1369 281B JR Z,M1386 136B FE09 CP 9 136D 2804 JR Z,M1373 136F FE15 CP 15H 1371 2003 JR NZ,M1376 1373 FD340D M1373: INC (IY+0DH) 1376 010300 M1376: LD BC,3 1379 11705C LD DE,OSPCC ;naechster Befehl fuer Cont. 137C 21445C LD HL,NSPPC ;Befehl der Zeile bei Sprung 137F CB7E BIT 7,(HL) 1381 2801 JR Z,M1384 1383 09 ADD HL,BC 1384 EDB8 M1384: LDDR 1386 FD360AFF M1386: LD (IY+0AH),0FFH 138A FDCB019E RES 3,(IY+1) 138E C3AC12 JP HAUEDI ;Meldungen des Betriebssystems ;das letzte Byte einer Meldung wird mit 80H geodert 1391 80 MELDU: DEFB 80H 1392 4FCB MELD0: DEFB 'OK'+80H 1394 4E455854 MELD1: DEFM 'NEXT without FOR'+80H 13A4 56617269 MELD2: DEFM 'Variable not found'+80H 13B6 53756273 MELD3: DEFM 'Subscript wrong'+80H 13C5 4F757420 MELD4: DEFM 'Out of memory'+80H 13D2 4F757420 MELD5: DEFM 'Out of screen'+80H 13DF 4E756D62 MELD6: DEFM 'Number too big'+80H 13ED 52455455 MELD7: DEFM 'RETURN without GOSUB'+80H 1401 456E6420 MELD8: DEFM 'End of file'+80H 140C 53544F50 MELD9: DEFM 'STOP statement'+80H 141A 496E7661 MELDA: DEFM 'Invalid argument'+80H 142A 496E7465 MELDB: DEFM 'Integer out of range'+80H 143E 4E6F6E73 MELDC: DEFM 'Nonsense in BASIC'+80H 144F 42524541 MELDD: DEFM 'BREAK - CONT repeats'+80H 1463 4F757420 MELDE: DEFM 'Out of DATA'+80H 146E 496E7661 MELDF: DEFM 'Invalid file name'+80H 147F 4E6F2072 MELDG: DEFM 'No room for line'+80H 148F 53544F50 MELDH: DEFM 'STOP in INPUT'+80H 149C 464F5220 MELDI: DEFM 'FOR without NEXT'+80H 14AC 496E7661 MELDJ: DEFM 'Invalid I/O device'+80H 14BE 496E7661 MELDK: DEFM 'Invalid colour'+80H 14CC 42524541 MELDL: DEFM 'BREAK into program'+80H 14DE 52414D54 MELDM: DEFM 'RAMTOP no good'+80H 14EC 53746174 MELDN: DEFM 'Statement lost'+80H 14FA 496E7661 MELDO: DEFM 'Invalid stream'+80H 1508 464E2077 MELDP: DEFM 'FN without DEF'+80H 1516 50617261 MELDQ: DEFM 'Parameter error'+80H 1525 54617065 MELDR: DEFM 'Tape loading error'+80H 1537 2CA0 MELDS: DEFB ', '+80H 1539 7F203139 COPRIG: DEFB 7FH,' 1982 Sinclair Research Ltd'+80H 1555 3E10 NOROOM: LD A,10H 1557 010000 LD BC,0 155A C31313 JP M1313 ;eine neue BASIC-Zeile ins Programm einfuegen ;wenn die Zeile schon existiert, dann ersetzen oder, ;falls nur eine Zeilennummer eingegeben wurde, ;diese Zeile loeschen 155D ED43495C EINFUE: LD (EPPC),BC ;aktuelle Editorzeile 1561 2A5D5C LD HL,(CHADD) ;Adr. des naechsten zu interpret. Zeichens 1564 EB EX DE,HL 1565 215515 LD HL,NOROOM 1568 E5 PUSH HL 1569 2A615C LD HL,(WORKSP) ;derzeitiger Workspace 156C 37 SCF 156D ED52 SBC HL,DE 156F E5 PUSH HL 1570 60 LD H,B 1571 69 LD L,C 1572 CD6E19 CALL M196E 1575 2006 JR NZ,EINFU1 1577 CDB819 CALL M19B8 157A CDE819 CALL RAUS2 157D C1 EINFU1: POP BC 157E 79 LD A,C 157F 3D DEC A 1580 B0 OR B 1581 2828 JR Z,M15AB 1583 C5 PUSH BC 1584 03 INC BC 1585 03 INC BC 1586 03 INC BC 1587 03 INC BC 1588 2B DEC HL 1589 ED5B535C LD DE,(PROG) ;Start des Basicprogrammes 158D D5 PUSH DE 158E CD5516 CALL MACHPL 1591 E1 POP HL 1592 22535C LD (PROG),HL ;Start des Basicprogrammes 1595 C1 POP BC 1596 C5 PUSH BC 1597 13 INC DE 1598 2A615C LD HL,(WORKSP) ;derzeitiger Workspace 159B 2B DEC HL 159C 2B DEC HL 159D EDB8 LDDR 159F 2A495C LD HL,(EPPC) ;aktuelle Editorzeile 15A2 EB EX DE,HL 15A3 C1 POP BC 15A4 70 LD (HL),B 15A5 2B DEC HL 15A6 71 LD (HL),C 15A7 2B DEC HL 15A8 73 LD (HL),E 15A9 2B DEC HL 15AA 72 LD (HL),D 15AB F1 M15AB: POP AF 15AC C3A212 JP HAUPT ;Kanalinformationen zum Initialisieren ;K = Keyboard (Tastatur) ;S = Screen (Bildschirm) ;R = Workspace (Arbeitsspeicher) ;P = Printer (Drucker) 15AF F4 INIKAN: DEFB 0F4H 15B0 09 DEFB 9 15B1 A810 DEFW TASTIN 15B3 4B DEFB 'K' 15B4 F4 DEFB 0F4H 15B5 09 DEFB 9 15B6 C415 DEFW INVIO 15B8 53 DEFB 'S' 15B9 81 DEFB 81H 15BA 0F DEFB 0FH 15BB C415 DEFW INVIO 15BD 52 DEFB 'R' 15BE F4 DEFB 0F4H 15BF 09 DEFB 9 15C0 C415 DEFW INVIO 15C2 50 DEFB 'P' 15C3 80 DEFB 80H 15C4 CF INVIO: RST ERRAUS 15C5 12 DEFB 12H ;'INVALID I/O' ;Stream Daten 15C6 01 STDATA: DEFB 1 15C7 00 DEFB 0 15C8 06 DEFB 6 15C9 00 DEFB 0 15CA 0B DEFB 0BH 15CB 00 DEFB 0 15CC 01 DEFB 1 15CD 00 DEFB 0 15CE 01 DEFB 1 15CF 00 DEFB 0 15D0 06 DEFB 6 15D1 00 DEFB 0 15D2 10 DEFB 010H 15D3 00 DEFB 0 ;Diese Subroutine ueberwacht den Aufruf der aktuellen ;Input-Subroutine 15D4 FDCB026E WARTA: BIT 5,(IY+2) 15D8 2004 JR NZ,M15DE 15DA FDCB02DE SET 3,(IY+2) 15DE CDE615 M15DE: CALL M15E6 15E1 D8 RET C 15E2 28FA JR Z,M15DE 15E4 CF RST ERRAUS 15E5 07 DEFB 7 ;'END OF FILE' ;Inputroutine fuer den gerade aktuellen File 15E6 D9 M15E6: EXX 15E7 E5 PUSH HL 15E8 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse 15EB 23 INC HL 15EC 23 INC HL 15ED 1808 JR INDCAL ;allgemeine Ausgaberoutine ;AUSGA2 mit auszugebenden Zeichen in A 15EF 1E30 M15EF: LD E,30H 15F1 83 ADD A,E 15F2 D9 AUSGA2: EXX 15F3 E5 PUSH HL 15F4 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse ;die aktuelle Ausgabe- oder Eingaberoutine aufrufen ;HL zeigt auf die Adresse, an der die Sprungadresse ;zu finden ist 15F7 5E INDCAL: LD E,(HL) 15F8 23 INC HL 15F9 56 LD D,(HL) 15FA EB EX DE,HL 15FB CD2C16 CALL INDJMP 15FE E1 POP HL 15FF D9 EXX 1600 C9 RET ;Routine um einen Kanal zu eroeffnen ;A enthaelt gueltige 'STREAM'-Nummer und der ;entsprechende Kanal wird eroeffnet 1601 87 OPKAN: ADD A,A 1602 C616 ADD A,16H 1604 6F LD L,A 1605 265C LD H,5CH 1607 5E LD E,(HL) 1608 23 INC HL 1609 56 LD D,(HL) 160A 7A LD A,D 160B B3 OR E 160C 2002 JR NZ,M1610 160E CF ISTREA: RST ERRAUS 160F 17 DEFB 17H ;'INVALID STREAM' 1610 1B M1610: DEC DE 1611 2A4F5C LD HL,(CHANS) ;Pointer fuer Kanaldaten 1614 19 ADD HL,DE 1615 22515C M1615: LD (CURCHL),HL ;aktuelle I/O Infoadresse 1618 FDCB30A6 RES 4,(IY+30H) 161C 23 INC HL 161D 23 INC HL 161E 23 INC HL 161F 23 INC HL 1620 4E LD C,(HL) 1621 212D16 LD HL,KLOOK 1624 CDDC16 CALL SUCHTA 1627 D0 RET NC 1628 1600 LD D,0 162A 5E LD E,(HL) 162B 19 ADD HL,DE 162C E9 INDJMP: JP (HL) 162D 4B KLOOK: DEFB 'K' 162E 06 DEFB KANALK-$ 162F 53 DEFB 'S' 1630 12 DEFB KANALS-$ 1631 50 DEFB 'P' 1632 1B DEFB KANALP-$ 1633 00 DEFB 0 1634 FDCB02C6 KANALK: SET 0,(IY+2) 1638 FDCB01AE RES 5,(IY+1) 163C FDCB30E6 SET 4,(IY+30H) 1640 1804 JR KANS1 1642 FDCB0286 KANALS: RES 0,(IY+2) 1646 FDCB018E KANS1: RES 1,(IY+1) 164A C34D0D JP AKTCOL 164D FDCB01CE KANALP: SET 1,(IY+1) 1651 C9 RET ;diese Routine schafft einen benoetigten Speicherraum. ;die Bytezahl steht in BC ;HL zeigt hinter die Position an der Platz benoetigt wird. 1652 010100 NUREIN: LD BC,1 1655 E5 MACHPL: PUSH HL 1656 CD051F CALL M1F05 1659 E1 POP HL 165A CD6416 CALL POINTE 165D 2A655C LD HL,(STKEND) ;Anfang des freien Speichers 1660 EB EX DE,HL 1661 EDB8 LDDR 1663 C9 RET ;diese Subroutine veraendert alle Systemvariablen (Pointer), ;die auf den Positionen hinter dem Speicherplatz zeigen (=HL), ;an dem Platz etc. geschaffen werden soll. BC muss die Anzahl der ;Bytes enthalten. 1664 F5 POINTE: PUSH AF 1665 E5 PUSH HL 1666 214B5C LD HL,VARS ;Beginn der Variablen 1669 3E0E LD A,14 166B 5E POINTL: LD E,(HL) 166C 23 INC HL 166D 56 LD D,(HL) 166E E3 EX (SP),HL 166F A7 AND A 1670 ED52 SBC HL,DE 1672 19 ADD HL,DE 1673 E3 EX (SP),HL 1674 3009 JR NC,NOCHA 1676 D5 PUSH DE 1677 EB EX DE,HL 1678 09 ADD HL,BC 1679 EB EX DE,HL 167A 72 LD (HL),D 167B 2B DEC HL 167C 73 LD (HL),E 167D 23 INC HL 167E D1 POP DE 167F 23 NOCHA: INC HL 1680 3D DEC A 1681 20E8 JR NZ,POINTL 1683 EB EX DE,HL 1684 D1 POP DE 1685 F1 POP AF 1686 A7 AND A 1687 ED52 SBC HL,DE 1689 44 LD B,H 168A 4D LD C,L 168B 03 INC BC 168C 19 ADD HL,DE 168D EB EX DE,HL 168E C9 RET ;holen der Nummer der Zeile, die durch HL adressiert wird. ;Falls ungueltig, Test ob DE auf eine gueltige Nummer zeigt. ;Trifft dies auch nicht zu, so wird 0000 als Zeilennummer in ;DE geladen (Nummer<10000). Normalerweise enthaelt DE die ;Zeilennummer und HL die Startadresse dieser Zeile bei RETURN. 168F 0000 ZEINUL: DEFW 0 1691 EB ZDAVOR: EX DE,HL 1692 118F16 LD DE,ZEINUL 1695 7E ZSUCHE: LD A,(HL) 1696 E6C0 AND 0C0H 1698 20F7 JR NZ,ZDAVOR 169A 56 LD D,(HL) 169B 23 INC HL 169C 5E LD E,(HL) 169D C9 RET ;Routine wird normalerweise ueber RESTART 30, (BC) Plaetze ;besorgen, aufgerufen. Stack enthaelt daher als letzten Wert ;'WORKSPACE' und davor die Anzahl 'BC'. 169E 2A635C RESERV: LD HL,(STKBOT) ;Anfang des Calculatorstacks 16A1 2B DEC HL 16A2 CD5516 CALL MACHPL 16A5 23 INC HL 16A6 23 INC HL 16A7 C1 POP BC 16A8 ED43615C LD (WORKSP),BC ;derzeitiger Workspace 16AC C1 POP BC 16AD EB EX DE,HL 16AE 23 INC HL 16AF C9 RET ;Routine loescht den Editorbereich, den Workspace und den ;Calculatorstack 16B0 2A595C CLREDI: LD HL,(ELINE) ;Adresse des eingegebenen Befehls 16B3 360D LD (HL),0DH 16B5 225B5C LD (KCUR),HL ;Kursoradresse 16B8 23 INC HL 16B9 3680 LD (HL),80H 16BB 23 INC HL 16BC 22615C LD (WORKSP),HL ;derzeitiger Workspace 16BF 2A615C CLRWOR: LD HL,(WORKSP) ;derzeitiger Workspace 16C2 22635C LD (STKBOT),HL ;Anfang des Calculatorstacks 16C5 2A635C CLRCAL: LD HL,(STKBOT) ;Anfang des Calculatorstacks 16C8 22655C LD (STKEND),HL ;Anfang des freien Speichers 16CB E5 PUSH HL 16CC 21925C LD HL,MEMBOT ;Calculatorspeicher 16CF 22685C LD (MEM),HL ;Zeiger auf Calculatorspeicher 16D2 E1 POP HL 16D3 C9 RET ;die Editorzeile wieder entfernen 16D4 ED5B595C M16D4: LD DE,(ELINE) ;Adresse des eingegebenen Befehls 16D8 C3E519 JP RAUS1 ;Subroutine zum durchsuchen von Tabellen (Ende = 00) ;HL zeigt auf deren Anfang und C enthaelt das zu suchende ;Zeichen. Carry gesetzt = gefunden. 16DB 23 SUCHT1: INC HL 16DC 7E SUCHTA: LD A,(HL) 16DD A7 AND A 16DE C8 RET Z 16DF B9 CP C 16E0 23 INC HL 16E1 20F8 JR NZ,SUCHT1 16E3 37 SCF 16E4 C9 RET ;CLOSE#-Subroutine zum schliessen von Streams ;fuer Streams 00-03 werden die Grunddaten immer gesetzt, ;so dass diese nicht geschlossen werden koennen 16E5 CD1E17 M16E5: CALL STRDAT 16E8 CD0117 CALL CLOKSP 16EB 010000 LD BC,0 16EE 11E2A3 LD DE,0A3E2H 16F1 EB EX DE,HL 16F2 19 ADD HL,DE 16F3 3807 JR C,M16FC 16F5 01D415 LD BC,15D4H 16F8 09 ADD HL,BC 16F9 4E LD C,(HL) 16FA 23 INC HL 16FB 46 LD B,(HL) 16FC EB M16FC: EX DE,HL 16FD 71 LD (HL),C 16FE 23 INC HL 16FF 70 LD (HL),B 1700 C9 RET ;Streamkode K, S oder P pruefen und Stream schliessen 1701 E5 CLOKSP: PUSH HL 1702 2A4F5C LD HL,(CHANS) ;Pointer fuer Kanaldaten 1705 09 ADD HL,BC 1706 23 INC HL 1707 23 INC HL 1708 23 INC HL 1709 4E LD C,(HL) 170A EB EX DE,HL 170B 211617 LD HL,CSTRTA 170E CDDC16 CALL SUCHTA 1711 4E LD C,(HL) 1712 0600 LD B,0 1714 09 ADD HL,BC 1715 E9 JP (HL) ;Tabelle fuer CLOSE STREAM 1716 4B CSTRTA: DEFB 'K' 1717 05 DEFB CLOSTR-$ 1718 53 DEFB 'S' 1719 03 DEFB CLOSTR-$ 171A 50 DEFB 'P' 171B 01 DEFB CLOSTR-$ ;CLOSE STREAM 171C E1 CLOSTR: POP HL 171D C9 RET ;nach BC die Daten eines Stream holen 171E CD941E STRDAT: CALL INTEG1 1721 FE10 CP 10H 1723 3802 JR C,M1727 1725 CF M1725: RST ERRAUS 1726 17 DEFB 17H 1727 C603 M1727: ADD A,3 1729 07 RLCA 172A 21105C LD HL,STRMS ;Tabelle der offenen Kanaele 172D 4F LD C,A 172E 0600 LD B,0 1730 09 ADD HL,BC 1731 4E LD C,(HL) 1732 23 INC HL 1733 46 LD B,(HL) 1734 2B DEC HL 1735 C9 RET ;OPEN#-Subroutine ;Kanalkode muss K, S oder P sein 1736 EF STROPE: RST CALRUF 1737 01 DEFB 1 1738 38 DEFB 38H 1739 CD1E17 CALL STRDAT 173C 78 LD A,B 173D B1 OR C 173E 2816 JR Z,STROP1 1740 EB EX DE,HL 1741 2A4F5C LD HL,(CHANS) ;Pointer fuer Kanaldaten 1744 09 ADD HL,BC 1745 23 INC HL 1746 23 INC HL 1747 23 INC HL 1748 7E LD A,(HL) 1749 EB EX DE,HL 174A FE4B CP 'K' 174C 2808 JR Z,STROP1 174E FE53 CP 'S' 1750 2804 JR Z,STROP1 1752 FE50 CP 'P' 1754 20CF JR NZ,M1725 1756 CD5D17 STROP1: CALL M175D 1759 73 LD (HL),E 175A 23 INC HL 175B 72 LD (HL),D 175C C9 RET 175D E5 M175D: PUSH HL 175E CDF12B CALL M2BF1 1761 78 LD A,B 1762 B1 OR C 1763 2002 JR NZ,M1767 1765 CF M1765: RST ERRAUS 1766 0E DEFB 0EH 1767 C5 M1767: PUSH BC 1768 1A LD A,(DE) 1769 E6DF AND 0DFH 176B 4F LD C,A 176C 217A17 LD HL,OPTAB 176F CDDC16 CALL SUCHTA 1772 30F1 JR NC,M1765 1774 4E LD C,(HL) 1775 0600 LD B,0 1777 09 ADD HL,BC 1778 C1 POP BC 1779 E9 JP (HL) ;Tabelle fuer Streameroeffnung 177A 4B OPTAB: DEFB 'K' 177B 06 DEFB OPENK-$ 177C 53 DEFB 'S' 177D 08 DEFB OPENS-$ 177E 50 DEFB 'P' 177F 0A DEFB OPENP-$ 1780 00 DEFB 0 1781 1E01 OPENK: LD E,1 1783 1806 JR M178B 1785 1E06 OPENS: LD E,6 1787 1802 JR M178B 1789 1E10 OPENP: LD E,10H 178B 0B M178B: DEC BC 178C 78 LD A,B 178D B1 OR C 178E 20D5 JR NZ,M1765 1790 57 LD D,A 1791 E1 POP HL 1792 C9 RET ;CAT-, ERASE-, FORMAT- und MOVE-Befehle ergeben die ;Fehlermeldung 'INVALID STREAM' 1793 1890 M1793: JR M1725 ;LIST- und LLIST-Routine ;Ausgabe der Zeilennummer, Tokenumwandlung, Cursordarstellung usw. 1795 ED733F5C LISTAU: LD (LISTSP),SP ;Returnadresse bei LIST 1799 FD360210 LD (IY+2),10H 179D CDAF0D CALL M0DAF 17A0 FDCB02C6 SET 0,(IY+2) 17A4 FD4631 LD B,(IY+31H) 17A7 CD440E CALL M0E44 17AA FDCB0286 RES 0,(IY+2) 17AE FDCB30C6 SET 0,(IY+30H) 17B2 2A495C LD HL,(EPPC) ;aktuelle Editorzeile 17B5 ED5B6C5C LD DE,(STOP) ;Nummer der obersten Zeile eines Listings 17B9 A7 AND A 17BA ED52 SBC HL,DE 17BC 19 ADD HL,DE 17BD 3822 JR C,M17E1 17BF D5 PUSH DE 17C0 CD6E19 CALL M196E 17C3 11C002 LD DE,2C0H 17C6 EB EX DE,HL 17C7 ED52 SBC HL,DE 17C9 E3 EX (SP),HL 17CA CD6E19 CALL M196E 17CD C1 POP BC 17CE C5 M17CE: PUSH BC 17CF CDB819 CALL M19B8 17D2 C1 POP BC 17D3 09 ADD HL,BC 17D4 380E JR C,M17E4 17D6 EB EX DE,HL 17D7 56 LD D,(HL) 17D8 23 INC HL 17D9 5E LD E,(HL) 17DA 2B DEC HL 17DB ED536C5C LD (STOP),DE ;Nummer der obersten Zeile eines Listings 17DF 18ED JR M17CE 17E1 226C5C M17E1: LD (STOP),HL ;Nummer der obersten Zeile eines Listings 17E4 2A6C5C M17E4: LD HL,(STOP) ;Nummer der obersten Zeile eines Listings 17E7 CD6E19 CALL M196E 17EA 2801 JR Z,M17ED 17EC EB EX DE,HL 17ED CD3318 M17ED: CALL M1833 17F0 FDCB02A6 RES 4,(IY+2) 17F4 C9 RET ;Einstieg bei 'LLIST' 17F5 3E03 M17F5: LD A,3 17F7 1802 JR M17FB 17F9 3E02 M17F9: LD A,2 17FB FD360200 M17FB: LD (IY+2),0 17FF CD3025 CALL M2530 1802 C40116 CALL NZ,OPKAN 1805 DF RST GETAKT 1806 CD7020 CALL M2070 1809 3814 JR C,M181F 180B DF RST GETAKT 180C FE3B CP ';' 180E 2804 JR Z,M1814 1810 FE2C CP ',' 1812 2006 JR NZ,M181A 1814 E7 M1814: RST GETNXT 1815 CD821C CALL PAR06 1818 1808 JR M1822 181A CDE61C M181A: CALL M1CE6 181D 1803 JR M1822 181F CDDE1C M181F: CALL M1CDE 1822 CDEE1B M1822: CALL M1BEE 1825 CD991E CALL M1E99 1828 78 LD A,B 1829 E63F AND 3FH 182B 67 LD H,A 182C 69 LD L,C 182D 22495C LD (EPPC),HL ;aktuelle Editorzeile 1830 CD6E19 CALL M196E 1833 1E01 M1833: LD E,1 ;Schleife zum Listen mehrerer Zeilen 1835 CD5518 M1835: CALL M1855 1838 D7 RST PRTOUT 1839 FDCB0266 BIT 4,(IY+2) 183D 28F6 JR Z,M1835 183F 3A6B5C LD A,(DFSZ) ;Zeilenanzahl+1 im unteren Bildschirmteil 1842 FD964F SUB (IY+4FH) 1845 20EE JR NZ,M1835 1847 AB XOR E 1848 C8 RET Z 1849 E5 PUSH HL 184A D5 PUSH DE 184B 216C5C LD HL,STOP ;Nummer der obersten Zeile eines Listings 184E CD0F19 CALL M190F 1851 D1 POP DE 1852 E1 POP HL 1853 18E0 JR M1835 ;Ausgabe einer kompletten Basiczeile 1855 ED4B495C M1855: LD BC,(EPPC) ;aktuelle Editorzeile 1859 CD8019 CALL M1980 185C 163E LD D,3EH 185E 2805 JR Z,M1865 1860 110000 LD DE,0 1863 CB13 RL E 1865 FD732D M1865: LD (IY+2DH),E 1868 7E LD A,(HL) 1869 FE40 CP 40H 186B C1 POP BC 186C D0 RET NC 186D C5 PUSH BC 186E CD281A CALL M1A28 1871 23 INC HL 1872 23 INC HL 1873 23 INC HL 1874 FDCB0186 RES 0,(IY+1) 1878 7A LD A,D 1879 A7 AND A 187A 2805 JR Z,M1881 187C D7 RST PRTOUT 187D FDCB01C6 M187D: SET 0,(IY+1) 1881 D5 M1881: PUSH DE 1882 EB EX DE,HL 1883 FDCB3096 RES 2,(IY+30H) 1887 213B5C LD HL,FLAGS ;Bit 1= Printer ein 188A CB96 RES 2,(HL) 188C FDCB376E BIT 5,(IY+37H) 1890 2802 JR Z,M1894 1892 CBD6 SET 2,(HL) 1894 2A5F5C M1894: LD HL,(XPTR) ;Adresse des Zeichens nach ? bei Error 1897 A7 AND A 1898 ED52 SBC HL,DE 189A 2005 JR NZ,M18A1 189C 3E3F LD A,'?' 189E CDC118 CALL M18C1 18A1 CDE118 M18A1: CALL M18E1 18A4 EB EX DE,HL 18A5 7E LD A,(HL) 18A6 CDB618 CALL M18B6 18A9 23 INC HL 18AA FE0D CP 0DH 18AC 2806 JR Z,M18B4 18AE EB EX DE,HL 18AF CD3719 CALL M1937 18B2 18E0 JR M1894 18B4 D1 M18B4: POP DE 18B5 C9 RET ;wenn Zeichen ein Zahlenmerker ist, dann die ;Floating - Pointzahl uebergehen 18B6 FE0E M18B6: CP 0EH 18B8 C0 RET NZ 18B9 23 INC HL 18BA 23 INC HL 18BB 23 INC HL 18BC 23 INC HL 18BD 23 INC HL 18BE 23 INC HL 18BF 7E LD A,(HL) 18C0 C9 RET ;Ausgabe eines blinkenden Zeichens 18C1 D9 M18C1: EXX 18C2 2A8F5C LD HL,(ATTRT) ;aktuelle Farben temporaer 18C5 E5 PUSH HL 18C6 CBBC RES 7,H 18C8 CBFD SET 7,L 18CA 228F5C LD (ATTRT),HL ;aktuelle Farben temporaer 18CD 21915C LD HL,PFLAG ;Printerflag 18D0 56 LD D,(HL) 18D1 D5 PUSH DE 18D2 3600 LD (HL),0 18D4 CDF409 CALL AUSGAB 18D7 E1 POP HL 18D8 FD7457 LD (IY+57H),H 18DB E1 POP HL 18DC 228F5C LD (ATTRT),HL ;aktuelle Farben temporaer 18DF D9 EXX 18E0 C9 RET ;Ausgabe des Cursors ;falls aktuelle Ausgabeposition nicht Cursorposition ist, ;sofort RETURN, sonst den entsprechenden Cursor (C/E/G/K/L) ;drucken 18E1 2A5B5C M18E1: LD HL,(KCUR) ;Kursoradresse 18E4 A7 AND A 18E5 ED52 SBC HL,DE 18E7 C0 RET NZ 18E8 3A415C LD A,(MODE) ;Tastenmodus (K,L,C,E,G) 18EB CB07 RLC A 18ED 2804 JR Z,M18F3 18EF C643 ADD A,43H 18F1 1816 JR M1909 18F3 213B5C M18F3: LD HL,FLAGS ;Bit 1= Printer ein 18F6 CB9E RES 3,(HL) 18F8 3E4B LD A,'K' 18FA CB56 BIT 2,(HL) 18FC 280B JR Z,M1909 18FE CBDE SET 3,(HL) 1900 3C INC A 1901 FDCB305E BIT 3,(IY+30H) 1905 2802 JR Z,M1909 1907 3E43 LD A,'C' 1909 D5 M1909: PUSH DE 190A CDC118 CALL M18C1 190D D1 POP DE 190E C9 RET ;bei Einstieg zeigt HL auf STOP oder EPPC. Am Ende ;enthaelt die jeweilige Variable die Zeilennummer. 190F 5E M190F: LD E,(HL) 1910 23 INC HL 1911 56 LD D,(HL) 1912 E5 PUSH HL 1913 EB EX DE,HL 1914 23 INC HL 1915 CD6E19 CALL M196E 1918 CD9516 CALL ZSUCHE 191B E1 POP HL 191C FDCB376E M191C: BIT 5,(IY+37H) 1920 C0 RET NZ 1921 72 LD (HL),D 1922 2B DEC HL 1923 73 LD (HL),E 1924 C9 RET ;Routine gibt Zeichen einer Basiczeile aus. Bei Zahlen ;werden fuehrende Space unterdrueckt (A=FFH) oder nicht. 1925 7B M1925: LD A,E 1926 A7 AND A 1927 F8 RET M 1928 180D JR M1937 ;Wandlung einer Zeilennummer in HL in eine Dezimalzahl ;dazu enthaelt BC, je nach Aufruf, die Werte -1000, -100 ;oder -10 (deshalb Addition). 192A AF M192A: XOR A 192B 09 M192B: ADD HL,BC 192C 3C INC A 192D 38FC JR C,M192B 192F ED42 SBC HL,BC 1931 3D DEC A 1932 28F1 JR Z,M1925 1934 C3EF15 JP M15EF ;hier alle Zeichen, Controlcodes und Tokens ausgeben 1937 CD1B2D M1937: CALL ZIFFER 193A 3030 JR NC,M196C 193C FE21 CP '!' 193E 382C JR C,M196C 1940 FDCB0196 RES 2,(IY+1) 1944 FECB CP 0CBH 1946 2824 JR Z,M196C 1948 FE3A CP ':' 194A 200E JR NZ,M195A 194C FDCB376E BIT 5,(IY+37H) 1950 2016 JR NZ,M1968 1952 FDCB3056 BIT 2,(IY+30H) 1956 2814 JR Z,M196C 1958 180E JR M1968 195A FE22 M195A: CP '"' 195C 200A JR NZ,M1968 195E F5 PUSH AF 195F 3A6A5C LD A,(FLAGS2) ;Flags Teil 2 1962 EE04 XOR 4 1964 326A5C LD (FLAGS2),A ;Flags Teil 2 1967 F1 POP AF 1968 FDCB01D6 M1968: SET 2,(IY+1) 196C D7 M196C: RST PRTOUT 196D C9 RET ;Subroutine zum suchen des Anfangs einer Zeile nach ;deren Zeilennummer (in HL). Wird diese Zeile nicht ;gefunden, wird die Startadresse der naechsten Zeile ;uebergeben, jeweils in HL, und in DE die Adresse der ;Zeile davor. Falls Zeile gefunden wurde, ist das ZERO- ;Flag gesetzt. 196E E5 M196E: PUSH HL 196F 2A535C LD HL,(PROG) ;Start des Basicprogrammes 1972 54 LD D,H 1973 5D LD E,L 1974 C1 M1974: POP BC 1975 CD8019 CALL M1980 1978 D0 RET NC 1979 C5 PUSH BC 197A CDB819 CALL M19B8 197D EB EX DE,HL 197E 18F4 JR M1974 ;Vergleich einer Zeilennummer in Bc mit einer durch HL ;adressierten Zeile 1980 7E M1980: LD A,(HL) 1981 B8 CP B 1982 C0 RET NZ 1983 23 INC HL 1984 7E LD A,(HL) 1985 2B DEC HL 1986 B9 CP C 1987 C9 RET ;diese Routine sucht das durch das Register D bestimmte ;Zeichen einer Zeile oder das Zeichen, Token etc. welches ;in Register E enthalten ist 1988 23 M1988: INC HL 1989 23 INC HL 198A 23 INC HL ;normaler Einstieg 198B 225D5C M198B: LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 198E 0E00 LD C,0 1990 15 M1990: DEC D 1991 C8 RET Z 1992 E7 RST GETNXT 1993 BB CP E 1994 2004 JR NZ,M199A 1996 A7 AND A 1997 C9 RET 1998 23 M1998: INC HL 1999 7E LD A,(HL) 199A CDB618 M199A: CALL M18B6 199D 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 19A0 FE22 CP '"' 19A2 2001 JR NZ,M19A5 19A4 0D DEC C 19A5 FE3A M19A5: CP ':' 19A7 2804 JR Z,M19AD 19A9 FECB CP 0CBH 19AB 2004 JR NZ,M19B1 19AD CB41 M19AD: BIT 0,C 19AF 28DF JR Z,M1990 19B1 FE0D M19B1: CP 0DH 19B3 20E3 JR NZ,M1998 19B5 15 DEC D 19B6 37 SCF 19B7 C9 RET ;Subroutine zum Suchen der naechsten Basiczeile oder der ;naechsten Variablen 19B8 E5 M19B8: PUSH HL 19B9 7E LD A,(HL) 19BA FE40 CP 40H 19BC 3817 JR C,M19D5 19BE CB6F BIT 5,A 19C0 2814 JR Z,M19D6 19C2 87 ADD A,A 19C3 FAC719 JP M,M19C7 19C6 3F CCF 19C7 010500 M19C7: LD BC,5 19CA 3002 JR NC,M19CE 19CC 0E12 LD C,12H 19CE 17 M19CE: RLA 19CF 23 INC HL 19D0 7E LD A,(HL) 19D1 30FB JR NC,M19CE 19D3 1806 JR M19DB 19D5 23 M19D5: INC HL 19D6 23 M19D6: INC HL 19D7 4E LD C,(HL) 19D8 23 INC HL 19D9 46 LD B,(HL) 19DA 23 INC HL 19DB 09 M19DB: ADD HL,BC 19DC D1 POP DE ;Subroutine zum Berechnen einer Differenz in BC. ;HL und DE sind bei RETURN vertauscht. 19DD A7 DIFFER: AND A 19DE ED52 SBC HL,DE 19E0 44 LD B,H 19E1 4D LD C,L 19E2 19 ADD HL,DE 19E3 EB EX DE,HL 19E4 C9 RET ;diese Routine entfernt Speicherbereiche und korrigiert ;alle entsprechenden Pointer. ;Am ersten Einstieg enthaelt DE die erste zu entfernende ;und HL die erste, nicht mehr zu entfernende, Speicherstelle. ;Beim zweiten Einstiegspunkt enthaelt HL die erste zu ent- ;fernende Speicherstelle und BC die Anzahl. 19E5 CDDD19 RAUS1: CALL DIFFER 19E8 C5 RAUS2: PUSH BC 19E9 78 LD A,B 19EA 2F CPL 19EB 47 LD B,A 19EC 79 LD A,C 19ED 2F CPL 19EE 4F LD C,A 19EF 03 INC BC 19F0 CD6416 CALL POINTE 19F3 EB EX DE,HL 19F4 E1 POP HL 19F5 19 ADD HL,DE 19F6 D5 PUSH DE 19F7 EDB0 LDIR 19F9 E1 POP HL 19FA C9 RET ;Einlesen einer Zeilennummer beim Editieren. ;Bei einem Direktkommando wird diese zu Null gesetzt. ;Das Ergebnis steht immer in BC. 19FB 2A595C M19FB: LD HL,(ELINE) ;Adresse des eingegebenen Befehls 19FE 2B DEC HL 19FF 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 1A02 E7 RST GETNXT 1A03 21925C LD HL,MEMBOT ;Calculatorspeicher 1A06 22655C LD (STKEND),HL ;Anfang des freien Speichers 1A09 CD3B2D CALL M2D3B 1A0C CDA22D CALL M2DA2 1A0F 3804 JR C,M1A15 1A11 21F0D8 LD HL,0D8F0H 1A14 09 ADD HL,BC 1A15 DA8A1C M1A15: JP C,M1C8A 1A18 C3C516 JP CLRCAL ;Zeilennummerausgabe ;Inhalt BC wird in dezimal gewandelt und ausgegeben. 1A1B D5 M1A1B: PUSH DE 1A1C E5 PUSH HL 1A1D AF XOR A 1A1E CB78 BIT 7,B 1A20 2020 JR NZ,M1A42 1A22 60 LD H,B 1A23 69 LD L,C 1A24 1EFF LD E,0FFH 1A26 1808 JR M1A30 ;Die durch HL adressierte (hexadezimale) Zeilennummer ;in dezimal wandeln und ausgeben (mit fuehrenden Spaces) 1A28 D5 M1A28: PUSH DE 1A29 56 LD D,(HL) 1A2A 23 INC HL 1A2B 5E LD E,(HL) 1A2C E5 PUSH HL 1A2D EB EX DE,HL 1A2E 1E20 LD E,' ' 1A30 0118FC M1A30: LD BC,0FC18H 1A33 CD2A19 CALL M192A 1A36 019CFF LD BC,0FF9CH 1A39 CD2A19 CALL M192A 1A3C 0EF6 LD C,0F6H 1A3E CD2A19 CALL M192A 1A41 7D LD A,L 1A42 CDEF15 M1A42: CALL M15EF 1A45 E1 POP HL 1A46 D1 POP DE 1A47 C9 RET ;===================================================== ;Basicbefehlsinterpretation ;Offsettabelle der Basicbefehle fuer die Zweite Tabelle 1A48 B1 BEFOFF: DEFB PADEFN-$ 1A49 CB DEFB PACAT-$ 1A4A BC DEFB PAFORM-$ 1A4B BF DEFB PAMOVE-$ 1A4C C4 DEFB PAERAS-$ 1A4D AF DEFB PAOPEN-$ 1A4E B4 DEFB PACLOS-$ 1A4F 93 DEFB PAMERG-$ 1A50 91 DEFB PAVERI-$ 1A51 92 DEFB PABEEP-$ 1A52 95 DEFB PACIRC-$ 1A53 98 DEFB PAINK-$ 1A54 98 DEFB PAPAPE-$ 1A55 98 DEFB PAFLAS-$ 1A56 98 DEFB PABRIG-$ 1A57 98 DEFB PAINVE-$ 1A58 98 DEFB PAOVER-$ 1A59 98 DEFB PAOUT-$ 1A5A 7F DEFB PALPRI-$ 1A5B 81 DEFB PALLIS-$ 1A5C 2E DEFB PASTOP-$ 1A5D 6C DEFB PAREAD-$ 1A5E 6E DEFB PADATA-$ 1A5F 70 DEFB PAREST-$ 1A60 48 DEFB PANEW-$ 1A61 94 DEFB PABORD-$ 1A62 56 DEFB PACONT-$ 1A63 3F DEFB PADIM-$ 1A64 41 DEFB PAREM-$ 1A65 2B DEFB PAFOR-$ 1A66 17 DEFB PAGOTO-$ 1A67 1F DEFB PAGOSU-$ 1A68 37 DEFB PAINPU-$ 1A69 77 DEFB PALOAD-$ 1A6A 44 DEFB PALIST-$ 1A6B 0F DEFB PALET-$ 1A6C 59 DEFB PAPAUS-$ 1A6D 2B DEFB PANEXT-$ 1A6E 43 DEFB PAPOKE-$ 1A6F 2D DEFB PAPRIN-$ 1A70 51 DEFB PAPLOT-$ 1A71 3A DEFB PARUN-$ 1A72 6D DEFB PASAVE-$ 1A73 42 DEFB PARAND-$ 1A74 0D DEFB PAIF-$ 1A75 49 DEFB PACLS-$ 1A76 5C DEFB PADRAW-$ 1A77 44 DEFB PACLEA-$ 1A78 15 DEFB PARETU-$ 1A79 5D DEFB PACOPY-$ ;Parametertabelle fuer die Befehle ;Bytes im Bereich von 00...0BH geben die weiteren ;notwendigen Parameter fuer die einzelnen Befehle an ;PAR00: keine weiteren Parameter ;PAR01: bei LET, eine Variable wird gebraucht ;PAR02: ein numerischer/String-Ausdruck muss folgen ;PAR03: numerischer Ausdruck kann folgen, sonst 0 ;PAR04: eine einfache Variable muss folgen ;PAR05: ein Parametersatz kann folgen ;PAR06: ein numerischer Ausdruck muss folgen ;PAR07: Farbenbehandlung etc. ;PAR08: zwei durch ',' geterennte, numerische Ausdruecke ;PAR09: wie 08,aber Farbenausdruecke duerfen vorangehen ;PAR0A: ein String-Ausdruck muss folgen ;PAR0B: bearbeitet Kassettenroutinen 1A7A 01 PALET: DEFB 1 1A7B 3D DEFB '=' 1A7C 02 DEFB 2 1A7D 06 PAGOTO: DEFB 6 1A7E 00 DEFB 0 1A7F 671E DEFW M1E67 1A81 06 PAIF: DEFB 6 1A82 CB DEFB 0CBH 1A83 05 DEFB 5 1A84 F01C DEFW M1CF0 1A86 06 PAGOSU: DEFB 6 1A87 00 DEFB 0 1A88 ED1E DEFW M1EED 1A8A 00 PASTOP: DEFB 0 1A8B EE1C DEFW M1CEE 1A8D 00 PARETU: DEFB 0 1A8E 231F DEFW M1F23 1A90 04 PAFOR: DEFB 4 1A91 3D DEFB '=' 1A92 06 DEFB 6 1A93 CC DEFB 0CCH 1A94 06 DEFB 6 1A95 05 DEFB 5 1A96 031D DEFW M1D03 1A98 04 PANEXT: DEFB 4 1A99 00 DEFB 0 1A9A AB1D DEFW M1DAB 1A9C 05 PAPRIN: DEFB 5 1A9D CD1F DEFW M1FCD 1A9F 05 PAINPU: DEFB 5 1AA0 8920 DEFW M2089 1AA2 05 PADIM: DEFB 5 1AA3 022C DEFW M2C02 1AA5 05 PAREM: DEFB 5 1AA6 B21B DEFW M1BB2 1AA8 00 PANEW: DEFB 0 1AA9 B711 DEFW NEW 1AAB 03 PARUN: DEFB 3 1AAC A11E DEFW M1EA1 1AAE 05 PALIST: DEFB 5 1AAF F917 DEFW M17F9 1AB1 08 PAPOKE: DEFB 8 1AB2 00 DEFB 0 1AB3 801E DEFW M1E80 1AB5 03 PARAND: DEFB 3 1AB6 4F1E DEFW M1E4F 1AB8 00 PACONT: DEFB 0 1AB9 5F1E DEFW M1E5F 1ABB 03 PACLEA: DEFB 3 1ABC AC1E DEFW M1EAC 1ABE 00 PACLS: DEFB 0 1ABF 6B0D DEFW M0D6B 1AC1 09 PAPLOT: DEFB 9 1AC2 00 DEFB 0 1AC3 DC22 DEFW PLOTHA 1AC5 06 PAPAUS: DEFB 6 1AC6 00 DEFB 0 1AC7 3A1F DEFW M1F3A 1AC9 05 PAREAD: DEFB 5 1ACA ED1D DEFW M1DED 1ACC 05 PADATA: DEFB 5 1ACD 271E DEFW M1E27 1ACF 03 PAREST: DEFB 3 1AD0 421E DEFW M1E42 1AD2 09 PADRAW: DEFB 9 1AD3 05 DEFB 5 1AD4 8223 DEFW M2382 1AD6 00 PACOPY: DEFB 0 1AD7 AC0E DEFW M0EAC 1AD9 05 PALPRI: DEFB 5 1ADA C91F DEFW M1FC9 1ADC 05 PALLIS: DEFB 5 1ADD F517 DEFW M17F5 1ADF 0B PASAVE: DEFB 0BH 1AE0 0B PALOAD: DEFB 0BH 1AE1 0B PAVERI: DEFB 0BH 1AE2 0B PAMERG: DEFB 0BH 1AE3 08 PABEEP: DEFB 8 1AE4 00 DEFB 0 1AE5 F803 DEFW M03F8 1AE7 09 PACIRC: DEFB 9 1AE8 05 DEFB 5 1AE9 2023 DEFW KREIS 1AEB 07 PAINK: DEFB 7 1AEC 07 PAPAPE: DEFB 7 1AED 07 PAFLAS: DEFB 7 1AEE 07 PABRIG: DEFB 7 1AEF 07 PAINVE: DEFB 7 1AF0 07 PAOVER: DEFB 7 1AF1 08 PAOUT: DEFB 8 1AF2 00 DEFB 0 1AF3 7A1E DEFW M1E7A 1AF5 06 PABORD: DEFB 6 1AF6 00 DEFB 0 1AF7 9422 DEFW M2294 1AF9 05 PADEFN: DEFB 5 1AFA 601F DEFW M1F60 1AFC 06 PAOPEN: DEFB 6 1AFD 2C DEFB ',' 1AFE 0A DEFB 0AH 1AFF 00 DEFB 0 1B00 3617 DEFW STROPE 1B02 06 PACLOS: DEFB 6 1B03 00 DEFB 0 1B04 E516 DEFW M16E5 1B06 0A PAFORM: DEFB 0AH 1B07 00 DEFB 0 1B08 9317 DEFW M1793 1B0A 0A PAMOVE: DEFB 0AH 1B0B 2C DEFB ',' 1B0C 0A DEFB 0AH 1B0D 00 DEFB 0 1B0E 9317 DEFW M1793 1B10 0A PAERAS: DEFB 0AH 1B11 00 DEFB 0 1B12 9317 DEFW M1793 1B14 00 PACAT: DEFB 0 1B15 9317 DEFW M1793 ;======================================================= ;Hauptroutine des Basicinterpreters mit Syntaxpruefung 1B17 FDCB01BE M1B17: RES 7,(IY+1) 1B1B CDFB19 CALL M19FB 1B1E AF XOR A 1B1F 32475C LD (SUBPPC),A ;Zeiger auf Befehl der Zeile 1B22 3D DEC A 1B23 323A5C LD (ERRNR),A 1B26 1801 JR M1B29 1B28 E7 M1B28: RST GETNXT 1B29 CDBF16 M1B29: CALL CLRWOR 1B2C FD340D INC (IY+0DH) 1B2F FA8A1C JP M,M1C8A 1B32 DF RST GETAKT 1B33 0600 LD B,0 1B35 FE0D CP 0DH 1B37 287A JR Z,M1BB3 1B39 FE3A CP ':' 1B3B 28EB JR Z,M1B28 1B3D 21761B LD HL,BRKTST 1B40 E5 PUSH HL 1B41 4F LD C,A 1B42 E7 RST GETNXT 1B43 79 LD A,C 1B44 D6CE SUB 0CEH 1B46 DA8A1C JP C,M1C8A 1B49 4F LD C,A 1B4A 21481A LD HL,BEFOFF 1B4D 09 ADD HL,BC 1B4E 4E LD C,(HL) 1B4F 09 ADD HL,BC 1B50 1803 JR M1B55 ;die Parameter der Befehle werden ausgewertet 1B52 2A745C PARHOL: LD HL,(TADDR) ;Adresse des naechsten Tokens in der Tabelle 1B55 7E M1B55: LD A,(HL) 1B56 23 INC HL 1B57 22745C LD (TADDR),HL ;Adresse des naechsten Tokens in der Tabelle 1B5A 01521B LD BC,PARHOL 1B5D C5 PUSH BC 1B5E 4F LD C,A 1B5F FE20 CP ' ' 1B61 300C JR NC,M1B6F 1B63 21011C LD HL,M1C01 1B66 0600 LD B,0 1B68 09 ADD HL,BC 1B69 4E LD C,(HL) 1B6A 09 ADD HL,BC 1B6B E5 PUSH HL 1B6C DF RST GETAKT 1B6D 05 DEC B 1B6E C9 RET ;der Seperator gemaess Parametertabelle, steht in Reg. C ;muss an dieser Stelle in der Zeile zu finden sein 1B6F DF M1B6F: RST GETAKT 1B70 B9 CP C 1B71 C28A1C JP NZ,M1C8A 1B74 E7 RST GETNXT 1B75 C9 RET ;nach jedem richtigen Befehl wird an dieser Stelle, zum ;Pruefen der Breaktaste, zurueckgekehrt 1B76 CD541F BRKTST: CALL M1F54 1B79 3802 JR C,M1B7D 1B7B CF RST ERRAUS 1B7C 14 DEFB 14H 1B7D FDCB0A7E M1B7D: BIT 7,(IY+0AH) 1B81 2071 JR NZ,M1BF4 1B83 2A425C LD HL,(NEWPPC) ;Zeilennummer wohin gesprungen wird (GO TO ...) 1B86 CB7C BIT 7,H 1B88 2814 JR Z,M1B9E ;Routine fuer 'RUN' ;das Syntax/RUN- Flag (7 von FLAGS) ist dann gesetzt 1B8A 21FEFF M1B8A: LD HL,0FFFEH 1B8D 22455C LD (PPC),HL ;aktuelle Nr. der Basiczeile 1B90 2A615C LD HL,(WORKSP) ;derzeitiger Workspace 1B93 2B DEC HL 1B94 ED5B595C LD DE,(ELINE) ;Adresse des eingegebenen Befehls 1B98 1B DEC DE 1B99 3A445C LD A,(NSPPC) ;Befehl der Zeile bei Sprung 1B9C 1833 JR M1BD1 ;neue Zeile nach einem Sprungbefehl suchen 1B9E CD6E19 M1B9E: CALL M196E 1BA1 3A445C LD A,(NSPPC) ;Befehl der Zeile bei Sprung 1BA4 2819 JR Z,M1BBF 1BA6 A7 AND A 1BA7 2043 JR NZ,M1BEC 1BA9 47 LD B,A 1BAA 7E LD A,(HL) 1BAB E6C0 AND 0C0H 1BAD 78 LD A,B 1BAE 280F JR Z,M1BBF 1BB0 CF RST ERRAUS 1BB1 FF DEFB 0FFH ;Einstieg bei dem Befehl 'REM' ;durch entfernen der Returnadresse BRKTST wird der Rest ;der Zeile ignoriert 1BB2 C1 M1BB2: POP BC ;Behandlung der Zeile, wenn das Ende gefunden wurde 1BB3 CD3025 M1BB3: CALL M2530 1BB6 C8 RET Z 1BB7 2A555C LD HL,(NXTLIN) ;Adresse der naechsten Basiczeile 1BBA 3EC0 LD A,0C0H 1BBC A6 AND (HL) 1BBD C0 RET NZ 1BBE AF XOR A ;diese Routine holt die neue Zeilennummer nach 'PPC' ;und sucht den Beginn der darauffolgenden Zeile 1BBF FE01 M1BBF: CP 1 1BC1 CE00 ADC A,0 1BC3 56 LD D,(HL) 1BC4 23 INC HL 1BC5 5E LD E,(HL) 1BC6 ED53455C LD (PPC),DE ;aktuelle Nr. der Basiczeile 1BCA 23 INC HL 1BCB 5E LD E,(HL) 1BCC 23 INC HL 1BCD 56 LD D,(HL) 1BCE EB EX DE,HL 1BCF 19 ADD HL,DE 1BD0 23 INC HL ;Variable fuer naechste Zeile setzen 1BD1 22555C M1BD1: LD (NXTLIN),HL ;Adresse der naechsten Basiczeile 1BD4 EB EX DE,HL 1BD5 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 1BD8 57 LD D,A 1BD9 1E00 LD E,0 1BDB FD360AFF LD (IY+0AH),0FFH 1BDF 15 DEC D 1BE0 FD720D LD (IY+0DH),D 1BE3 CA281B JP Z,M1B28 1BE6 14 INC D 1BE7 CD8B19 CALL M198B 1BEA 2808 JR Z,M1BF4 1BEC CF M1BEC: RST ERRAUS 1BED 16 DEFB 16H 1BEE CD3025 M1BEE: CALL M2530 1BF1 C0 RET NZ 1BF2 C1 POP BC 1BF3 C1 POP BC ;naechsten Befehl finden: ;bei Carriage Return in der naechsten Zeile, bei ;':' in der gleichen Zeile. ;alle anderen Zeichen bedeuten Syntax-Error 1BF4 DF M1BF4: RST GETAKT 1BF5 FE0D CP 0DH 1BF7 28BA JR Z,M1BB3 1BF9 FE3A CP ':' 1BFB CA281B JP Z,M1B28 1BFE C38A1C JP M1C8A 1C01 0F M1C01: DEFB PAR00-$ 1C02 1D DEFB PAR01-$ 1C03 4B DEFB PAR02-$ 1C04 09 DEFB PAR03-$ 1C05 67 DEFB PAR04-$ 1C06 0B DEFB PAR05-$ 1C07 7B DEFB PAR06-$ 1C08 8E DEFB PAR07-$ 1C09 71 DEFB PAR08-$ 1C0A B4 DEFB PAR09-$ 1C0B 81 DEFB PAR0A-$ 1C0C CF DEFB PAR0B-$ ;Parameter 03: es kann eine Zahl folgen 1C0D CDDE1C PAR03: CALL M1CDE ;Parameter 00: es duerfen keine Angaben folgen z.B. COPY 1C10 BF PAR00: CP A ;Parameter 05: es koennen Ausdruecke folgen: ;z.B. PRINT"SPECTRUM" 1C11 C1 PAR05: POP BC 1C12 CCEE1B CALL Z,M1BEE 1C15 EB EX DE,HL ;jetzt kann nach erfolgter Pruefung, aus der Parametertabelle ;der einzelnen Befehle die Sprungadresse geladen und auf den ;STACK geschoben werden 1C16 2A745C M1C16: LD HL,(TADDR) ;Adresse des naechsten Tokens in der Tabelle 1C19 4E LD C,(HL) 1C1A 23 INC HL 1C1B 46 LD B,(HL) 1C1C EB EX DE,HL 1C1D C5 PUSH BC 1C1E C9 RET ;Parameter 01: Variablenzuweisung bei LET 1C1F CDB228 PAR01: CALL M28B2 1C22 FD363700 M1C22: LD (IY+37H),0 1C26 3008 JR NC,M1C30 1C28 FDCB37CE SET 1,(IY+37H) 1C2C 2018 JR NZ,M1C46 1C2E CF M1C2E: RST ERRAUS 1C2F 01 DEFB 1 1C30 CC9629 M1C30: CALL Z,M2996 1C33 FDCB0176 BIT 6,(IY+1) 1C37 200D JR NZ,M1C46 1C39 AF XOR A 1C3A CD3025 CALL M2530 1C3D C4F12B CALL NZ,M2BF1 1C40 21715C LD HL,FLAGX ;Flag Teil 3 1C43 B6 OR (HL) 1C44 77 LD (HL),A 1C45 EB EX DE,HL ;fuer alle numerischen und neuen String- oder ;Stringarrayvariablen enthaelt C den Variablennamen. ;Fuer alte String- oder Stringarrayvariable enthaelt BC ;die Laenge fuer die Zuweisung. 1C46 ED43725C M1C46: LD (STRLEN),BC ;Laenge eines Strings 1C4A 224D5C LD (DEST),HL ;Variablenadresse bei Zuweisung 1C4D C9 RET ;Parameter 02: aktuelle Berechnung fuer Zuweisung einer ;Variablen in einem LET-Befehl durchfuehren 1C4E C1 PAR02: POP BC 1C4F CD561C CALL M1C56 1C52 CDEE1B CALL M1BEE 1C55 C9 RET ;Diese Routine wird von LET, READ und INPUT benutzt um ;erst eine Variable zu berechnen und diese dann zuzuweisen. ;INPUT benutzt FLAGX und steigt beim zweiten Befehl ein. 1C56 3A3B5C M1C56: LD A,(FLAGS) ;Bit 1= Printer ein 1C59 F5 M1C59: PUSH AF 1C5A CDFB24 CALL AUSDRU 1C5D F1 POP AF 1C5E FD5601 LD D,(IY+1) 1C61 AA XOR D 1C62 E640 AND 40H 1C64 2024 JR NZ,M1C8A 1C66 CB7A BIT 7,D 1C68 C2FF2A JP NZ,M2AFF 1C6B C9 RET ;Parameter 04: Einstieg fuer FOR..NEXT - Befehle 1C6C CDB228 PAR04: CALL M28B2 1C6F F5 PUSH AF 1C70 79 LD A,C 1C71 F69F OR 09FH 1C73 3C INC A 1C74 2014 JR NZ,M1C8A 1C76 F1 POP AF 1C77 18A9 JR M1C22 ;Die folgenden Routinen dienen dem Berechnen von ;numerischen Ausdruecken. Das jeweilige Ergebnis kommt ;als letztes auf den Calculatorstack. ;Der erste Einstiegspunkt dient dem Berechnen von zwei ;durch Komma getrennten Ausdruecken (PAR 08). 1C79 E7 M1C79: RST GETNXT 1C7A CD821C PAR08: CALL PAR06 1C7D FE2C CP ',' 1C7F 2009 JR NZ,M1C8A 1C81 E7 RST GETNXT ;ab hier nur einen Ausdruck berechnen 1C82 CDFB24 PAR06: CALL AUSDRU 1C85 FDCB0176 BIT 6,(IY+1) 1C89 C0 RET NZ 1C8A CF M1C8A: RST ERRAUS 1C8B 0B DEFB 0BH ;Berechnung eines einfachen String-Ausdrucks 1C8C CDFB24 PAR0A: CALL AUSDRU 1C8F FDCB0176 BIT 6,(IY+1) 1C93 C8 RET Z 1C94 18F4 JR M1C8A ;Parameter 07: setzen der dauerhaften Farben 1C96 FDCB017E PAR07: BIT 7,(IY+1) 1C9A FDCB0286 RES 0,(IY+2) 1C9E C44D0D CALL NZ,AKTCOL 1CA1 F1 POP AF 1CA2 3A745C LD A,(TADDR) ;Adresse des naechsten Tokens in der Tabelle 1CA5 D613 SUB 13H 1CA7 CDFC21 CALL M21FC 1CAA CDEE1B CALL M1BEE 1CAD 2A8F5C LD HL,(ATTRT) ;aktuelle Farben temporaer 1CB0 228D5C LD (ATTRP),HL ;aktuelle Farben permanent 1CB3 21915C LD HL,PFLAG ;Printerflag 1CB6 7E LD A,(HL) 1CB7 07 RLCA 1CB8 AE XOR (HL) 1CB9 E6AA AND 0AAH 1CBB AE XOR (HL) 1CBC 77 LD (HL),A 1CBD C9 RET ;Parameter 09: Diese Routine wird von PLOT, DRAW und ;CIRCLE benutzt, um erst einmal Defaultwerte von ;FLASH, BRIGHT und PAPER auf 8 zu setzen. 1CBE CD3025 PAR09: CALL M2530 1CC1 2813 JR Z,M1CD6 1CC3 FDCB0286 RES 0,(IY+2) 1CC7 CD4D0D CALL AKTCOL 1CCA 21905C LD HL,MASKT ;aktuelle Farbe transp./temp. 1CCD 7E LD A,(HL) 1CCE F6F8 OR 0F8H 1CD0 77 LD (HL),A 1CD1 FDCB57B6 RES 6,(IY+57H) 1CD5 DF RST GETAKT 1CD6 CDE221 M1CD6: CALL FAREIN 1CD9 189F JR PAR08 ;Parameter 0B: alle Kassettenroutinen 1CDB C30506 PAR0B: JP KASHAU ;Routine um einen numerischen Ausdruck zu berechnen. ;Es wird der Wert Null uebergeben, falls kein Ausdruck ;vorhanden ist. 1CDE FE0D M1CDE: CP 0DH 1CE0 2804 JR Z,M1CE6 1CE2 FE3A CP ':' 1CE4 209C JR NZ,PAR06 ;sonst den Calculator benutzen und eine Null im ;Caculatorstack addieren. 1CE6 CD3025 M1CE6: CALL M2530 1CE9 C8 RET Z 1CEA EF RST CALRUF 1CEB A0 DEFB 0A0H 1CEC 38 DEFB 38H 1CED C9 RET ;die folgenden Routinen dienen der Befehlsausfuehrung 1CEE CF M1CEE: RST ERRAUS 1CEF 08 DEFB 8 ;Befehl IF 1CF0 C1 M1CF0: POP BC 1CF1 CD3025 CALL M2530 1CF4 280A JR Z,M1D00 1CF6 EF RST CALRUF 1CF7 02 DEFB 2 1CF8 38 DEFB 38H 1CF9 EB EX DE,HL 1CFA CDE934 CALL M34E9 1CFD DAB31B JP C,M1BB3 1D00 C3291B M1D00: JP M1B29 ;Befehl FOR 1D03 FECD M1D03: CP 0CDH 1D05 2009 JR NZ,M1D10 1D07 E7 RST GETNXT 1D08 CD821C CALL PAR06 1D0B CDEE1B CALL M1BEE 1D0E 1806 JR M1D16 1D10 CDEE1B M1D10: CALL M1BEE 1D13 EF RST CALRUF 1D14 A1 DEFB 0A1H 1D15 38 DEFB 38H ;die letzten drei Werte des Calculatorstacks sind: ;der Wert der Variablen (W), die Obergrenze (O) und ;die Schrittweite 1D16 EF M1D16: RST CALRUF 1D17 C0 DEFB 0C0H 1D18 02 DEFB 2 1D19 01 DEFB 1 1D1A E0 DEFB 0E0H 1D1B 01 DEFB 1 1D1C 38 DEFB 38H 1D1D CDFF2A CALL M2AFF 1D20 22685C LD (MEM),HL 1D23 2B DEC HL 1D24 7E LD A,(HL) 1D25 CBFE SET 7,(HL) 1D27 010600 LD BC,6 1D2A 09 ADD HL,BC 1D2B 07 RLCA 1D2C 3806 JR C,M1D34 1D2E 0E0D LD C,0DH 1D30 CD5516 CALL MACHPL 1D33 23 INC HL 1D34 E5 M1D34: PUSH HL 1D35 EF RST CALRUF 1D36 02 DEFB 2 1D37 02 DEFB 2 1D38 38 DEFB 38H 1D39 E1 POP HL 1D3A EB EX DE,HL 1D3B 0E0A LD C,10 1D3D EDB0 LDIR 1D3F 2A455C LD HL,(PPC) ;aktuelle Nr. der Basiczeile 1D42 EB EX DE,HL 1D43 73 LD (HL),E 1D44 23 INC HL 1D45 72 LD (HL),D 1D46 FD560D LD D,(IY+0DH) 1D49 14 INC D 1D4A 23 INC HL 1D4B 72 LD (HL),D ;Es folgt der Test, ob eine FOR-NEXT-Schleife auge- ;fuehrt werden kann. Wenn ja: RETURN, sonst muss ;naechster Befehl hinter NEXT gefunden werden. 1D4C CDDA1D CALL M1DDA 1D4F D0 RET NC 1D50 FD4638 LD B,(IY+38H) 1D53 2A455C LD HL,(PPC) ;aktuelle Nr. der Basiczeile 1D56 22425C LD (NEWPPC),HL ;Zeilennummer wohin gesprungen wird (GO TO ...) 1D59 3A475C LD A,(SUBPPC) ;Zeiger auf Befehl der Zeile 1D5C ED44 NEG 1D5E 57 LD D,A 1D5F 2A5D5C LD HL,(CHADD) ;Adr. des naechsten zu interpret. Zeichens 1D62 1EF3 LD E,0F3H 1D64 C5 M1D64: PUSH BC 1D65 ED4B555C LD BC,(NXTLIN) ;Adresse der naechsten Basiczeile 1D69 CD861D CALL M1D86 1D6C ED43555C LD (NXTLIN),BC ;Adresse der naechsten Basiczeile 1D70 C1 POP BC 1D71 3811 JR C,M1D84 1D73 E7 RST GETNXT 1D74 F620 OR 20H 1D76 B8 CP B 1D77 2803 JR Z,M1D7C 1D79 E7 RST GETNXT 1D7A 18E8 JR M1D64 ;NEWPPC enthaelt nun die Zeilennummer, in der das ;richtige NEXT-Statement gefunden wurde. Die Befehlszahl ;des 'NEXT' wird gesucht und in NSPPC gespeichert. 1D7C E7 M1D7C: RST GETNXT 1D7D 3E01 LD A,1 1D7F 92 SUB D 1D80 32445C LD (NSPPC),A ;Befehl der Zeile bei Sprung 1D83 C9 RET 1D84 CF M1D84: RST ERRAUS 1D85 11 DEFB 011H ;Diese Routine durchsucht das Programm nach 'DATA', ;'DEF FN' und 'NEXT'. Token im Register E und Start- ;adresse des Suchens in HL. 1D86 7E M1D86: LD A,(HL) 1D87 FE3A CP ':' 1D89 2818 JR Z,M1DA3 1D8B 23 M1D8B: INC HL 1D8C 7E LD A,(HL) 1D8D E6C0 AND 0C0H 1D8F 37 SCF 1D90 C0 RET NZ 1D91 46 LD B,(HL) 1D92 23 INC HL 1D93 4E LD C,(HL) 1D94 ED43425C LD (NEWPPC),BC ;Zeilennummer wohin gesprungen wird (GO TO ...) 1D98 23 INC HL 1D99 4E LD C,(HL) 1D9A 23 INC HL 1D9B 46 LD B,(HL) 1D9C E5 PUSH HL 1D9D 09 ADD HL,BC 1D9E 44 LD B,H 1D9F 4D LD C,L 1DA0 E1 POP HL 1DA1 1600 LD D,0 1DA3 C5 M1DA3: PUSH BC 1DA4 CD8B19 CALL M198B 1DA7 C1 POP BC 1DA8 D0 RET NC 1DA9 18E0 JR M1D8B ;Befehl NEXT ;die Laufvariable wird um den STEP-WERT erhoeht 1DAB FDCB374E M1DAB: BIT 1,(IY+37H) 1DAF C22E1C JP NZ,M1C2E 1DB2 2A4D5C LD HL,(DEST) ;Variablenadresse bei Zuweisung 1DB5 CB7E BIT 7,(HL) 1DB7 281F JR Z,M1DD8 1DB9 23 INC HL 1DBA 22685C LD (MEM),HL ;Zeiger auf Calculatorspeicher 1DBD EF RST CALRUF 1DBE E0 DEFB 0E0H 1DBF E2 DEFB 0E2H 1DC0 0F DEFB 0FH 1DC1 C0 DEFB 0C0H 1DC2 02 DEFB 2 1DC3 38 DEFB 38H 1DC4 CDDA1D CALL M1DDA 1DC7 D8 RET C 1DC8 2A685C LD HL,(MEM) ;Zeiger auf Calculatorspeicher 1DCB 110F00 LD DE,0FH 1DCE 19 ADD HL,DE 1DCF 5E LD E,(HL) 1DD0 23 INC HL 1DD1 56 LD D,(HL) 1DD2 23 INC HL 1DD3 66 LD H,(HL) 1DD4 EB EX DE,HL 1DD5 C3731E JP M1E73 1DD8 CF M1DD8: RST ERRAUS 1DD9 00 NOP ;Ueberpruefung, ob die Ober-/Untergrenze einer FOR- ;NEXT-Schleife erreicht (je nach Vorzeichen von STEP) 1DDA EF M1DDA: RST CALRUF 1DDB E1 DEFB 0E1H 1DDC E0 DEFB 0E0H 1DDD E2 DEFB 0E2H 1DDE 36 DEFB 36H 1DDF 00 DEFB 0 1DE0 02 DEFB NXTNEG-$ 1DE1 01 DEFB 1 1DE2 03 NXTNEG: DEFB 3 1DE3 37 DEFB 37H 1DE4 00 DEFB 0 1DE5 04 DEFB NXTEND-$ 1DE6 38 DEFB 38H 1DE7 A7 AND A 1DE8 C9 RET 1DE9 38 NXTEND: DEFB 38H 1DEA 37 SCF 1DEB C9 RET ;Befehl READ ;CHADD wird als Zeiger entlang der einzelnen DATA-Statements ;benutzt. DATADD zeigt auf das aktuelle Element der Daten- ;liste (noetig fuer mehrere READ-Befehle) 1DEC E7 M1DEC: RST GETNXT 1DED CD1F1C M1DED: CALL PAR01 1DF0 CD3025 CALL M2530 1DF3 2829 JR Z,M1E1E 1DF5 DF RST GETAKT 1DF6 225F5C LD (XPTR),HL ;Adresse des Zeichens nach ? bei Error 1DF9 2A575C LD HL,(DATADD) ;Zeiger auf Endbyte der letzten Daten 1DFC 7E LD A,(HL) 1DFD FE2C CP ',' 1DFF 2809 JR Z,M1E0A 1E01 1EE4 LD E,0E4H 1E03 CD861D CALL M1D86 1E06 3002 JR NC,M1E0A 1E08 CF RST ERRAUS 1E09 0D DEFB 0DH 1E0A CD7700 M1E0A: CALL M0077 1E0D CD561C CALL M1C56 1E10 DF RST GETAKT 1E11 22575C LD (DATADD),HL ;Zeiger auf Endbyte der letzten Daten 1E14 2A5F5C LD HL,(XPTR) ;Adresse des Zeichens nach ? bei Error 1E17 FD362600 LD (IY+26H),0 1E1B CD7800 CALL M0078 1E1E DF M1E1E: RST GETAKT 1E1F FE2C CP ',' 1E21 28C9 JR Z,M1DEC 1E23 CDEE1B CALL M1BEE 1E26 C9 RET ;Befehl DATA ;beim Programmlauf werden die DATA-Statements uebersprungen 1E27 CD3025 M1E27: CALL M2530 1E2A 200B JR NZ,M1E37 1E2C CDFB24 M1E2C: CALL AUSDRU 1E2F FE2C CP ',' 1E31 C4EE1B CALL NZ,M1BEE 1E34 E7 RST GETNXT 1E35 18F5 JR M1E2C 1E37 3EE4 M1E37: LD A,0E4H ;Routine zum Ueberspringen von Programmteilen 1E39 47 M1E39: LD B,A 1E3A EDB9 CPDR 1E3C 110002 LD DE,200H 1E3F C38B19 JP M198B ;Befehl RESTORE ;ein Operand wird als Zeilennummer interpretiert, ;wenn keiner vorhanden, Defaultwert Null 1E42 CD991E M1E42: CALL M1E99 1E45 60 M1E45: LD H,B 1E46 69 LD L,C 1E47 CD6E19 CALL M196E 1E4A 2B DEC HL 1E4B 22575C LD (DATADD),HL ;Zeiger auf Endbyte der letzten Daten 1E4E C9 RET ;Befehl RANDOMIZE ;falls der Operand Null ist, wird statt dessen FRAMES ;als Ersatz genommen 1E4F CD991E M1E4F: CALL M1E99 1E52 78 LD A,B 1E53 B1 OR C 1E54 2004 JR NZ,M1E5A 1E56 ED4B785C LD BC,(FRAMES) ;3 Byte Bildzaehler (Uhr) 1E5A ED43765C M1E5A: LD (SEED),BC ;Zufallszahl setzen durch Randomize 1E5E C9 RET ;Befehl CONTINUE ;die entsprechenden Zeilen- und Befehlsnummern werden ;geladen, um dann ein 'GO TO' auszufuehren 1E5F 2A6E5C M1E5F: LD HL,(OLDPPC) ;Zeilennummer fuer Continue 1E62 FD5636 LD D,(IY+36H) 1E65 180C JR M1E73 ;Befehl GO TO ;die Zeilennummer sollte im Bereich von 0 - 9999 sein, ;es wird jedoch nur auf >61439 geprueft 1E67 CD991E M1E67: CALL M1E99 1E6A 60 LD H,B 1E6B 69 LD L,C 1E6C 1600 LD D,0 1E6E 7C LD A,H 1E6F FEF0 CP 0F0H 1E71 302C JR NC,M1E9F 1E73 22425C M1E73: LD (NEWPPC),HL ;Zeilennummer wohin gesprungen wird (GO TO ...) 1E76 FD720A LD (IY+0AH),D 1E79 C9 RET ;Befehl OUT ;die zwei Parameter werden vom Calculatorstack ;geholt und ausgegeben 1E7A CD851E M1E7A: CALL M1E85 1E7D ED79 OUT (C),A 1E7F C9 RET ;Befehl POKE ;die beiden Parameter werden, wie bei OUT, vom ;Calculatorstack genommen 1E80 CD851E M1E80: CALL M1E85 1E83 02 LD (BC),A 1E84 C9 RET ;Die zwei obersten Parameter vom Calculatorstack entnehmen: ;Der erste muss im Bereich von 0 - 255 sein, (es wird das ;Zweierkomplement gebildet, falls negativ), der Zweite im ;Bereich von 0 - 65535 sein (Integer) 1E85 CDD52D M1E85: CALL M2DD5 1E88 3815 JR C,M1E9F 1E8A 2802 JR Z,M1E8E 1E8C ED44 NEG 1E8E F5 M1E8E: PUSH AF 1E8F CD991E CALL M1E99 1E92 F1 POP AF 1E93 C9 RET ;Subroutine, um Integerzahlen vom Calculatorstack zu holen. ;INTEG1 fuer Zahlen von 0 - 255 (1 Byte) ;INTEG2 fuer Zahlen von 0 - 65535 (2 Byte) 1E94 CDD52D INTEG1: CALL M2DD5 1E97 1803 JR M1E9C 1E99 CDA22D M1E99: CALL M2DA2 1E9C 3801 M1E9C: JR C,M1E9F 1E9E C8 RET Z 1E9F CF M1E9F: RST ERRAUS 1EA0 0A DEFB 0AH ;Befehl RUN ;Parameter von RUN wird ueber GO TO zugewiesen, danach ;wird ein 'RESTORE 0' und 'CLEAR' ausgefuehrt 1EA1 CD671E M1EA1: CALL M1E67 1EA4 010000 LD BC,0 1EA7 CD451E CALL M1E45 1EAA 1803 JR M1EAF ;Befehl CLEAR ;hiermit werden die Variablen und der Bildschirm ;geloescht. RAMTOP und der Stack werden neu angelegt. 1EAC CD991E M1EAC: CALL M1E99 1EAF 78 M1EAF: LD A,B 1EB0 B1 OR C 1EB1 2004 JR NZ,M1EB7 1EB3 ED4BB25C LD BC,(RAMTOP) ;letzte Speicheradresse fuer Basic 1EB7 C5 M1EB7: PUSH BC 1EB8 ED5B4B5C LD DE,(VARS) ;Beginn der Variablen 1EBC 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 1EBF 2B DEC HL 1EC0 CDE519 CALL RAUS1 1EC3 CD6B0D CALL M0D6B 1EC6 2A655C LD HL,(STKEND) ;Anfang des freien Speichers 1EC9 113200 LD DE,032H 1ECC 19 ADD HL,DE 1ECD D1 POP DE 1ECE ED52 SBC HL,DE 1ED0 3008 JR NC,M1EDA 1ED2 2AB45C LD HL,(PRAMT) ;letzte Speicheradresse 1ED5 A7 AND A 1ED6 ED52 SBC HL,DE 1ED8 3002 JR NC,M1EDC 1EDA CF M1EDA: RST ERRAUS 1EDB 15 DEFB 15H 1EDC EB M1EDC: EX DE,HL 1EDD 22B25C LD (RAMTOP),HL ;letzte Speicheradresse fuer Basic 1EE0 D1 POP DE 1EE1 C1 POP BC 1EE2 363E LD (HL),3EH 1EE4 2B DEC HL 1EE5 F9 LD SP,HL 1EE6 C5 PUSH BC 1EE7 ED733D5C LD (ERRSP),SP ;Errorstackpointer 1EEB EB EX DE,HL 1EEC E9 JP (HL) ;Befehl GO SUB ;der aktuelle Wert von PPC und SUBPPC+1 werden im ;'GO SUB'-Stack gespeichert 1EED D1 M1EED: POP DE 1EEE FD660D LD H,(IY+0DH) 1EF1 24 INC H 1EF2 E3 EX (SP),HL 1EF3 33 INC SP 1EF4 ED4B455C LD BC,(PPC) ;aktuelle Nr. der Basiczeile 1EF8 C5 PUSH BC 1EF9 E5 PUSH HL 1EFA ED733D5C LD (ERRSP),SP ;Errorstackpointer 1EFE D5 PUSH DE 1EFF CD671E CALL M1E67 1F02 011400 LD BC,14H ;Testroutine fuer benoetigten Speicherplatz (in BC) 1F05 2A655C M1F05: LD HL,(STKEND) ;Anfang des freien Speichers 1F08 09 ADD HL,BC 1F09 380A JR C,M1F15 1F0B EB EX DE,HL 1F0C 215000 LD HL,50H 1F0F 19 ADD HL,DE 1F10 3803 JR C,M1F15 1F12 ED72 SBC HL,SP 1F14 D8 RET C ;Fehlermeldung 'OUT OF MEMORY' 1F15 2E03 M1F15: LD L,3 1F17 C35500 JP M0055 ;Routine zum Berechnen des freien Speicherplatzes (FRE) ;der freie Platz ergibt sich durch: PRINT65535-USR7962 1F1A 010000 M1F1A: LD BC,0 1F1D CD051F CALL M1F05 1F20 44 LD B,H 1F21 4D LD C,L 1F22 C9 RET ;Befhl RETURN ;Zeilennummer und Befehlszahl in der Zeile werden vom ;'GO SUB'-Stack genommen 1F23 C1 M1F23: POP BC 1F24 E1 POP HL 1F25 D1 POP DE 1F26 7A LD A,D 1F27 FE3E CP 3EH 1F29 280B JR Z,M1F36 1F2B 3B DEC SP 1F2C E3 EX (SP),HL 1F2D EB EX DE,HL 1F2E ED733D5C LD (ERRSP),SP ;Errorstackpointer 1F32 C5 PUSH BC 1F33 C3731E JP M1E73 1F36 D5 M1F36: PUSH DE 1F37 E5 PUSH HL 1F38 CF RST ERRAUS 1F39 06 DEFB 6 ;Befehl PAUSE ;Es werden hierbei die Interrupts gezaehlt, die 50 mal ;pro Sekunde (fuer die Tastaturabfrage) auftreten. Wenn ;eine Taste gedrueckt wird, wird die Pause ebenfalls beendet. 1F3A CD991E M1F3A: CALL M1E99 1F3D 76 M1F3D: HALT 1F3E 0B DEC BC 1F3F 78 LD A,B 1F40 B1 OR C 1F41 280C JR Z,M1F4F 1F43 78 LD A,B 1F44 A1 AND C 1F45 3C INC A 1F46 2001 JR NZ,M1F49 1F48 03 INC BC 1F49 FDCB016E M1F49: BIT 5,(IY+1) 1F4D 28EE JR Z,M1F3D 1F4F FDCB01AE M1F4F: RES 5,(IY+1) 1F53 C9 RET ;Subroutine, um auf gedrueckte Break-Taste zu pruefen 1F54 3E7F M1F54: LD A,7FH 1F56 DBFE IN A,(0FEH) 1F58 1F RRA 1F59 D8 RET C 1F5A 3EFE LD A,0FEH 1F5C DBFE IN A,(0FEH) 1F5E 1F RRA 1F5F C9 RET ;Befehl DEF FN ;Zur Laufzeit wird 'DEF FN' uebersprungen (wie DATA). ;Bei der Syntaxpruefung wird der Ausdruck geprueft. 1F60 CD3025 M1F60: CALL M2530 1F63 2805 JR Z,M1F6A 1F65 3ECE LD A,0CEH 1F67 C3391E JP M1E39 1F6A FDCB01F6 M1F6A: SET 6,(IY+1) 1F6E CD8D2C CALL M2C8D 1F71 3016 JR NC,M1F89 1F73 E7 RST GETNXT 1F74 FE24 CP '$' 1F76 2005 JR NZ,M1F7D 1F78 FDCB01B6 RES 6,(IY+1) 1F7C E7 RST GETNXT 1F7D FE28 M1F7D: CP '(' 1F7F 203C JR NZ,M1FBD 1F81 E7 RST GETNXT 1F82 FE29 CP ')' 1F84 2820 JR Z,M1FA6 ;Schleife, um alle Parameter nacheinander abzuarbeiten 1F86 CD8D2C M1F86: CALL M2C8D 1F89 D28A1C M1F89: JP NC,M1C8A 1F8C EB EX DE,HL 1F8D E7 RST GETNXT 1F8E FE24 CP '$' 1F90 2002 JR NZ,M1F94 1F92 EB EX DE,HL 1F93 E7 RST GETNXT 1F94 EB M1F94: EX DE,HL 1F95 010600 LD BC,6 1F98 CD5516 CALL MACHPL 1F9B 23 INC HL 1F9C 23 INC HL 1F9D 360E LD (HL),0EH 1F9F FE2C CP ',' 1FA1 2003 JR NZ,M1FA6 1FA3 E7 RST GETNXT 1FA4 18E0 JR M1F86 1FA6 FE29 M1FA6: CP ')' 1FA8 2013 JR NZ,M1FBD 1FAA E7 RST GETNXT 1FAB FE3D CP '=' 1FAD 200E JR NZ,M1FBD 1FAF E7 RST GETNXT 1FB0 3A3B5C LD A,(FLAGS) ;Bit 1= Printer ein 1FB3 F5 PUSH AF 1FB4 CDFB24 CALL AUSDRU 1FB7 F1 POP AF 1FB8 FDAE01 XOR (IY+1) 1FBB E640 AND 40H 1FBD C28A1C M1FBD: JP NZ,M1C8A 1FC0 CDEE1B CALL M1BEE ;Stackkorrekturroutine fuer verschiedene Gelegenheiten ;bei der Syntaxpruefung 1FC3 CD3025 M1FC3: CALL M2530 1FC6 E1 POP HL 1FC7 C8 RET Z 1FC8 E9 JP (HL) ;Befehle LPRINT und PRINT ;der erforderliche Kanal wird geoeffnet 1FC9 3E03 M1FC9: LD A,3 1FCB 1802 JR M1FCF 1FCD 3E02 M1FCD: LD A,2 1FCF CD3025 M1FCF: CALL M2530 1FD2 C40116 CALL NZ,OPKAN 1FD5 CD4D0D CALL AKTCOL 1FD8 CDDF1F CALL M1FDF 1FDB CDEE1B CALL M1BEE 1FDE C9 RET 1FDF DF M1FDF: RST GETAKT 1FE0 CD4520 CALL M2045 1FE3 280D JR Z,M1FF2 1FE5 CD4E20 M1FE5: CALL M204E 1FE8 28FB JR Z,M1FE5 1FEA CDFC1F CALL M1FFC 1FED CD4E20 CALL M204E 1FF0 28F3 JR Z,M1FE5 1FF2 FE29 M1FF2: CP ')' 1FF4 C8 RET Z ;Subroutine, um ein CARRIAGE RETURN auszudrucken, aber ;nur zur Laufzeit 1FF5 CDC31F M1FF5: CALL M1FC3 1FF8 3E0D LD A,0DH 1FFA D7 RST PRTOUT 1FFB C9 RET ;Subroutine zum Ausgeben von Ausdruecken bei PRINT etc. 1FFC DF M1FFC: RST GETAKT 1FFD FEAC CP 0ACH 1FFF 200D JR NZ,M200E 2001 CD791C CALL M1C79 2004 CDC31F CALL M1FC3 2007 CD0723 CALL M2307 200A 3E16 LD A,16H 200C 1810 JR M201E 200E FEAD M200E: CP 0ADH 2010 2012 JR NZ,M2024 2012 E7 RST GETNXT 2013 CD821C CALL PAR06 2016 CDC31F CALL M1FC3 2019 CD991E CALL M1E99 201C 3E17 LD A,17H 201E D7 M201E: RST PRTOUT 201F 79 LD A,C 2020 D7 RST PRTOUT 2021 78 LD A,B 2022 D7 RST PRTOUT 2023 C9 RET 2024 CDF221 M2024: CALL FARBUN 2027 D0 RET NC 2028 CD7020 CALL M2070 202B D0 RET NC ;die zu druckenden Zeichen muessen entweder ein String ;oder ein numerischer Ausdruck sein 202C CDFB24 CALL AUSDRU 202F CDC31F CALL M1FC3 2032 FDCB0176 BIT 6,(IY+1) 2036 CCF12B CALL Z,M2BF1 2039 C2E32D JP NZ,M2DE3 ;Ausgabeschleife fuer einen String 203C 78 M203C: LD A,B 203D B1 OR C 203E 0B DEC BC 203F C8 RET Z 2040 1A LD A,(DE) 2041 13 INC DE 2042 D7 RST PRTOUT 2043 18F7 JR M203C ;Subroutine zum Untersuchen, ob eine Ausgabe zu Ende ;ist. Trifft dies zu, so ist das ZERO-Flag gesetzt. 2045 FE29 M2045: CP ')' 2047 C8 RET Z 2048 FE0D M2048: CP 0DH 204A C8 RET Z 204B FE3A CP ':' 204D C9 RET ;Subroutine zum Positionieren beim Ausdrucken 204E DF M204E: RST GETAKT 204F FE3B CP ';' 2051 2814 JR Z,M2067 2053 FE2C CP ',' 2055 200A JR NZ,M2061 2057 CD3025 CALL M2530 205A 280B JR Z,M2067 205C 3E06 LD A,6 205E D7 RST PRTOUT 205F 1806 JR M2067 2061 FE27 M2061: CP 27H ;' 2063 C0 RET NZ 2064 CDF51F CALL M1FF5 2067 E7 M2067: RST GETNXT 2068 CD4520 CALL M2045 206B 2001 JR NZ,M206E 206D C1 POP BC 206E BF M206E: CP A 206F C9 RET ;Subroutine zum STREAM-aendern, falls der Benutzer ;es wuenscht 2070 FE23 M2070: CP '#' 2072 37 SCF 2073 C0 RET NZ 2074 E7 RST GETNXT 2075 CD821C CALL PAR06 2078 A7 AND A 2079 CDC31F CALL M1FC3 207C CD941E CALL INTEG1 207F FE10 CP 10H 2081 D20E16 JP NC,ISTREA 2084 CD0116 CALL OPKAN 2087 A7 AND A 2088 C9 RET ;Befehl INPUT ;eventuelle Ausgaben beim INPUT werden im unteren ;Bildschirmteil gedruckt 2089 CD3025 M2089: CALL M2530 208C 2808 JR Z,M2096 208E 3E01 LD A,1 2090 CD0116 CALL OPKAN 2093 CD6E0D CALL M0D6E 2096 FD360201 M2096: LD (IY+2),1 209A CDC120 CALL M20C1 209D CDEE1B CALL M1BEE 20A0 ED4B885C LD BC,(SPOSN) ;Zeile/Spalte fuer Print 20A4 3A6B5C LD A,(DFSZ) ;Zeilenanzahl+1 im unteren Bildschirmteil 20A7 B8 CP B 20A8 3803 JR C,M20AD 20AA 0E21 LD C,33 20AC 47 LD B,A 20AD ED43885C M20AD: LD (SPOSN),BC ;Zeile/Spalte fuer Print 20B1 3E19 LD A,25 20B3 90 SUB B 20B4 328C5C LD (SCRCT),A ;Scrollzaehler 20B7 FDCB0286 RES 0,(IY+2) 20BB CDD90D CALL M0DD9 20BE C36E0D JP M0D6E ;eigentliche INPUT-Routine 20C1 CD4E20 M20C1: CALL M204E 20C4 28FB JR Z,M20C1 20C6 FE28 CP '(' 20C8 200E JR NZ,M20D8 20CA E7 RST GETNXT 20CB CDDF1F CALL M1FDF 20CE DF RST GETAKT 20CF FE29 CP ')' 20D1 C28A1C JP NZ,M1C8A 20D4 E7 RST GETNXT 20D5 C3B221 JP M21B2 20D8 FECA M20D8: CP 0CAH 20DA 2011 JR NZ,M20ED 20DC E7 RST GETNXT 20DD CD1F1C CALL PAR01 20E0 FDCB37FE SET 7,(IY+37H) 20E4 FDCB0176 BIT 6,(IY+1) 20E8 C28A1C JP NZ,M1C8A 20EB 180D JR M20FA ;normale INPUT-Variablen 20ED CD8D2C M20ED: CALL M2C8D 20F0 D2AF21 JP NC,M21AF 20F3 CD1F1C CALL PAR01 20F6 FDCB37BE RES 7,(IY+37H) ;die PROMPT-Ausgabe wird im WORKSPACE aufgebaut 20FA CD3025 M20FA: CALL M2530 20FD CAB221 JP Z,M21B2 2100 CDBF16 CALL CLRWOR 2103 21715C LD HL,FLAGX ;Flag Teil 3 2106 CBB6 RES 6,(HL) 2108 CBEE SET 5,(HL) 210A 010100 LD BC,1 210D CB7E BIT 7,(HL) 210F 200B JR NZ,M211C 2111 3A3B5C LD A,(FLAGS) ;Bit 1= Printer ein 2114 E640 AND 40H 2116 2002 JR NZ,M211A 2118 0E03 LD C,3 211A B6 M211A: OR (HL) 211B 77 LD (HL),A 211C F7 M211C: RST REST30 211D 360D LD (HL),0DH 211F 79 LD A,C 2120 0F RRCA 2121 0F RRCA 2122 3005 JR NC,M2129 2124 3E22 LD A,'"' 2126 12 LD (DE),A 2127 2B DEC HL 2128 77 LD (HL),A 2129 225B5C M2129: LD (KCUR),HL ;Kursoradresse 212C FDCB377E BIT 7,(IY+37H) 2130 202C JR NZ,M215E 2132 2A5D5C LD HL,(CHADD) ;Adr. des naechsten zu interpret. Zeichens 2135 E5 PUSH HL 2136 2A3D5C LD HL,(ERRSP) ;Errorstackpointer 2139 E5 PUSH HL 213A 213A21 LD HL,$ 213D E5 PUSH HL 213E FDCB3066 BIT 4,(IY+30H) 2142 2804 JR Z,M2148 2144 ED733D5C LD (ERRSP),SP ;Errorstackpointer 2148 2A615C M2148: LD HL,(WORKSP) ;derzeitiger Workspace 214B CDA711 CALL HOLFLO 214E FD3600FF LD (IY+0),0FFH 2152 CD2C0F CALL M0F2C 2155 FDCB01BE RES 7,(IY+1) 2159 CDB921 CALL M21B9 215C 1803 JR M2161 215E CD2C0F M215E: CALL 0F2CH 2161 FD362200 M2161: LD (IY+22H),0 2165 CDD621 CALL M21D6 2168 200A JR NZ,M2174 216A CD1D11 CALL M111D 216D ED4B825C LD BC,(ECHOE) ;Position fuer Input 2171 CDD90D CALL M0DD9 2174 21715C M2174 LD HL,FLAGX ;Flag Teil 3 2177 CBAE RES 5,(HL) 2179 CB7E BIT 7,(HL) 217B CBBE RES 7,(HL) 217D 201C JR NZ,M219B 217F E1 POP HL 2180 E1 POP HL 2181 223D5C LD (ERRSP),HL ;Errorstackpointer 2184 E1 POP HL 2185 225F5C LD (XPTR),HL ;Adresse des Zeichens nach ? bei Error 2188 FDCB01FE SET 7,(IY+1) 218C CDB921 CALL M21B9 218F 2A5F5C LD HL,(XPTR) ;Adresse des Zeichens nach ? bei Error 2192 FD362600 LD (IY+26H),0 2196 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 2199 1817 JR M21B2 219B 2A635C M219B: LD HL,(STKBOT) ;Anfang des Calculatorstacks 219E ED5B615C LD DE,(WORKSP) ;derzeitiger Workspace 21A2 37 SCF 21A3 ED52 SBC HL,DE 21A5 44 LD B,H 21A6 4D LD C,L 21A7 CDB22A CALL M2AB2 21AA CDFF2A CALL M2AFF 21AD 1803 JR M21B2 21AF CDFC1F M21AF: CALL M1FFC 21B2 CD4E20 M21B2: CALL M204E 21B5 CAC120 JP Z,M20C1 21B8 C9 RET ;Subroutine fuer INPUT-Zuweisung ;erster Aufruf mit Syntaxflag gesetzt und zweiter ;mit Syntaxflag zurueckgesetzt (Programmlauf) 21B9 2A615C M21B9: LD HL,(WORKSP) ;derzeitiger Workspace 21BC 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 21BF DF RST GETAKT 21C0 FEE2 CP 0E2H 21C2 280C JR Z,M21D0 21C4 3A715C LD A,(FLAGX) ;Flag Teil 3 21C7 CD591C CALL M1C59 21CA DF RST GETAKT 21CB FE0D CP 0DH 21CD C8 RET Z 21CE CF RST ERRAUS 21CF 0B DEFB 0BH 21D0 CD3025 M21D0: CALL M2530 21D3 C8 RET Z ;erstes Zeichen des INPUT war STOP 21D4 CF RST ERRAUS 21D5 10 DEFB 10H ;Subroutine zum Pruefen, ob Kanal K im INPUT benutzt ;wird. Falls ja, dann ZERO = 1 21D6 2A515C M21D6: LD HL, (CURCHL) 21D9 23 INC HL 21DA 23 INC HL 21DB 23 INC HL 21DC 23 INC HL 21DD 7E LD A,(HL) 21DE FE4B CP 'K' 21E0 C9 RET ;Unterprogramme zur Behandlung von Farbanweisungen 21E1 E7 M21E1: RST GETNXT ;normaler Einstieg 21E2 CDF221 FAREIN: CALL FARBUN 21E5 D8 RET C 21E6 DF RST GETAKT 21E7 FE2C CP ',' 21E9 28F6 JR Z,M21E1 21EB FE3B CP ';' 21ED 28F2 JR Z,M21E1 21EF C38A1C JP M1C8A 21F2 FED9 FARBUN: CP 0D9H 21F4 D8 RET C 21F5 FEDF CP 0DFH 21F7 3F CCF 21F8 D8 RET C 21F9 F5 PUSH AF 21FA E7 RST GETNXT 21FB F1 POP AF 21FC D6C9 M21FC: SUB 0C9H 21FE F5 PUSH AF 21FF CD821C CALL PAR06 2202 F1 POP AF 2203 A7 AND A 2204 CDC31F CALL M1FC3 2207 F5 PUSH AF 2208 CD941E CALL INTEG1 220B 57 LD D,A 220C F1 POP AF 220D D7 RST PRTOUT 220E 7A LD A,D 220F D7 RST PRTOUT 2210 C9 RET ;Die folgenden Unterprogramme werden von der PRINT-Routine ;aufgerufen. Dabei werden die Systemvariablen ATTRT, MASKT ;und PFLAG entsprechend den Anweisungen geaendert (nur die ;Temporaeren). REG A enthaelt das Steuerzeichen und REG D ;den Parameter 2211 D611 M2211: SUB 11H 2213 CE00 ADC A,0 2215 281D JR Z,M2234 2217 D602 SUB 2 2219 CE00 ADC A,0 221B 2856 JR Z,M2273 221D FE01 CP 1 221F 7A LD A,D 2220 0601 LD B,1 2222 2004 JR NZ,M2228 2224 07 RLCA 2225 07 RLCA 2226 0604 LD B,4 2228 4F M2228: LD C,A 2229 7A LD A,D 222A FE02 CP 2 222C 3016 JR NC,M2244 222E 79 LD A,C 222F 21915C LD HL,PFLAG ;Printerflag 2232 1838 JR M226C ;Behandlung von INK und PAPER 2234 7A M2234: LD A,D 2235 0607 LD B,7 2237 3805 JR C,M223E 2239 07 RLCA 223A 07 RLCA 223B 07 RLCA 223C 0638 LD B,38H 223E 4F M223E: LD C,A 223F 7A LD A,D 2240 FE0A CP 0AH 2242 3802 JR C,M2246 2244 CF M2244: RST ERRAUS 2245 13 DEFB 13H 2246 218F5C M2246: LD HL,ATTRT ;aktuelle Farben temporaer 2249 FE08 CP 8 224B 380B JR C,M2258 224D 7E LD A,(HL) 224E 2807 JR Z,M2257 2250 B0 OR B 2251 2F CPL 2252 E624 AND 24H 2254 2801 JR Z,M2257 2256 78 LD A,B 2257 4F M2257: LD C,A 2258 79 M2258: LD A,C 2259 CD6C22 CALL M226C ;jetzt wird MASKT bearbeitet 225C 3E07 LD A,7 225E BA CP D 225F 9F SBC A,A 2260 CD6C22 CALL M226C ;zuletzt noch PFLAG bearbeiten 2263 07 RLCA 2264 07 RLCA 2265 E650 AND 50H 2267 47 LD B,A 2268 3E08 LD A,8 226A BA CP D 226B 9F SBC A,A ;Subroutine zum Setzen der Farbdetails. REG HL enthaelt ;die Adresse, REG B die Maske und REG A den neuen Wert. 226C AE M226C: XOR (HL) 226D A0 AND B 226E AE XOR (HL) 226F 77 LD (HL),A 2270 23 INC HL 2271 78 LD A,B 2272 C9 RET ;Behandlung von FLASH und BRIGHT 2273 9F M2273: SBC A,A 2274 7A LD A,D 2275 0F RRCA 2276 0680 LD B,80H 2278 2003 JR NZ,M227D 227A 0F RRCA 227B 0640 LD B,40H 227D 4F M227D: LD C,A 227E 7A LD A,D 227F FE08 CP 8 2281 2804 JR Z,M2287 2283 FE02 CP 2 2285 30BD JR NC,M2244 2287 79 M2287: LD A,C 2288 218F5C LD HL,ATTRT ;aktuelle Farben temporaer 228B CD6C22 CALL M226C 228E 79 LD A,C 228F 0F RRCA 2290 0F RRCA 2291 0F RRCA 2292 18D8 JR M226C ;Befehl BORDER ;Der Parameter von BORDER wird ueber einen 'OUT'-Befehl ;ausgegeben. Anschliessend wird der Parameter in BORDCR ;gespeichert. 2294 CD941E M2294: CALL INTEG1 2297 FE08 CP 8 2299 30A9 JR NC,M2244 229B D3FE OUT (0FEH),A 229D 07 RLCA 229E 07 RLCA 229F 07 RLCA 22A0 CB6F BIT 5,A 22A2 2002 JR NZ,M22A6 22A4 EE07 XOR 7 22A6 32485C M22A6: LD (BORDCR),A ;Bordercolor * 8 22A9 C9 RET ;Subroutine zum Berechnen einer 'PIXEL'-Adresse ;auf dem Bildschirm ;Aufruf von POINT und PLOT mit Adresse des Punktes in ;BC. Bei RETURN enthaelt HL die Adresse des Bytes im ent- ;sprechenden Bildschirmbereich und A die Bitposition des ;Punktes in diesem Byte 22AA 3EAF PKTADR: LD A,0AFH 22AC 90 SUB B 22AD DAF924 JP C,M24F9 22B0 47 LD B,A 22B1 A7 AND A 22B2 1F RRA 22B3 37 SCF 22B4 1F RRA 22B5 A7 AND A 22B6 1F RRA 22B7 A8 XOR B 22B8 E6F8 AND 0F8H 22BA A8 XOR B 22BB 67 LD H,A 22BC 79 LD A,C 22BD 07 RLCA 22BE 07 RLCA 22BF 07 RLCA 22C0 A8 XOR B 22C1 E6C7 AND 0C7H 22C3 A8 XOR B 22C4 07 RLCA 22C5 07 RLCA 22C6 6F LD L,A 22C7 79 LD A,C 22C8 E607 AND 7 22CA C9 RET ;Subroutine fuer die POINT-Funktion 22CB CD0723 M22CB: CALL M2307 22CE CDAA22 CALL PKTADR 22D1 47 LD B,A 22D2 04 INC B 22D3 7E LD A,(HL) 22D4 07 M22D4: RLCA 22D5 10FD DJNZ M22D4 22D7 E601 AND 1 22D9 C3282D JP M2D28 ;Befehl PLOT ;Beim Einstieg liegen die Koordinaten auf dem Calc.-Stack. ;Unter Beruecksichtigung von 'INVERSE' und 'OVER' (in ;PFLAG) wird der Punkt entsprechend gesetzt 22DC CD0723 PLOTHA: CALL M2307 22DF CDE522 CALL PLOTTE 22E2 C34D0D JP AKTCOL 22E5 ED437D5C PLOTTE: LD (COORDS),BC ;Koordinaten des letzten Plot 22E9 CDAA22 CALL PKTADR 22EC 47 LD B,A 22ED 04 INC B 22EE 3EFE LD A,0FEH 22F0 0F M22F0: RRCA 22F1 10FD DJNZ M22F0 22F3 47 LD B,A 22F4 7E LD A,(HL) 22F5 FD4E57 LD C,(IY+57H) 22F8 CB41 BIT 0,C 22FA 2001 JR NZ,M22FD 22FC A0 AND B 22FD CB51 M22FD: BIT 2,C 22FF 2002 JR NZ,M2303 2301 A8 XOR B 2302 2F CPL 2303 77 M2303: LD (HL),A 2304 C3DB0B JP M0BDB ;Subroutine, um BC mit den letzten zwei Werten, im ;Bereich jeweils von 0-FFH, des Calc.-Stacks zu ;laden. D und E enthalten jeweils +/- 1 fuer die ;Zeichenrichtung. 2307 CD1423 M2307: CALL STAINA 230A 47 LD B,A 230B C5 PUSH BC 230C CD1423 CALL STAINA 230F 59 LD E,C 2310 C1 POP BC 2311 51 LD D,C 2312 4F LD C,A 2313 C9 RET ;Letzte Floatingpoint-Zahl vom Calc.-Stack nach A ;laden, Bereich 0-FFH. C enthaelt +1 fuer positive ;-1 fuer negative Werte 2314 CDD52D STAINA: CALL M2DD5 2317 DAF924 JP C,M24F9 231A 0E01 LD C,1 231C C8 RET Z 231D 0EFF LD C,0FFH 231F C9 RET ;Befehl CIRCLE ;Es wird ein angenaeherter Kreis mit Radius 'R' um die ;Koordinate X,Y (=Mitte) gezeichnet. Alle drei Werte ;werden zuerst gerundet. 2320 DF KREIS: RST GETAKT 2321 FE2C CP ',' 2323 C28A1C JP NZ,M1C8A 2326 E7 RST GETNXT 2327 CD821C CALL PAR06 232A CDEE1B CALL M1BEE 232D EF RST CALRUF 232E 2A DEFB 2AH 232F 3D DEFB 3DH 2330 38 DEFB 38H 2331 7E LD A,(HL) 2332 FE81 CP 81H 2334 3005 JR NC,M233B 2336 EF RST CALRUF 2337 02 DEFB 2 2338 38 DEFB 38H 2339 18A1 JR PLOTHA 233B EF M233B: RST CALRUF 233C A3 DEFB 0A3H 233D 38 DEFB 38H 233E 3683 LD (HL),83H 2340 EF RST CALRUF 2341 C5 DEFB 0C5H 2342 02 DEFB 2 2343 38 DEFB 38H 2344 CD7D24 CALL M247D ;Der Kreis wird auf Geradenstuecken zurueckgefuehrt, ;die mit der 'DRAW'-Subroutine gezeichnet werden. Die ;Anzahl der Geradenstuecken ist A und in BC enthalten. 2347 C5 PUSH BC 2348 EF RST CALRUF 2349 31 DEFB 31H 234A E1 DEFB 0E1H 234B 04 DEFB 4 234C 38 DEFB 38H 234D 7E LD A,(HL) 234E FE80 CP 80H 2350 3008 JR NC,M235A 2352 EF RST CALRUF 2353 02 DEFB 2 2354 02 DEFB 2 2355 38 DEFB 38H 2356 C1 POP BC 2357 C3DC22 JP PLOTHA 235A EF M235A: RST CALRUF 235B C2 DEFB 0C2H 235C 01 DEFB 1 235D C0 DEFB 0C0H 235E 02 DEFB 2 235F 03 DEFB 3 2360 01 DEFB 1 2361 E0 DEFB 0E0H 2362 0F DEFB 0FH 2363 C0 DEFB 0C0H 2364 01 DEFB 1 2365 31 DEFB 31H 2366 E0 DEFB 0E0H 2367 01 DEFB 1 2368 31 DEFB 31H 2369 E0 DEFB 0E0H 236A A0 DEFB 0A0H 236B C1 DEFB 0C1H 236C 02 DEFB 2 236D 38 DEFB 38H 236E FD3462 INC (IY+62H) 2371 CD941E CALL INTEG1 2374 6F LD L,A 2375 E5 PUSH HL 2376 CD941E CALL INTEG1 2379 E1 POP HL 237A 67 LD H,A 237B 227D5C LD (COORDS),HL ;Koordinaten des letzten Plot 237E C1 POP BC 237F C32024 JP M2420 ;Befehl DRAW ;Die Startkoordinaten (X0,Y0) einer Geraden sind in ;COORDS enthalten. Wenn ausser den Endpunkten X und Y ;keine weiteren Parameter angegeben sind, wird eine ;Gerade von X0,Y0 nach X+X0,Y+Y0 gezeichnet. 2382 DF M2382: RST GETAKT 2383 FE2C CP ',' 2385 2806 JR Z,M238D 2387 CDEE1B CALL M1BEE 238A C37724 JP M2477 238D E7 M238D: RST GETNXT 238E CD821C CALL PAR06 2391 CDEE1B CALL M1BEE 2394 EF RST CALRUF 2395 C5 DEFB 0C5H 2396 A2 DEFB 0A2H 2397 04 DEFB 4 2398 1F DEFB 1FH 2399 31 DEFB 31H 239A 30 DEFB 30H 239B 30 DEFB 30H 239C 00 DEFB 0 239D 06 DEFB ZEIWIN-$ 239E 02 DEFB 2 239F 38 DEFB 38H 23A0 C37724 JP M2477 23A3 C0 ZEIWIN: DEFB 0C0H 23A4 02 DEFB 2 23A5 C1 DEFB 0C1H 23A6 02 DEFB 2 23A7 31 DEFB 31H 23A8 2A DEFB 2AH 23A9 E1 DEFB 0E1H 23AA 01 DEFB 1 23AB E1 DEFB 0E1H 23AC 2A DEFB 2AH 23AD 0F DEFB 0FH 23AE E0 DEFB 0E0H 23AF 05 DEFB 5 23B0 2A DEFB 2AH 23B1 E0 DEFB 0E0H 23B2 01 DEFB 1 23B3 3D DEFB 3DH 23B4 38 DEFB 38H 23B5 7E LD A,(HL) 23B6 FE81 CP 81H 23B8 3007 JR NC,M23C1 23BA EF RST CALRUF 23BB 02 DEFB 2 23BC 02 DEFB 2 23BD 38 DEFB 38H 23BE C37724 JP M2477 23C1 CD7D24 M23C1: CALL M247D 23C4 C5 PUSH BC 23C5 EF RST CALRUF 23C6 02 DEFB 2 23C7 E1 DEFB 0E1H 23C8 01 DEFB 1 23C9 05 DEFB 5 23CA C1 DEFB 0C1H 23CB 02 DEFB 2 23CC 01 DEFB 1 23CD 31 DEFB 31H 23CE E1 DEFB 0E1H 23CF 04 DEFB 4 23D0 C2 DEFB 0C2H 23D1 02 DEFB 2 23D2 01 DEFB 1 23D3 31 DEFB 31H 23D4 E1 DEFB 0E1H 23D5 04 DEFB 4 23D6 E2 DEFB 0E2H 23D7 E5 DEFB 0E5H 23D8 E0 DEFB 0E0H 23D9 03 DEFB 3 23DA A2 DEFB 0A2H 23DB 04 DEFB 4 23DC 31 DEFB 31H 23DD 1F DEFB 1FH 23DE C5 DEFB 0C5H 23DF 02 DEFB 2 23E0 20 DEFB 20H 23E1 C0 DEFB 0C0H 23E2 02 DEFB 2 23E3 C2 DEFB 0C2H 23E4 02 DEFB 2 23E5 C1 DEFB 0C1H 23E6 E5 DEFB 0E5H 23E7 04 DEFB 4 23E8 E0 DEFB 0E0H 23E9 E2 DEFB 0E2H 23EA 04 DEFB 4 23EB 0F DEFB 0FH 23EC E1 DEFB 0E1H 23ED 01 DEFB 1 23EE C1 DEFB 0C1H 23EF 02 DEFB 2 23F0 E0 DEFB 0E0H 23F1 04 DEFB 4 23F2 E2 DEFB 0E2H 23F3 E5 DEFB 0E5H 23F4 04 DEFB 4 23F5 03 DEFB 3 23F6 C2 DEFB 0C2H 23F7 2A DEFB 2AH 23F8 E1 DEFB 0E1H 23F9 2A DEFB 2AH 23FA 0F DEFB 0FH 23FB 02 DEFB 2 23FC 38 DEFB 38H 23FD 1A LD A,(DE) 23FE FE81 CP 81H 2400 C1 POP BC 2401 DA7724 JP C,M2477 2404 C5 PUSH BC 2405 EF RST CALRUF 2406 01 DEFB 1 2407 38 DEFB 38H 2408 3A7D5C LD A,(COORDS) 240B CD282D CALL M2D28 240E EF RST CALRUF 240F C0 DEFB 0C0H 2410 0F DEFB 0FH 2411 01 DEFB 1 2412 38 DEFB 38H 2413 3A7E5C LD A,(COORDS+1) 2416 CD282D CALL M2D28 2419 EF RST CALRUF 241A C5 DEFB 0C5H 241B 0F DEFB 0FH 241C E0 DEFB 0E0H 241D E5 DEFB 0E5H 241E 38 DEFB 38H 241F C1 POP BC ;Im folgenden werden die Geradenteile gezeichnet. ;Auf dem Calc.-Stack liegen die Werte: ;X0+X,Y0+Y,Xn,Yn ;als Zwischenwerte werden benutzt: ;Un=Xn+1-Xn, Vn=Yn+1-Yn 2420 05 M2420: DEC B 2421 283C JR Z,M245F 2423 1814 JR M2439 2425 EF GERADS: RST CALRUF 2426 E1 DEFB 0E1H 2427 31 DEFB 31H 2428 E3 DEFB 0E3H 2429 04 DEFB 4 242A E2 DEFB 0E2H 242B E4 DEFB 0E4H 242C 04 DEFB 4 242D 03 DEFB 3 242E C1 DEFB 0C1H 242F 02 DEFB 2 2430 E4 DEFB 0E4H 2431 04 DEFB 4 2432 E2 DEFB 0E2H 2433 E3 DEFB 0E3H 2434 04 DEFB 4 2435 0F DEFB 0FH 2436 C2 DEFB 0C2H 2437 02 DEFB 2 2438 38 DEFB 38H 2439 C5 M2439: PUSH BC 243A EF RST CALRUF 243B C0 DEFB 0C0H 243C 02 DEFB 2 243D E1 DEFB 0E1H 243E 0F DEFB 0FH 243F 31 DEFB 31H 2440 38 DEFB 38H 2441 3A7D5C LD A,(COORDS) 2444 CD282D CALL M2D28 2447 EF RST CALRUF 2448 03 DEFB 3 2449 E0 DEFB 0E0H 244A E2 DEFB 0E2H 244B 0F DEFB 0FH 244C C0 DEFB 0C0H 244D 01 DEFB 1 244E E0 DEFB 0E0H 244F 38 DEFB 38H 2450 3A7E5C LD A,(COORDS+1) 2453 CD282D CALL M2D28 2456 EF RST CALRUF 2457 03 DEFB 3 2458 38 DEFB 38H 2459 CDB724 CALL M24B7 245C C1 POP BC 245D 10C6 DJNZ GERADS 245F EF M245F: RST CALRUF 2460 02 DEFB 2 2461 02 DEFB 2 2462 01 DEFB 1 2463 38 DEFB 38H 2464 3A7D5C LD A,(COORDS) 2467 CD282D CALL M2D28 246A EF RST CALRUF 246B 03 DEFB 3 246C 01 DEFB 1 246D 38 DEFB 38H 246E 3A7E5C LD A,(COORDS+1) 2471 CD282D CALL M2D28 2474 EF RST CALRUF 2475 03 DEFB 3 2476 38 DEFB 38H 2477 CDB724 M2477: CALL M24B7 247A C34D0D JP AKTCOL ;Subroutine zum Berechnen der Anfangsparameter. ;Beim Aufruf durch die Subroutine zum Zeichnen ;des Kreises liegen X,Y,R (Radius, hier=Z) und ;bei Aufruf durch 'DRAW' X,Y,SIN(G/2),Z auf dem ;Calc.-Stack. Die Rechnungen werden nur ab Z ;aufgefuehrt. 247D EF M247D: RST CALRUF 247E 31 DEFB 31H 247F 28 DEFB 28H 2480 34 DEFB 34H 2481 32 DEFB 32H 2482 00 DEFB 0 2483 01 DEFB 1 2484 05 DEFB 5 2485 E5 DEFB 0E5H 2486 01 DEFB 1 2487 05 DEFB 5 2488 2A DEFB 2AH 2489 38 DEFB 38H 248A CDD52D CALL M2DD5 248D 3806 JR C,M2495 248F E6FC AND 0FCH 2491 C604 ADD A,4 2493 3002 JR NC,M2497 2495 3EFC M2495: LD A,0FCH 2497 F5 M2497: PUSH AF 2498 CD282D CALL M2D28 249B EF RST CALRUF 249C E5 DEFB 0E5H 249D 01 DEFB 1 249E 05 DEFB 5 249F 31 DEFB 31H 24A0 1F DEFB 1FH 24A1 C4 DEFB 0C4H 24A2 02 DEFB 2 24A3 31 DEFB 31H 24A4 A2 DEFB 0A2H 24A5 04 DEFB 4 24A6 1F DEFB 1FH 24A7 C1 DEFB 0C1H 24A8 01 DEFB 1 24A9 C0 DEFB 0C0H 24AA 02 DEFB 2 24AB 31 DEFB 31H 24AC 04 DEFB 4 24AD 31 DEFB 31H 24AE 0F DEFB 0FH 24AF A1 DEFB 0A1H 24B0 03 DEFB 3 24B1 1B DEFB 1BH 24B2 C3 DEFB 0C3H 24B3 02 DEFB 2 24B4 38 DEFB 38H 24B5 C1 POP BC 24B6 C9 RET ;Subroutine zum Zeichnen von Geraden 24B7 CD0723 M24B7: CALL M2307 24BA 79 LD A,C 24BB B8 CP B 24BC 3006 JR NC,M24C4 24BE 69 LD L,C 24BF D5 PUSH DE 24C0 AF XOR A 24C1 5F LD E,A 24C2 1807 JR M24CB 24C4 B1 M24C4: OR C 24C5 C8 RET Z 24C6 68 LD L,B 24C7 41 LD B,C 24C8 D5 PUSH DE 24C9 1600 LD D,0 24CB 60 M24CB: LD H,B 24CC 78 LD A,B 24CD 1F RRA 24CE 85 M24CE: ADD A,L 24CF 3803 JR C,M24D4 24D1 BC CP H 24D2 3807 JR C,M24DB 24D4 94 M24D4: SUB H 24D5 4F LD C,A 24D6 D9 EXX 24D7 C1 POP BC 24D8 C5 PUSH BC 24D9 1804 JR M24DF 24DB 4F M24DB: LD C,A 24DC D5 PUSH DE 24DD D9 EXX 24DE C1 POP BC 24DF 2A7D5C M24DF: LD HL,(COORDS) ;Koordinaten des letzten Plot 24E2 78 LD A,B 24E3 84 ADD A,H 24E4 47 LD B,A 24E5 79 LD A,C 24E6 3C INC A 24E7 85 ADD A,L 24E8 380D JR C,M24F7 24EA 280D JR Z,M24F9 24EC 3D M24EC: DEC A 24ED 4F LD C,A 24EE CDE522 CALL PLOTTE 24F1 D9 EXX 24F2 79 LD A,C 24F3 10D9 DJNZ M24CE 24F5 D1 POP DE 24F6 C9 RET 24F7 28F3 M24F7: JR Z,M24EC 24F9 CF M24F9: RST ERRAUS 24FA 0A DEFB 0AH ;================================================= ;Unterprogramme zur Auswertung von Ausdruecken. ;Das Ergebnis wird als letzter Wert auf dem Calc.-Stack ;abgelgt (numerisch), bei Strings 5 Bytes mit folgender ;Bedeutung: das Erste ist nicht definiert, das Zweite+ ;Dritte sind die Startadresse des String und die letzten ;zwei geben die Laenge an. 24FB DF AUSDRU: RST GETAKT 24FC 0600 LD B,0 24FE C5 PUSH BC 24FF 4F M24FF: LD C,A 2500 219625 LD HL,M2596 2503 CDDC16 CALL SUCHTA 2506 79 LD A,C 2507 D28426 JP NC,M2684 250A 0600 LD B,0 250C 4E LD C,(HL) 250D 09 ADD HL,BC 250E E9 JP (HL) ;Subroutine zum Untersuchen auf Anfuehrstriche '"' 250F CD7400 M250F: CALL NEXZEI 2512 03 INC BC 2513 FE0D CP 0DH 2515 CA8A1C JP Z,M1C8A 2518 FE22 CP '"' 251A 20F3 JR NZ,M250F 251C CD7400 CALL NEXZEI 251F FE22 CP '"' 2521 C9 RET ;Subroutine untersucht, ob die benoetigten zwei ;Koordinaten folgen 2522 E7 M2522: RST GETNXT 2523 FE28 CP '(' 2525 2006 JR NZ,M252D 2527 CD791C CALL M1C79 252A DF RST GETAKT 252B FE29 CP ')' 252D C28A1C M252D: JP NZ,M1C8A ;Diese Unterroutine ueberprueft, ob eine Syntaxpruefung ;stattfindet oder ein Programm (Zero gesetzt) laeuft. 2530 FDCB017E M2530: BIT 7,(IY+1) 2534 C9 RET ;Subroutine zum Suchen des Zeichens an den Koordinaten ;X,Y durch 'SCREEN$'. Normal werden nur die im Zeichen- ;satz-ROM (ab 3D00H) abgelegten Zeichen gefunden: 20H - 7FH 2535 CD0723 M2535: CALL M2307 2538 2A365C LD HL,(CHARS) ;Zeichensatzadresse -256 253B 110001 LD DE,100H 253E 19 ADD HL,DE 253F 79 LD A,C 2540 0F RRCA 2541 0F RRCA 2542 0F RRCA 2543 E6E0 AND 0E0H 2545 A8 XOR B 2546 5F LD E,A 2547 79 LD A,C 2548 E618 AND 18H 254A EE40 XOR 40H ;HIGH-Teil von BILD 254C 57 LD D,A 254D 0660 LD B,60H 254F C5 M254F: PUSH BC 2550 D5 PUSH DE 2551 E5 PUSH HL 2552 1A LD A,(DE) 2553 AE XOR (HL) 2554 2804 JR Z,M255A 2556 3C INC A 2557 201A JR NZ,M2573 2559 3D DEC A 255A 4F M255A: LD C,A 255B 0607 LD B,7 255D 14 M255D: INC D 255E 23 INC HL 255F 1A LD A,(DE) 2560 AE XOR (HL) 2561 A9 XOR C 2562 200F JR NZ,M2573 2564 10F7 DJNZ M255D 2566 C1 POP BC 2567 C1 POP BC 2568 C1 POP BC 2569 3E80 LD A,80H 256B 90 SUB B 256C 010100 LD BC,1 256F F7 RST REST30 2570 12 LD (DE),A 2571 180A JR M257D 2573 E1 M2573: POP HL 2574 110800 LD DE,8 2577 19 ADD HL,DE 2578 D1 POP DE 2579 C1 POP BC 257A 10D3 DJNZ M254F 257C 48 LD C,B 257D C3B22A M257D: JP M2AB2 ;Unterprogramm, um den Wert von ATTR (X,Y) zu bestimmen 2580 CD0723 M2580: CALL M2307 2583 79 LD A,C 2584 0F RRCA 2585 0F RRCA 2586 0F RRCA 2587 4F LD C,A 2588 E6E0 AND 0E0H 258A A8 XOR B 258B 6F LD L,A 258C 79 LD A,C 258D E603 AND 3 258F EE58 XOR 58H 2591 67 LD H,A 2592 7E LD A,(HL) 2593 C3282D JP M2D28 ;Offsettabelle fuer die Entwicklung von Ausdruecken 2596 22 M2596: DEFB '"' 2597 1C DEFB M25B3-$ 2598 28 DEFB '(' 2599 4F DEFB M25E8-$ 259A 2E DEFB '.' 259B F2 DEFB M268D-$ 259C 2B DEFB '+' 259D 12 DEFB M25AF-$ 259E A8 DEFB 0A8H 259F 56 DEFB M25F5-$ 25A0 A5 DEFB 0A5H 25A1 57 DEFB M25F8-$ 25A2 A7 DEFB 0A7H 25A3 84 DEFB M2627-$ 25A4 A6 DEFB 0A6H 25A5 8F DEFB M2634-$ 25A6 C4 DEFB 0C4H 25A7 E6 DEFB M268D-$ 25A8 AA DEFB 0AAH 25A9 BF DEFB M2668-$ 25AA AB DEFB 0ABH 25AB C7 DEFB M2672-$ 25AC A9 DEFB 0A9H 25AD CE DEFB M267B-$ 25AE 00 DEFB 0 ;Es folgen die einzelnen Unterprogramm, die mit Hilfe ;der Offsettabelle aufgerufen werden ;Pluszeichen 25AF E7 M25AF: RST GETNXT 25B0 C3FF24 JP M24FF ;Textmodus: Strings, einfache und mehrfache, die mit ;'"' eingeschlossen sind, bearbeiten. 25B3 DF M25B3: RST GETAKT 25B4 23 INC HL 25B5 E5 PUSH HL 25B6 010000 LD BC,0 25B9 CD0F25 CALL M250F 25BC 201B JR NZ,M25D9 25BE CD0F25 M25BE: CALL M250F 25C1 28FB JR Z,M25BE 25C3 CD3025 CALL M2530 25C6 2811 JR Z,M25D9 25C8 F7 RST REST30 25C9 E1 POP HL 25CA D5 PUSH DE 25CB 7E M25CB: LD A,(HL) 25CC 23 INC HL 25CD 12 LD (DE),A 25CE 13 INC DE 25CF FE22 CP '"' 25D1 20F8 JR NZ,M25CB 25D3 7E LD A,(HL) 25D4 23 INC HL 25D5 FE22 CP '"' 25D7 28F2 JR Z,M25CB 25D9 0B M25D9: DEC BC 25DA D1 POP DE 25DB 213B5C M25DB: LD HL,FLAGS ;Bit 1= Printer ein 25DE CBB6 RES 6,(HL) 25E0 CB7E BIT 7,(HL) 25E2 C4B22A CALL NZ,M2AB2 25E5 C31227 JP M2712 ;Einstieg bei Klammer auf 25E8 E7 M25E8: RST GETNXT 25E9 CDFB24 CALL AUSDRU 25EC FE29 CP ')' 25EE C28A1C JP NZ,M1C8A 25F1 E7 RST GETNXT 25F2 C31227 JP M2712 ;Einstieg bei 'FN' 25F5 C3BD27 M25F5: JP M27BD ;Einstieg bei 'RND' 25F8 CD3025 M25F8: CALL M2530 25FB 2828 JR Z,M2625 25FD ED4B765C LD BC,(SEED) ;Zufallszahl setzen durch Randomize 2601 CD2B2D CALL M2D2B 2604 EF RST CALRUF 2605 A1 DEFB 0A1H 2606 0F DEFB 0FH 2607 34 DEFB 34H 2608 37 DEFB 37H 2609 16 DEFB 16H 260A 04 DEFB 4 260B 34 DEFB 34H 260C 80 DEFB 80H 260D 41 DEFB 41H 260E 00 DEFB 0 260F 00 DEFB 0 2610 80 DEFB 80H 2611 32 DEFB 32H 2612 02 DEFB 2 2613 A1 DEFB 0A1H 2614 03 DEFB 3 2615 31 DEFB 31H 2616 38 DEFB 38H 2617 CDA22D CALL M2DA2 261A ED43765C LD (SEED),BC ;Zufallszahl setzen durch Randomize 261E 7E LD A,(HL) 261F A7 AND A 2620 2803 JR Z,M2625 2622 D610 SUB 10H 2624 77 LD (HL),A 2625 1809 M2625: JR M2630 ;die Zahl PI als letzten Wert auf den Calc.-Stack bringen 2627 CD3025 M2627: CALL M2530 262A 2804 JR Z,M2630 262C EF RST CALRUF 262D A3 DEFB 0A3H 262E 38 DEFB 38H 262F 34 INC (HL) 2630 E7 M2630: RST GETNXT 2631 C3C326 JP M26C3 ;Einsprung bei INKEY$ 2634 015A10 M2634: LD BC,105AH 2637 E7 RST GETNXT 2638 FE23 CP '#' 263A CA0D27 JP Z,M270D 263D 213B5C LD HL,FLAGS ;Bit 1= Printer ein 2640 CBB6 RES 6,(HL) 2642 CB7E BIT 7,(HL) 2644 281F JR Z,M2665 2646 CD8E02 CALL KEY 2649 0E00 LD C,0 264B 2013 JR NZ,M2660 264D CD1E03 CALL M031E 2650 300E JR NC,M2660 2652 15 DEC D 2653 5F LD E,A 2654 CD3303 CALL M0333 2657 F5 PUSH AF 2658 010100 LD BC,1 265B F7 RST REST30 265C F1 POP AF 265D 12 LD (DE),A 265E 0E01 LD C,1 2660 0600 M2660: LD B,0 2662 CDB22A CALL M2AB2 2665 C31227 M2665: JP M2712 ;Einstieg bei SCREEN$ 2668 CD2225 M2668: CALL M2522 266B C43525 CALL NZ,M2535 266E E7 RST GETNXT 266F C3DB25 JP M25DB ;Einstieg bei ATTR 2672 CD2225 M2672: CALL M2522 2675 C48025 CALL NZ,M2580 2678 E7 RST GETNXT 2679 1848 JR M26C3 ;Einstieg bei POINT 267B CD2225 M267B: CALL M2522 267E C4CB22 CALL NZ,M22CB 2681 E7 RST GETNXT 2682 183F JR M26C3 ;ein Zeichen auf alphanumerisch Pruefen 2684 CD882C M2684: CALL M2C88 2687 3056 JR NC,M26DF 2689 FE41 CP 'A' 268B 303C JR NC,M26C9 ;Routine zum Bearbeiten von Dezimalzahlen (auch 'BIN') 268D CD3025 M268D: CALL M2530 2690 2023 JR NZ,M26B5 ;Bei der Eingabe einer Zeile (Syntaxpruefung) wird eine ;Zahl in eine Floatingpointzahl umgewandelt und in die ;BASIC-Zeile kopiert 2692 CD9B2C CALL DEZFLO 2695 DF RST GETAKT 2696 010600 LD BC,6 2699 CD5516 CALL MACHPL 269C 23 INC HL 269D 360E LD (HL),0EH 269F 23 INC HL 26A0 EB EX DE,HL 26A1 2A655C LD HL,(STKEND) ;Anfang des freien Speichers 26A4 0E05 LD C,5 26A6 A7 AND A 26A7 ED42 SBC HL,BC 26A9 22655C LD (STKEND),HL ;Anfang des freien Speichers 26AC EDB0 LDIR 26AE EB EX DE,HL 26AF 2B DEC HL 26B0 CD7700 CALL M0077 26B3 180E JR M26C3 ;der folgende Teil wird im Programmlauf bearbeitet 26B5 DF M26B5: RST GETAKT 26B6 23 M26B6: INC HL 26B7 7E LD A,(HL) 26B8 FE0E CP 0EH 26BA 20FA JR NZ,M26B6 26BC 23 INC HL 26BD CDB433 CALL M33B4 26C0 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 26C3 FDCB01F6 M26C3: SET 6,(IY+1) 26C7 1814 JR M26DD ;Subroutine sucht Variable (numerisch, String) im ;Variablen- oder Programmbereich. Die Variable oder ;die Parameter bei Stringvar. werden in den Calc.- ;Stack gebracht 26C9 CDB228 M26C9: CALL M28B2 26CC DA2E1C JP C,M1C2E 26CF CC9629 CALL Z,M2996 26D2 3A3B5C LD A,(FLAGS) ;Bit 1= Printer ein 26D5 FEC0 CP 0C0H 26D7 3804 JR C,M26DD 26D9 23 INC HL 26DA CDB433 CALL M33B4 26DD 1833 M26DD: JR M2712 ;Im folgenden werden verschiedene Operatoren geprueft 26DF 01DB09 M26DF: LD BC,9DBH 26E2 FE2D CP '-' 26E4 2827 JR Z,M270D 26E6 011810 LD BC,1018H 26E9 FEAE CP 0AEH 26EB 2820 JR Z,M270D 26ED D6AF SUB 0AFH 26EF DA8A1C JP C,M1C8A 26F2 01F004 LD BC,4F0H 26F5 FE14 CP 14H 26F7 2814 JR Z,M270D 26F9 D28A1C JP NC,M1C8A ;Tokens jetzt in Operationskodes wandeln 26FC 0610 LD B,10H 26FE C6DC ADD A,0DCH 2700 4F LD C,A 2701 FEDF CP 0DFH 2703 3002 JR NC,M2707 2705 CBB1 RES 6,C 2707 FEEE M2707: CP 0EEH 2709 3802 JR C,M270D 270B CBB9 RES 7,C ;Der Prioritaetskode in B und der Operationskode in C ;werden auf dem Stack abgelegt, bevor der naechste Teil ;des Ausdruckes untersucht wird. 270D C5 M270D: PUSH BC 270E E7 RST GETNXT 270F C3FF24 JP M24FF ;Es wird jetzt der weitere Ausdruck untersucht Klammer, ;Ende etc. 2712 DF M2712: RST GETAKT 2713 FE28 M2713: CP '(' 2715 200C JR NZ,M2723 2717 FDCB0176 BIT 6,(IY+1) 271B 2017 JR NZ,M2734 271D CD522A CALL M2A52 2720 E7 RST GETNXT 2721 18F0 JR M2713 ;Routine, um fuer die diversen Operatoren (+,*,NOT etc.) ;die Prioritaeten und den Operationskode zu suchen. 2723 0600 M2723: LD B,0 2725 4F LD C,A 2726 219527 LD HL,M2795 2729 CDDC16 CALL SUCHTA 272C 3006 JR NC,M2734 272E 4E LD C,(HL) 272F 21ED26 LD HL,M27B0-0C3H 2732 09 ADD HL,BC 2733 46 LD B,(HL) 2734 D1 M2734: POP DE 2735 7A LD A,D 2736 B8 CP B 2737 383A JR C,M2773 2739 A7 AND A 273A CA1800 JP Z,GETAKT 273D C5 PUSH BC 273E 213B5C LD HL,FLAGS ;Bit 1= Printer ein 2741 7B LD A,E 2742 FEED CP 0EDH 2744 2006 JR NZ,M274C 2746 CB76 BIT 6,(HL) 2748 2002 JR NZ,M274C 274A 1E99 LD E,99H 274C D5 M274C: PUSH DE 274D CD3025 CALL M2530 2750 2809 JR Z,M275B 2752 7B LD A,E 2753 E63F AND 3FH 2755 47 LD B,A 2756 EF RST CALRUF 2757 3B DEFB 3BH 2758 38 DEFB 38H 2759 1809 JR M2764 ;Die Art der letzten Operation mit der zu ;untersuchenden Vergleichen 275B 7B M275B: LD A,E 275C FDAE01 XOR (IY+1) 275F E640 AND 40H 2761 C28A1C M2761: JP NZ,M1C8A ;Die Art der vorherigen Operation muss noch ;in FLAGS angemerkt werden. 2764 D1 M2764: POP DE 2765 213B5C LD HL,FLAGS ;Bit 1= Printer ein 2768 CBF6 SET 6,(HL) 276A CB7B BIT 7,E 276C 2002 JR NZ,M2770 276E CBB6 RES 6,(HL) 2770 C1 M2770: POP BC 2771 18C1 JR M2734 ;Falls die jetzige Prioritaet hoeher als die vorherige ist, ;werden beide Operationen auf dem Stack gespeichert. Wenn ;die jetzige Operation eine Stringbearbeitung bedeutet, muss ;diese noch im Operationkode angemerkt werden. 2773 D5 M2773: PUSH DE 2774 79 LD A,C 2775 FDCB0176 BIT 6,(IY+1) 2779 2015 JR NZ,M2790 277B E63F AND 3FH 277D C608 ADD A,8 277F 4F LD C,A 2780 FE10 CP 10H 2782 2004 JR NZ,M2788 2784 CBF1 SET 6,C 2786 1808 JR M2790 2788 38D7 M2788: JR C,M2761 278A FE17 CP 17H 278C 2802 JR Z,M2790 278E CBF9 SET 7,C 2790 C5 M2790: PUSH BC 2791 E7 RST GETNXT 2792 C3FF24 JP M24FF ;Tabelle zum Umsetzen der Operatoren in Operationskodes 2795 2B M2795: DEFB '+' 2796 CF DEFB 0CFH 2797 2D DEFB '-' 2798 C3 DEFB 0C3H 2799 2A DEFB '*' 279A C4 DEFB 0C4H 279B 2F DEFB '/' 279C C5 DEFB 0C5H 279D 5E DEFB '^' 279E C6 DEFB 0C6H 279F 3D DEFB '=' 27A0 CE DEFB 0CEH 27A1 3E DEFB '>' 27A2 CC DEFB 0CCH 27A3 3C DEFB '<' 27A4 CD DEFB 0CDH 27A5 C7 DEFB 0C7H ;<= 27A6 C9 DEFB 0C9H 27A7 C8 DEFB 0C8H ;>= 27A8 CA DEFB 0CAH 27A9 C9 DEFB 0C9H ;<> 27AA CB DEFB 0CBH 27AB C5 DEFB 0C5H ;OR 27AC C7 DEFB 0C7H 27AD C6 DEFB 0C6H ;AND 27AE C8 DEFB 0C8H 27AF 00 DEFB 0 ;Tabelle der zugehoerigen Prioritaeten 27B0 06 M27B0: DEFB 6 27B1 08 DEFB 8 27B2 08 DEFB 8 27B3 0A DEFB 0AH 27B4 02 DEFB 2 27B5 03 DEFB 3 27B6 05 DEFB 5 27B7 05 DEFB 5 27B8 05 DEFB 5 27B9 05 DEFB 5 27BA 05 DEFB 5 27BB 05 DEFB 5 27BC 06 DEFB 6 ;Subroutine zur Entwicklung von Benutzerdefinitionen ;(DEF FN) 27BD CD3025 M27BD: CALL M2530 27C0 2035 JR NZ,M27F7 27C2 E7 RST GETNXT 27C3 CD8D2C CALL M2C8D 27C6 D28A1C JP NC,M1C8A 27C9 E7 RST GETNXT 27CA FE24 CP '$' 27CC F5 PUSH AF 27CD 2001 JR NZ,M27D0 27CF E7 RST GETNXT 27D0 FE28 M27D0: CP '(' 27D2 2012 JR NZ,M27E6 27D4 E7 RST GETNXT 27D5 FE29 CP ')' 27D7 2810 JR Z,M27E9 27D9 CDFB24 M27D9: CALL AUSDRU 27DC DF RST GETAKT 27DD FE2C CP ',' 27DF 2003 JR NZ,M27E4 27E1 E7 RST GETNXT 27E2 18F5 JR M27D9 27E4 FE29 M27E4: CP ')' 27E6 C28A1C M27E6: JP NZ,M1C8A 27E9 E7 M27E9: RST GETNXT 27EA 213B5C LD HL,FLAGS ;Bit 1= Printer ein 27ED CBB6 RES 6,(HL) 27EF F1 POP AF 27F0 2802 JR Z,M27F4 27F2 CBF6 SET 6,(HL) 27F4 C31227 M27F4: JP M2712 ;Einstieg fuer Funktionen im Programmlauf 27F7 E7 M27F7: RST GETNXT 27F8 E6DF AND 0DFH 27FA 47 LD B,A 27FB E7 RST GETNXT 27FC D624 SUB '$' 27FE 4F LD C,A 27FF 2001 JR NZ,M2802 2801 E7 RST GETNXT 2802 E7 M2802: RST GETNXT 2803 E5 PUSH HL 2804 2A535C LD HL,(PROG) ;Start des Basicprogrammes 2807 2B DEC HL 2808 11CE00 M2808: LD DE,0CEH 280B C5 PUSH BC 280C CD861D CALL M1D86 280F C1 POP BC 2810 3002 JR NC,M2814 2812 CF RST ERRAUS 2813 18 DEFB 18H 2814 E5 M2814: PUSH HL 2815 CDAB28 CALL M28AB 2818 E6DF AND 0DFH 281A B8 CP B 281B 2008 JR NZ,M2825 281D CDAB28 CALL M28AB 2820 D624 SUB '$' 2822 B9 CP C 2823 280C JR Z,M2831 2825 E1 M2825: POP HL 2826 2B DEC HL 2827 110002 LD DE,200H 282A C5 PUSH BC 282B CD8B19 CALL M198B 282E C1 POP BC 282F 18D7 JR M2808 ;Der richtige FN-Befehl wurde gefunden. 2831 A7 M2831: AND A 2832 CCAB28 CALL Z,M28AB 2835 D1 POP DE 2836 D1 POP DE 2837 ED535D5C LD (CHADD),DE ;Adr. des naechsten zu interpret. Zeichens 283B CDAB28 CALL M28AB 283E E5 PUSH HL 283F FE29 CP ')' 2841 2842 JR Z,M2885 2843 23 M2843: INC HL 2844 7E LD A,(HL) 2845 FE0E CP 0EH 2847 1640 LD D,40H 2849 2807 JR Z,M2852 284B 2B DEC HL 284C CDAB28 CALL M28AB 284F 23 INC HL 2850 1600 LD D,0 2852 23 M2852: INC HL 2853 E5 PUSH HL 2854 D5 PUSH DE 2855 CDFB24 CALL AUSDRU 2858 F1 POP AF 2859 FDAE01 XOR (IY+1) 285C E640 AND 40H 285E 202B JR NZ,M288B 2860 E1 POP HL 2861 EB EX DE,HL 2862 2A655C LD HL,(STKEND) ;Anfang des freien Speichers 2865 010500 LD BC,5 2868 ED42 SBC HL,BC 286A 22655C LD (STKEND),HL ;Anfang des freien Speichers 286D EDB0 LDIR 286F EB EX DE,HL 2870 2B DEC HL 2871 CDAB28 CALL M28AB 2874 FE29 CP ')' 2876 280D JR Z,M2885 2878 E5 PUSH HL 2879 DF RST GETAKT 287A FE2C CP ',' 287C 200D JR NZ,M288B 287E E7 RST GETNXT 287F E1 POP HL 2880 CDAB28 CALL M28AB 2883 18BE JR M2843 2885 E5 M2885: PUSH HL 2886 DF RST GETAKT 2887 FE29 CP ')' 2889 2802 JR Z,M288D 288B CF M288B: RST ERRAUS 288C 19 DEFB 19H 288D D1 M288D: POP DE 288E EB EX DE,HL 288F 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 2892 2A0B5C LD HL,(DEFADD) ;Argument fuer Funktionen 2895 E3 EX (SP),HL 2896 220B5C LD (DEFADD),HL ;Argument fuer Funktionen 2899 D5 PUSH DE 289A E7 RST GETNXT 289B E7 RST GETNXT 289C CDFB24 CALL AUSDRU 289F E1 POP HL 28A0 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 28A3 E1 POP HL 28A4 220B5C LD (DEFADD),HL ;Argument fuer Funktionen 28A7 E7 RST GETNXT 28A8 C31227 JP M2712 ;Routine zum Ueberspringen von Funktionsteilen (Zeichen <21H) ;nur mit HL, denn CHADD muss erhalten bleiben. 28AB 23 M28AB: INC HL 28AC 7E LD A,(HL) 28AD FE21 CP '!' 28AF 38FA JR C,M28AB 28B1 C9 RET ;Subroutine zum Suchen von Variablen. ;Suche entweder im Variablenbereich oder, bei 'DEF FN' ;im Argumentbereich der Funktion. 28B2 FDCB01F6 M28B2: SET 6,(IY+1) 28B6 DF RST GETAKT 28B7 CD8D2C CALL M2C8D 28BA D28A1C JP NC,M1C8A 28BD E5 PUSH HL 28BE E61F AND 1FH 28C0 4F LD C,A 28C1 E7 RST GETNXT 28C2 E5 PUSH HL 28C3 FE28 CP '(' 28C5 2828 JR Z,M28EF 28C7 CBF1 SET 6,C 28C9 FE24 CP '$' 28CB 2811 JR Z,M28DE 28CD CBE9 SET 5,C 28CF CD882C CALL M2C88 28D2 300F JR NC,M28E3 ;das letzte Zeichen eines Variablennamens suchen 28D4 CD882C M28D4: CALL M2C88 28D7 3016 JR NC,M28EF 28D9 CBB1 RES 6,C 28DB E7 RST GETNXT 28DC 18F6 JR M28D4 28DE E7 M28DE: RST GETNXT 28DF FDCB01B6 RES 6,(IY+1) ;Wenn das Highbyte von DEFADD nicht Null ist (=DEF FN) ;und wenn zur Laufzeit, dann wird die Suche nach den ;Argumenten von 'DEF FN' durchgefuehrt. 28E3 3A0C5C M28E3: LD A,(DEFADD+1) ;Argument fuer Funktionen 28E6 A7 AND A 28E7 2806 JR Z,M28EF 28E9 CD3025 CALL M2530 28EC C25129 JP NZ,M2951 28EF 41 M28EF: LD B,C 28F0 CD3025 CALL M2530 28F3 2008 JR NZ,M28FD 28F5 79 LD A,C 28F6 E6E0 AND 0E0H 28F8 CBFF SET 7,A 28FA 4F LD C,A 28FB 1837 JR M2934 ;Waehrend des Programmlaufes wird die Suche nach der ;Variablen im Variablenbereich durchgefuehrt. 28FD 2A4B5C M28FD: LD HL,(VARS) ;Beginn der Variablen 2900 7E M2900: LD A,(HL) 2901 E67F AND 7FH 2903 282D JR Z,M2932 2905 B9 CP C 2906 2022 JR NZ,M292A 2908 17 RLA 2909 87 ADD A,A 290A F23F29 JP P,M293F 290D 3830 JR C,M293F ;lange Namen ganz untersuchen 290F D1 POP DE 2910 D5 PUSH DE 2911 E5 PUSH HL 2912 23 M2912: INC HL 2913 1A M2913: LD A,(DE) 2914 13 INC DE 2915 FE20 CP ' ' 2917 28FA JR Z,M2913 2919 F620 OR 20H 291B BE CP (HL) 291C 28F4 JR Z,M2912 291E F680 OR 80H 2920 BE CP (HL) 2921 2006 JR NZ,M2929 2923 1A LD A,(DE) 2924 CD882C CALL M2C88 2927 3015 JR NC,M293E ;Wenn die Namen nicht stimmen, muss die naechste ;Variable im Variablenbereich gesucht werden. ;HL ist Zeiger darauf 2929 E1 M2929: POP HL 292A C5 M292A: PUSH BC 292B CDB819 CALL M19B8 292E EB EX DE,HL 292F C1 POP BC 2930 18CE JR M2900 2932 CBF8 M2932: SET 7,B ;bei Syntaxpruefung hier hin 2934 D1 M2934: POP DE 2935 DF RST GETAKT 2936 FE28 CP '(' 2938 2809 JR Z,M2943 293A CBE8 SET 5,B 293C 180D JR M294B ;der richtige Namen ist gefunden 293E D1 M293E: POP DE 293F D1 M293F: POP DE 2940 D1 POP DE 2941 E5 PUSH HL 2942 DF RST GETAKT 2943 CD882C M2943: CALL M2C88 2946 3003 JR NC,M294B 2948 E7 RST GETNXT 2949 18F8 JR M2943 294B E1 M294B: POP HL 294C CB10 RL B 294E CB70 BIT 6,B 2950 C9 RET ;Unterprogramm, um die Argumente von 'DEF FN' auf den ;Calc.-Stack abzulegen. Der Einsprung erfolgt von der ;Variablensuchroutine aus. 2951 2A0B5C M2951: LD HL,(DEFADD) ;Argument fuer Funktionen 2954 7E LD A,(HL) 2955 FE29 CP ')' 2957 CAEF28 JP Z,M28EF 295A 7E M295A: LD A,(HL) 295B F660 OR 60H 295D 47 LD B,A 295E 23 INC HL 295F 7E LD A,(HL) 2960 FE0E CP 0EH 2962 2807 JR Z,M296B 2964 2B DEC HL 2965 CDAB28 CALL M28AB 2968 23 INC HL 2969 CBA8 RES 5,B 296B 78 M296B: LD A,B 296C B9 CP C 296D 2812 JR Z,M2981 296F 23 INC HL 2970 23 INC HL 2971 23 INC HL 2972 23 INC HL 2973 23 INC HL 2974 CDAB28 CALL M28AB 2977 FE29 CP ')' 2979 CAEF28 JP Z,M28EF 297C CDAB28 CALL M28AB 297F 18D9 JR M295A 2981 CB69 M2981: BIT 5,C 2983 200C JR NZ,M2991 2985 23 INC HL 2986 ED5B655C LD DE,(STKEND) ;Anfang des freien Speichers 298A CDC033 CALL VERDO 298D EB EX DE,HL 298E 22655C LD (STKEND),HL ;Anfang des freien Speichers 2991 D1 M2991: POP DE 2992 D1 POP DE 2993 AF XOR A 2994 3C INC A 2995 C9 RET ;Subroutine zum Suchen von Stringparametern im ;Variablenbereich oder zum Finden der Basisadresse ;eines Arrays 2996 AF M2996: XOR A 2997 47 LD B,A 2998 CB79 BIT 7,C 299A 204B JR NZ,M29E7 299C CB7E BIT 7,(HL) 299E 200E JR NZ,M29AE 29A0 3C INC A 29A1 23 M29A1: INC HL 29A2 4E LD C,(HL) 29A3 23 INC HL 29A4 46 LD B,(HL) 29A5 23 INC HL 29A6 EB EX DE,HL 29A7 CDB22A CALL M2AB2 29AA DF RST GETAKT 29AB C3492A JP M2A49 29AE 23 M29AE: INC HL 29AF 23 INC HL 29B0 23 INC HL 29B1 46 LD B,(HL) 29B2 CB71 BIT 6,C 29B4 280A JR Z,M29C0 29B6 05 DEC B 29B7 28E8 JR Z,M29A1 29B9 EB EX DE,HL 29BA DF RST GETAKT 29BB FE28 CP '(' 29BD 2061 JR NZ,M2A20 29BF EB EX DE,HL 29C0 EB M29C0: EX DE,HL 29C1 1824 JR M29E7 ;Nachfolgend die Schleife zum Suchen der Parameter eines ;Arrayelements. B dient als Dimensionszaehler. Stringarrays ;haben eine Dimension weniger als angegeben, da der letzte ;Teil als Beschreibung eines Teilstrings dient. 29C3 E5 M29C3: PUSH HL 29C4 DF RST GETAKT 29C5 E1 POP HL 29C6 FE2C CP ',' 29C8 2820 JR Z,M29EA 29CA CB79 BIT 7,C 29CC 2852 JR Z,M2A20 29CE CB71 BIT 6,C 29D0 2006 JR NZ,M29D8 29D2 FE29 CP ')' 29D4 203C JR NZ,M2A12 29D6 E7 RST GETNXT 29D7 C9 RET 29D8 FE29 M29D8: CP ')' 29DA 286C JR Z,M2A48 29DC FECC CP 0CCH 29DE 2032 JR NZ,M2A12 29E0 DF M29E0: RST GETAKT 29E1 2B DEC HL 29E2 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 29E5 185E JR M2A45 ;normaler Einstiegspunkt in diese Routine 29E7 210000 M29E7: LD HL,0 29EA E5 M29EA: PUSH HL 29EB E7 RST GETNXT 29EC E1 POP HL 29ED 79 LD A,C 29EE FEC0 CP 0C0H 29F0 2009 JR NZ,M29FB 29F2 DF RST GETAKT 29F3 FE29 CP ')' 29F5 2851 JR Z,M2A48 29F7 FECC CP 0CCH 29F9 28E5 JR Z,M29E0 29FB C5 M29FB: PUSH BC 29FC E5 PUSH HL 29FD CDEE2A CALL M2AEE 2A00 E3 EX (SP),HL 2A01 EB EX DE,HL 2A02 CDCC2A CALL M2ACC 2A05 3819 JR C,M2A20 2A07 0B DEC BC 2A08 CDF42A CALL M2AF4 2A0B 09 ADD HL,BC 2A0C D1 POP DE 2A0D C1 POP BC 2A0E 10B3 DJNZ M29C3 2A10 CB79 BIT 7,C 2A12 2066 M2A12: JR NZ,M2A7A 2A14 E5 PUSH HL 2A15 CB71 BIT 6,C 2A17 2013 JR NZ,M2A2C 2A19 42 LD B,D 2A1A 4B LD C,E 2A1B DF RST GETAKT 2A1C FE29 CP ')' 2A1E 2802 JR Z,M2A22 2A20 CF M2A20: RST ERRAUS 2A21 02 DEFB 2 2A22 E7 M2A22: RST GETNXT 2A23 E1 POP HL 2A24 110500 LD DE,5 2A27 CDF42A CALL M2AF4 2A2A 09 ADD HL,BC 2A2B C9 RET ;Stringarrays weiter bearbeiten 2A2C CDEE2A M2A2C: CALL M2AEE 2A2F E3 EX (SP),HL 2A30 CDF42A CALL M2AF4 2A33 C1 POP BC 2A34 09 ADD HL,BC 2A35 23 INC HL 2A36 42 LD B,D 2A37 4B LD C,E 2A38 EB EX DE,HL 2A39 CDB12A CALL M2AB1 2A3C DF RST GETAKT 2A3D FE29 CP ')' 2A3F 2807 JR Z,M2A48 2A41 FE2C CP ',' 2A43 20DB JR NZ,M2A20 2A45 CD522A M2A45: CALL M2A52 2A48 E7 M2A48: RST GETNXT 2A49 FE28 M2A49: CP '(' 2A4B 28F8 JR Z,M2A45 2A4D FDCB01B6 RES 6,(IY+1) 2A51 C9 RET ;Subroutine zum Bearbeiten von Teilstrings 2A52 CD3025 M2A52: CALL M2530 2A55 C4F12B CALL NZ,M2BF1 2A58 E7 RST GETNXT 2A59 FE29 CP ')' 2A5B 2850 JR Z,M2AAD 2A5D D5 PUSH DE 2A5E AF XOR A 2A5F F5 PUSH AF 2A60 C5 PUSH BC 2A61 110100 LD DE,1 2A64 DF RST GETAKT 2A65 E1 POP HL 2A66 FECC CP 0CCH 2A68 2817 JR Z,M2A81 2A6A F1 POP AF 2A6B CDCD2A CALL M2ACD 2A6E F5 PUSH AF 2A6F 50 LD D,B 2A70 59 LD E,C 2A71 E5 PUSH HL 2A72 DF RST GETAKT 2A73 E1 POP HL 2A74 FECC CP 0CCH 2A76 2809 JR Z,M2A81 2A78 FE29 CP ')' 2A7A C28A1C M2A7A: JP NZ,M1C8A ;Hier wird ein einzelnes Zeichen eines Strings, ;z.B. C$(7), bearbeitet 2A7D 62 LD H,D 2A7E 6B LD L,E 2A7F 1813 JR M2A94 2A81 E5 M2A81: PUSH HL 2A82 E7 RST GETNXT 2A83 E1 POP HL 2A84 FE29 CP ')' 2A86 280C JR Z,M2A94 2A88 F1 POP AF 2A89 CDCD2A CALL M2ACD 2A8C F5 PUSH AF 2A8D DF RST GETAKT 2A8E 60 LD H,B 2A8F 69 LD L,C 2A90 FE29 CP ')' 2A92 20E6 JR NZ,M2A7A 2A94 F1 M2A94: POP AF 2A95 E3 EX (SP),HL 2A96 19 ADD HL,DE 2A97 2B DEC HL 2A98 E3 EX (SP),HL 2A99 A7 AND A 2A9A ED52 SBC HL,DE 2A9C 010000 LD BC,0 2A9F 3807 JR C,M2AA8 2AA1 23 INC HL 2AA2 A7 AND A 2AA3 FA202A JP M,M2A20 2AA6 44 LD B,H 2AA7 4D LD C,L 2AA8 D1 M2AA8: POP DE 2AA9 FDCB01B6 RES 6,(IY+1) 2AAD CD3025 M2AAD: CALL M2530 2AB0 C8 RET Z ;Subroutine, um Parameter, die in den Reg. A - E enthalten ;sind, auf den Calc.-Stack abzulegen. Reg. A = 0 bedeutet ;String von einem Array oder ein Teilstring, eine 1 signa- ;lisiert einen einfachen String, dessen alter Wert entfernt ;werden kann. 2AB1 AF M2AB1: XOR A 2AB2 FDCB01B6 M2AB2: RES 6,(IY+1) 2AB6 C5 M2AB6: PUSH BC 2AB7 CDA933 CALL PLATZ5 2ABA C1 POP BC 2ABB 2A655C LD HL,(STKEND) ;Anfang des freien Speichers 2ABE 77 LD (HL),A 2ABF 23 INC HL 2AC0 73 LD (HL),E 2AC1 23 INC HL 2AC2 72 LD (HL),D 2AC3 23 INC HL 2AC4 71 LD (HL),C 2AC5 23 INC HL 2AC6 70 LD (HL),B 2AC7 23 INC HL 2AC8 22655C LD (STKEND),HL ;Anfang des freien Speichers 2ACB C9 RET ;Subroutine zum Einlesen einer Integerzahl ins Reg. BC. ;Das Ergebnis darf nicht groesser als der Inhalt von HL ;sein, sonst ERROR. Erroranzeige in Reg. A: 0FFH = ERROR 2ACC AF M2ACC: XOR A 2ACD D5 M2ACD: PUSH DE 2ACE E5 PUSH HL 2ACF F5 PUSH AF 2AD0 CD821C CALL PAR06 2AD3 F1 POP AF 2AD4 CD3025 CALL M2530 2AD7 2812 JR Z,M2AEB 2AD9 F5 PUSH AF 2ADA CD991E CALL M1E99 2ADD D1 POP DE 2ADE 78 LD A,B 2ADF B1 OR C 2AE0 37 SCF 2AE1 2805 JR Z,M2AE8 2AE3 E1 POP HL 2AE4 E5 PUSH HL 2AE5 A7 AND A 2AE6 ED42 SBC HL,BC 2AE8 7A M2AE8: LD A,D 2AE9 DE00 SBC A,0 2AEB E1 M2AEB: POP HL 2AEC D1 POP DE 2AED C9 RET ;Diese Subroutine laedt Register DE aus den Speicher- ;plaetzen (DE+1),(DE+2) 2AEE EB M2AEE: EX DE,HL 2AEF 23 INC HL 2AF0 5E LD E,(HL) 2AF1 23 INC HL 2AF2 56 LD D,(HL) 2AF3 C9 RET ;Subroutine zum Berechnen von DE * HL und Test, dass ;das Ergibnis in HL kleiner als 65536 ist 2AF4 CD3025 M2AF4: CALL M2530 2AF7 C8 RET Z 2AF8 CDA930 CALL M30A9 2AFB DA151F JP C,M1F15 2AFE C9 RET ;Befehl LET ;Es wird die tatsaechliche Zuweisung bei LET, READ und ;INPUT durchgefuehrt 2AFF 2A4D5C M2AFF: LD HL,(DEST) ;Variablenadresse bei Zuweisung 2B02 FDCB374E BIT 1,(IY+37H) 2B06 285E JR Z,M2B66 2B08 010500 LD BC,5 2B0B 03 M2B0B: INC BC 2B0C 23 M2B0C: INC HL 2B0D 7E LD A,(HL) 2B0E FE20 CP ' ' 2B10 28FA JR Z,M2B0C 2B12 300B JR NC,M2B1F 2B14 FE10 CP 10H 2B16 3811 JR C,M2B29 2B18 FE16 CP 16H 2B1A 300D JR NC,M2B29 2B1C 23 INC HL 2B1D 18ED JR M2B0C 2B1F CD882C M2B1F: CALL M2C88 2B22 38E7 JR C,M2B0B 2B24 FE24 CP '$' 2B26 CAC02B JP Z,M2BC0 ;Fuer eine neue numerische Variable werden 'BC' Plaetze ;gebraucht (NAME + WERT). Danach wird die Variable ;komplett kopiert. 2B29 79 M2B29: LD A,C 2B2A 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 2B2D 2B DEC HL 2B2E CD5516 CALL MACHPL 2B31 23 INC HL 2B32 23 INC HL 2B33 EB EX DE,HL 2B34 D5 PUSH DE 2B35 2A4D5C LD HL,(DEST) ;Variablenadresse bei Zuweisung 2B38 1B DEC DE 2B39 D606 SUB 6 2B3B 47 LD B,A 2B3C 2811 JR Z,M2B4F 2B3E 23 M2B3E: INC HL 2B3F 7E LD A,(HL) 2B40 FE21 CP '!' 2B42 38FA JR C,M2B3E 2B44 F620 OR 20H 2B46 13 INC DE 2B47 12 LD (DE),A 2B48 10F4 DJNZ M2B3E 2B4A F680 OR 80H 2B4C 12 LD (DE),A 2B4D 3EC0 LD A,0C0H 2B4F 2A4D5C M2B4F: LD HL,(DEST) ;Variablenadresse bei Zuweisung 2B52 AE XOR (HL) 2B53 F620 OR 20H 2B55 E1 POP HL 2B56 CDEA2B CALL M2BEA 2B59 E5 M2B59: PUSH HL 2B5A EF RST CALRUF 2B5B 02 DEFB 2 2B5C 38 DEFB 38H 2B5D E1 POP HL 2B5E 010500 LD BC,5 2B61 A7 AND A 2B62 ED42 SBC HL,BC 2B64 1840 JR M2BA6 ;Bearbeitung einer bereits vorhandenen Variablen 2B66 FDCB0176 M2B66: BIT 6,(IY+1) 2B6A 2806 JR Z,M2B72 ;Der alte Zahlenwert einer numerischen Variablen wird ;durch den neuen ueberschrieben. HL muss deshalb ;korrigiert werden. 2B6C 110600 LD DE,6 2B6F 19 ADD HL,DE 2B70 18E7 JR M2B59 ;Stringvariablen bearbeiten 2B72 2A4D5C M2B72: LD HL,(DEST) ;Variablenadresse bei Zuweisung 2B75 ED4B725C LD BC,(STRLEN) ;Laenge eines Strings 2B79 FDCB3746 BIT 0,(IY+37H) 2B7D 2030 JR NZ,M2BAF ;Bearbeiten von Teilstrings und Strings von Arrays 2B7F 78 LD A,B 2B80 B1 OR C 2B81 C8 RET Z 2B82 E5 PUSH HL 2B83 F7 RST REST30 2B84 D5 PUSH DE 2B85 C5 PUSH BC 2B86 54 LD D,H 2B87 5D LD E,L 2B88 23 INC HL 2B89 3620 LD (HL),' ' 2B8B EDB8 LDDR 2B8D E5 PUSH HL 2B8E CDF12B CALL M2BF1 2B91 E1 POP HL 2B92 E3 EX (SP),HL 2B93 A7 AND A 2B94 ED42 SBC HL,BC 2B96 09 ADD HL,BC 2B97 3002 JR NC,M2B9B 2B99 44 LD B,H 2B9A 4D LD C,L 2B9B E3 M2B9B: EX (SP),HL 2B9C EB EX DE,HL 2B9D 78 LD A,B 2B9E B1 OR C 2B9F 2802 JR Z,M2BA3 2BA1 EDB0 LDIR 2BA3 C1 M2BA3: POP BC 2BA4 D1 POP DE 2BA5 E1 POP HL ;Subroutine zum Einschreiben einer numerischen Variablen ;vom Calc.-Stack oder eines Strings vom Workspace in den ;Variablenbereich 2BA6 EB M2BA6: EX DE,HL 2BA7 78 LD A,B 2BA8 B1 OR C 2BA9 C8 RET Z 2BAA D5 PUSH DE 2BAB EDB0 LDIR 2BAD E1 POP HL 2BAE C9 RET ;Bearbeitung eines kompletten, neuen und einfachen Strings ;(von LET herkommend) 2BAF 2B M2BAF: DEC HL 2BB0 2B DEC HL 2BB1 2B DEC HL 2BB2 7E LD A,(HL) 2BB3 E5 PUSH HL 2BB4 C5 PUSH BC 2BB5 CDC62B CALL M2BC6 2BB8 C1 POP BC 2BB9 E1 POP HL 2BBA 03 INC BC 2BBB 03 INC BC 2BBC 03 INC BC 2BBD C3E819 JP RAUS2 ;neue einfache Strings bearbeiten 2BC0 3EDF M2BC0: LD A,0DFH 2BC2 2A4D5C LD HL,(DEST) ;Variablenadresse bei Zuweisung 2BC5 A6 AND (HL) 2BC6 F5 M2BC6: PUSH AF 2BC7 CDF12B CALL M2BF1 2BCA EB EX DE,HL 2BCB 09 ADD HL,BC 2BCC C5 PUSH BC 2BCD 2B DEC HL 2BCE 224D5C LD (DEST),HL ;Variablenadresse bei Zuweisung 2BD1 03 INC BC 2BD2 03 INC BC 2BD3 03 INC BC 2BD4 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 2BD7 2B DEC HL 2BD8 CD5516 CALL MACHPL 2BDB 2A4D5C LD HL,(DEST) ;Variablenadresse bei Zuweisung 2BDE C1 POP BC 2BDF C5 PUSH BC 2BE0 03 INC BC 2BE1 EDB8 LDDR 2BE3 EB EX DE,HL 2BE4 23 INC HL 2BE5 C1 POP BC 2BE6 70 LD (HL),B 2BE7 2B DEC HL 2BE8 71 LD (HL),C 2BE9 F1 POP AF ;Subroutine zum Einschreiben des ersten Zeichens eines ;Variablennamens (altes Endebyte mit 80H). HL zeigt am ;Ende auf die neue Ende(80H)-Position. 2BEA 2B M2BEA: DEC HL 2BEB 77 LD (HL),A 2BEC 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 2BEF 2B DEC HL 2BF0 C9 RET ;Subroutine zum Laden des letzten Eintrags vom Calc.-Stack. ;Dier Werte koennen eine Variable oder Stringparameter sein. 2BF1 2A655C M2BF1: LD HL,(STKEND) ;Anfang des freien Speichers 2BF4 2B DEC HL 2BF5 46 LD B,(HL) 2BF6 2B DEC HL 2BF7 4E LD C,(HL) 2BF8 2B DEC HL 2BF9 56 LD D,(HL) 2BFA 2B DEC HL 2BFB 5E LD E,(HL) 2BFC 2B DEC HL 2BFD 7E LD A,(HL) 2BFE 22655C LD (STKEND),HL ;Anfang des freien Speichers 2C01 C9 RET ;Befehl DIM ;Diese Routine dient zum Anlegen der Arrays. Wenn bereits ;ein Array unter dem gleichen Namen existiert, so wird das ;alte ueberschrieben. Das ganze Array wird beim Anlegen mit ;0 (numerisch) oder 20H (Space, bei Strings) beschrieben. 2C02 CDB228 M2C02: CALL M28B2 2C05 C28A1C M2C05: JP NZ,M1C8A 2C08 CD3025 CALL M2530 2C0B 2008 JR NZ,M2C15 2C0D CBB1 RES 6,C 2C0F CD9629 CALL M2996 2C12 CDEE1B CALL M1BEE 2C15 3808 M2C15: JR C,M2C1F 2C17 C5 PUSH BC 2C18 CDB819 CALL M19B8 2C1B CDE819 CALL RAUS2 2C1E C1 POP BC 2C1F CBF9 M2C1F: SET 7,C 2C21 0600 LD B,0 2C23 C5 PUSH BC 2C24 210100 LD HL,1 2C27 CB71 BIT 6,C 2C29 2002 JR NZ,M2C2D 2C2B 2E05 LD L,5 2C2D EB M2C2D: EX DE,HL 2C2E E7 M2C2E: RST GETNXT 2C2F 26FF LD H,0FFH 2C31 CDCC2A CALL M2ACC 2C34 DA202A JP C,M2A20 2C37 E1 POP HL 2C38 C5 PUSH BC 2C39 24 INC H 2C3A E5 PUSH HL 2C3B 60 LD H,B 2C3C 69 LD L,C 2C3D CDF42A CALL M2AF4 2C40 EB EX DE,HL 2C41 DF RST GETAKT 2C42 FE2C CP ',' 2C44 28E8 JR Z,M2C2E 2C46 FE29 CP ')' 2C48 20BB JR NZ,M2C05 2C4A E7 RST GETNXT 2C4B C1 POP BC 2C4C 79 LD A,C 2C4D 68 LD L,B 2C4E 2600 LD H,0 2C50 23 INC HL 2C51 23 INC HL 2C52 29 ADD HL,HL 2C53 19 ADD HL,DE 2C54 DA151F JP C,M1F15 2C57 D5 PUSH DE 2C58 C5 PUSH BC 2C59 E5 PUSH HL 2C5A 44 LD B,H 2C5B 4D LD C,L 2C5C 2A595C LD HL,(ELINE) ;Adresse des eingegebenen Befehls 2C5F 2B DEC HL 2C60 CD5516 CALL MACHPL 2C63 23 INC HL 2C64 77 LD (HL),A 2C65 C1 POP BC 2C66 0B DEC BC 2C67 0B DEC BC 2C68 0B DEC BC 2C69 23 INC HL 2C6A 71 LD (HL),C 2C6B 23 INC HL 2C6C 70 LD (HL),B 2C6D C1 POP BC 2C6E 78 LD A,B 2C6F 23 INC HL 2C70 77 LD (HL),A 2C71 62 LD H,D 2C72 6B LD L,E 2C73 1B DEC DE 2C74 3600 LD (HL),0 2C76 CB71 BIT 6,C 2C78 2802 JR Z,M2C7C 2C7A 3620 LD (HL),' ' 2C7C C1 M2C7C: POP BC 2C7D EDB8 LDDR 2C7F C1 M2C7F: POP BC 2C80 70 LD (HL),B 2C81 2B DEC HL 2C82 71 LD (HL),C 2C83 2B DEC HL 2C84 3D DEC A 2C85 20F8 JR NZ,M2C7F 2C87 C9 RET ;Subroutine zum Pruefen auf alphanumerisch. CARRY ist ;gesetzt bei Buchstaben und Ziffern. 2C88 CD1B2D M2C88: CALL ZIFFER 2C8B 3F CCF 2C8C D8 RET C ;Subroutine ueberprueft auf Buchstaben. CARRY ist ;bei Buchstaben gesetzt. 2C8D FE41 M2C8D: CP 'A' 2C8F 3F CCF 2C90 D0 RET NC 2C91 FE5B CP 5BH 2C93 D8 RET C 2C94 FE61 CP 'a' 2C96 3F CCF 2C97 D0 RET NC 2C98 FE7B CP 7BH 2C9A C9 RET ;Subroutien zum Wandeln von Dezimalzahlen oder, mit dem ;Zusatz 'BIN', Binaerzahlen in Floatingpointzahlen, die ;dann als letztes Ergebnis auf dem Calc.-Stack abgelegt ;werden. 2C9B FEC4 DEZFLO: CP 0C4H 2C9D 2019 JR NZ,M2CB8 2C9F 110000 LD DE,0 2CA2 E7 BINFLO: RST GETNXT 2CA3 D631 SUB '1' 2CA5 CE00 ADC A,0 2CA7 200A JR NZ,M2CB3 2CA9 EB EX DE,HL 2CAA 3F CCF 2CAB ED6A ADC HL,HL 2CAD DAAD31 JP C,M31AD 2CB0 EB EX DE,HL 2CB1 18EF JR BINFLO 2CB3 42 M2CB3: LD B,D 2CB4 4B LD C,E 2CB5 C32B2D JP M2D2B 2CB8 FE2E M2CB8: CP '.' 2CBA 280F JR Z,M2CCB 2CBC CD3B2D CALL M2D3B 2CBF FE2E CP '.' 2CC1 2028 JR NZ,M2CEB 2CC3 E7 RST GETNXT 2CC4 CD1B2D CALL ZIFFER 2CC7 3822 JR C,M2CEB 2CC9 180A JR M2CD5 ;Zahlen, die mit Punkt anfangen bearbeiten 2CCB E7 M2CCB: RST GETNXT 2CCC CD1B2D CALL ZIFFER 2CCF DA8A1C M2CCF: JP C,M1C8A 2CD2 EF RST CALRUF 2CD3 A0 DEFB 0A0H 2CD4 38 DEFB 38H 2CD5 EF M2CD5: RST CALRUF 2CD6 A1 DEFB 0A1H 2CD7 C0 DEFB 0C0H 2CD8 02 DEFB 2 2CD9 38 DEFB 38H 2CDA DF M2CDA: RST GETAKT 2CDB CD222D CALL M2D22 2CDE 380B JR C,M2CEB 2CE0 EF RST CALRUF 2CE1 E0 DEFB 0E0H 2CE2 A4 DEFB 0A4H 2CE3 05 DEFB 5 2CE4 C0 DEFB 0C0H 2CE5 04 DEFB 4 2CE6 0F DEFB 0FH 2CE7 38 DEFB 38H 2CE8 E7 RST GETNXT 2CE9 18EF JR M2CDA ;Exponent untersuchen 2CEB FE45 M2CEB: CP 'E' 2CED 2803 JR Z,M2CF2 2CEF FE65 CP 'e' 2CF1 C0 RET NZ 2CF2 06FF M2CF2: LD B,0FFH 2CF4 E7 RST GETNXT 2CF5 FE2B CP '+' 2CF7 2805 JR Z,M2CFE 2CF9 FE2D CP '-' 2CFB 2002 JR NZ,M2CFF 2CFD 04 INC B 2CFE E7 M2CFE: RST GETNXT 2CFF CD1B2D M2CFF: CALL ZIFFER 2D02 38CB JR C,M2CCF 2D04 C5 PUSH BC 2D05 CD3B2D CALL M2D3B 2D08 CDD52D CALL M2DD5 2D0B C1 POP BC 2D0C DAAD31 JP C,M31AD 2D0F A7 AND A 2D10 FAAD31 JP M,M31AD 2D13 04 INC B 2D14 2802 JR Z,M2D18 2D16 ED44 NEG 2D18 C34F2D M2D18: JP M2D4F ;Subroutine zum Untersuchen auf Ziffern. Bei Ziffern ;wird das CARRY-Flag gesetzt. 2D1B FE30 ZIFFER: CP '0' 2D1D D8 RET C 2D1E FE3A CP ':' 2D20 3F CCF 2D21 C9 RET ;Subroutine zum Ablegen eines Digits (Ziffer) auf dem ;Calc.-Stack. 2D22 CD1B2D M2D22: CALL ZIFFER 2D25 D8 RET C 2D26 D630 SUB '0' ;Subroutine legt Binaerzahl in A als Floatingpointzahl ;auf dem Calc.-Stack als letzten Wert ab. 2D28 4F M2D28: LD C,A 2D29 0600 LD B,0 ;Subroutine zum Ablegen der Integerzahl in BC auf dem ;Calc.-Stack als letzter Wert in Floatingpointformat. ;Das 1. und das 5. Byte sind immer 0, das 2. gibt das ;Vorzeichen an: 0 = positiv, FFH = negativ. Das 3. Byte ;ist das Lowbyte und das 4. das Highbyte. Die Ablage ;erfolgt im 2-Komplement. 2D2B FD213A5C M2D2B: LD IY,ERRNR 2D2F AF XOR A 2D30 5F LD E,A 2D31 51 LD D,C 2D32 48 LD C,B 2D33 47 LD B,A 2D34 CDB62A CALL M2AB6 2D37 EF RST CALRUF 2D38 38 DEFB 38H 2D39 A7 AND A 2D3A C9 RET ;Subroutine zum Einlesen ganzzahliger Dezimalzahlen als ;letzten Wert auf dem Calc.-Stack. Aufruf erfolgt z.B. ;beim Einlesen einer Dezimalzahl aus einer BASIC-Zeile. ;(siehe (DEZFLO) 2D3B F5 M2D3B: PUSH AF 2D3C EF RST CALRUF 2D3D A0 DEFB 0A0H 2D3E 38 DEFB 38H 2D3F F1 POP AF 2D40 CD222D M2D40: CALL M2D22 2D43 D8 RET C 2D44 EF RST CALRUF 2D45 01 DEFB 1 2D46 A4 DEFB 0A4H 2D47 04 DEFB 4 2D48 0F DEFB 0FH 2D49 38 DEFB 38H 2D4A CD7400 CALL NEXZEI 2D4D 18F1 JR M2D40 ;Arithmetische Routinen ;Wandlung von Dezimalzahlen mit Mantisse/Exponent- ;Darstellung (xEn) in eine Floatingpointzahl. X steht ;als letzter Wert bereits auf dem Calc.-Stack. 2D4F 07 M2D4F: RLCA 2D50 0F RRCA 2D51 3002 JR NC,M2D55 2D53 2F CPL 2D54 3C INC A 2D55 F5 M2D55: PUSH AF 2D56 21925C LD HL,MEMBOT ;Calculatorspeicher 2D59 CD0B35 CALL M350B 2D5C EF RST CALRUF 2D5D A4 DEFB 0A4H 2D5E 38 DEFB 38H 2D5F F1 POP AF 2D60 CB3F EXSCHL: SRL A 2D62 300D JR NC,M2D71 2D64 F5 PUSH AF 2D6? E? RS? CALRUF 2D66 C1 DEFB 0C1H 2D67 E0 DEFB 0E0H 2D68 00 DEFB 0 2D69 04 DEFB EXDIV-$ 2D6A 04 DEFB 4 2D6B 33 DEFB 33H 2D6C 02 DEFB EXGET1-$ 2D6D 05 EXDIV: DEFB 5 2D6E E1 EXGET1: DEFB 0E1H 2D6F 38 DEFB 38H 2D70 F1 POP AF 2D71 2808 M2D71: JR Z,M2D7B 2D73 F5 PUSH AF 2D74 EF RST CALRUF 2D75 31 DEFB 31H 2D76 04 DEFB 4 2D77 38 DEFB 38H 2D78 F1 POP AF 2D79 18E5 JR EXSCHL 2D7B EF M2D7B: RST CALRUF 2D7C 02 DEFB 2 2D7D 38 DEFB 38H 2D7E C9 RET ;Subroutine zum Holen einer Integerzahl vom Calc.-Stack 2D7F 23 M2D7F: INC HL 2D80 4E LD C,(HL) 2D81 23 INC HL 2D82 7E LD A,(HL) 2D83 A9 XOR C 2D84 91 SUB C 2D85 5F LD E,A 2D86 23 INC HL 2D87 7E LD A,(HL) 2D88 89 ADC A,C 2D89 A9 XOR C 2D8A 57 LD D,A 2D8B C9 RET ;Subroutine zum Abspeichern einer Integegerzahl auf dem ;Calc.-Stack 2D8C 0E00 M2D8C: LD C,0 2D8E E5 M2D8E: PUSH HL 2D8F 3600 LD (HL),0 2D91 23 INC HL 2D92 71 LD (HL),C 2D93 23 INC HL 2D94 7B LD A,E 2D95 A9 XOR C 2D96 91 SUB C 2D97 77 LD (HL),A 2D98 23 INC HL 2D99 7A LD A,D 2D9A 89 ADC A,C 2D9B A9 XOR C 2D9C 77 LD (HL),A 2D9D 23 INC HL 2D9E 3600 LD (HL),0 2DA0 E1 POP HL 2DA1 C9 RET ;Subroutine zum Wandeln einer Floatingpointzahl in eine ;Integerzahl und Uebertragen des Ergebnisses in BC 2DA2 EF M2DA2: RST CALRUF 2DA3 38 DEFB 38H 2DA4 7E LD A,(HL) 2DA5 A7 AND A 2DA6 2805 JR Z,M2DAD 2DA8 EF RST CALRUF 2DA9 A2 DEFB 0A2H 2DAA 0F DEFB 0FH 2DAB 27 DEFB 27H 2DAC 38 DEFB 38H 2DAD EF M2DAD: RST CALRUF 2DAE 02 DEFB 2 2DAF 38 DEFB 38H 2DB0 E5 PUSH HL 2DB1 D5 PUSH DE 2DB2 EB EX DE,HL 2DB3 46 LD B,(HL) 2DB4 CD7F2D CALL M2D7F 2DB7 AF XOR A 2DB8 90 SUB B 2DB9 CB79 BIT 7,C 2DBB 42 LD B,D 2DBC 4B LD C,E 2DBD 7B LD A,E 2DBE D1 POP DE 2DBF E1 POP HL 2DC0 C9 RET ;Subroutine zum Berechnen von LOG(2^A). A enthaelt den ;Exponent einer Floatingpointzahl. Die Berechnung dient ;zum Bestimmen der Vorkommastellen einer auszugebenden ;Dezimalzahl oder der auf den Dezimalpunkt folgenden Nullen. 2DC1 57 LOG2A: LD D,A 2DC2 17 RLA 2DC3 9F SBC A,A 2DC4 5F LD E,A 2DC5 4F LD C,A 2DC6 AF XOR A 2DC7 47 LD B,A 2DC8 CDB62A CALL M2AB6 2DCB EF RST CALRUF 2DCC 34 DEFB 34H 2DCD EF DEFB 0EFH 2DCE 1A DEFB 1AH 2DCF 20 DEFB 20H 2DD0 9A DEFB 9AH 2DD1 85 DEFB 85H 2DD2 04 DEFB 4 2DD3 27 DEFB 27H 2DD4 38 DEFB 38H ;Floatingpointzahl in eine Integerzahl von einem Byte wandeln, ;Ergebnis in A. Wenn das Ergebnis >255 ist, erfolgt eine ERROR- ;Meldung. 2DD5 CDA22D M2DD5: CALL M2DA2 2DD8 D8 RET C 2DD9 F5 PUSH AF 2DDA 05 DEC B 2DDB 04 INC B 2DDC 2803 JR Z,M2DE1 2DDE F1 POP AF 2DDF 37 SCF 2DE0 C9 RET 2DE1 F1 M2DE1: POP AF 2DE2 C9 RET ;Subroutine zum Ausgeben einer Floatingpointzahl durch 'PRINT'- ;oder 'STR$'-Befehl 2DE3 EF M2DE3: RST CALRUF 2DE4 31 DEFB 31H 2DE5 36 DEFB 36H 2DE6 00 DEFB 0 2DE7 0B DEFB FPNEGA-$ 2DE8 31 DEFB 31H 2DE9 37 DEFB 37H 2DEA 00 DEFB 0 2DEB 0D DEFB FPPOSI-$ 2DEC 02 DEFB 2 2DED 38 DEFB 38H 2DEE 3E30 LD A,'0' 2DF0 D7 RST PRTOUT 2DF1 C9 RET ;Fuer negative Zahlen erst ein Minuszeichen ausgeben und ;dann ABS(X) bilden, so dass die Zahl im weiteren wie eine ;Positive behandelt werden kann. 2DF2 2A FPNEGA: DEFB 2AH 2DF3 38 DEFB 38H 2DF4 3E2D LD A,'-' 2DF6 D7 RST PRTOUT 2DF7 EF RST CALRUF ;Xist im folgenden ABS(X) 2DF8 A0 FPPOSI: DEFB 0A0H 2DF9 C3 DEFB 0C3H 2DFA C4 DEFB 0C4H 2DFB C5 DEFB 0C5H 2DFC 02 DEFB 2 2DFD 38 DEFB 38H 2DFE D9 EXX 2DFF E5 PUSH HL 2E00 D9 EXX 2E01 EF M2E01: RST CALRUF 2E02 31 DEFB 31H 2E03 27 DEFB 27H 2E04 C2 DEFB 0C2H 2E05 03 DEFB 3 2E06 E2 DEFB 0E2H 2E07 01 DEFB 1 2E08 C2 DEFB 0C2H 2E09 02 DEFB 2 2E0A 38 DEFB 38H 2E0B 7E LD A,(HL) 2E0C A7 AND A 2E0D 2047 JR NZ,M2E56 2E0F CD7F2D CALL M2D7F 2E12 0610 LD B,10H 2E14 7A LD A,D 2E15 A7 AND A 2E16 2006 JR NZ,M2E1E 2E18 B3 OR E 2E19 2809 JR Z,M2E24 2E1B 53 LD D,E 2E1C 0608 LD B,8 2E1E D5 M2E1E: PUSH DE 2E1F D9 EXX 2E20 D1 POP DE 2E21 D9 EXX 2E22 1857 JR M2E7B ;Bearbeitung, wenn nur ein Nachkommateil vorhanden 2E24 EF M2E24: RST CALRUF 2E25 E2 DEFB 0E2H 2E26 38 DEFB 38H 2E27 7E LD A,(HL) 2E28 D67E SUB 7EH 2E2A CDC12D CALL LOG2A 2E2D 57 LD D,A 2E2E 3AAC5C LD A,(5CACH) 2E31 92 SUB D 2E32 32AC5C LD (5CACH),A 2E35 7A LD A,D 2E36 CD4F2D CALL M2D4F 2E39 EF RST CALRUF 2E3A 31 DEFB 31H 2E3B 27 DEFB 27H 2E3C C1 DEFB 0C1H 2E3D 03 DEFB 3 2E3E E1 DEFB 0E1H 2E3F 38 DEFB 38H 2E40 CDD52D CALL M2DD5 2E43 E5 PUSH HL 2E44 32A15C LD (5CA1H),A 2E47 3D DEC A 2E48 17 RLA 2E49 9F SBC A,A 2E4A 3C INC A 2E4B 21AB5C LD HL,5CABH 2E4E 77 LD (HL),A 2E4F 23 INC HL 2E50 86 ADD A,(HL) 2E51 77 LD (HL),A 2E52 E1 POP HL 2E53 C3CF2E JP M2ECF ;Zahlen, die groesser als 2^27 sind, werden so bearbeitet, ;dass 8 Stellen vor dem Komma ausgegeben werden. 2E56 D680 M2E56: SUB 80H 2E58 FE1C CP 28 2E5A 3813 JR C,M2E6F 2E5C CDC12D CALL LOG2A 2E5F D607 SUB 7 2E61 47 LD B,A 2E62 21AC5C LD HL,5CACH 2E65 86 ADD A,(HL) 2E66 77 LD (HL),A 2E67 78 LD A,B 2E68 ED44 NEG 2E6A CD4F2D CALL M2D4F 2E6D 1892 JR M2E01 ;Integerteil von X in den Ausgabepuffer MEM3 und MEM4 ;speichern 2E6F EB M2E6F: EX DE,HL 2E70 CDBA2F CALL M2FBA 2E73 D9 EXX 2E74 CBFA SET 7,D 2E76 7D LD A,L 2E77 D9 EXX 2E78 D680 SUB 80H 2E7A 47 LD B,A 2E7B CB23 M2E7B: SLA E 2E7D CB12 RL D 2E7F D9 EXX 2E80 CB13 RL E 2E82 CB12 RL D 2E84 D9 EXX 2E85 21AA5C LD HL,5CAAH 2E88 0E05 LD C,5 2E8A 7E M2E8A: LD A,(HL) 2E8B 8F ADC A,A 2E8C 27 DAA 2E8D 77 LD (HL),A 2E8E 2B DEC HL 2E8F 0D DEC C 2E90 20F8 JR NZ,M2E8A 2E92 10E7 DJNZ M2E7B ;Das Ergbenis liegt nunmehr gepackt in MEM4 vor. Dieses wird ;jetzt auf insgesamt 9 Bytes, pro Stelle ein Byte, aufgeteilt ;nach MEM3 und MEM4. 2E94 AF XOR A 2E95 21A65C LD HL,5CA6H 2E98 11A15C LD DE,5CA1H 2E9B 0609 LD B,9 2E9D ED6F RLD 2E9F 0EFF LD C,0FFH 2EA1 ED6F M2EA1: RLD 2EA3 2004 JR NZ,M2EA9 2EA5 0D DEC C 2EA6 0C INC C 2EA7 200A JR NZ,M2EB3 2EA9 12 M2EA9: LD (DE),A 2EAA 13 INC DE 2EAB FD3471 INC (IY+71H) 2EAE FD3472 INC (IY+72H) 2EB1 0E00 LD C,0 2EB3 CB40 M2EB3: BIT 0,B 2EB5 2801 JR Z,M2EB8 2EB7 23 INC HL 2EB8 10E7 M2EB8: DJNZ M2EA1 2EBA 3AAB5C LD A,(5CABH) 2EBD D609 SUB 9 2EBF 380A JR C,M2ECB 2EC1 FD3571 DEC (IY+71H) 2EC4 3E04 LD A,4 2EC6 FDBE6F CP (IY+6FH) 2EC9 1841 JR DEZRND ;Die Nachkommastellen werden jetzt im Ausgabepuffer ;abgelegt. 2ECB EF M2ECB: RST CALRUF 2ECC 02 DEFB 2 2ECD E2 DEFB 0E2H 2ECE 38 DEFB 38H 2ECF EB M2ECF: EX DE,HL 2ED0 CDBA2F CALL M2FBA 2ED3 D9 EXX 2ED4 3E80 LD A,80H 2ED6 95 SUB L 2ED7 2E00 LD L,0 2ED9 CBFA SET 7,D 2EDB D9 EXX 2EDC CDDD2F CALL SHIFTF 2EDF FD7E71 M2EDF: LD A,(IY+71H) 2EE2 FE08 CP 8 2EE4 3806 JR C,M2EEC 2EE6 D9 EXX 2EE7 CB12 RL D 2EE9 D9 EXX 2EEA 1820 JR DEZRND 2EEC 010002 M2EEC: LD BC,200H 2EEF 7B M2EEF: LD A,E 2EF0 CD8B2F CALL M2F8B 2EF3 5F LD E,A 2EF4 7A LD A,D 2EF5 CD8B2F CALL M2F8B 2EF8 57 LD D,A 2EF9 C5 PUSH BC 2EFA D9 EXX 2EFB C1 POP BC 2EFC 10F1 DJNZ M2EEF 2EFE 21A15C LD HL,5CA1H 2F01 79 LD A,C 2F02 FD4E71 LD C,(IY+71H) 2F05 09 ADD HL,BC 2F06 77 LD (HL),A 2F07 FD3471 INC (IY+71H) 2F0A 18D3 JR M2EDF ;die Dezimalstellen runden 2F0C F5 DEZRND: PUSH AF 2F0D 21A15C LD HL,5CA1H 2F10 FD4E71 LD C,(IY+71H) 2F13 0600 LD B,0 2F15 09 ADD HL,BC 2F16 41 LD B,C 2F17 F1 POP AF 2F18 2B M2F18: DEC HL 2F19 7E LD A,(HL) 2F1A CE00 ADC A,0 2F1C 77 LD (HL),A 2F1D A7 AND A 2F1E 2805 JR Z,M2F25 2F20 FE0A CP 0AH 2F22 3F CCF 2F23 3008 JR NC,M2F2D 2F25 10F1 M2F25: DJNZ M2F18 2F27 3601 LD (HL),1 2F29 04 INC B 2F2A FD3472 INC (IY+72H) 2F2D FD7071 M2F2D: LD (IY+71H),B 2F30 EF RST CALRUF 2F31 02 DEFB 2 2F32 38 DEFB 38H 2F33 D9 EXX 2F34 E1 POP HL 2F35 D9 EXX ;die Zahl kann ausgegeben werden 2F36 ED4BAB5C LD BC,(5CABH) 2F3A 21A15C LD HL,5CA1H 2F3D 78 LD A,B 2F3E FE09 CP 9 2F40 3804 JR C,M2F46 2F42 FEFC CP 0FCH 2F44 3826 JR C,M2F6C 2F46 A7 M2F46: AND A 2F47 CCEF15 CALL Z,M15EF 2F4A AF M2F4A: XOR A 2F4B 90 SUB B 2F4C FA522F JP M,M2F52 2F4F 47 LD B,A 2F50 180C JR M2F5E ;die Stellen vor dem Punkt ausgeben 2F52 79 M2F52: LD A,C 2F53 A7 AND A 2F54 2803 JR Z,M2F59 2F56 7E LD A,(HL) 2F57 23 INC HL 2F58 0D DEC C 2F59 CDEF15 M2F59: CALL M15EF 2F5C 10F4 DJNZ M2F52 2F5E 79 M2F5E: LD A,C 2F5F A7 AND A 2F60 C8 RET Z 2F61 04 INC B 2F62 3E2E LD A,'.' 2F64 D7 M2F64: RST PRTOUT 2F65 3E30 LD A,'0' 2F67 10FB DJNZ M2F64 2F69 41 LD B,C 2F6A 18E6 JR M2F52 ;Einstieg, wenn die Zahl in Exponentialformat ;gedruckt werden muss 2F6C 50 M2F6C: LD D,B 2F6D 15 DEC D 2F6E 0601 LD B,1 2F70 CD4A2F CALL M2F4A 2F73 3E45 LD A,'E' 2F75 D7 RST PRTOUT 2F76 4A LD C,D 2F77 79 LD A,C 2F78 A7 AND A 2F79 F2832F JP P,M2F83 2F7C ED44 NEG 2F7E 4F LD C,A 2F7F 3E2D LD A,'-' 2F81 1802 JR M2F85 2F83 3E2B M2F83: LD A,'+' 2F85 D7 M2F85: RST PRTOUT 2F86 0600 LD B,0 2F88 C31B1A JP M1A1B ;Subroutine zum Berechnen von 10*(A)+(C) 2F8B D5 M2F8B: PUSH DE 2F8C 6F LD L,A 2F8D 2600 LD H,0 2F8F 5D LD E,L 2F90 54 LD D,H 2F91 29 ADD HL,HL 2F92 29 ADD HL,HL 2F93 19 ADD HL,DE 2F94 29 ADD HL,HL 2F95 59 LD E,C 2F96 19 ADD HL,DE 2F97 4C LD C,H 2F98 7D LD A,L 2F99 D1 POP DE 2F9A C9 RET ;Subroutine zum Vorbereiten der Addition einer ;Floatingpointzahl 2F9B 7E M2F9B: LD A,(HL) 2F9C 3600 LD (HL),0 2F9E A7 AND A 2F9F C8 RET Z 2FA0 23 INC HL 2FA1 CB7E BIT 7,(HL) 2FA3 CBFE SET 7,(HL) 2FA5 2B DEC HL 2FA6 C8 RET Z 2FA7 C5 PUSH BC 2FA8 010500 LD BC,5 2FAB 09 ADD HL,BC 2FAC 41 LD B,C 2FAD 4F LD C,A 2FAE 37 SCF 2FAF 2B M2FAF: DEC HL 2FB0 7E LD A,(HL) 2FB1 2F CPL 2FB2 CE00 ADC A,0 2FB4 77 LD (HL),A 2FB5 10F8 DJNZ M2FAF 2FB7 79 LD A,C 2FB8 C1 POP BC 2FB9 C9 RET ;Subroutine zum Laden von 2 Floatingpointzahlen in die ;Prozessorregister. HL zeigt auf 1. Byte der ersten und ;DE auf 1.Byte der zweiten Zahl. ;Zahl 1: M1 - M5 in H',B',C',C,B ;Zahl 2: M1 - M5 in L',D',E',D,E 2FBA E5 M2FBA: PUSH HL 2FBB F5 PUSH AF 2FBC 4E LD C,(HL) 2FBD 23 INC HL 2FBE 46 LD B,(HL) 2FBF 77 LD (HL),A 2FC0 23 INC HL 2FC1 79 LD A,C 2FC2 4E LD C,(HL) 2FC3 C5 PUSH BC 2FC4 23 INC HL 2FC5 4E LD C,(HL) 2FC6 23 INC HL 2FC7 46 LD B,(HL) 2FC8 EB EX DE,HL 2FC9 57 LD D,A 2FCA 5E LD E,(HL) 2FCB D5 PUSH DE 2FCC 23 INC HL 2FCD 56 LD D,(HL) 2FCE 23 INC HL 2FCF 5E LD E,(HL) 2FD0 D5 PUSH DE 2FD1 D9 EXX 2FD2 D1 POP DE 2FD3 E1 POP HL 2FD4 C1 POP BC 2FD5 D9 EXX 2FD6 23 INC HL 2FD7 56 LD D,(HL) 2FD8 23 INC HL 2FD9 5E LD E,(HL) 2FDA F1 POP AF 2FDB E1 POP HL 2FDC C9 RET ;Subroutine zum Shiften einer Zahl um maximal 32 Bits ;fuer eine Addition (Exponentenangleich) 2FDD A7 SHIFTF: AND A 2FDE C8 RET Z 2FDF FE21 CP 33 2FE1 3016 JR NC,ADDNUL 2FE3 C5 PUSH BC 2FE4 47 LD B,A 2FE5 D9 SHIFTB: EXX 2FE6 CB2D SRA L 2FE8 CB1A RR D 2FEA CB1B RR E 2FEC D9 EXX 2FED CB1A RR D 2FEF CB1B RR E 2FF1 10F2 DJNZ SHIFTB 2FF3 C1 POP BC 2FF4 D0 RET NC 2FF5 CD0430 CALL M3004 2FF8 C0 RET NZ 2FF9 D9 ADDNUL: EXX 2FFA AF XOR A 2FFB 2E00 M2FFB: LD L,0 2FFD 57 LD D,A 2FFE 5D LD E,L 2FFF D9 EXX 3000 110000 LD DE,0 3003 C9 RET ;Subroutine zum Addieren eines Carrys bei der Rechtsver- ;schiebung einer Zahl 3004 1C M3004: INC E 3005 C0 RET NZ 3006 14 INC D 3007 C0 RET NZ 3008 D9 EXX 3009 1C INC E 300A 2001 JR NZ,M300D 300C 14 INC D 300D D9 M300D: EXX 300E C9 RET ;Subtraktion zweier Floatingpointzahlen 300F EB SUBTRA: EX DE,HL 3010 CD6E34 CALL NEGIER 3013 EB EX DE,HL ;Subroutine zum Addieren zweier Floatingpointzahlen ;auf dem Calc.-Stack zu einem 'letzten Wert' 3014 1A ADDIER: LD A,(DE) 3015 B6 OR (HL) 3016 2026 JR NZ,M303E ;Addition von Integerzahlen 3018 D5 PUSH DE 3019 23 INC HL 301A E5 PUSH HL 301B 23 INC HL 301C 5E LD E,(HL) 301D 23 INC HL 301E 56 LD D,(HL) 301F 23 INC HL 3020 23 INC HL 3021 23 INC HL 3022 7E LD A,(HL) 3023 23 INC HL 3024 4E LD C,(HL) 3025 23 INC HL 3026 46 LD B,(HL) 3027 E1 POP HL 3028 EB EX DE,HL 3029 09 ADD HL,BC 302A EB EX DE,HL 302B 8E ADC A,(HL) 302C 0F RRCA 302D CE00 ADC A,0 302F 200B JR NZ,M303C 3031 9F SBC A,A 3032 77 LD (HL),A 3033 23 INC HL 3034 73 LD (HL),E 3035 23 INC HL 3036 72 LD (HL),D 3037 2B DEC HL 3038 2B DEC HL 3039 2B DEC HL 303A D1 POP DE 303B C9 RET 303C 2B M303C: DEC HL 303D D1 POP DE 303E CD9332 M303E: CALL M3293 ;volle Addition zweier Zahlen (keine Integerzahlen) 3041 D9 EXX 3042 E5 PUSH HL 3043 D9 EXX 3044 D5 PUSH DE 3045 E5 PUSH HL 3046 CD9B2F CALL M2F9B 3049 47 LD B,A 304A EB EX DE,HL 304B CD9B2F CALL M2F9B 304E 4F LD C,A 304F B8 CP B 3050 3003 JR NC,M3055 3052 78 LD A,B 3053 41 LD B,C 3054 EB EX DE,HL 3055 F5 M3055: PUSH AF 3056 90 SUB B 3057 CDBA2F CALL M2FBA 305A CDDD2F CALL SHIFTF 305D F1 POP AF 305E E1 POP HL 305F 77 LD (HL),A 3060 E5 PUSH HL 3061 68 LD L,B 3062 61 LD H,C 3063 19 ADD HL,DE 3064 D9 EXX 3065 EB EX DE,HL 3066 ED4A ADC HL,BC 3068 EB EX DE,HL 3069 7C LD A,H 306A 8D ADC A,L 306B 6F LD L,A 306C 1F RRA 306D AD XOR L 306E D9 EXX 306F EB EX DE,HL 3070 E1 POP HL 3071 1F RRA 3072 3008 JR NC,M307C 3074 3E01 LD A,1 3076 CDDD2F CALL SHIFTF 3079 34 INC (HL) 307A 2823 JR Z,M309F 307C D9 M307C: EXX 307D 7D LD A,L 307E E680 AND 80H 3080 D9 EXX 3081 23 INC HL 3082 77 LD (HL),A 3083 2B DEC HL 3084 281F JR Z,M30A5 3086 7B LD A,E 3087 ED44 NEG 3089 3F CCF 308A 5F LD E,A 308B 7A LD A,D 308C 2F CPL 308D CE00 ADC A,0 308F 57 LD D,A 3090 D9 EXX 3091 7B LD A,E 3092 2F CPL 3093 CE00 ADC A,0 3095 5F LD E,A 3096 7A LD A,D 3097 2F CPL 3098 CE00 ADC A,0 309A 3007 JR NC,M30A3 309C 1F RRA 309D D9 EXX 309E 34 INC (HL) 309F CAAD31 M309F: JP Z,M31AD 30A2 D9 EXX 30A3 57 M30A3: LD D,A 30A4 D9 EXX 30A5 AF M30A5: XOR A 30A6 C35531 JP TSTNOR ;Subroutine zum Berechnen von HL=DE*HL 30A9 C5 M30A9: PUSH BC 30AA 0610 LD B,10H 30AC 7C LD A,H 30AD 4D LD C,L 30AE 210000 LD HL,0 30B1 29 M30B1: ADD HL,HL 30B2 380A JR C,M30BE 30B4 CB11 RL C 30B6 17 RLA 30B7 3003 JR NC,M30BC 30B9 19 ADD HL,DE 30BA 3802 JR C,M30BE 30BC 10F3 M30BC: DJNZ M30B1 30BE C1 M30BE: POP BC 30BF C9 RET ;Subroutine zum Vorbereiten einer Multiplikation oder ;Division 30C0 CDE934 M30C0: CALL M34E9 30C3 D8 RET C 30C4 23 INC HL 30C5 AE XOR (HL) 30C6 CBFE SET 7,(HL) 30C8 2B DEC HL 30C9 C9 RET ;Subroutine Multiplikation 30CA 1A MULTIP: LD A,(DE) 30CB B6 OR (HL) 30CC 2022 JR NZ,M30F0 30CE D5 PUSH DE 30CF E5 PUSH HL 30D0 D5 PUSH DE 30D1 CD7F2D CALL M2D7F 30D4 EB EX DE,HL 30D5 E3 EX (SP),HL 30D6 41 LD B,C 30D7 CD7F2D CALL M2D7F 30DA 78 LD A,B 30DB A9 XOR C 30DC 4F LD C,A 30DD E1 POP HL 30DE CDA930 CALL M30A9 30E1 EB EX DE,HL 30E2 E1 POP HL 30E3 380A JR C,M30EF 30E5 7A LD A,D 30E6 B3 OR E 30E7 2001 JR NZ,M30EA 30E9 4F LD C,A 30EA CD8E2D M30EA: CALL M2D8E 30ED D1 POP DE 30EE C9 RET 30EF D1 M30EF: POP DE 30F0 CD9332 M30F0: CALL M3293 30F3 AF XOR A 30F4 CDC030 CALL M30C0 30F7 D8 RET C 30F8 D9 EXX 30F9 E5 PUSH HL 30FA D9 EXX 30FB D5 PUSH DE 30FC EB EX DE,HL 30FD CDC030 CALL M30C0 3100 EB EX DE,HL 3101 385A JR C,M315D 3103 E5 PUSH HL 3104 CDBA2F CALL M2FBA 3107 78 LD A,B 3108 A7 AND A 3109 ED62 SBC HL,HL 310B D9 EXX 310C E5 PUSH HL 310D ED62 SBC HL,HL 310F D9 EXX 3110 0621 LD B,21H 3112 1811 JR M3125 3114 3005 M3114: JR NC,M311B 3116 19 ADD HL,DE 3117 D9 EXX 3118 ED5A ADC HL,DE 311A D9 EXX 311B D9 M311B: EXX 311C CB1C RR H 311E CB1D RR L 3120 D9 EXX 3121 CB1C RR H 3123 CB1D RR L 3125 D9 M3125: EXX 3126 CB18 RR B 3128 CB19 RR C 312A D9 EXX 312B CB19 RR C 312D 1F RRA 312E 10E4 DJNZ M3114 3130 EB EX DE,HL 3131 D9 EXX 3132 EB EX DE,HL 3133 D9 EXX 3134 C1 POP BC 3135 E1 POP HL 3136 78 LD A,B 3137 81 ADD A,C 3138 2001 JR NZ,M313B 313A A7 AND A 313B 3D M313B: DEC A 313C 3F CCF 313D 17 M313D: RLA 313E 3F CCF 313F 1F RRA 3140 F24631 JP P,M3146 3143 3068 JR NC,M31AD 3145 A7 AND A 3146 3C M3146: INC A 3147 2008 JR NZ,M3151 3149 3806 JR C,M3151 314B D9 EXX 314C CB7A BIT 7,D 314E D9 EXX 314F 205C JR NZ,M31AD 3151 77 M3151: LD (HL),A 3152 D9 EXX 3153 78 LD A,B 3154 D9 EXX ;normalisieren der Mantisse fuer alle Rechenroutinen 3155 3015 TSTNOR: JR NC,NORMAL 3157 7E LD A,(HL) 3158 A7 AND A 3159 3E80 M3159: LD A,80H 315B 2801 JR Z,M315E 315D AF M315D: XOR A 315E D9 M315E: EXX 315F A2 AND D 3160 CDFB2F CALL M2FFB 3163 07 RLCA 3164 77 LD (HL),A 3165 382E JR C,M3195 3167 23 INC HL 3168 77 LD (HL),A 3169 2B DEC HL 316A 1829 JR M3195 316C 0620 NORMAL: LD B,32 316E D9 M316E: EXX 316F CB7A BIT 7,D 3171 D9 EXX 3172 2012 JR NZ,M3186 3174 07 RLCA 3175 CB13 RL E 3177 CB12 RL D 3179 D9 EXX 317A CB13 RL E 317C CB12 RL D 317E D9 EXX 317F 35 DEC (HL) 3180 28D7 JR Z,M3159 3182 10EA DJNZ M316E 3184 18D7 JR M315D 3186 17 M3186: RLA 3187 300C JR NC,M3195 3189 CD0430 CALL M3004 318C 2007 JR NZ,M3195 318E D9 EXX 318F 1680 LD D,80H 3191 D9 EXX 3192 34 INC (HL) 3193 2818 JR Z,M31AD 3195 E5 M3195: PUSH HL 3196 23 INC HL 3197 D9 EXX 3198 D5 PUSH DE 3199 D9 EXX 319A C1 POP BC 319B 78 LD A,B 319C 17 RLA 319D CB16 RL (HL) 319F 1F RRA 31A0 77 LD (HL),A 31A1 23 INC HL 31A2 71 LD (HL),C 31A3 23 INC HL 31A4 72 LD (HL),D 31A5 23 INC HL 31A6 73 LD (HL),E 31A7 E1 POP HL 31A8 D1 POP DE 31A9 D9 EXX 31AA E1 POP HL 31AB D9 EXX 31AC C9 RET 31AD CF M31AD: RST ERRAUS 31AE 05 DEFB 5 ;'ARITHMETIC OVERFLOW' ;Subroutine Division 31AF CD9332 M31AF: CALL M3293 31B2 EB EX DE,HL 31B3 AF XOR A 31B4 CDC030 CALL M30C0 31B7 38F4 JR C,M31AD 31B9 EB EX DE,HL 31BA CDC030 CALL M30C0 31BD D8 RET C 31BE D9 EXX 31BF E5 PUSH HL 31C0 D9 EXX 31C1 D5 PUSH DE 31C2 E5 PUSH HL 31C3 CDBA2F CALL M2FBA 31C6 D9 EXX 31C7 E5 PUSH HL 31C8 60 LD H,B 31C9 69 LD L,C 31CA D9 EXX 31CB 61 LD H,C 31CC 68 LD L,B 31CD AF XOR A 31CE 06DF LD B,0DFH 31D0 1810 JR M31E2 31D2 17 M31D2: RLA 31D3 CB11 RL C 31D5 D9 EXX 31D6 CB11 RL C 31D8 CB10 RL B 31DA D9 EXX 31DB 29 ADD HL,HL 31DC D9 EXX 31DD ED6A ADC HL,HL 31DF D9 EXX 31E0 3810 JR C,M31F2 31E2 ED52 M31E2: SBC HL,DE 31E4 D9 EXX 31E5 ED52 SBC HL,DE 31E7 D9 EXX 31E8 300F JR NC,M31F9 31EA 19 ADD HL,DE 31EB D9 EXX 31EC ED5A ADC HL,DE 31EE D9 EXX 31EF A7 AND A 31F0 1808 JR M31FA 31F2 A7 M31F2: AND A 31F3 ED52 SBC HL,DE 31F5 D9 EXX 31F6 ED52 SBC HL,DE 31F8 D9 EXX 31F9 37 M31F9: SCF 31FA 04 M31FA: INC B 31FB FAD231 JP M,M31D2 31FE F5 PUSH AF 31FF 28E1 JR Z,M31E2 3201 5F LD E,A 3202 51 LD D,C 3203 D9 EXX 3204 59 LD E,C 3205 50 LD D,B 3206 F1 POP AF 3207 CB18 RR B 3209 F1 POP AF 320A CB18 RR B 320C D9 EXX 320D C1 POP BC 320E E1 POP HL 320F 78 LD A,B 3210 91 SUB C 3211 C33D31 JP M313D ;Subroutine zum Abtrennen des Integerteils einer ;Variablen 3214 7E M3214: LD A,(HL) 3215 A7 AND A 3216 C8 RET Z 3217 FE81 CP 81H 3219 3006 JR NC,M3221 321B 3600 LD (HL),0 321D 3E20 LD A,32 321F 1851 JR M3272 3221 FE91 M3221: CP 91H 3223 201A JR NZ,M323F 3225 23 INC HL 3226 23 INC HL 3227 23 INC HL 3228 3E80 LD A,80H 322A A6 AND (HL) 322B 2B DEC HL 322C B6 OR (HL) 322D 2B DEC HL 322E 2003 JR NZ,M3233 3230 3E80 LD A,80H 3232 AE XOR (HL) 3233 2B M3233: DEC HL 3234 2036 JR NZ,M326C 3236 77 LD (HL),A 3237 23 INC HL 3238 36FF LD (HL),0FFH 323A 2B DEC HL 323B 3E18 LD A,18H 323D 1833 JR M3272 323F 302C M323F: JR NC,M326D 3241 D5 PUSH DE 3242 2F CPL 3243 C691 ADD A,91H 3245 23 INC HL 3246 56 LD D,(HL) 3247 23 INC HL 3248 5E LD E,(HL) 3249 2B DEC HL 324A 2B DEC HL 324B 0E00 LD C,0 324D CB7A BIT 7,D 324F 2801 JR Z,M3252 3251 0D DEC C 3252 CBFA M3252: SET 7,D 3254 0608 LD B,8 3256 90 SUB B 3257 80 ADD A,B 3258 3804 JR C,M325E 325A 5A LD E,D 325B 1600 LD D,0 325D 90 SUB B 325E 2807 M325E: JR Z,M3267 3260 47 LD B,A 3261 CB3A M3261: SRL D 3263 CB1B RR E 3265 10FA DJNZ M3261 3267 CD8E2D M3267: CALL M2D8E 326A D1 POP DE 326B C9 RET ;grosse Werte fuer 'X' untersuchen 326C 7E M326C: LD A,(HL) 326D D6A0 M326D: SUB 0A0H 326F F0 RET P 3270 ED44 NEG 3272 D5 M3272: PUSH DE 3273 EB EX DE,HL 3274 2B DEC HL 3275 47 LD B,A 3276 CB38 SRL B 3278 CB38 SRL B 327A CB38 SRL B 327C 2805 JR Z,M3283 327E 3600 M327E: LD (HL),0 3280 2B DEC HL 3281 10FB DJNZ M327E 3283 E607 M3283: AND 7 3285 2809 JR Z,M3290 3287 47 LD B,A 3288 3EFF LD A,0FFH 328A CB27 M328A: SLA A 328C 10FC DJNZ M328A 328E A6 AND (HL) 328F 77 LD (HL),A 3290 EB M3290: EX DE,HL 3291 D1 POP DE 3292 C9 RET ;Subroutine zum Abspeichern von 2 Integerzahlen ;in Floatingpointform auf dem Calc.-Stack 3293 CD9632 M3293: CALL M3296 3296 EB M3296: EX DE,HL ;Subroutine zum Abspeichern einer Integerzahl ;auf dem Calc.-Stack in Floatingpointform 3297 7E M3297: LD A,(HL) 3298 A7 AND A 3299 C0 RET NZ 329A D5 PUSH DE 329B CD7F2D CALL M2D7F 329E AF XOR A 329F 23 INC HL 32A0 77 LD (HL),A 32A1 2B DEC HL 32A2 77 LD (HL),A 32A3 0691 LD B,91H 32A5 7A LD A,D 32A6 A7 AND A 32A7 2008 JR NZ,M32B1 32A9 B3 OR E 32AA 42 LD B,D 32AB 2810 JR Z,M32BD 32AD 53 LD D,E 32AE 58 LD E,B 32AF 0689 LD B,89H 32B1 EB M32B1: EX DE,HL 32B2 05 M32B2: DEC B 32B3 29 ADD HL,HL 32B4 30FC JR NC,M32B2 32B6 CB09 RRC C 32B8 CB1C RR H 32BA CB1D RR L 32BC EB EX DE,HL 32BD 2B M32BD: DEC HL 32BE 73 LD (HL),E 32BF 2B DEC HL 32C0 72 LD (HL),D 32C1 2B DEC HL 32C2 70 LD (HL),B 32C3 D1 POP DE 32C4 C9 RET ;=============================================== ;ab hier Unterprogramme und Tabellen des ; FLOATING - POINT - CALCULATORS ;Tabelle der Konstanten NULL, EINS, 0.5, PI/2, ZEHN 32C5 00 M32C5: DEFB 0 ;NULL 32C6 B0 DEFB 0B0H 32C7 00 DEFB 0 32C8 40 DEFB 40H ;EINS 32C9 B0 DEFB 0B0H 32CA 00 DEFB 0 32CB 01 DEFB 1 32CC 30 DEFB 30H ;0.5 32CD 00 DEFB 0 32CE F1 DEFB 0F1H ;PI/2 32CF 49 DEFB 49H 32D0 0F DEFB 0FH 32D1 DA DEFB 0DAH 32D2 A2 DEFB 0A2H 32D3 40 DEFB 40H ;ZEHN 32D4 B0 DEFB 0B0H 32D5 00 DEFB 0 32D6 0A DEFB 0AH ;Tabelle der 'OPCODES', die dem Befehl RST CALRUF ;folge mit den dazugehoerigen Sprungadressen 32D7 8F36 M32D7: DEFW M368F ;00: Sprung, wenn war 32D9 3C34 DEFW TAUSCH ;01: Tauschen 32DB A133 DEFW M33A1 ;02: Loeschen 32DD 0F30 DEFW SUBTRA ;03: Subtrahieren 32DF CA30 DEFW MULTIP ;04: Multiplizieren 32E1 AF31 DEFW M31AF ;05: Dividieren 32E3 5138 DEFW M3851 ;06: hoch 2 (^2) 32E5 1B35 DEFW M351B ;07: ODER 32E7 2435 DEFW M3524 ;08: logisch UND 32E9 3B35 DEFW M353B ;09: ungleich 32EB 3B35 DEFW M353B ;0A: kleiner als 32ED 3B35 DEFW M353B ;0B: Strings ungleich 32EF 3B35 DEFW M353B ;0C: nicht groesser 32F1 3B35 DEFW M353B ;0D: nicht kleiner 32F3 3B35 DEFW M353B ;0E: Strings gleich 32F5 1430 DEFW ADDIER ;0F: Addieren 32F7 2D35 DEFW M352D ;10: String and Number 32F9 3B35 DEFW M353B ;11: String <= 32FB 3B35 DEFW M353B ;12: String >= 32FD 3B35 DEFW M353B ;13: String <> 32FF 3B35 DEFW M353B ;14: String > 3301 3B35 DEFW M353B ;15: String < 3303 3B35 DEFW M353B ;16: String = 3305 9C35 DEFW M359C ;17: Stringaddition 3307 DE35 DEFW M35DE ;18: VAL$ 3309 BC34 DEFW M34BC ;19: USR$ 330B 4536 DEFW M3645 ;1A: READIN 330D 6E34 DEFW NEGIER ;1B: negieren 330F 6936 DEFW M3669 ;1C: CODE 3311 DE35 DEFW M35DE ;1D: VAL 3313 7436 DEFW M3674 ;1E: LEN 3315 B537 DEFW M37B5 ;1F: SINUS 3317 AA37 DEFW M37AA ;20: COSINUS 3319 DA37 DEFW M37DA ;21: TANGENS 331B 3338 DEFW M3833 ;22: ARCUSSINUS 331D 4338 DEFW M3843 ;23: ARCUSCOSINUS 331F E237 DEFW M37E2 ;24: ARCUSTANGENS 3321 1337 DEFW M3713 ;25: LN (Logarithmus) 3323 C436 DEFW M36C4 ;26: EXP (E hoch X) 3325 AF36 DEFW M36AF ;27: INT(EGER) 3327 4A38 DEFW M384A ;28: SQR (Wurzel) 3329 9234 DEFW M3492 ;29: SGN (Vorzeichen) 332B 6A34 DEFW ABSOLU ;2A: ABS (Betrag) 332D AC34 DEFW M34AC ;2B: PEEK 332F A534 DEFW M34A5 ;2C: IN 3331 B334 DEFW M34B3 ;2D: USR mit Zahl 3333 1F36 DEFW M361F ;2E: STR$ 3335 C935 DEFW M35C9 ;2F: CHR$ 3337 0135 DEFW M3501 ;30: NOT 3339 C033 DEFW VERDO ;31: Duplizieren 333B A036 DEFW M36A0 ;32: N MOD M- Division 333D 8636 DEFW M3686 ;33: Sprung 333F C633 DEFW M33C6 ;34: Daten auf Stack 3341 7A36 DEFW M367A ;35: DJNZ 3343 0635 DEFW M3506 ;36: kleiner 0 3345 F934 DEFW M34F9 ;37: groesser 0 3347 9B36 DEFW M369B ;38: Ende CALCULATOR 3349 8337 DEFW M3783 ;39: hole Argument 334B 1432 DEFW M3214 ;3A: Abschneiden mit Runden 334D A233 DEFW M33A2 ;3B: FP-CALC-2 334F 4F2D DEFW M2D4F ;3C: in Floating-Zahl wandeln 3351 9732 DEFW M3297 ;3D: wieder auf Stack legen 3353 4934 DEFW M3449 ;3E: Polynomenentwicklung 3355 1B34 DEFW M341B ;3F: NULL auf Stack 3357 2D34 DEFW M342D ;40: speichere in MEMO etc. 3359 0F34 DEFW M340F ;41: hole von MEMO etc. ;Calculator ;Aufruf normal durch RST 28H (RST CALRUF) ;Hinter dem RST 28H Befehl folgen ein oder mehrere Bytes, ;die die auszufuehrenden Operationen gemaess obenstehender ;Tabelle bestimmen. ;Die Rechenoperationen beziehen sich im allgemeinen auf ;den oder die 'LETZTEN WERT(E)' im Calculatorstack. Ein ;letzter Wert (genau 5 Bytes) kann eine Floatingpointzahl ;oder Stringparameter sein. Zusaetzlich benutzt der Calcu- ;lator einige Speicherplaetze zur Zwischenspeicherung von ;Teilergebnissen etc., die mit MEM0 - MEM5 bezeichnet sind ;und jeweils 5 Byte umfassen. 335B CDBF35 RECHNE: CALL M35BF 335E 78 M335E: LD A,B 335F 32675C LD (BREG),A ;Calculator Hifsregister 3362 D9 RECH2: EXX 3363 E3 EX (SP),HL 3364 D9 EXX 3365 ED53655C CLOOP: LD (STKEND),DE ;Anfang des freien Speichers 3369 D9 EXX 336A 7E LD A,(HL) 336B 23 INC HL 336C E5 M336C: PUSH HL 336D A7 AND A 336E F28033 JP P,M3380 3371 57 LD D,A 3372 E660 AND 60H 3374 0F RRCA 3375 0F RRCA 3376 0F RRCA 3377 0F RRCA 3378 C67C ADD A,7CH 337A 6F LD L,A 337B 7A LD A,D 337C E61F AND 1FH 337E 180E JR M338E 3380 FE18 M3380: CP 18H 3382 3008 JR NC,M338C 3384 D9 EXX 3385 01FBFF LD BC,0FFFBH 3388 54 LD D,H 3389 5D LD E,L 338A 09 ADD HL,BC 338B D9 EXX 338C 07 M338C: RLCA 338D 6F LD L,A 338E 11D732 M338E: LD DE,M32D7 3391 2600 LD H,0 3393 19 ADD HL,DE 3394 5E LD E,(HL) 3395 23 INC HL 3396 56 LD D,(HL) 3397 216533 LD HL,CLOOP 339A E3 EX (SP),HL 339B D5 PUSH DE 339C D9 EXX 339D ED4B665C LD BC,(STKEND+1) 33A1 C9 M33A1: RET ;Subroutine zum Loeschen des letzten Wertes im Calc.-Stack ;(OP-CODE 02). Der Aufruf fuehrt nur auf das obige 'RET', ;so dass nur HL als Zeiger auf den letzten Wert um 5 Byte ;vermindert wird, also auf den Vorletzten zeigt. Dadurch ;wird der bisherige letzte Wert nicht mehr adressiert und ;bei der naechsten Operation ueberschrieben. ;Subroutine um eine Operation auszufuehren (Auruf bei der ;Entwicklung von Ausdruecken, OP-CODE 3BH) 33A2 F1 M33A2: POP AF 33A3 3A675C LD A,(BREG) ;Calculator Hifsregister 33A6 D9 EXX 33A7 18C3 JR M336C ;Subroutine zum Ueberpruefen, ob noch 5 Speicherplaetze ;frei sind 33A9 D5 PLATZ5: PUSH DE 33AA E5 PUSH HL 33AB 010500 LD BC,5 33AE CD051F CALL M1F05 33B1 E1 POP HL 33B2 D1 POP DE 33B3 C9 RET ;Subroutine um 1 Zahl auf den Stack zu bringen 33B4 ED5B655C M33B4: LD DE,(STKEND) ;Anfang des freien Speichers 33B8 CDC033 CALL VERDO 33BB ED53655C LD (STKEND),DE ;Anfang des freien Speichers 33BF C9 RET ;Umspeichern einer Floatingpointzahl (OP-CODE 31H) 33C0 CDA933 VERDO: CALL PLATZ5 33C3 EDB0 LDIR 33C5 C9 RET ;Abspeichern einer Floatingpointzahl, die dem OP-CODE 34H ;direkt folgt. Das 1. Byte, welches Exponent ist, gibt ;hierbei die Anzahl der noch folgenden Mantissenstellen an ;(Bit 7 und 6), der Rest wird mit Nullen aufgefuellt. 33C6 62 M33C6: LD H,D 33C7 6B LD L,E 33C8 CDA933 M33C8: CALL PLATZ5 33CB D9 EXX 33CC E5 PUSH HL 33CD D9 EXX 33CE E3 EX (SP),HL 33CF C5 PUSH BC 33D0 7E LD A,(HL) 33D1 E6C0 AND 0C0H 33D3 07 RLCA 33D4 07 RLCA 33D5 4F LD C,A 33D6 0C INC C 33D7 7E LD A,(HL) 33D8 E63F AND 3FH 33DA 2002 JR NZ,M33DE 33DC 23 INC HL 33DD 7E LD A,(HL) 33DE C650 M33DE: ADD A,50H 33E0 12 LD (DE),A 33E1 3E05 LD A,5 33E3 91 SUB C 33E4 23 INC HL 33E5 13 INC DE 33E6 0600 LD B,0 33E8 EDB0 LDIR 33EA C1 POP BC 33EB E3 EX (SP),HL 33EC D9 EXX 33ED E1 POP HL 33EE D9 EXX 33EF 47 LD B,A 33F0 AF XOR A 33F1 05 M33F1: DEC B 33F2 C8 RET Z 33F3 12 LD (DE),A 33F4 13 INC DE 33F5 18FA JR M33F1 ;Suchen der Konstanten in der Calculatortabelle. Die ;Nummer steht in A. 33F7 A7 M33F7: AND A 33F8 C8 M33F8: RET Z 33F9 F5 PUSH AF 33FA D5 PUSH DE 33FB 110000 LD DE,0 33FE CDC833 CALL M33C8 3401 D1 POP DE 3402 F1 POP AF 3403 3D DEC A 3404 18F2 JR M33F8 ;Ausrechnen der Adresse eines 5-Byte-Bereichs im Calcu- ;latorspeicherbereich (MEM0 - MEM5) 3406 4F M3406: LD C,A 3407 07 RLCA 3408 07 RLCA 3409 81 ADD A,C 340A 4F LD C,A 340B 0600 LD B,0 340D 09 ADD HL,BC 340E C9 RET ;Eine Variable vom Calculatorspeicher in den Calc.- ;Stack holen als letzten Wert 340F D5 M340F: PUSH DE 3410 2A685C LD HL,(MEM) ;Zeiger auf Calculatorspeicher 3413 CD0634 CALL M3406 3416 CDC033 CALL VERDO 3419 E1 POP HL 341A C9 RET ;Ablegen einer Konstanten auf dem Calc.-Stack ;(OP-CODES A0H - A4H) 341B 62 M341B: LD H,D 341C 6B LD L,E 341D D9 EXX 341E E5 PUSH HL 341F 21C532 LD HL,M32C5 3422 D9 EXX 3423 CDF733 CALL M33F7 3426 CDC833 CALL M33C8 3429 D9 EXX 342A E1 POP HL 342B D9 EXX 342C C9 RET ;Speichern des letzten Wertes in MEM0 - MEM5 ;(OP-CODES C0H -C5H) 342D E5 M342D: PUSH HL 342E EB EX DE,HL 342F 2A685C LD HL,(MEM) ;Zeiger auf Calculatorspeicher 3432 CD0634 CALL M3406 3435 EB EX DE,HL 3436 CDC033 CALL VERDO 3439 EB EX DE,HL 343A E1 POP HL 343B C9 RET ;Austauschen der beiden letzten Werte im Calc.-Stack 343C 0605 TAUSCH: LD B,5 343E 1A M343E: LD A,(DE) 343F 4E LD C,(HL) 3440 EB EX DE,HL 3441 12 LD (DE),A 3442 71 LD (HL),C 3443 23 INC HL 3444 13 INC DE 3445 10F7 DJNZ M343E 3447 EB EX DE,HL 3448 C9 RET ;Generieren von Polynomen bei Funktionen wie SINUS, ;ATN etc. (OP-CODES 86H,88H,8CH = 3EH in Tabelle) 3449 47 M3449: LD B,A 344A CD5E33 CALL M335E ;den letzten Wert 'Z' vorbereiten 344D 31 DEFB 31H 344E 0F DEFB 0FH 344F C0 DEFB 0C0H 3450 02 DEFB 2 3451 A0 DEFB 0A0H 3452 C2 DEFB 0C2H ;In der folgenden Schleife werden die Koeffizienten ;berechnet: ;B(M)=2*Z*B(M-1)-B(M-2)+C(M), wobei M=0....N. ;Die Konstanten C(M) stehen hinter dem jeweiligen ;Aufruf dieser Routine. 3453 31 POLYS: DEFB 31H 3454 E0 DEFB 0E0H 3455 04 DEFB 4 3456 E2 DEFB 0E2H 3457 C1 DEFB 0C1H 3458 03 DEFB 3 3459 38 DEFB 38H ;naechste Konstante in den Calc.-Stack laden 345A CDC633 CALL M33C6 345D CD6233 CALL RECH2 3460 0F DEFB 0FH 3461 01 DEFB 1 3462 C2 DEFB 0C2H 3463 02 DEFB 2 3464 35 DEFB 35H 3465 EE DEFB 0EEH 3466 E1 DEFB 0E1H 3467 03 DEFB 3 3468 38 DEFB 38H 3469 C9 RET ;die 'ABS(-OLUT)'-Funktion (OP-CODE 2AH) 346A 06FF ABSOLU: LD B,0FFH 346C 1806 JR M3474 ;Wechseln des Vorzeichens des letzten Wertes ;Negieren (OP-CODE 1BH) 346E CDE934 NEGIER: CALL M34E9 3471 D8 RET C 3472 0600 LD B,0 3474 7E M3474: LD A,(HL) 3475 A7 AND A 3476 280B JR Z,M3483 3478 23 INC HL 3479 78 LD A,B 347A E680 AND 80H 347C B6 OR (HL) 347D 17 RLA 347E 3F CCF 347F 1F RRA 3480 77 LD (HL),A 3481 2B DEC HL 3482 C9 RET ;Vorzeichenwechsel bei Integerzahlen 3483 D5 M3483: PUSH DE 3484 E5 PUSH HL 3485 CD7F2D CALL M2D7F 3488 E1 POP HL 3489 78 LD A,B 348A B1 OR C 348B 2F CPL 348C 4F LD C,A 348D CD8E2D CALL M2D8E 3490 D1 POP DE 3491 C9 RET ;Auswerten des Vorzeichens: ;Negativ=-1, Positiv=+1, Null=0 ;SIGN-Funktion (OP-CODE 29H) ;als letzten Wert speichern 3492 CDE934 M3492: CALL M34E9 3495 D8 RET C 3496 D5 PUSH DE 3497 110100 LD DE,1 349A 23 INC HL 349B CB16 RL (HL) 349D 2B DEC HL 349E 9F SBC A,A 349F 4F LD C,A 34A0 CD8E2D CALL M2D8E 34A3 D1 POP DE 34A4 C9 RET ;Befehl 'IN' (laden eines Ports, OP-CODE 2CH) 34A5 CD991E M34A5: CALL M1E99 34A8 ED78 IN A,(C) 34AA 1804 JR M34B0 ;Befehl 'PEEK' (OP-CODE 2BH) 34AC CD991E M34AC: CALL M1E99 34AF 0A LD A,(BC) 34B0 C3282D M34B0: JP M2D28 ;Befehl 'USR' mit Zahlen (OP-CODE 2DH) ;Im Maschinenprogramm duerfen alle Register ausser HL' ;benutzt werden. Wird HL' trotzdem gebraucht, muss vor ;dem Ende des Maschinenprogramms HL' mit 2758H geladen ;werden. 34B3 CD991E M34B3: CALL M1E99 34B6 212B2D LD HL,M2D2B 34B9 E5 PUSH HL 34BA C5 PUSH BC 34BB C9 RET ;Befehl 'USR A$' (OP-CODE 19H) 34BC CDF12B M34BC: CALL M2BF1 34BF 0B DEC BC 34C0 78 LD A,B 34C1 B1 OR C 34C2 2023 JR NZ,M34E7 34C4 1A LD A,(DE) 34C5 CD8D2C CALL M2C8D 34C8 3809 JR C,M34D3 34CA D690 SUB 90H 34CC 3819 JR C,M34E7 34CE FE15 CP 15H 34D0 3015 JR NC,M34E7 34D2 3C INC A 34D3 3D M34D3: DEC A 34D4 87 ADD A,A 34D5 87 ADD A,A 34D6 87 ADD A,A 34D7 FEA8 CP 0A8H 34D9 300C JR NC,M34E7 34DB ED4B7B5C LD BC,(UDG) ;Adresse der User Grafikzeichen 34DF 81 ADD A,C 34E0 4F LD C,A 34E1 3001 JR NC,M34E4 34E3 04 INC B 34E4 C32B2D M34E4: JP M2D2B 34E7 CF M34E7: RST ERRAUS 34E8 09 DEFB 9 ;'INVALID ARGUMENT' ;Test, ob eine Zahl Null ist 34E9 E5 M34E9: PUSH HL 34EA C5 PUSH BC 34EB 47 LD B,A 34EC 7E LD A,(HL) 34ED 23 INC HL 34EE B6 OR (HL) 34EF 23 INC HL 34F0 B6 OR (HL) 34F1 23 INC HL 34F2 B6 OR (HL) 34F3 78 LD A,B 34F4 C1 POP BC 34F5 E1 POP HL 34F6 C0 RET NZ 34F7 37 SCF 34F8 C9 RET ;Test auf >0 (OP-CODE 37H) ;trifft dies zu, dann letzter Wert = 1 ; sonst = 0 34F9 CDE934 M34F9: CALL M34E9 34FC D8 RET C 34FD 3EFF LD A,0FFH 34FF 1806 JR M3507 ;Funktion 'NOT' (OP-CODE 30H) ;letzter Wert wird 1, wenn letzter Wert Null ;war, sonst wird letzter Wert immer Null 3501 CDE934 M3501: CALL M34E9 3504 1805 JR M350B ;Funktion <0 (OP-CODE 36H) 3506 AF M3506: XOR A 3507 23 M3507: INC HL 3508 AE XOR (HL) 3509 2B DEC HL 350A 07 RLCA ;Speichern einer 0 (CARRY geloescht) oder ;einer 1 als letzten Wert 350B E5 M350B: PUSH HL 350C 3E00 LD A,0 350E 77 LD (HL),A 350F 23 INC HL 3510 77 LD (HL),A 3511 23 INC HL 3512 17 RLA 3513 77 LD (HL),A 3514 1F RRA 3515 23 INC HL 3516 77 LD (HL),A 3517 23 INC HL 3518 77 LD (HL),A 3519 E1 POP HL 351A C9 RET ;Funktion 'OR' (OP-CODE 07) ;Das Ergebnis dieser Operation (X OR Y) ist X, ;wenn Y Null ist, andernfalls 1 351B EB M351B: EX DE,HL 351C CDE934 CALL M34E9 351F EB EX DE,HL 3520 D8 RET C 3521 37 SCF 3522 18E7 JR M350B ;Funktion 'AND' (OP-CODE 08) ;Die Operation 'X AND Y' liefert X als Ergebnis, ;wenn Y<>0 ist, andernfalls den Wert 0 3524 EB M3524: EX DE,HL 3525 CDE934 CALL M34E9 3528 EB EX DE,HL 3529 D0 RET NC 352A A7 AND A 352B 18DE JR M350B ;Funktion 'STRING AND ZAHL' (OP-CODE 10H) ;Das Ergebnis der Operation 'A$ AND X' ist A$, wenn ;X<>0 ist, sonst wird ein Nullstring uebergeben 352D EB M352D: EX DE,HL 352E CDE934 CALL M34E9 3531 EB EX DE,HL 3532 D0 RET NC 3533 D5 PUSH DE 3534 1B DEC DE 3535 AF XOR A 3536 12 LD (DE),A 3537 1B DEC DE 3538 12 LD (DE),A 3539 D1 POP DE 353A C9 RET ;Vergleichsoperationen (OP-CODE 09-0EH, 11H-16H) ;OP-CODE ist beim Einstieg in Reg B 353B 78 M353B: LD A,B 353C D608 SUB 8 353E CB57 BIT 2,A 3540 2001 JR NZ,M3543 3542 3D DEC A 3543 0F M3543: RRCA 3544 3008 JR NC,M354E 3546 F5 PUSH AF 3547 E5 PUSH HL 3548 CD3C34 CALL TAUSCH 354B D1 POP DE 354C EB EX DE,HL 354D F1 POP AF 354E CB57 M354E: BIT 2,A 3550 2007 JR NZ,M3559 3552 0F RRCA 3553 F5 PUSH AF 3554 CD0F30 CALL SUBTRA 3557 1833 JR M358C ;Stringoperationen 3559 0F M3559: RRCA 355A F5 PUSH AF 355B CDF12B CALL M2BF1 355E D5 PUSH DE 355F C5 PUSH BC 3560 CDF12B CALL M2BF1 3563 E1 POP HL 3564 7C M3564: LD A,H 3565 B5 OR L 3566 E3 EX (SP),HL 3567 78 LD A,B 3568 200B JR NZ,M3575 356A B1 OR C 356B C1 M356B: POP BC 356C 2804 JR Z,M3572 356E F1 POP AF 356F 3F CCF 3570 1816 JR M3588 3572 F1 M3572: POP AF 3573 1813 JR M3588 3575 B1 M3575: OR C 3576 280D JR Z,M3585 3578 1A LD A,(DE) 3579 96 SUB (HL) 357A 3809 JR C,M3585 357C 20ED JR NZ,M356B 357E 0B DEC BC 357F 13 INC DE 3580 23 INC HL 3581 E3 EX (SP),HL 3582 2B DEC HL 3583 18DF JR M3564 3585 C1 M3585: POP BC 3586 F1 POP AF 3587 A7 AND A 3588 F5 M3588: PUSH AF 3589 EF RST CALRUF 358A A0 DEFB 0A0H 358B 38 DEFB 38H 358C F1 M358C: POP AF 358D F5 PUSH AF 358E DC0135 CALL C,M3501 3591 F1 POP AF 3592 F5 PUSH AF 3593 D4F934 CALL NC,M34F9 3596 F1 POP AF 3597 0F RRCA 3598 D40135 CALL NC,M3501 359B C9 RET ;Addieren von Strings (OP-CODE 17H) 359C CDF12B M359C: CALL M2BF1 359F D5 PUSH DE 35A0 C5 PUSH BC 35A1 CDF12B CALL M2BF1 35A4 E1 POP HL 35A5 E5 PUSH HL 35A6 D5 PUSH DE 35A7 C5 PUSH BC 35A8 09 ADD HL,BC 35A9 44 LD B,H 35AA 4D LD C,L 35AB F7 RST REST30 35AC CDB22A CALL M2AB2 35AF C1 POP BC 35B0 E1 POP HL 35B1 78 LD A,B 35B2 B1 OR C 35B3 2802 JR Z,M35B7 35B5 EDB0 LDIR 35B7 C1 M35B7: POP BC 35B8 E1 POP HL 35B9 78 LD A,B 35BA B1 OR C 35BB 2802 JR Z,M35BF 35BD EDB0 LDIR ;Setzen von DE auf STKEND und HL auf ;STKEND-5, d.h. 1. Byte des letzten Wertes im ;Calc.-Stack 35BF 2A655C M35BF: LD HL,(STKEND) ;Anfang des freien Speichers 35C2 11FBFF LD DE,0FFFBH 35C5 E5 PUSH HL 35C6 19 ADD HL,DE 35C7 D1 POP DE 35C8 C9 RET ;Funktion 'CHR$' (OP-CODE 2FH) 35C9 CDD52D M35C9: CALL M2DD5 35CC 380E JR C,M35DC 35CE 200C JR NZ,M35DC 35D0 F5 PUSH AF 35D1 010100 LD BC,1 35D4 F7 RST REST30 35D5 F1 POP AF 35D6 12 LD (DE),A 35D7 CDB22A CALL M2AB2 35DA EB EX DE,HL 35DB C9 RET 35DC CF M35DC: RST ERRAUS 35DD 0A DEFB 0AH ;'INTEGER OUT OF RANGE' ;Funktion 'VAL' (OP-CODE 1DH) und 'VAL$' (18H) 35DE 2A5D5C M35DE: LD HL,(CHADD) ;Adr. des naechsten zu interpret. Zeichens 35E1 E5 PUSH HL 35E2 78 LD A,B 35E3 C6E3 ADD A,0E3H 35E5 9F SBC A,A 35E6 F5 PUSH AF 35E7 CDF12B CALL M2BF1 35EA D5 PUSH DE 35EB 03 INC BC 35EC F7 RST REST30 35ED E1 POP HL 35EE ED535D5C LD (CHADD),DE ;Adr. des naechsten zu interpret. Zeichens 35F2 D5 PUSH DE 35F3 EDB0 LDIR 35F5 EB EX DE,HL 35F6 2B DEC HL 35F7 360D LD (HL),0DH 35F9 FDCB01BE RES 7,(IY+1) 35FD CDFB24 CALL AUSDRU 3600 DF RST GETAKT 3601 FE0D CP 0DH 3603 2007 JR NZ,M360C 3605 E1 POP HL 3606 F1 POP AF 3607 FDAE01 XOR (IY+1) 360A E640 AND 40H 360C C28A1C M360C: JP NZ,M1C8A 360F 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 3612 FDCB01FE SET 7,(IY+1) 3616 CDFB24 CALL AUSDRU 3619 E1 POP HL 361A 225D5C LD (CHADD),HL ;Adr. des naechsten zu interpret. Zeichens 361D 18A0 JR M35BF ;Funktion 'STR $' (OP-CODE 2EH) 361F 010100 M361F: LD BC,1 3622 F7 RST REST30 3623 225B5C LD (KCUR),HL ;Kursoradresse 3626 E5 PUSH HL 3627 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse 362A E5 PUSH HL 362B 3EFF LD A,0FFH 362D CD0116 CALL OPKAN 3630 CDE32D CALL M2DE3 3633 E1 POP HL 3634 CD1516 CALL M1615 3637 D1 POP DE 3638 2A5B5C LD HL,(KCUR) ;Kursoradresse 363B A7 AND A 363C ED52 SBC HL,DE 363E 44 LD B,H 363F 4D LD C,L 3640 CDB22A CALL M2AB2 3643 EB EX DE,HL 3644 C9 RET ;Funktion 'READ-IN' (OP-CODE 1AH) 3645 CD941E M3645: CALL INTEG1 3648 FE10 CP 10H 364A D29F1E JP NC,M1E9F 364D 2A515C LD HL,(CURCHL) ;aktuelle I/O Infoadresse 3650 E5 PUSH HL 3651 CD0116 CALL OPKAN 3654 CDE615 CALL M15E6 3657 010000 LD BC,0 365A 3003 JR NC,M365F 365C 0C INC C 365D F7 RST REST30 365E 12 LD (DE),A 365F CDB22A M365F: CALL M2AB2 3662 E1 POP HL 3663 CD1516 CALL M1615 3666 C3BF35 JP M35BF ;Funktion 'CODE' (OP-CODE 1CH) ;Ausgabe des ASCII-Wertes eines Zeichens 3669 CDF12B M3669: CALL M2BF1 366C 78 LD A,B 366D B1 OR C 366E 2801 JR Z,M3671 3670 1A LD A,(DE) 3671 C3282D M3671: JP M2D28 ;Funktion 'LEN' (OP-CODE 1EH) 3674 CDF12B M3674: CALL M2BF1 3677 C32B2D JP M2D2B ;Vermindern von 'BREG' um 1, welches als Schleifen- ;zaehler dient, (Nachbildung von DJNZ) (OP-CODE 35H) 367A D9 M367A: EXX 367B E5 PUSH HL 367C 21675C LD HL,BREG ;Calculator Hifsregister 367F 35 DEC (HL) 3680 E1 POP HL 3681 2004 JR NZ,M3687 3683 23 INC HL 3684 D9 EXX 3685 C9 RET ;Funktion 'JUMP' (OP-CODE 33H) zum ueberspringen ;von Calculator-OP-CODES 3686 D9 M3686: EXX ; korr. 11.apr.96 KIO ! 3687 5E M3687: LD E,(HL) 3688 7B LD A,E 3689 17 RLA 368A 9F SBC A,A 368B 57 LD D,A 368C 19 ADD HL,DE 368D D9 EXX 368E C9 RET ;Ueberspringen von Calculatorbefehlen, wenn der ;letzte Wert <>0 ist (OP-CODE 00) 368F 13 M368F: INC DE 3690 13 INC DE 3691 1A LD A,(DE) 3692 1B DEC DE 3693 1B DEC DE 3694 A7 AND A 3695 20EF JR NZ,M3686 3697 D9 EXX 3698 23 INC HL 3699 D9 EXX 369A C9 RET ;Ende der Calculatoroperation 369B F1 M369B: POP AF 369C D9 EXX 369D E3 EX (SP),HL 369E D9 EXX 369F C9 RET ;Berechnen von N MOD M (OP-CODE 32H) ;Der ganzahlige Anteil INT (N/M) ergibt den ;letzten Wert, der Rest der Division den vor- ;letzten Wert. 36A0 EF M36A0: RST CALRUF 36A1 C0 DEFB 0C0H 36A2 02 DEFB 2 36A3 31 DEFB 31H 36A4 E0 DEFB 0E0H 36A5 05 DEFB 5 36A6 27 DEFB 27H 36A7 E0 DEFB 0E0H 36A8 01 DEFB 1 36A9 C0 DEFB 0C0H 36AA 04 DEFB 4 36AB 03 DEFB 3 36AC E0 DEFB 0E0H 36AD 38 DEFB 38H 36AE C9 RET ;Funktion 'INTEGER' (OP-CODE 27H) 36AF EF M36AF: RST CALRUF 36B0 31 DEFB 31H 36B1 36 DEFB 36H 36B2 00 DEFB 0 36B3 04 DEFB INTINV-$ 36B4 3A DEFB 3AH 36B5 38 DEFB 38H 36B6 C9 RET 36B7 31 INTINV: DEFB 31H 36B8 3A DEFB 3AH 36B9 C0 DEFB 0C0H 36BA 03 DEFB 3 36BB E0 DEFB 0E0H 36BC 01 DEFB 1 36BD 30 DEFB 30H 36BE 00 DEFB 0 36BF 03 DEFB NEGINT-$ 36C0 A1 DEFB 0A1H 36C1 03 DEFB 3 36C2 38 NEGINT: DEFB 38H 36C3 C9 RET ;Funktion E^X (OP-CODE 26H, EXP) 36C4 EF M36C4: RST CALRUF 36C5 3D DEFB 3DH 36C6 34 DEFB 34H 36C7 F1 DEFB 0F1H 36C8 38 DEFB 38H 36C9 AA DEFB 0AAH 36CA 3B DEFB 3BH 36CB 29 DEFB 29H 36CC 04 DEFB 4 36CD 31 DEFB 31H 36CE 27 DEFB 27H 36CF C3 DEFB 0C3H 36D0 03 DEFB 3 36D1 31 DEFB 31H 36D2 0F DEFB 0FH 36D3 A1 DEFB 0A1H 36D4 03 DEFB 3 36D5 88 DEFB 88H ;es folgen 8 Konstanten 36D6 13 DEFB 13H 36D7 36 DEFB 36H 36D8 58 DEFB 58H 36D9 65 DEFB 65H 36DA 66 DEFB 66H 36DB 9D DEFB 9DH 36DC 78 DEFB 78H 36DD 65 DEFB 65H 36DE 40 DEFB 40H 36DF A2 DEFB 0A2H 36E0 60 DEFB 60H 36E1 32 DEFB 32H 36E2 C9 DEFB 0C9H 36E3 E7 DEFB 0E7H 36E4 21 DEFB 21H 36E5 F7 DEFB 0F7H 36E6 AF DEFB 0AFH 36E7 24 DEFB 24H 36E8 EB DEFB 0EBH 36E9 2F DEFB 2FH 36EA B0 DEFB 0B0H 36EB B0 DEFB 0B0H 36EC 14 DEFB 14H 36ED EE DEFB 0EEH 36EE 7E DEFB 07EH 36EF BB DEFB 0BBH 36F0 94 DEFB 94H 36F1 58 DEFB 58H 36F2 F1 DEFB 0F1H 36F3 3A DEFB 3AH 36F4 7E DEFB 7EH 36F5 F8 DEFB 0F8H 36F6 CF DEFB 0CFH 36F7 E3 DEFB 0E3H 36F8 38 DEFB 38H 36F9 CDD52D CALL M2DD5 36FC 2007 JR NZ,M3705 36FE 3803 JR C,M3703 3700 86 ADD A,(HL) 3701 3009 JR NC,M370C 3703 CF M3703: RST ERRAUS 3704 05 DEFB 5 ;'NUMBER TOO BIG' 3705 3807 M3705: JR C,M370E 3707 96 SUB (HL) 3708 3004 JR NC,M370E 370A ED44 NEG 370C 77 M370C: LD (HL),A 370D C9 RET 370E EF M370E: RST CALRUF 370F 02 DEFB 2 3710 A0 DEFB 0A0H 3711 38 DEFB 38H 3712 C9 RET ;Funktion 'LN (X)' (OP-CODE 25H) ;X wird bei LN(X) auf 2 Arten berechnet. Die Unter- ;scheidung wird daran getroffen, ob X<.8 oder >.8 ;ist, nachdem X in den Bereich von .5<=X<1 gebracht ;wurde. 3713 EF M3713: RST CALRUF 3714 3D DEFB 3DH 3715 31 DEFB 31H 3716 37 DEFB 37H 3717 00 DEFB 0 3718 04 DEFB LNPOS-$ 3719 38 DEFB 38H 371A CF RST ERRAUS 371B 09 DEFB 9 ;'INVALID ARGUMENT' 371C A0 LNPOS: DEFB 0A0H 371D 02 DEFB 2 371E 38 DEFB 38H 371F 7E LD A,(HL) 3720 3680 LD (HL),80H 3722 CD282D CALL M2D28 3725 EF RST CALRUF 3726 34 DEFB 34H 3727 38 DEFB 38H 3728 00 DEFB 0 3729 03 DEFB 3 372A 01 DEFB 1 372B 31 DEFB 31H 372C 34 DEFB 34H 372D F0 DEFB 0F0H 372E 4C DEFB 4CH 372F CC DEFB 0CCH 3730 CC DEFB 0CCH 3731 CD DEFB 0CDH 3732 03 DEFB 3 3733 37 DEFB 37H 3734 00 DEFB 0 3735 08 DEFB GROSS8-$ 3736 01 DEFB 1 3737 A1 DEFB 0A1H 3738 03 DEFB 3 3739 01 DEFB 1 373A 38 DEFB 38H 373B 34 INC (HL) 373C EF RST CALRUF 373D 0134F0 GROSS8: LD BC,0F034H ;ab hier nur OP-CODES 3740 317217 LD SP,1772H 3743 F8 RET M 3744 04 INC B 3745 01A203 LD BC,3A2H 3748 A2 AND D 3749 03 INC BC 374A 313432 LD SP,3234H 374D 2004 JR NZ,6+$ ;3753H 374F A2 AND D 3750 03 INC BC 3751 8C ADC A,H 3752 11AC14 LD DE,14ACH 3755 09 ADD HL,BC 3756 56 LD D,(HL) 3757 DAA559 JP C,59A5H 375A 30C5 JR NC,-39H+$ ;3721H 375C 5C LD E,H 375D 90 SUB B 375E AA XOR D 375F 9E SBC A,(HL) 3760 70 LD (HL),B 3761 6F LD L,A 3762 61 LD H,C 3763 A1 AND C 3764 CBDA SET 3,D 3766 96 SUB (HL) 3767 A4 AND H 3768 319FB4 LD SP,0B49FH 376B E7 RST GETNXT 376C A0 AND B 376D FE5C CP 5CH 376F FCEA1B CALL M,1BEAH 3772 43 LD B,E 3773 CA36ED JP Z,0ED36H 3776 A7 AND A 3777 9C SBC A,H 3778 7E LD A,(HL) 3779 5E LD E,(HL) 377A F0 RET P 377B 6E LD L,(HL) 377C 23 INC HL 377D 80 ADD A,B 377E 93 SUB E 377F 04 INC B 3780 0F RRCA 3781 38 DEFB 38H ;Ende der OP-CODES 3782 C9 RET ;Reduzieren des Arguments bei SINUS und COSINUS ;in den Bereich -.5 <=V<.5 3783 EF M3783: RST CALRUF 3784 3D DEC A ;ab hier nur OP-CODES 3785 34 INC (HL) 3786 EE22 XOR 22H 3788 F9 LD SP,HL 3789 83 ADD A,E 378A 6E LD L,(HL) 378B 04 INC B 378C 31A20F LD SP,0FA2H 378F 27 DAA 3790 03 INC BC 3791 310F31 LD SP,310FH 3794 0F RRCA 3795 312AA1 LD SP,0A12AH 3798 03 INC BC 3799 3137C0 LD SP,0C037H 379C 00 NOP 379D 04 INC B 379E 02 LD (BC),A 379F 38 DEFB 38H ;Ende der OP-CODES 37A0 C9 RET 37A1 A1 ZPOSI: AND C ;ab hier nur OP-CODES 37A2 03 INC BC 37A3 013600 LD BC,036H 37A6 02 LD (BC),A 37A7 1B DEC DE 37A8 38 YNEGAT: DEFB 38H ;Ende der OP-CODES 37A9 C9 RET ;Funktion COSINUS (OP-CODE 20H) 37AA EF M37AA: RST CALRUF 37AB 39 ADD HL,SP ;ab hier nur OP-CODES 37AC 2AA103 LD HL,(3A1H) 37AF E0 RET PO 37B0 00 NOP 37B1 061B LD B,1BH 37B3 33 INC SP 37B4 03 INC BC ;Berechnen SINUS (OP-CODE 1FH) 37B5 EF M37B5: RST CALRUF 37B6 39 ADD HL,SP ;immer noch OP-CODES 37B7 313104 SINCOS: LD SP,431H 37BA 310FA1 LD SP,0A10FH 37BD 03 INC BC 37BE 86 ADD A,(HL) 37BF 14 INC D 37C0 E65C AND 5CH 37C2 1F RRA 37C3 0B DEC BC 37C4 A3 AND E 37C5 8F ADC A,A 37C6 38EE JR C,-10H+$ 37C8 E9 JP (HL) 37C9 15 DEC D 37CA 63 LD H,E 37CB BB CP E 37CC 23 INC HL 37CD EE92 XOR 92H 37CF 0D DEC C 37D0 CDEDF1 CALL 0F1EDH 37D3 23 INC HL 37D4 5D LD E,L 37D5 1B DEC DE 37D6 EA0438 JP PE,3804H 37D9 C9 RET ;Ende des OP-CODES ;Berechnung TANGENS (OP-CODE 21H) 37DA EF M37DA: RST CALRUF 37DB 311F01 LD SP,11FH ;ab hier nur OP-CODES 37DE 2005 JR NZ,7+$ 37E0 38 DEFB 38H ;Ende der OP-CODES 37E1 C9 RET ;Berechnung ARCUSTANGENS (OP-CODE 24H) ;Unterteilung in 3 Faelle: ;fuer -1