;**********************************************   ;*                                            *    ;*     TERMINAL  BETRIEBSSYSTEM  V 1.0        *     ;*                                            *      ;*     LETZTE AENDERUNG : 20.9.86             *       ;*                                            *        ;**********************************************                                                                         PORTA  EQU $0         ;PORT A                      ;***   BITBELEGUNG VON PORT A       RXD    EQU 7          ;SERIELL IN   X2, 17C       TXD    EQU 6          ;SERIELL OUT  X2, 16C       CTS    EQU 5          ;RECHNER EMPFANGSBEREIT X1, 17C       ONLINE EQU 4          ;ON/OFF LINE X1, 18A       RTST   EQU 1          ;TERMINAL EMPFANGSBEREIT X1, 19C       PORTB  EQU $1         ;PORT B    MATRIXTASTATUR;***   BELEGUNG DER BITS;      BIT  0,1,2       ZEILENWERT   0-6;      BIT  3,4,5,6     SPALTENWERT  0-15;      BIT  7           LOW : TASTE GEDRUECKT  HIGH : NICHT GEDRUECKT       PORTC  EQU $2         ;PORT C;***   BELEGUNG DER BITS;      BIT 0,1,2,3      ZEILENABFRAGE BEI MATRIX-TASTATUR;      BIT 4            NEG. STROBE FUER TASTATUR-PIPS (ABSCHALTBAR) ;      BIT 5            INVERS VIDEO;      BIT 7            NEG. STROBE FUER BELL  $07       PORTD  EQU $3         ;PORT D;***   REIHENEINGAENGE DER MATRIX-TASTATUR;***   6511 REGISTER       CLRIF  EQU $10        ;CLEAR INT FLAGS 0-3       IFR    EQU $11        ;INT FLAG REGISTER       IER    EQU $12        ;INT ENABLE REGISTER       MCR    EQU $14        ;MODE CONTROL       SCCR   EQU $15        ;SERIAL COMMAND CONTROL       SCSR   EQU $16        ;SERIAL COMMAND STATUS       SDR    EQU $17        ;RCVR/XMTR DATA REGISTER       CNTAL  EQU $18        ;COUNTER A LOW       CNTAH  EQU $1A        ;COUNTER A HIGH, START       CNTBL  EQU $1C        ;COUNTER B LOW       CNTBH  EQU $1E        ;COUNTER B HIGH, START;***   TERMINALVERWALTUNG       KMODE  EQU $40        ;INPUT-STATUS;***   FLAGS       SHFTFL EQU 7          ;SHIFT-TASTE GEDRUECKT       CTRLFL EQU 6          ;CONTROL-TASTE GEDRUECKT       ESCSER EQU 5          ;ESCAPE SERIELL GESENDET       ALCKFL EQU 4          ;ALPHA-LOCK       WAITFL EQU 3          ;TASTE ENTPRELLT       INKEY  EQU 2          ;ZEICHEN IM TASTATURPUFFER       ARFL   EQU 1          ;AUTOREPEAT       KEYFL  EQU 0          ;TASTE GEDRUECKT;***   DEFAULT NACH RESET       KBSTAT EQU %00010000  ;ALPHA-LOCK       SCANTM EQU 17500      ;INTERVALL TASTATURABFRAGE  20 ms       AUTREP EQU 8          ;AUTOREPEAT GESCHWINDIGKEIT       IFMODE EQU KMODE + 1  ;INTERFACE-STATUS;***   FLAGS       DUXFL  EQU 7          ;DUPLEX EDIT       HSTOFF EQU 6          ;XOFF VON HOSTRECHNER       XON    EQU 5          ;XON/XOFF PROTOKOLL       EXTPGM EQU 4          ;EXTERNES PROGRAMM       SCRLFL EQU 3          ;SCROLL EIN       BELLFL EQU 2          ;TASTENDRUCK MIT "PIPS" BESTAETIGEN       TRANSP EQU 1          ;TRANSPARENT-MODE       ESCFL  EQU 0          ;ESCAPE-SEQUENZ;***   DEFAULT NACH RESET       IFSTAT EQU %10001000  ;DUPLEX, SCROLL       BAUDRT EQU 4          ;9600 BAUD AUS TABELLE       FORMAT EQU %11000100  ;7 BIT OHNE PARITY;*** SCCR  7  6  5  4  3  2  1  0;          .  .  .  .  .  .  .  EVEN/ODD PARITY;          .  .  .  .  .  .  PARITY ENABLE;          .  .  .  .  0  0  8 BITS;          .  .  .  .  0  1  7 BITS;          .  .  .  .  1  0  6 BITS;          .  .  .  .  1  1  5 BITS;          .  .  0  0  XMTR/RCVR ASYNC;          .  .  0  1  RCVR S/R;          .  .  1  0  XMTR S/R;          .  RCVR ENABLE;          XMTR ENABLE       KBROW  EQU IFMODE + 1 ;TASTATURREIHE       ARCNT  EQU KBROW + 1  ;AUTOREPEAT-ZAEHLER       KEY    EQU ARCNT + 1  ;TASTATURPUFFER       CURL   EQU KEY + 1    ;CURSOR-POSITION       CURH   EQU CURL + 1       CROW   EQU CURH + 1   ;SPALTEPOSITION CURSOR       CLINE  EQU CROW + 1   ;ZEILENPOSITION CURSOR       BLDPOS EQU CLINE +1   ; ------                                     ACTEMP EQU BLDPOS + 1 ;AKKU WAEHREND INTERRUPT       XYTEMP EQU ACTEMP + 1 ;X- ODER Y-REG WAEHREND INTERRUPT       HELP   EQU XYTEMP + 1 ;ALLGEMEINES HIFSREGISTER       ESCTAB EQU HELP + 1   ;ZEIGER AUF ESCAPE-TABELLE       CTRLTAB EQU ESCTAB + 2 ;ZEIGER AUF CONTROL-TABELLE       KEYTAB1 EQU CTRLTAB + 2 ;ZEIGER AUF TASTATUR-TABELLE       TOL    EQU KEYTAB1 + 2 ;MEHRZWECKZEIGER       TOH    EQU TOL + 1       FROML  EQU TOH + 1    ;MEHRZWECKZEIGER       FROMH  EQU FROML + 1       ADL    EQU FROMH + 1  ;ADRESSE IM MONITOR       ADH    EQU ADL + 1       MATRIX EQU ADH + 1    ;TASTATUR-MATIXKOORDINATE       ININD  EQU MATRIX + 1 ;PUFFER-EINGANGSZEIGER       OUTIND EQU ININD + 1  ;PUFFER-AUSGANGSZEIGER       PBZ    EQU OUTIND + 1 ;PUFFER-BELEGUNGSZAEHLER       KEYTAB2 EQU PBZ + 1   ;ZEIGER AUF TASTATUR-TABELLE       FKTTAB EQU KEYTAB2 + 2 ;ZEIGER AUF FUNKTIONSTASTEN-TABELLE       INBUF  EQU FKTTAB + 2 ;SERIELLER EINGANGSPUFFER       FIFOLN EQU 128        ;PUFFERGROESSE, DARUEBER STACK       RAM    EQU $1000      ;RAM-ANFANG       VIDTOP EQU $1800      ;BILDSPEICHERENDE       VIDREG EQU $800       ;CRT-REGISTERADRESSE       VIDDAT EQU $801       ;CRT-DATENADRESSE       HORDIS EQU 80         ;ANZAHL ZEICHEN PRO ZEILE       LINES  EQU 24         ;ANZAHL ZEILEN       CHARS  EQU LINES * HORDIS;ANZAHL ZEICHEN OHNE STATUSZEILE       STARTLN EQU VIDTOP - CHARS - HORDIS       VIDRAM EQU VIDTOP - CHARS       STACK  EQU 1       FKTL   EQU 50         ;PUFFERGROESSE FUER 1 FUNKTIONSTASTE       EXVEC  EQU RAM        ;ZEIGER AUF AUSFUEHR-ROUTINE       KEYVAL EQU EXVEC + 2  ;TASTENWERT       KBTEMP EQU KEYVAL + 1 ;BITMUSTER       KEYVAL2 EQU KBTEMP + 1       TABPNT EQU KEYVAL2 + 1 ;ZEIGER AUF TAB-TABELLE       TABTB  EQU TABPNT + 1  ;TABULATOR-TABELLE       *=$F000               ;STARTADRESSE;**********************************************;*                                            *;*     CRT-CONTROLLER INITIALISIERUNGSTABELLE *;*                                            *;**********************************************VIDTAB .BYT 98               ;HOR TOTAL CHARS       .BYT HORDIS           ;HOR DISPLAYED CHARS       .BYT 84               ;HOR SYNC POSITION       .BYT 6                ;YSYNC, HSYNC WIDTH       .BYT 26               ;VERT TOTAL ROWS       .BYT 2                ;ADJ LINES       .BYT LINES + 1        ;VERT DISPLAYED ROWS       .BYT 25               ;VERT SYNC POSITION       .BYT 0                ;MODE CONTROL       .BYT 12               ;SCAN LINES       .BYT %01101100        ;CURSOR FORM UND START LINE       .BYT 12               ;CURSOR END LINE       .BYT >STARTLN         ;START ADDRESS HIGH       .BYT <STARTLN       .BYT >VIDRAM          ;CURSOR ADDRESS HIGH       .BYT <VIDRAM       TABSZ EQU 9 * 8       ;TABELLENGROESSE  ZEILE * SPALTE;**********************************************;*                                            *;*     TASTATURTABELLE                        *;*     FUER COLOUR GENIE                      *;*                                            *;**********************************************;***   UNTERE EBENEKEYT   .BYT '@abcdefg'       .BYT 'hijklmno'       .BYT 'pqrstuvw'       .BYT 'xyz ',$80818283,       .BYT '01234567'       .BYT '89:;,-./'       .BYT $0D5B880B0A080C20,       .BYT $FF20201BFE202020,       .BYT $0000000000000000,;***   OBERE EBENEKOTAB  .BYT '`ABCDEFG'       .BYT 'HIJKLMNO'       .BYT 'PQRSTUVW'       .BYT 'XYZ ',$84858687,       .BYT '0!"#$%&',$27,       .BYT '()*+<=>?'       .BYT $0D5D890B0A080C20,       .BYT $FF20201BFE202020,       .BYT $0000000000000000,;***   CONTROL EBENEKCTAB  .BYT $0001020304050607,       .BYT $08090A0B0C0D0E0F,       .BYT $1011121314151617,       .BYT $18191A0090919293,       .BYT $0000000000000000,       .BYT $0000000000000000,       .BYT $0D00001E1F1A1B16,       .BYT $0000000000000000,       .BYT $0000000000000000,;**********************************************;*                                            *;*     TIMER OFFSET FUER BAUDRATEN-WAHL       *;*                                            *;*       T = CLOCK / 16 / BAUD  - 1           *;*                                            *;**********************************************BAUDTB .WOR 90               ; 1200 BAUD    NR : 0       .WOR 45               ; 2400 BAUD         1       .WOR 29               ; 3600 BAUD         2       .WOR 22               ; 4800 BAUD         3       .WOR 10               ; 9600 BAUD         4       .WOR 5                ;19200 BAUD         5;**********************************************;*                                            *;*     BILDSCHIRM LOESCHEN, CUSOR HOME        *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************CLEAR  LDY #<VIDRAM          ;AB $1080 LOESCHEN       LDA #0       STA CURL       LDA #>VIDRAM       STA CURHCLR1   LDA #' 'CLR2   STA (CURL),Y       INY       BNE CLR2       INC CURH       LDA CURH       CMP #>VIDTOP       BCC CLR1       JSR CURHOME       RTS;**********************************************;*                                            *;*     WAGENRUECKLAUF                         *;*      AKKU ?                                *;*                                            *;**********************************************CR     SEC       LDA CURL              ;CURSOR ADRESSE       SBC CROW              ;SPALTENPOSITION SUBTRAHIEREN       STA CURL              ;NEUE CURSORPOSITION       BCS CR1       DEC CURHCR1    LDA #0       STA CROW              ;REIHE 0       RTS;**********************************************;*                                            *;*     NEUE ZEILE                             *;*      AKKU ?   Y-REG ?   X-REG ?            *;*                                            *;**********************************************LF     LDX CLINE             ;CURSOR-ZEILE       INX       CPX #LINES            ;LETZTE ZEILE ?       BCS SCROLL       LDA CURL              ;CURSOR IN NAECHSTE ZEILE SETZEN       ADC #HORDIS       STA CURL       BCC LF1       INC CURHLF1    STX CLINE       RTS;**********************************************;*                                            *;*     24 ZEILEN NACH OBEN SCROLLEN           *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************SCROLL BBS SCRLFL,IFMODE,SCROLL3       SMB RTST,PORTA        ;BUSY MELDEN       JSR BELL              ;AKUSTISCHES SIGNAL GEBENSCROLL1 BBR INKEY,KMODE,SCROLL1 ;WARTEN AUF TASTENDRUCK       LDA KEY       RMB INKEY,KMODE       CMP #$0A       BEQ SCROLL2           ;LF ? ->       CMP #$0D              ;CR ? NEIN ->       BNE SCROLL1       JSR CLEARSCROLL2 RMB RTST,PORTA        ;READY MELDENSCROLL3 LDY #HORDIS - 1SCRLOP LDA HORDIS + VIDRAM,Y ;ZEILE 1       STA VIDRAM,Y          ;NACH ZEILE 0       LDA HORDIS*2+VIDRAM,Y ;ZEILE 2       STA HORDIS + VIDRAM,Y ;NACH ZEILE 1       LDA HORDIS*3+VIDRAM,Y       STA HORDIS*2+VIDRAM,Y       LDA HORDIS*4+VIDRAM,Y       STA HORDIS*3+VIDRAM,Y       LDA HORDIS*5+VIDRAM,Y       STA HORDIS*4+VIDRAM,Y       LDA HORDIS*6+VIDRAM,Y       STA HORDIS*5+VIDRAM,Y       LDA HORDIS*7+VIDRAM,Y       STA HORDIS*6+VIDRAM,Y       LDA HORDIS*8+VIDRAM,Y       STA HORDIS*7+VIDRAM,Y       LDA HORDIS*9+VIDRAM,Y       STA HORDIS*8+VIDRAM,Y       LDA HORDIS*10+VIDRAM,Y       STA HORDIS*9+VIDRAM,Y       LDA HORDIS*11+VIDRAM,Y       STA HORDIS*10+VIDRAM,Y       LDA HORDIS*12+VIDRAM,Y       STA HORDIS*11+VIDRAM,Y       LDA HORDIS*13+VIDRAM,Y       STA HORDIS*12+VIDRAM,Y       LDA HORDIS*14+VIDRAM,Y       STA HORDIS*13+VIDRAM,Y       LDA HORDIS*15+VIDRAM,Y       STA HORDIS*14+VIDRAM,Y       LDA HORDIS*16+VIDRAM,Y       STA HORDIS*15+VIDRAM,Y       LDA HORDIS*17+VIDRAM,Y       STA HORDIS*16+VIDRAM,Y       LDA HORDIS*18+VIDRAM,Y       STA HORDIS*17+VIDRAM,Y       LDA HORDIS*19+VIDRAM,Y       STA HORDIS*18+VIDRAM,Y       LDA HORDIS*20+VIDRAM,Y       STA HORDIS*19+VIDRAM,Y       LDA HORDIS*21+VIDRAM,Y       STA HORDIS*20+VIDRAM,Y       LDA HORDIS*22+VIDRAM,Y       STA HORDIS*21+VIDRAM,Y       LDA HORDIS*23+VIDRAM,Y       STA HORDIS*22+VIDRAM,Y       LDA #' '              ;NEUE ZEILE LOESCHEN       STA HORDIS*23+VIDRAM,Y       DEY       BMI SCROLL4       JMP SCRLOPSCROLL4 RTS                                                      ;**********************************************;*                                            *;*     DATENEINGANG  SERIELLE SCHNITTSTELLE,  *;*                   TASTATUR                 *;*      AKKU ?   X-REG ?                      *;*                                            *;**********************************************INPUT  BBS ONLINE,PORTA,MELDON ;ON LINE       JSR OFFLN             ;OFF LINE IN STATUS-ZEILE SCHREIBEN       JMP INPUT1MELDON JSR ONLN              ;ON LINE IN STATUS-ZEILE SCHREIBENINPUT1 BBR INKEY,KMODE,INPSER ;TASTATUR-PUFFER LEER ? ->       LDA KEY               ;ZEICHEN HOLEN       RMB INKEY,KMODE       CMP #$80              ;FUNKTIONSTASTE ?       BCS INPEXIT           ;JA ->       BBR ONLINE,PORTA,INPEXIT ;OFF LINE;***   ZEICHEN FUER SERIELLE SCHNITTSTELLE       CMP #$1B              ;ESCAPE ?       BNE INTAST1           ;NEIN ->       JSR ESCSET            ;"ESC" IN STATUSZEILE SCHREIBEN       SMB ESCSER,KMODE      ;FLAG SETZEN       BBS ESCSER,KMODE,INTAST2INTAST1 BBR ESCSER,KMODE,INTAST2       RMB ESCSER,KMODE      ;FLAG LOESCHEN       JSR ESCCLR            ;MELDUNG "ESC" LOESCHENINTAST2 JSR SNDSER            ;ZEICHEN AN HOST SENDEN       BBS DUXFL,IFMODE,INPSER ;DUPLEX EDIT ? ->       JSR SCREEN            ;ZEICHEN AUF BILSCHIRM AUSGEBEN;***   ZEICHEN VON SERIELLER SCHNITTSTELLEINPSER LDX OUTIND            ;FIFO AUSGANGSZEIGER       BNE INPS1       LDX #FIFOLNINPS1  DEX       CPX ININD       BNE INPS2       LDX #FIFOLN - 8       STX PBZ               ;PUFFERBELEGUNGSZAEHLER RUECKSETZEN       BBR RTST,PORTA,INPUT       RMB RTST,PORTA       BBR XON,IFMODE,INPUT       LDA #$11              ;XON SENDEN       JSR SNDSER       JMP INPUTINPS2  LDA INBUF,X           ;ZEICHEN VOM INPUT-PUFFER IN AKKU LADEN       STX OUTIND       INC PBZ               ;WIEDER EIN PLATZ FREIINPEXIT RTS;**********************************************;*                                            *;*     AUSGABE                                *;*                                            *;**********************************************OUTPUT CMP #$80       BMI SCREEN            ;KEINE FUNKTIONSTASTE ? ->       JMP FKTSEQ;**********************************************;*                                            *;*     ZEICHEN AUF BILDSCHIRM AUSGEBEN        *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************SCREEN BBS ESCFL,IFMODE,ESCSEQ       CMP #$20              ;STEUERZEICHEN ?       BCC CTRLSEQSCREEN0 LDY #0       STA (CURL),Y          ;ZEICHEN AUF BILDSCHIRM AUSGEBEN       INC CURL              ;ZEIGER AUF NAECHSTE POSITION SETZEN       BNE SCREEN1       INC CURHSCREEN1 LDY CROW       INY       CPY #HORDIS           ;ZEILE UEBERSCHRITTEN ?       BCC SCREEN4           ;NEIN ->       INC CLINE             ;NAECHSTE ZEILE       LDY CLINE       CPY #LINES            ;UNTERER RAND UEBERSCHRITTEN ?       BCC SCREEN3           ;NEIN ->       JSR SCROLL            ;SCROLLEN       DEC CLINE             ;1 ZEILE HOEHER       SEC       LDA CURL              ;CURSOR AUF ZEILENANFANG STELLEN       SBC #HORDIS       STA CURL       BCS SCREEN3       DEC CURHSCREEN3 LDY #0SCREEN4 STY CROW;***   CURSOR REFRESH FUER CRT-CONTROLLERREFRESH LDA #14       STA VIDREG       LDA CURH       STA VIDDAT       LDA #15       STA VIDREG       LDA CURL       STA VIDDAT       RTS;**********************************************;*                                            *;*     AUSFUEHRUNG VON CONTROL-CODES          *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************CTRLSEQ BBR TRANSP,IFMODE,CTRL1       PHA       JSR SCREEN0           ;TRANSPARENTES STEUERZEICHEN       PLACTRL1  ASL A                 ;TABELLE ENTHAELT 2 ADRESSBYTES       TAY       LDA (CTRLTAB),Y       ;AUSFUEHRUNGSVEKTOR SETZEN       STA EXVEC       INY       LDA (CTRLTAB),Y       STA EXVEC + 1       JSR EXEC              ;FUNKTION AUSFUEHREN       JMP REFRESH;**********************************************;*                                            *;*     AUSFUEHRUNG VON ESCAPE-SEQUENZEN       *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************ESCSEQ RMB ESCFL,IFMODE      ;FLAG RUECKSETZEN       JSR ESCCLR            ;MELDUNG "ESC" LOESCHEN       ASL A       TAY       LDA (ESCTAB),Y        ;AUSFUEHRUNGSVEKTOR SETZEN       STA EXVEC       INY       LDA (ESCTAB),Y       STA EXVEC + 1       JSR EXEC              ;FUNKTION AUSFUEHREN       JMP REFRESH;**********************************************;*                                            *;*     AUSFUEHRUNG VON FUNKTIONS-SEQUENZEN    *;*      AKKU -> X-REG   AKKU ?   Y-REG ?      *;*                                            *;**********************************************FKTSEQ AND #$7F              ;BIT 7 LOESCHEN       TAX                   ;TASTENNUMMER INS X-REGISTER RETTEN       ASL A                 ;TABELLE ENTHAELT ZWEI ADRESSBYTES       TAY       LDA (FKTTAB),Y        ;AUSFUEHRUNGSVEKTOR SETZEN       STA EXVEC       INY       LDA (FKTTAB),Y       STA EXVEC + 1       JSR EXEC              ;FUNKTION AUSFUEHREN       JMP REFRESH;***   STEUER-, FUNKTIONS- UND ESCAPE-SEQUENZEN AUSFUEHRENEXEC   JMP (EXVEC);**********************************************;*                                            *;*     INTERRUPT-SERVICE  TASTATUR,           *;*      SERIELLE SCHNITTSTELLE                *;*                                            *;**********************************************INIRQ  STA ACTEMP            ;AKKU RETTEN       BBS 5,IFR,SCAN        ;MATRIX ABFRAGEN;***   VON SERIELLER SCHNITTSTELLE EINLESENINSER  STX XYTEMP            ;X-REG RETTEN       LDX ININD             ;FIFO-ZEIGER LADEN       LDA SDR               ;DATEN LADEN       BBR XON,IFMODE,INSER2 ;NICHT XON/XOFF ? ->       CMP #$11              ;XON ?       BNE INSER1            ;NEIN ->       RMB HSTOFF,IFMODE       BEQ INSERX            ;EXITINSER1 CMP #$13              ;XOFF ?       BNE INSER2            ;NEIN ->       SMB HSTOFF,IFMODE       BEQ INSERX            ;EXITINSER2 STA INBUF,X           ;DATEN IN FIFO       DEX       BPL INSER3       LDX #FIFOLN - 1;INSER3 STX ININD             ;NEUER ZEIGERSTAND       DEC PBZ               ;FREIER PUFFER DEKREMENTIEREN       BPL INSERX            ;NOCH PLATZ ? ->       SMB RTST,PORTA        ;TERMINAL BUSY MELDEN       BBR XON,IFMODE,INSERX ;NICHT XON/XOFF ? ->       LDA #$13              ;XOFF SENDEN       JSR SNDSERINSERX LDX XYTEMP            ;X-REG WIEDERHERSTELLEN       LDA ACTEMP            ;AKKU WIEDERHERSTELLEN       RTI;**********************************************;*                                            *;*     SENDEN UEBER SERIELLE SCHNITTSTELLE    *;*                                            *;**********************************************SNDSER BBR XON,IFMODE,SNDS1       BBS HSTOFF,IFMODE,SNDSER  ;WARTEN AUF XON       BBR HSTOFF,IFMODE,SNDS2SNDS1  BBS CTS,PORTA,SNDS1   ;WARTEN AUF CTSSNDS2  BBR 6,SCSR,SNDS2      ;WARTEN BIS SDR LEER       STA SDR               ;DATEN AUSGEBEN       RTS;**********************************************;*                                            *;*     ABFRAGE DER MATRIX-TASTATUR            *;*                                            *;*      PORT-D   BIT 0-7 : SPALTENWERT        *;*      PORT-C   BIT 4-7 : ZEILENWERT         *;*                                            *;**********************************************SCAN   STY XYTEMP            ;Y-REGISTER RETTEN       LDA #>SCANTM       STA CNTBH             ;TIMER RUECKSETZEN       RMB SHFTFL,KMODE       RMB CTRLFL,KMODE       RMB KEYFL,KMODE       LDA #8                ;9 ZEILEN ABFRAGEN       STA KBROWSCLOOP LDA PORTC       AND #%11110000        ;BITS 0,1,2,3 ZUM DECODER       ORA KBROW       STA PORTC             ;ZEILE AUSGEBEN       LDA PORTD             ;SPALTE LESEN       CMP #$FF              ;TASTE GEDRUECKT ?       BEQ NXTROW            ;NEIN ->       STA KBTEMP            ;BITMUSTER RETTEN;***   TASTENWERT ERRECHNENCVAL   LDY KBROW       LDA #-8CVAL1  CLC       ADC #8                ;8 PRO REIHE ADDIEREN       DEY       BPL CVAL1       STA KEYVAL            ;VORLAEUFIGER TASTENWERTCVAL2  SEC       ROR KBTEMP       BCC CVAL4CVAL3  INC KEYVAL       LSR KBTEMP       BCS CVAL7CVAL4  LDY KEYVAL       LDA (KEYTAB1),Y       CMP #$FE              ;CONTROL ?       BNE CVAL5             ;NEIN ->       SMB CTRLFL,KMODE       BEQ CVAL7CVAL5  CMP #$FF              ;SHIFT ?       BNE CVAL6       SMB SHFTFL,KMODE       BEQ CVAL7CVAL6  SMB KEYFL,KMODE       ;TASTE GEDRUECKT       STY KEYVAL2CVAL7  LDA KBTEMP       CMP #1       BNE CVAL3NXTROW DEC KBROW             ;NAECHSTE ZEILE       BPL SCLOOP       BBS KEYFL,KMODE,KVAL  ;TASTE ERKANNTCVAL8  RMB WAITFL,KMODE      ;ENTPRELL-FLAG       RMB ARFL,KMODE        ;AUTO-REPEAT-FLAG       LDA #AUTREP * 4       ;AUTO-REPEAT WARTEZEIT       STA ARCNT       BNE SCEXIT;TASTENWERT AUS TABELLE LADENKVAL   LDY KEYVAL2           ;MATRIXKOORDINATE IST INDEXKVAL1  BBS CTRLFL,KMODE,KCTRL       BBS SHFTFL,KMODE,KSHFT       LDA (KEYTAB1),Y       ;UNTERE EBENE       BNE KVAL2KCTRL  LDA (KEYTAB2),Y       ;CONTROL EBENE       JMP KVAL2KSHFT  TYA                   ;OBERE EBENE       CLC                   ;Y-REG AUF NAECHSTE EBENE SETZEN       ADC #TABSZ            ;TABELLENGROESSE ADDIEREN       TAY       LDA (KEYTAB1),YKVAL2  BBR ALCKFL,KMODE,KVAL3       CMP #'a'              ;KLEINBUCHSRABEN ?       BCC KVAL3       CMP #$7F       BCS KVAL3       AND #%11011111        ;ALPHA-LOCK AUSFUEHRENKVAL3  BBS WAITFL,KMODE,KVAL4 ;ENTPRELLT ? JA ->       SMB WAITFL,KMODE       JMP SCEXITKVAL4  BBR ARFL,KMODE,KVAL5  ;TASTE WIEDERHOLEN ?       CMP KEY               ;DIESSELBE TASTE ?       BNE CVAL8             ;ERST ENTPRELLEN       DEC ARCNT       BPL SCEXIT            ;REPEATZEIT ABWARTEN       LDY #AUTREP       STY ARCNT             ;REPEAT-ZAEHLER RUECKSETZENKVAL5  SMB INKEY,KMODE       ;TASTE GUELTIG       SMB ARFL,KMODE       STA KEY               ;TASTENWERT IN PUFFER       BBR BELLFL,IFMODE,SCEXIT       JSR PIPS              ;AKUSTISCHES SIGNAL AUSGEBENSCEXIT LDA ACTEMP            ;AKKU WIEDERHERSTELLEN       LDY XYTEMP            ;Y-REG WIEDERHERSTELLEN       RTI;**********************************************;*                                            *;*     SERIELLE SCHNITTSTELLE INITIALISIEREN  *;*      AKKU ?   Y-REG ?                      *;*      AKKU :  IF-STATUS                     *;*      X-REG : BAUDRATE                      *;*      Y-REG : UEBERTRAGUNGSFORMAT SERIELL   *;*                                            *;**********************************************IFINIT STA IFMODE       STY SCCR              ;XMTR,RCVR ENABLE       LDA #FIFOLN           ;FIFO-ZEIGER SETZEN       STA OUTIND       LDA #FIFOLN - 1       STA ININD       TXA                   ;BAUDRATEIFINIT1 ASL A                 ;INDEX FUER 2 BYTES       TAY       LDA BAUDTB,Y          ;LOW BYTE       STA CNTAL       LDA BAUDTB + 1,Y      ;HIGH BYTE       STA CNTAH       SMB 6,IER             ;RCVR-IRQ ENABLE       RTS;**********************************************;*                                            *;*     VIDEO-CONTROLLER INITIALISIEREN        *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************CRTINIT LDY #0CRT1   LDA VIDTAB,Y          ;BYTE AUS TABELLE LADEN       STY VIDREG            ;REGISTER AUSWAEHLEN       STA VIDDAT            ;DATEN INS REGISTER SCHREIBEN       INY       CPY #16               ;16 REGISTER       BCC CRT1       JSR CLEAR             ;BILDSCHIRM LOESCHEN       JSR STATCL            ;STATUS-ZEILE LOESCHEN       RTS;**********************************************;*                                            *;*     ZEIGER AUF TABELLEN SETZEN             *;*      AKKU ?   Y-REG ?   X-REG ?            *;*                                            *;**********************************************TABINIT LDA #KBSTAT          ;KEYBOARD-STATUS       STA KMODE             ;TASTATUR INITIALISIEREN       LDA #<SCANTM          ;SCAN-INTERVALL FUER MATRIXABFRAGE       STA CNTBL       LDA #>SCANTM       STA CNTBH       SMB 5,IER             ;TIMER B INTERRUPT ENABLE       LDA #IFSTAT       LDY #FORMAT       LDX #BAUDRT       JSR IFINIT            ;SERIELLE SCHNITTSTELLE INITIALISIEREN       JSR SCR               ;"SCROLL" IN STATUS-ZEILE SCHREIBEN       LDA #<ESCTB           ;ZEIGER AUF ESCAPE-TABELLE SETZEN       STA ESCTAB       LDA #>ESCTB       STA ESCTAB + 1       LDA #<CTRLTB          ;ZEIGER AUF CONTROL-TABELLE SETZEN       STA CTRLTAB       LDA #>CTRLTB       STA CTRLTAB + 1       STA KEYTAB2 + 1       LDA VIDTOP + 6       LDA #<KEYT            ;ZEIGER AUF TASTATUR-TABELLE SETZEN       STA KEYTAB1       LDA #>KEYT       STA KEYTAB1 + 1       KEYEB3 EQU TABSZ * 2 + KEYT       LDA #<KEYEB3       STA KEYTAB2       LDA #>KEYEB3       STA KEYTAB2 + 1       LDA #<FKTTB           ;ZEIGER AUF FUNKTIONSTASTEN-TABELLE SETZEN       STA FKTTAB       LDA #>FKTTB       STA FKTTAB + 1       RTS;**********************************************;*                                            *;*     TERMINAL INITIALISIEREN                *;*      AKKU ?   Y-REG ?   X-REG ?   STACK ?  *;*                                            *;**********************************************RESET  LDX #$FF              ;STACKPOINTER SETZEN       TXS       SEI       CLD       LDA #%01000000        ;14 BIT ADRESSE       STA MCR               ;MODE CONTROL       LDA #0       STA TABPNT            ;ZEIGER AUF TABTABELLE       STA BLDPOS            ;BILDPOSITIONSREGISTER SETZEN       JSR CRTINIT           ;CRT-CONTROLLER INITIALISIEREN       JSR TABINIT           ;ZEIGER SETZEN, SCHNITTSTELLEN INIT       CLI;***   HAUPTSCHLEIFEMAINLP JSR INPUT             ;EINGABE, ONLINE SENDEN       JSR OUTPUT            ;BILDSCHIRM       JMP MAINLP;**********************************************;*                                            *;*     CURSOR-POSITIONIERUNG MIT $20 OFFSET   *;*      AKKU ?   X-REG ?                      *;*                                            *;**********************************************CURPA  JSR INPUT             ;SEITENANGABE UEBERGEHENCURPOS JSR INPUT             ;VERTIKAL POSITION       SEC       SBC #$20              ;OFFSET ABZIEHEN       CMP #LINES            ;ZEILE MOEGLICH ?       BCC CP1               ;JA ->       LDA #LINES - 1        ;LETZTE ZEILECP1    STA CLINE             ;CURSOR-ZEILE       TAX       LDA #<VIDRAM       STA CURL       LDA #>VIDRAM       STA CURH       BNE CP2CPLOOP LDA CURL       CLC       ADC #HORDIS       STA CURL       BCC CP2       INC CURHCP2    DEX       BPL CPLOOP       JSR INPUT             ;HORIZONTAL POSITION       SEC       SBC #$20              ;OFFSET ABZIEHEN       CMP #HORDIS           ;SPALTE MOEGLICH       BCC CP3               ;JA ->       LDA #HORDIS - 1       ;LETZTE SPALTECP3    CLC       STA CROW       ADC CURL       STA CURL       BCC NEUT       INC CURHNEUT   RTS;**********************************************;*                                            *;*     TEXT IN STATUS-ZEILE LOESCHEN          *;*     LAENGE IM Y-REG                        *;*      AKKU ?                                *;*                                            *;**********************************************TXTCL  LDA #' 'TXTCL1 STA STARTLN + 50,Y       DEY       BPL TXTCL1       RTS;**********************************************;*                                            *;*     TEXT AUF BILDSCHIRM AUSGEBEN           *;*                                            *;**********************************************TXTOUT LDA (FROML),Y       STA (CURL),Y       DEY       BPL TXTOUT       JMP NEWLINE;**********************************************;*                                            *;*     BAUDRATE WAEHLEN                       *;*                                            *;**********************************************BAUDTXT .BYT 'BAUDRATE WAEHLEN'       .BYT '0 :    1200 BAUD'       .BYT '1 :    2400 BAUD'       .BYT '2 :    3600 BAUD'       .BYT '3 :    4800 BAUD'       .BYT '4 :    9600 BAUD'       .BYT '5 :   19200 BAUD'BAUDSET JSR CLEAR            ;BILDSCHIRM LOESCHEN       LDA #<BAUDTXT         ;ZEIGER AUF TEXT SETZEN       STA FROML       LDA #>BAUDTXT       STA FROMH       LDY #15               ;16 ZEICHEN       JSR TXTOUT            ;TEXT AUSGEBEN       JSR LF       LDA #5                ;6 BAUDRATENBAUDS1 PHA                   ;SCHLEIFENZAEHLER AUF STACK LEGEN       LDY #15               ;16 ZEICHEN       CLC       LDA FROML             ;ZEIGER AUF NAECHSTE TEXTZEILE SETZEN       ADC #16       STA FROML       BCC BAUDS2       INC FROML + 1BAUDS2 JSR TXTOUT            ;TEXT AUSGEBEN       PLA       SEC       SBC #1       BPL BAUDS1       JSR CURHOME           ;CURSOR HOME       JSR INPUT             ;BAUDRATE WAEHLEN       AND #$0F              ;UMWANDLUNG VON ASCII->INDEX       JMP IFINIT1           ;BAUDRATE SETZEN;**********************************************;*                                            *;*     CURSOR-FORM AENDERN                    *;*                                            *;*     0 : UNSICHTBAR      1 : BLINK. BLOCK   *;*     2 : STEH. BLOCK     3 : BLINK. STRICH  *;*     4 : STEH. STRICH                       *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************CURTAB .BYT $2060006C0CCURTXT .BYT 'CURSOR - FORM'CURSFM LDY #12               ;13 ZEICHENCURSFM1 LDA CURTXT,Y         ;TEXT LADEN       STA STARTLN + 50,Y    ;TEXT IN STATUS-ZEILE SCHREIBEN       DEY       BPL CURSFM1       JSR INPUT             ;FORM EINLESEN       PHA       JSR SCREEN       PLA       SEC       SBC #$30              ;OFFSET ABZIEHEN       AND #$7               ;AUF ZULAESSIGE WERTE BESCHRAENKEN       CMP #5       BCC CURSFM2       LDA #3                ;DEFAULT BLINKENDER STRICHCURSFM2 TAY       LDA CURTAB,Y          ;FORM LADEN       LDY #10       STY VIDREG            ;CRT CONTROL-REGISTER FUER CURSORFORM       STA VIDDAT       LDY #12       JSR TXTCL             ;TEXT IN STATUS-ZEILE LOESCHEN       RTS;**********************************************;*                                            *;*     CURSOR AUFWAERTS  $0B                  *;*      AKKU ?   X-REG ?                      *;*                                            *;**********************************************CURUP  LDX CLINE             ;CURSOR-ZEILE LADEN       DEX       BMI CURU2             ;SCHON OBEN ? ->       SEC       LDA CURL       SBC #HORDIS       STA CURL       BCS CURU1       DEC CURHCURU1  STX CLINE             ;NEUE CURSOR-ZEILE SPEICHERNCURU2  RTS;**********************************************;*                                            *;*     CURSOR ABWAERTS OHNE SCROLL  $16       *;*      AKKU ?   X-REG ?                      *;*                                            *;**********************************************CURDOWN LDX CLINE            ;CURSOR-ZEILE LADEN       INX       CPX #LINES       BCS CURD2             ;SCHON UNTEN ? ->       LDA CURL       ADC #HORDIS       STA CURL       BCC CURD1       INC CURHCURD1  STX CLINE             ;NEUE CURSOR-ZEILE SPEICHERNCURD2  RTS;**********************************************;*                                            *;*     CURSOR NACH RECHTS  $0C                *;*      AKKU ?   X-REG ?                      *;*                                            *;**********************************************CURRIGHT LDX CROW            ;CURSOR-SPALTE LADEN       INX       CPX #HORDIS       BCC CURR1             ;SCHON RECHTS ? NEIN ->       LDX CLINE             ;CURSOR-ZEILE LADEN       INX       CPX #LINES       BCS CURR2             ;SCHON UNTEN ? ->       STX CLINE             ;NEUE CURSOR-ZEILE MERKEN       LDX #0                ;NEUE ZEILECURR1  STX CROW              ;NEUE CURSOR-SPALTE SPEICHERN       INC CURL       BNE CURR2       INC CURHCURR2  RTS;**********************************************;*                                            *;*     CURSOR NACH LINKS  $08                 *;*      AKKU ?   X-REG ?                      *;*                                            *;**********************************************CURLEFT LDX CROW             ;CURSOR-SPALTE LADEN       DEX       BPL CURL1             ;SCHON RECHTS ? NEIN ->       LDX CLINE             ;CURSOR-ZEILE LADEN       DEX       BMI CURL3             ;SCHON OBEN ? ->       STX CLINE             ;NEUE CURSOR-ZEILE MERKEN       LDX #HORDIS - 1       ;EINE ZEILE HOEHERCURL1  STX CROW              ;NEUE CURSOR-SPALTE MERKEN       LDA CURL       BNE CURL2       DEC CURHCURL2  DEC CURLCURL3  RTS;**********************************************;*                                            *;*     CURSOR HOME  $1E                       *;*      AKKU ?                                *;*                                            *;**********************************************CURHOME LDA #<VIDRAM       STA CURL       LDA #>VIDRAM       STA CURH       LDA #0       STA CROW       STA CLINE       RTS;**********************************************;*                                            *;*     NEUE ZEILE MIT SCROLL  $1F             *;*      AKKU ?   Y-REG ?   X-REG ?            *;*                                            *;**********************************************NEWLINE JSR CR       JMP LF;**********************************************;*                                            *;*     ZEILE ZUM HOST SENDEN                  *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************SNDLINE LDA CURL             ;STARTKADRESSE ERMITTELN       SEC       SBC CROW       STA TOL       LDA CURH       SBC #0       STA TOH       LDY #0SNDL1  LDA (TOL),Y           ;ZEICHEN LADEN       JSR SNDSER            ;ZEICHEN SENDEN       INC TOL       BNE SNDL2       INC TOHSNDL2  LDA CURL       CMP TOL       BCS SNDL1       LDA CURH       CMP TOH       BCS SNDL1             ;FERTIG ? NEIN ->       LDA #$0D       JMP SNDSER            ;ABSCHLUSS MIT CR;**********************************************;*                                            *;*     STATUS-ZEILE LOESCHEN                  *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************STATCL LDA #<STARTLN       STA TOL       LDA #>STARTLN       STA TOH       LDY #HORDIS - 1       LDA #' 'STAT1  STA (TOL),Y       DEY       BNE STAT1       LDA #$82              ;ATTRIBUT HALBHELL       STA (TOL),Y       RTS;**********************************************;*                                            *;*     ESCAPE IN STATUS-ZEILE                 *;*         Y-REG ?                            *;*                                            *;**********************************************ESCTXT1 .BYT 'ESC'ESCSET PHA       LDY #2ESCS1  LDA ESCTXT1,Y       STA STARTLN + 22,Y       DEY       BPL ESCS1       PLA       RTSESCCLR PHA       LDY #2       LDA #' 'ESCC1  STA STARTLN + 22,Y       DEY       BPL ESCC1       PLA       RTS;**********************************************;*                                            *;*     SCROLL/NO SCROLL IN STATUSZEILE        *;*      Y-REG ?                               *;*                                            *;**********************************************SCRTXT1 .BYT 'NO SCROLL'SCRTXT2 .BYT '   SCROLL'SCR    PHA       LDY #8SCR1   LDA SCRTXT2,Y       STA STARTLN + 11,Y       DEY       BPL SCR1       PLA       RTSNSCR   PHA       LDY #8NSCR1  LDA SCRTXT1,Y       STA STARTLN + 11,Y       DEY       BPL NSCR1       PLA       RTS;**********************************************;*                                            *;*     ONLINE/OFFLINE IN STATUSZEILE          *;*      Y-REG ?                               *;*                                            *;**********************************************ONLNTXT  .BYT ' ON LINE'OFFLNTXT .BYT 'OFF LINE'OFFLN  PHA       LDY #7OFFLN1 LDA OFFLNTXT,Y       STA STARTLN + 1,Y       DEY       BPL OFFLN1       PLA       RTSONLN   PHA       LDY #7ONLN1  LDA ONLNTXT,Y       STA STARTLN + 1,Y       DEY       BPL ONLN1       PLA       RTS;**********************************************;*                                            *;*     SCROLL/NO SCROLL SETZEN                *;*      AKKU ?                                *;*                                            *;**********************************************NOSCRL LDA IFMODE       EOR #%00001000        ;SCROLL-FLAG INVERTIEREN       STA IFMODE       BBS SCRLFL,IFMODE,NOSCRL1       JSR NSCR              ;"NO SCROLL" IN STATUS-ZEILE SCHREIBEN       JMP NOSCRL2NOSCRL1 JSR SCR              ;"SCROLL" IN STATUS-ZEILE SCHREIBENNOSCRL2 RTS;**********************************************;*                                            *;*     AKUSTISCHES SIGNAL AUSGEBEN  $07       *;*                                            *;**********************************************BELL   RMB 7,PORTC           ;STROBE FUER SIGNAL       SMB 7,PORTC       RTS;**********************************************;*                                            *;*     TASTATURPIPS SIGNAL AUSGEBEN           *;*                                            *;**********************************************PIPS   RMB 4,PORTC           ;STROBE FUER SIGNAL       SMB 4,PORTC       RTS;**********************************************;*                                            *;*     INVERS/NORMAL VIDEO                    *;*      AKKU ?                                *;*                                            *;**********************************************INVVID LDA PORTC       EOR #%00100000        ;BIT 5 INVERTIEREN       STA PORTC       RTS;**********************************************;*                                            *;*     TRANSPARENT-MODE SETZEN/LOESCHEN       *;*      AKKU ?                                *;*                                            *;**********************************************TRMODE LDA IFMODE       EOR #%00000010        ;TRANSPARENT-FLAG SETZEN/RUECKSETZEN       STA IFMODE       RTS;**********************************************;*                                            *;*     XON / XOFF  EIN/AUSSCHALTEN            *;*                                            *;**********************************************ENXON  SMB XON,IFMODE       RTSDISXON RMB XON,IFMODE       RTS;**********************************************;*                                            *;*     ESCAPE-FLAG SETZEN                     *;*      Y-REG ?                               *;*                                            *;**********************************************SETESC SMB ESCFL,IFMODE       JSR ESCSET            ;"ESC" IN STATUSZEILE SCHREIBEN       RTS;**********************************************;*                                            *;*     DUPLEX SETZEN/LOESCHEN                 *;*      AKKU ?                                *;*                                            *;**********************************************DUPLEX LDA IFMODE       EOR #%10000000        ;DUPLEX-FLAG INVERTIEREN       STA IFMODE       RTS;**********************************************;*                                            *;*     ALPHA-LOCK SETZEN/LOESCHEN             *;*      AKKU ?                                *;*                                            *;**********************************************ALPHA  LDA KMODE       EOR #%00010000       STA KMODE       RTS;**********************************************;*                                            *;*     BELL-FLAG SETZEN/LOESCHEN              *;*      AKKU ?                                *;*                                            *;**********************************************BELLSET LDA IFMODE       EOR #%00000100        ;BELL-FLAG INVERTIEREN       STA IFMODE       RTS;**********************************************;*                                            *;*     FUNKTIONSTASTEN BELEGEN                *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************FKTTXT .BYT 'FUNKTIONSTASTE DEF'FKTBEL LDY #17               ;18 ZEICHENFKTBEL1 LDA FKTTXT,Y       STA STARTLN + 50,Y    ;TEXT IN STATUS-ZEILE SCHREIBEN       DEY       BPL FKTBEL1       JSR INPUT             ;TASTENZUORDNUNG       CMP #$88       BCS FKTEND            ;FUNKTIONSTEXT-TASTE ? NEIN ->       CMP #$80       BCC FKTEND            ;FUNKTIONSTASTE ? NEIN ->       AND #$07       TAY                   ;TASTENNUMMER IN Y-REGISTER       LDA CURL              ;STARTADRESSE DER BILDSCHIRMZEILE       SBC CROW              ;ERMITTELN       STA FROML       LDA CURH       SBC #0       STA FROMH       CLC       LDA #-FKTL       ADC #<VIDTOP + 16     ;16 BYTE FUER TABELLEN RESERVIERT       STA TOL       LDA #>VIDTOP       STA TOHFKTBEL2 CLC       LDA TOL       ADC #FKTL             ;PUFFERLAENGE ADDIEREN       STA TOL       BCC FKTB1       INC TOHFKTB1  DEY       BPL FKTBEL2       LDA CROW       CMP #FKTL             ;MAXIMALE LAENGE UEBERSCHRITTEN ?       BCC FKTBEL3           ;NEIN ->       LDA FROML             ;NEUE CURSORPOSITION BESTIMMEN       CLC       ADC #FKTL - 1       STA CURL       LDA FROMH       ADC #0       STA CURH       LDA #FKTL - 1       STA CROW              ;CURSORSPALTE AUF MAXIMUM SETZENFKTBEL3 LDY #0       STA (TOL),Y           ,TEXTLAENGE SPEICHERN       INC TOL               ;ZEIGER AUF TEXTPUFFER SETZEN       BNE FKTBEL4       INC TOHFKTBEL4 LDA (FROML),Y        ;TEXT LADEN       STA (TOL),Y           ;TEXT SPEICHERN       INY       CPY CROW              ;TEST AUF MAXIMALE LAENGE       BCC FKTBEL4           ;NOCH PLATZ ? ->FKTEND LDA #'<'              ;ZEICHEN FUER ENDE       JSR SCREEN            ;ZEICHEN AUSGEBEN       LDY #17               ;18 ZEICHEN       JSR TXTCL             ;TEXT IN STATUS-ZEILE LOESCHEN       JMP NEWLINE;**********************************************;*                                            *;*     VIDEO-ATTRIBUT SETZEN                  *;*                                            *;*     BIT 0 : --       BIT 1 : HALBHELL      *;*     BIT 2 : INVERS   BIT 3 : DOPPELT BREIT *;*     BIT 4 : BLINKEN  BIT 5 : ZEICHENSATZ 2 *;*     BIT 6 : ZEICHENSATZ 3,4                *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************ATTRTAB .BYT $82848890A0C0ATTRART .BYT 'HIDB23'ATTRTXT .BYT 'ATTRIBUT'ATTR   LDY #7                ;8 ZEICHENATTR1  LDA ATTRTXT,Y       STA STARTLN + 50,Y    ;TEXT IN STATUS-ZEILE SCHREIBEN       DEY       BPL ATTR1       LDY #5                ;6 ZEICHENATTR2  LDA ATTRART,Y       STA STARTLN + 60,Y    ;TEXT IN STATUS-ZEILE SCHREIBEN       DEY       BPL ATTR2       LDA #$80              ;ATTRIBUT LOESCHEN       STA HELPATTR3  JSR INPUT             ;ATTRIBUT LADEN       LDY #5ATTRLP CMP ATTRART,Y         ;VERGLEICH MIT TABELLE       BNE ATTR4             ;OK ?  NEIN ->       LDA ATTRTAB,Y         ;ATTRIBUT AUS TABELLE LADEN       ORA HELP       STA HELP       BNE ATTR3             ;WEITERES ATTRIBUT HOLENATTR4  DEY       BPL ATTRLP       LDA HELP       JSR SCREEN            ;ATTRIBUT IM BILD ABLEGEN       LDY #15       JMP TXTCL             ;TEXT IN STATUS-ZEILE LOESCHEN;**********************************************;*                                            *;*     CURSORPOSITION AN HOST SENDEN          *;*      AKKU ?                                *;*                                            *;**********************************************CURPSA  LDA #0               ;SEITE       JSR SNDSERCURPSND LDA CLINE             ;ZEILE       CLC       ADC #$20              ;OFFSET ADDIEREN       JSR SNDSER       LDA CROW              ;SPALTE       ADC #$20              ;OFFSET ADDIEREN       JMP SNDSER;**********************************************;*                                            *;*     INSERT ON/OFF LINE                     *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************INS    BBR ONLINE,PORTA,INSERT ;OFF LINE       LDA #$1B              ;ESC       JSR SNDSER       LDA #$0C              ;CURSOR NACH RECHTS       JMP SNDSER;**********************************************;*                                            *;*     ZEICHEN AN CURSORPOSITION EINFUEGEN    *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************INSERT LDA #HORDIS - 2       ;VORLETZTE ZEILENSPALTE       SEC       SBC CROW       TAYINSERT1 LDA (CURL),Y         ;ZEICHEN LADEN       INY       STA (CURL),Y          ;AUF PLATZ RECHTS DANEBEN SPEICHERN       DEY       DEY       BPL INSERT1       INY       LDA #' '       STA (CURL),Y          ;BLANK EINFUEGEN       RTS;**********************************************;*                                            *;*     DELETE ON/OFF LINE                     *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************DEL    BBR ONLINE,PORTA,DELETE ;OFF LINE       LDA #$1B              ;ESC       JSR SNDSER       LDA #$08              ;BACKSTEP       JMP SNDSER;**********************************************;*                                            *;*     ZEICHEN AN CURSORPOSITION AUSFUEGEN    *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************DELETE LDY #1       LDA #HORDIS       SEC       SBC CROW       STA HELP              ;GRENZEDELETE1 LDA (CURL),Y         ;ZEICHEN RECHTS NEBEN CURSOR LADEN       DEY       STA (CURL),Y          ;ZEICHEN SPEICHERN       INY       INY       CPY HELP              ;ALLES VERSCHOBEN ?       BCC DELETE1           ;NEIN ->       LDA #' '       DEY       STA (CURL),Y          ;LETZTE STELLE LOESCHEN       RTS;**********************************************;*                                            *;*     FUNKTIONSTASTENTEXT AUSGEBEN           *;*      AKKU ?   Y-REG ?   X-REG ?            *;*      X : TASTENNUMMER                      *;*                                            *;**********************************************FKTOUT TXA                   ;TASTENNUMMER AUS X-REGISTER LADEN       TAY                   ;TASTENNUMMER IST INDEX       CLC       LDA #-FKTL       ADC #<VIDTOP + 16     ;16 BYTE FUER TABELLEN FREILASSEN       STA FROML       LDA #>VIDTOP       STA FROMHFKTLP1 CLC       LDA FROML       ADC #FKTL             ;PUFFERGROESSE DER FUNKTION ADDIEREN       STA FROML       BCC FKTLP11       INC FROMHFKTLP11 DEY       BPL FKTLP1       LDY #0       LDA (FROML),Y         ;TEXTLAENGE LADEN       BEQ FKTEXIT           ;KEIN TEXT ? ->       TAX       INC FROML             ;ZEIGER AUF ERSTES ZEICHEN LEGEN       BNE FKTLP2                                                       INC FROMH                                                 FKTLP2 LDY #0       LDA (FROML),Y         ;ZEICHEN AUS FKT.SPEICHER HOLEN       BBR ONLINE,PORTA,FKTO3 ;OFF LINE ? ->       JSR SNDSER            ;ZEICHEN AN HOST SENDEN       BBS DUXFL,IFMODE,FKTO4 ;DUPLEX EDIT ? ->FKTO3  JSR SCREEN            ;ZEICHEN AUSGEBENFKTO4  INC FROML             ;ZEIGER AUF NAECHSTES ZEICHEN SETZEN       BNE FKTO5       INC FROMHFKTO5  DEX       BNE FKTLP2            ;ALLES AUSGEGEBEN ?  NEIN ->FKTEXIT RTS;**********************************************;*                                            *;*     NIBBLE IN ASCII UMWANDELN              *;*      UMWANDLUNG IM AKKU                    *;*                                            *;**********************************************ASCII  CLC       ADC #$F6       BCC ASC1              ;ZEICHEN <= 9 ?  ->       ADC #6ASC1   ADC #$3A              ;ASCII OFFSET ADDIEREN       RTS;**********************************************;*                                            *;*     ASCII IN HEX UMWANDELN                 *;*      UMWANDLUNG IM AKKU                    *;*                                            *;**********************************************HEXIN  CMP #$3A              ;ZEICHEN > 9 ?       PHP       AND #$0F       PLP       BCC HEXIN1       ADC #8                ;ZEICHEN A...FHEXIN1 RTS;**********************************************;*                                            *;*     TABELLE FUER CRT-CONTROLLER AUSGEBEN   *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************CRTOUT JSR CLEAR             ;BILDSCHIRM LOESCHEN       LDY #0CRTT2  LDA VIDTOP,Y          ;ZEICHEN AUS TABELLE HOLEN       PHA       LSR A       LSR A       LSR A       LSR A       JSR ASCII             ;HEX->ASCII       STA (CURL),Y          ;OBERES NIBBLE AUSGEBEN       PLA       AND #$0F       JSR ASCII             ;HEX->ASCII       INC CURL       STA (CURL),Y          ;UNTERES NIBBLE AUSGEBEN       LDA #' '       INC CURL       STA (CURL),Y          ;BLANK ZWISCHEN ZWEI BYTES       INY       CPY #16               ;ALLE 16 BYTES AUSGEGEBEN ?       BCC CRTT2             ;NEIN ?  ->       RTS;**********************************************;*                                            *;*     TABELLE FUER CRT-CONTROLLER EINLESEN   *;*      AKKU ?   Y-REG ?                      *;*                                            *;**********************************************CRTIN  JSR CURHOME       LDY #0CRTI1  LDA (CURL),Y          ;ZEICHEN VOM BILDSCHIRM HOLEN       JSR HEXIN             ;ASCII->HEX       ASL A       ASL A       ASL A       ASL A       STA HELP              ;OBERES NIBBLE       INC CURL       LDA (CURL),Y       JSR HEXIN             ;ASCII->HEX       ORA HELP              ;UNTERES NIBBLE       STA VIDTOP,Y          ;BYTE MERKEN       STY VIDREG            ;CRT PROGRAMMIEREN       STA VIDDAT       INC CURL       INY       CPY #16               ;ALLE 16 BYTES PROGRAMMIERT ?       BCC CRTI1             ;NEIN ?  ->       JMP CURHOME;**********************************************;*                                            *;*     ZEILE RECHTS VOM CURSOR LOESCHEN       *;*                                            *;**********************************************;**********************************************;*                                            *;*     ZEILE LINKS VOM CURSOR LOESCHEN        *;*                                            *;**********************************************;**********************************************;*                                            *;*     SPRUNGLISTE FUER STEUERBEFEHLE         *;*                                            *;**********************************************CTRLTB .WOR NEUT             ;00       .WOR NEUT             ;01       .WOR NEUT             ;02       .WOR NEUT             ;03       .WOR NEUT             ;04       .WOR NEUT             ;05       .WOR NEUT             ;06       .WOR BELL             ;07 BELL       .WOR CURLEFT          ;08 BACKSPACE  CURSOR LINKS       .WOR NEUT             ;09 HOR TABULATOR       .WOR LF               ;0A LINE FEED  CURSOR NACH UNTEN       .WOR CURUP            ;0B VERT TABULATOR  CURSOR NACH OBEN       .WOR CURRIGHT         ;0C FORM FEED  CURSOR NACH RECHTS       .WOR CR               ;0D CARRIAGE  RETURN       .WOR DISXON           ;0E DISABLE XON/XOFF       .WOR ENXON            ;0F ENABLE XON/XOFF       .WOR NEUT             ;10       .WOR NEUT             ;11       .WOR NEUT             ;12       .WOR NEUT             ;13       .WOR NEUT             ;14       .WOR NEUT             ;15       .WOR CURDOWN          ;CURSOR ABWAERTS OHNE SCROLL       .WOR NEUT             ;17       .WOR NEUT             ;18       .WOR NEUT             ;19       .WOR CLEAR            ;1A BILDSCHIRM LOESCHEN       .WOR SETESC           ;1B ESCAPE-FLAG SETZEN       .WOR NEUT             ;1C       .WOR NEUT             ;1D       .WOR CURHOME          ;1E CURSOR HOME       .WOR NEWLINE          ;1F NEUE ZEILE MIT SCROLL;**********************************************;*                                            *;*     SPRUNGLISTE FUER ESC SEQUENZEN         *;*                                            *;**********************************************ESCTB  .WOR NEUT             ;00       .WOR NEUT             ;01                                    .WOR NEUT             ;02       .WOR NEUT             ;03       .WOR NEUT             ;04       .WOR NEUT             ;05       .WOR NEUT             ;06       .WOR NEUT             ;07       .WOR DELETE           ;08 ZEICHEN UNTER CURSOR LOESCHEN       .WOR NEUT             ;09       .WOR NEUT             ;0A       .WOR NEUT             ;0B       .WOR INSERT           ;0C ZEICHEN UNTER CURSOR EINFUEGEN       .WOR NEUT             ;0D       .WOR NEUT             ;0E       .WOR NEUT             ;0F       .WOR NEUT             ;10       .WOR NEUT             ;11       .WOR NEUT             ;12       .WOR NEUT             ;13       .WOR NEUT             ;14       .WOR NEUT             ;15       .WOR NEUT             ;16       .WOR NEUT             ;17       .WOR NEUT             ;18       .WOR NEUT             ;19       .WOR NEUT             ;1A       .WOR NEUT             ;1B       .WOR NEUT             ;1C       .WOR NEUT             ;1D       .WOR NEUT             ;1E       .WOR NEUT             ;1F       .WOR NEUT             ;20 MONITOR       .WOR ALPHA            ;! ALPHA-LOCK SETZEN/LOESCHEN       .WOR NEUT             ;"       .WOR NEUT             ;#       .WOR NEUT             ;$       .WOR NEUT             ;%       .WOR NEUT             ;&       .WOR NEUT             ;'       .WOR NEUT             ;(       .WOR NEUT             ;)       .WOR NEUT             ;*       .WOR NEUT             ;+       .WOR NEUT             ;,       .WOR CURPA            ;- CURSOR POSITIONIEREN MIT SEITE       .WOR NEUT             ;.       .WOR CURPSA           ;/ CURSORPOSITION SENDEN MIT SEITE       .WOR NEUT             ;0       .WOR NEUT             ;1       .WOR NEUT             ;2       .WOR NEUT             ;3       .WOR NEUT             ;4       .WOR NEUT             ;5       .WOR NEUT             ;6       .WOR NEUT             ;7       .WOR NEUT             ;8       .WOR NEUT             ;9       .WOR NEUT             ;:       .WOR CLEAR            ;; BILDSCHIRM LOESCHEN       .WOR NEUT             ;<       .WOR CURPOS           ;= CURSOR POSITIONIEREN OHNE SEITE       .WOR NEUT             ;>       .WOR CURPSND          ;? CURSORPOSITION SENDEN OHNE SEITE       .WOR NEUT             ;@       .WOR ATTR             ;A ATTRIBUT SETZEN       .WOR BELLSET          ;B BELL-FLAG SETZEN/LOESCHEN       .WOR CURSFM           ;C CURSOR-FORM SETZEN       .WOR DUPLEX           ;D DUPLEX SETZEN/LOESCHEN       .WOR NEUT             ;E       .WOR FKTBEL           ;F FUNKTIONSTASTEN BELEGEN       .WOR NEUT             ;G       .WOR NEUT             ;H       .WOR NEUT             ;I       .WOR NEUT             ;J       .WOR NEUT             ;K       .WOR SNDLINE          ;L ZEILE BIS CURSOR AN HOST SENDEN       .WOR NEUT             ;M       .WOR NEUT             ;N       .WOR NEUT             ;O       .WOR NEUT             ;P       .WOR NEUT             ;Q       .WOR NEUT             ;R       .WOR NOSCRL           ;S SCROLL/NO SCROLL SETZEN       .WOR TRMODE           ;T TRANSPARENT-MODE SETZEN/RUECKSETZEN       .WOR NEUT             ;U       .WOR INVVID           ;V NORMAL/INVERS VIDEO       .WOR NEUT             ;W       .WOR NEUT             ;X       .WOR NEUT             ;Y       .WOR NEUT             ;Z       .WOR NEUT             ;5B       .WOR NEUT             ;5C       .WOR NEUT             ;5D       .WOR NEUT             ;5E       .WOR NEUT             ;5F       .WOR NEUT             ;`       .WOR NEUT             ;a       .WOR BAUDSET          ;b BAUDRATE WAEHLEN       .WOR NEUT             ;c       .WOR NEUT             ;d       .WOR NEUT             ;e       .WOR NEUT             ;f       .WOR NEUT             ;g       .WOR NEUT             ;h       .WOR NEUT             ;i       .WOR NEUT             ;j       .WOR NEUT             ;k       .WOR NEUT             ;l       .WOR NEUT             ;m       .WOR NEUT             ;n       .WOR NEUT             ;o       .WOR NEUT             ;p       .WOR NEUT             ;q       .WOR NEUT             ;r       .WOR NEUT             ;s       .WOR NEUT             ;t       .WOR NEUT             ;u       .WOR NEUT             ;v       .WOR NEUT             ;w       .WOR CRTOUT           ;x CRT-TABELLE AUSGEBEN       .WOR CRTIN            ;y CRT-TABELLE EINLESEN       .WOR NEUT             ;z USER-PROGRAMM EMPFANGEN       .WOR NEUT             ;7B       .WOR NEUT             ;7C       .WOR NEUT             ;7D       .WOR NEUT             ;7E       .WOR NEUT             ;7F;**********************************************;*                                            *;*     SRUNGLISTE FUER FKT-SEQUENZEN          *;*                                            *;**********************************************FKTTB  .WOR FKTOUT           ;0 F1       .WOR FKTOUT           ;1 F2       .WOR FKTOUT           ;2 F3       .WOR FKTOUT           ;3 F4       .WOR FKTOUT           ;4 F5       .WOR FKTOUT           ;5 F6       .WOR FKTOUT           ;6 F7       .WOR FKTOUT           ;7 F8       .WOR INS              ;8 INSERT       .WOR DEL              ;9 DELETE;**********************************************;*                                            *;*     6511 VEKTOREN                          *;*                                            *;********************************************** *=$FFFANMI    .WOR RESETRES    .WOR RESETIRQ    .WOR INIRQ .END