00100 *MOUSE5/ASM     PART 2 OF SCREEN DRIVER
00200 
00300 *THIS ONE DOES A RETURN ON TEXT SCREEN
00400 CR      LDB     WDXLEN,U        GET LINE LENGTH
00500         SUBB    XCPOS,U         GET BYTE LEFT ON LINE
00600 CR1     DECB                    ANY BYTES LEFT ON LINE?
00700         BMI     CR2             SKIP IF NOT
00800         PSHS    B               SAVE COUNTER
00900         LDA     #32             GET SPACE " "
01000         LBSR    CHR20           PRINT IT ON SCREEN
01100         PULS    B               GET COUNTER
01200         BRA     CR1             LOOP TILL END OF LINE
01300 
01400 CR2     CLR     XCPOS,U         PUT TEXT CURSOR AT START OF LINE
01500 
01600 *DO A LINE FEED
01700 LF      INC     YCPOS,U         MOVE DOWN ONE LINE
01800 SCROLL  PSHS    A               SAVE PRINTING CHAR.
01900         LDB     YCPOS,U         GET LINE POSITION
02000         CMPB    WDYLEN,U        IS THIS LINE OFF SCREEN?
02100         BLO     SCROLL9         NO, SKIP AND EXIT
02200         DEC     YCPOS,U         ELSE MOVE UP A LINE
02300 
02400         BSR     HOLDIT          TURN OFF CURSOR FOR PRINTING
02500         LDA     #15
02600         STA     HOLD,U          MAKE THE HOLD A LITTLE LONGER
02700         LDA     WDYLEN,U        GET NUMBER LINE IN WINDOW
02800         DECA                    DON'T SCROLL THE LAST LINE
02900         BEQ     SCROLL5         SKIP ONLY ONE LINE
03000 
03100         LDA     WDYPOS,U        GET TEXT WINDOW LINE POSITION
03200         ADDA    SSTART          ADD THE SCREEN START POSITION
03300         LDB     WDXPOS,U        GET WINDOW C POSITION
03400         TFR     D,X             AND MAKE X POINT TO IT
03500         LDA     WDYLEN,U        GET NUMBER OF LINES IN WINDOW
03600         DECA                    DON'T SCROLL THE LAST ONE
03700         LSLA                    MUL BY 8 SCAN LINES
03800         LSLA
03900         LSLA
04000 SCROLL1 PSHS    X,A             SAVE SCAN LINE COUNT & POINTER
04100         LDB     WDXLEN,U        GET WINDOW X LENGTH
04200         LSRB                    DIVIDE BY 2
04300         BCC     SCROLL2         SKIP IF EVEN
04400         LDA     256,X           MOVE ONE BYTE IF ODD
04500         STA     ,X+
04600 SCROLL2 STB     COUNT,U         SET BYTE COUNTER
04700         BEQ     SCROLL4         SKIP IF ONLY ONE BYTE TO MOVE
04800 SCROLL3 LDD     256,X           ELSE MOVE TWO BYTES AT ONCE
04900         STD     ,X++
05000         DEC     COUNT,U         LOOP TILL ALL BYTES ARE DONE
05100         BNE     SCROLL3
05200 SCROLL4 PULS    X,A             RESET BACK TO START OF LINE
05300         LEAX    32,X            MOVE TO NEXT SCAN LINE
05400         DECA                    ALL LINE MOVED?
05500         BNE     SCROLL1         LOOP IF NOT
05600         
05700 SCROLL5 LDB     #8              LINES TO BE BLANKED
05800         LDA     INVERT,U        GET BACKROUND (BLACK OR WHITE)
05900 SCROLL6 PSHS    X,B             SAVE LINE START AND COUNTER
06000         LDB     WDXLEN,U        GET NUMBER OF BYTES PER LINE
06100 SCROLL7 STA     ,X+             PUT DOWN BACKROUND
06200         DECB                    ALL DONE WITH THIS LINE?
06300         BNE     SCROLL7         NO, THEN LOOP
06400         PULS    X,B             GET COUNT & START OF LINE
06500         LEAX    32,X            MOVE TO NEXT LINE
06600         DECB                    ALL LINES DONE
06700         BNE     SCROLL6         LOOP IF NOT
06800         LDA     #2              RESET HOLD
06900         STA     HOLD,U
07000 SCROLL9 PULS    PC,A            AND EXIT
07100 
07200 HOLDIT  PSHS    D,Y,U,X         SAVE ALL REGS
07300         LDA     #2              DELAY CURSOR FOR 2 IRQS
07400         STA     HOLD,U
07500         LBSR    CUROFF          TURN OFF CURSOR
07600         PULS    PC,U,Y,X,D      RESTORE AND EXIT
07700 
07800 CLS     BSR     HOLDIT          PUT CURSOR ON HOLD
07900         LDA     #10             PIT IT ON HOLD A LITTLE LONGER
08000         STA     HOLD,U
08100         LDD     WDYPOS,U        GET WINDOW POSITION
08200         ADDA    SSTART          ADD START OF SCREEN MEMORY
08300         TFR     D,X             MAKE X THE POINTER TO SCREEN
08400         LDA     INVERT,U        GET BACKROUND COLOR
08500         LDB     WDYLEN,U        GET NUMBER OF LINES
08600         LSLB                    8 LINES PER TEXT LINE
08700         LSLB
08800         LSLB
08900 CLS1    PSHS    B,X             SAVE LINE COUNT & POINTER
09000         LDB     WDXLEN,U        GET NUMBER OF BYTES PER LINE
09100 CLS2    STA     ,X+             PUT BACKROUND ON SCREEN
09200         DECB                    ARE ALL BYTES DONE ON LINE
09300         BNE     CLS2            NO, THEN LOOP BACK
09400         PULS    X,B             GET LINE COUNTER & START OF LINE
09500         LEAX    32,X            MOVE TO NEXT SCAN LINE
09600         DECB                    ALL SCANS DONE?
09700         BNE     CLS1            NO, THEN LOOP
09800         CLR     YCPOS,U         PUT TEXT CURSOR AT
09900         CLR     XCPOS,U         TOP OF WINDOW
10000         LDA     #2              RESET HOLD TO STANDARD
10100         STA     HOLD,U
10200         RTS                     AND EXIT
10300 
10400 SVIDEO  CLR     INVERT,U        MAKE WHITE ON BLACK
10500 NUL     RTS
10600 
10700 SETPOS  LDA     #1              START GET CURSOR POSITION
10800         STA     PMODE,U
10900         RTS
11000 
11100 SETWIN  LDA     #3              START GET WINDOW SIZE & POSITION
11200         STA     PMODE,U
11300         RTS
11400 
11500 WMODE1  CMPA    #31             IS WINDOW X START POS <31
11600         BHS     WERROR          IF NOT THAT ERROR
11700         STA     WDXPOS,U
11800         NEGA                    GET MAX WINDOW X LEG FOR THAT
11900         ADDA    #32             START PSOITION
12000         STA     WDXLEN,U        AND USE IT FOR NOW
12100         CLR     YCPOS,U         HOME TEXT CURSOR TO TOP
12200         CLR     XCPOS,U         LEFT OF WINDOW
12300         INC     PMODE,U         MOVE TO NEXT PRINT MODE
12400         RTS
12500 
12600 WMODE2  CMPA    #23             IS WINDOW Y START POS <23
12700         BHS     WERROR          IF NOT THEN ERROR
12800         STA     WDYPOS,U
12900         NEGA                    GET MAX WINDOW X LEN FOR THAT
13000         ADDA    #24             STARTING POSITION
13100         STA     WDYLEN,U
13200         INC     PMODE,U         MOVE TO NEXT PRINT MODE
13300         RTS
13400 
13500 WERROR  CLR     PMODE,U         RESET PRINT MODE
13600         LBRA    FNERR           AND GIVE A ?FN ERROR
13700 
13800 WMODE3  BEQ     WERROR          ERROR IF 0 BYTES PER LINE
13900         CMPA    WDXLEN,U        IS THIS WINDOW TOO BIG?
14000         BHI     WERROR          ?FN ERROR IF SO
14100         STA     WDXLEN,U        ELSE SET LINE LENGTH
14200         INC     PMODE,U         MOVE TO NE XT PRINT MODE
14300         RTS
14400 
14500 WMODE4  BEQ     WERROR          ERROR IF LENGTH IS ZERO
14600         CMPA    WDYLEN,U        IS THE SIZE TOO BIG?
14700         BHI     WERROR          FN ERROR IF SO
14800         STA     WDYLEN,U        ELSE SET IT
14900         CLR     PMODE,U         RESET PRINT MODE
15000         RTS                     AND EXIT
15100 
15200 IVIDEO  LDA     #255            SET BLACK ON WHITE VIDEO
15300         STA     INVERT,U
15400         RTS
15500 
15600 *THIS IS A BACK SPACE CODE ($08)
15700 BACKSP  LDD     YCPOS,U         GET TEXT CURSOR POSITION
15800         DECB                    BACK UP ONE
15900         BPL     BACKS1          USE IT IF STILL ON THE SAME LINE
16000         LDB     WDXLEN,U        ELSE MOVE CURSOR TO END
16100         DECB                    OF LINE
16200         DECA                    AND MOVE UP ONE LINE
16300         BPL     BACKS1          USE IT IF NOT THE TOP OF WINDOW
16400         INCA                    ELSE BACK TOP TOP LINE
16500         CLRB                    AND START OF THE LINE
16600 BACKS1  STD     YCPOS,U         STORE NEW TEXT CURSOR POSITION
16700         LDA     #32             CLEAR (BLANK) THE NEW TEXT
16800         LBSR    CHR20           CURSOR POSITION
16900         DEC     XCPOS,U         MOVE BACK TO THAT PLACE
17000         RTS                     AND EXIT
17100 
17200 LEFT    LDA     XCPOS,U         GET TEXT CURSOR'S X POSITION
17300         DECA                    MOVE BACK ONE
17400         BPL     LEFT1           IF STILL ONE LINE? THEN USE IT
17500         LDA     WDXLEN,U        ELSE MAKE IT THE MAX RIGHT
17600         DECA                    POSITION ON LINE
17700 LEFT1   STA     XCPOS,U         AND STORE IT
17800         RTS                     ALL DONE AND EXIT
17900 
18000 RIGHT   LDA     XCPOS,U         GET TEXT CURSOR'S X POSITION
18100         INCA                    MOVE TO RIGHT
18200         CMPA    WDXLEN,U        GONE TOO FAR?
18300         BLO     RIGHT1          NO, THEN USE IT (SKIP)
18400         CLRA                    ELSE MOVE TO FAR LEFT
18500 RIGHT1  STA     XCPOS,U         AND STORE IT
18600         RTS                     ALL DOWN, EXIT
18700 
18800 UPLINE  DEC     YCPOS,U         MOVE TEXT CURSOR UP ONE LINE
18900         BPL     UPLIN1          MOVE OFF OF TOP OF WINDOW?, NO SKIP
19000         LDA     WDYLEN,U        SET TO BOTTOM OF WINDOW
19100         DECA
19200         STA     YCPOS,U
19300 UPLIN1  RTS
19400 
19500 TAB     LDB     XCPOS,U         GET TEXT CURSOR POSITION
19600         ANDB    #7              GET OFFSET FROM TAB STOP (EVERY 8)
19700         NEGB                    GET NUMBER TO NEXT NEXT ONE
19800         ADDB    #8
19900         LDA     #32             GET A SPACE " "
20000 TAB1    PSHS    D               SAVE BOTH
20100         LBSR    CHR20           PRINT THAT SPACE
20200         PULS    D               GET BOTH
20300         DECB                    AT NEXT TAP STOP?
20400         BNE     TAB1            NO, THEN LOOP
20500         RTS
