00100 * SOUND AND SCREEN DRIVERS
00200 PING    BSR     SNDON           GET SOUND FROM 6 BIT DAC
00300         PSHS    CC              SAVE IRQ FLAGS
00400         ORCC    #$50            TUEN OFF IRQS
00500         LDA     #230            HOW LONG TO DO SOUND
00600 PING1   BSR     PING5           DO A TIME DELAY
00700 
00800         TFR     A,B             GET TIME COUNT
00900         ANDB    #$F7            USE ONLY THE TOP 5 BITS
01000         ORB     #2              SET PRINTER BIT HIGH
01100         STB     $FF20           SEND IT OUT THE DAC PORT
01200 
01300         BSR     PING5           DO A TIME DELAY
01400         LDB     #2              CLEAR ALL BITS BUT PRINTER
01500         STB     $FF20           ON DAC PORT
01600         DECA                    MAKE BALL SOUND SMALLER
01700         DECA                    BY 2
01800         CMPA    #18             IS BELL DONE?
01900         BHS     PING1           NO, THEN LOOP
02000         PULS    CC              TURN ON IRQS
02100 SNDOFF  LDA     $FF23           TURN OFF DAC SOUND
02200         ANDA    #$F7            BY RESETTING THE BIT
02300         STA     $FF23
02400         CLRB                    MAKE RETURN ZERO
02500         RTS                     AND RETURN
02600 
02700 SNDON   LDA     $FF23           TURN ON THE SOUND BY
02800         ORA     #8              SETTING THE SOUND ON BIT
02900         STA     $FF23
03000         LDA     $FF01           GET LSB OF JOY/AUDIO
03100         ANDA    #$FF-8          PORT AND RESET IT
03200         STA     $FF01           AND PUT IT BACK
03300         LDA     $FF03           GET MSB OF JOY/AUDIO
03400         ANDA    #$FF-8          PORT AND RESET IT TOO
03500         STA     $FF03           AND PUT IT BACK
03600         RTS                     NOW EXIT
03700 
03800 PING5   LDB     #180            TIME DELAY USED BY BELL (PING)
03900 PING6   DECB
04000         BNE     PING6
04100         RTS
04200 
04300 *MAKE A SMALL CLICK SOUND
04400 CLICK   BSR     SNDON           TURN SOUND ON TO DAC
04500         LDA     #10             START TIME DELAY SHORT
04600 CLICK1  TFR     A,B             DO A DELAY (USE COUNT)
04700 CLICK2  DECB                    GET LONGER EACH TIME
04800         BNE     CLICK2
04900         LDB     $FF20           GET DAC PORT
05000         EORB    #$F0            FLIP TOP 4 BITS
05100         STB     $FF20           SAVE SET PORT
05200         INCA                    MAKE DELAY LONGER
05300         CMPA    #76             ALL DONE?
05400         BLO     CLICK1          NO, LOOP BACK
05500         BRA     SNDOFF          ELSE SOUND OFF AND EXIT
05600 
05700 FNERR   LDB     #4*2            GO HERE FOR ?FN ERROR
05800         FCB     $8C
05900 SNERR   LDB     #2              GO HERE FOR ?SN ERROR
06000         JMP     $AC46           JUMP TO ERROR (OF BASIC)
06100 
06200 *MOUSE'S NEW PRINT COMMAND
06300 NPRINT  BEQ     OPRINT          SKIP IF NO PRINT DATA
06400         CMPA    #64             IS THE FIRST CHAR. A "@"?
06500         BNE     OPRINT
06600         PSHS    A
06700         LDA     $FF22           GET GRAPHICS MODE
06800         ANDA    #$E0            IS SCREEN A PMODE 3 TO 4
06900         EORA    #$E0
07000         PULS    A
07100         BNE     OPRINT          NO, THEN USE OLD PRINT COMMAND
07200 
07300         JSR     $B3E4           GET VAL FOR THE @ POSITION
07400         PSHS    U               SAVE U, NEED FOR VARIABLE BLOCK
07500         LEAU    DATA,PCR        GET VARIABLE POINTER
07600         CLR     COUNT,U         CLEAR LINE COUNT
07700 AT1     INC     COUNT,U         ADD ONE TO LINE COUNT
07800         SUBB    WDXLEN,U        SUB ONE LINE WIDTH
07900         SBCA    #0              (DO 16 BIT SUB)
08000         BCC     AT1             LOOP TILL NEG
08100         ADDB    WDXLEN,U        ALWAYS ONE TOO MANY
08200         LDA     COUNT,U         GET LINE COUNT
08300         DECA                    ALWAYS ONE TOO MANY
08400         CMPA    WDYLEN,U        IS THE LINE OUT OF THE WINDOW
08500         BHS     FNERR           FM ERROR IF OUT OF RANGE
08600         STD     YCPOS,U         SAVE THE LINE & COLUMN POSITION
08700         PULS    U               RESTORE U REG.
08800 
08900         JSR     $A5             GET NEXT CHAR.
09000         BEQ     OPRINT          END IF END OF PRINT DATA
09100         CMPA    #$2C            IS THE CHAR. A ","?
09200         BNE     SNERR           NO, THEN ?SN ERROR
09300         JSR     $9F             SET FLAGS FOR CHARACTER
09400 OPRINT  JMP     [OLDPRT+DATA,PCR]
09500 
09600 PMTAB   FDB     CHR1-PMTAB      TABLE USED FOR PMODE TYPE
09700         FDB     PMODE1-PMTAB
09800         FDB     PMODE2-PMTAB
09900 
10000         FDB     WMODE1-PMTAB
10100         FDB     WMODE2-PMTAB
10200         FDB     WMODE3-PMTAB
10300         FDB     WMODE4-PMTAB
10400 
10500 SPRINT  PSHS    B               SAVE IT'S DATA, I NEED TO USE IT
10600         LDB     $FF22           GET SCREEN MODE
10700         EORB    #$E0            COMPLEMENT HI-RES BITS
10800         ANDB    #$E0            ONLY USE THOSE BITS
10900 * IF THE SCREEN IS IN THE HI-RES (6K) MODE THEN B=0
11000 
11100         ORB     $6F             GET I/O PATH NUMBER
11200 * IF THE I/O PATH IS THE SCREEN (ZERO) THEN B STILL WILL BE ZERO
11300 
11400         PULS    B               GET B OLD DATA
11500         BEQ     SPRNT1          SKIP IF FOR HI-RES SCREEN
11600 SPRNT0  JMP     [OLDIO+DATA,PCR]        ELSE USE OLD I/O PATH CALL
11700 
11800 SPRNT1  LEAS    2,S             REMOVE PATCH-CALL ADDRESS
11900 
12000 CHR     PSHS    U,Y,X,D         SAVE ALL REGS.
12100         LEAU    DATA,PCR        GET ADDRESS OF VARIABLES
12200         LDB     PMODE,U         GET PRINT MODE
12300         LEAX    PMTAB,PCR       GET PRINT MODE OFFSET TABLE
12400         LSLB                    MAKE PRINT MODE *2 FOR 16 OFFSET
12500         LDD     B,X             GET PRINT MODE'S 16 BIT OFFSET
12600         LEAX    D,X             MAKE X POINT THE SUBR.
12700         LDA     ,S              GET CHARACTER TO PRINT
12800         JSR     ,X              CALL IT
12900         LDB     XCPOS,U         GET PRINT CURSOR X POSITION
13000         ORB     #$E0            MAKE IT BOTTOM LINE
13100         LDA     #5
13200         STD     $88             PUT IT IN BASIC'S CURSOR POSITION
13300         PULS    PC,U,Y,X,D      RESTORE REGS AND EXIT
13400 
13500 *SET TEXT CURTSOR Y POSITION
13600 PMODE2  CMPA    WDYLEN,U        IS Y POSITION BIGGER THEN THE
13700         BLO     PMODEA          WINDOW? NO, USE IT!
13800         LDA     WDYLEN,U        ELSE USE THE MAX POSITION
13900         DECA
14000 PMODEA  STA     YCPOS,U         STORE IT
14100         CLR     PMODE,U         RESET PMODE TO NORMAL
14200         RTS                     AND EXIT
14300 
14400 *GET X POSITION
14500 PMODE1  CMPA    WDXLEN,U        IS THE X POSITION TOO BIG?
14600         BLO     PMODEB          NO, USE IT!
14700         LDA     WDXLEN,U        ELSE USE THE MAX X POSITION
14800         DECA
14900 PMODEB  STA     XCPOS,U         STORE IT
15000         INC     PMODE,U         MOVE TO NEXT PRINT MODE
15100         RTS                     AND EXIT
15200 
15300 CHRTAB  FDB     NUL-CHRTAB      CONTROL CODE VECTORS
15400         FDB     SETPOS-CHRTAB
15500         FDB     SVIDEO-CHRTAB
15600         FDB     IVIDEO-CHRTAB
15700         FDB     SETWIN-CHRTAB
15800         FDB     LEFT-CHRTAB
15900         FDB     RIGHT-CHRTAB
16000         FDB     PING-CHRTAB
16100         FDB     BACKSP-CHRTAB
16200         FDB     TAB-CHRTAB
16300         FDB     LF-CHRTAB
16400         FDB     UPLINE-CHRTAB
16500         FDB     CLS-CHRTAB
16600         FDB     CR-CHRTAB
16700 
16800 CHR1    CMPA    #13             IS THE CHARACTER A CONTROL CODE?
16900         BHI     CHR20           SKIP IF NOT
17000         LSLA                    ELSE JUMP TO IT VECTOR
17100         LEAX    CHRTAB,PCR
17200         LDD     A,X
17300         JMP     D,X
17400 
17500 CHR20   SUBA    #32             IS IT A PRINTABLE CODE?
17600         CMPA    #96
17700         BHI     CHR29           NO, THEN SKIP TO EXIT
17800 
17900         LBSR    HOLDIT          PUT MOUSE CURSOR ON HOLD
18000         LDB     XCPOS,U         GET X-POSITION ON SCREEN
18100         CMPB    WDXLEN,U        PAST RIGHT SIDE?
18200         BLO     CHR21           NO, JUST PRINT IT
18300         CLR     XCPOS,U         ELSE BACK TO LEFT SIDE
18400         INC     YCPOS,U         AND MOVE DOWN LINE
18500         BSR     SCROLL          IF NEEDS TO SCROLL, THEN SCROLL!
18600 
18700 CHR21   LEAY    >CHRDAT,PCR     GET CHR DATA TABLE
18800         LDB     #8              INDEX TO THE CHAR. DATA
18900         MUL
19000         LEAY    D,Y
19100 
19200         LDD     WDYPOS,U        GET WINDOW START POSITION
19300         ADDD    YCPOS,U         GET TEXT CURSOR POSITION
19400         ADDA    SSTART          ADD SCREEN START IN MEMORY
19500         TFR     D,X             AND POINT X TO IT
19600         LDB     #8              NUMBER BYTES PER CHAR.
19700 CHR22   LDA     ,Y+             GET DATA BYTE
19800         EORA    INVERT,U        INVERT IF FLAG IS ON
19900         STA     ,X              PUT IT ON THE SCREEN
20000         LEAX    32,X            NEXT LINE ON SCREEN
20100         DECB                    ALL BYTES DONE???
20200         BNE     CHR22           LOOP IF NOT
20300 
20400         INC     XCPOS,U         NEXT POSITION ON SCREEN
20500 CHR29   RTS
