[net.micro.apple] DCOM 3.21 VIDEX driver source code

ix742@sdcc6.UUCP (James Hayes) (05/16/86)

Here is the source code for the VIDEX driver.  I'm posting it
because it might have a few problems.  I could only test the driver
on VIDEX lookalike equipment, and have not actually seen it work on
real VIDEX equipment

The source code is not all the commented, but should prove useful if
modifications are needed.

-Jim Hayes, UCSD

ARPA: hayes@UCSD.ARPA
UUCP: {ihnp4, ucbvax, decvax, gatech}!sdcsvax!hayes
----CUT-----
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	t.dcom.screen.vdx
# This archive created: Thu May 15 19:16:50 1986
# By:	James Hayes (UC San Diego EE/CS Department.)
export PATH; PATH=/bin:$PATH
echo shar: extracting "'t.dcom.screen.vdx'" '(21248 characters)'
if test -f 't.dcom.screen.vdx'
then
	echo shar: will not over-write existing file "'t.dcom.screen.vdx'"
else
sed 's/^XX//' << \SHAR_EOF > 't.dcom.screen.vdx'
XX ORG $5000
XX********************************
XX*/VERS. 3.21 07-APR-86 11:37AM *
XX********************************
XX*                              *
XX* DCOM.SCREEN.VDX              *
XX*                              *
XX*                              *
XX* THIS IS THE SCREEN DRIVER    *
XX* FOR THE VIDEX VIDEOTERM      *
XX*                              *
XX********************************
XX*
XX********************************
XX*                              *
XX* DCOM 3    COMMUNICATIONS FOR *
XX* MAINFRAME INTERACTIONS.      *
XX*                              *
XX* FOR THE //e AND //c SERIES.  *
XX*                              *
XX********************************
XX*                              *
XX* Copyright(C)1986 James Hayes *
XX* ALL RIGHTS RESERVED          *
XX*                              *
XX* P.O. Box 221044              *
XX* University City, CA          *
XX*       92122-1044             *
XX*                              *
XX* (619) 450-9316               *
XX* PHONE # VALID UNTIL JUNE '86 *
XX*                              *
XX********************************
XX*
XX********************************
XX* 80 COLUMN CARD SCREEN        *
XX* ROUTINES:                    *
XX*                              *
XX********************************
XX JMP INITSCRN
XX JMP ZAP
XX JMP CLRLINE
XX JMP MOVELINE
XX JMP STOREXY
XX JMP CLEAREOL
XX JMP CLEAREOS
XX JMP SCROLLUP
XX JMP SCROLLDO
XX JMP HCP
XX JMP CCHECK
XX JMP SCP
XX JMP PICKUP
XX JMP CHOUT
XX JMP INSERTLN
XX JMP KILLLN
XX JMP CLEARBLC
XX JMP CLEARHC
XX JMP DELTCHAR
XX JMP INSTCHAR
XX JMP FILLE
XX JMP FIXSCRN
XX JMP DOCR
XX JMP DOLF
XX JMP SAVESCRN
XX JMP RESTSCRN
XX JMP DORESET
XX JMP DOUBLEIT
XX*
XX*
XXDUMMY RTS
XX*
XX********************************
XX*                              *
XX* CARD CONSTANTS               *
XX*                              *
XX********************************
XX*
XXINITDATA HEX 7F50625819001818
XX HEX 0009200000000000
XX*
XX*
XXSCRNTABL HEX 0050A0F04090E030
XX HEX 80D02070C01060B0
XX HEX 0050A0F04090E030
XX*
XXSCRNTABH HEX CCCCCCCCCDCDCDCC
XX HEX CCCCCDCDCDCCCCCC
XX HEX CDCDCDCDCCCCCCCD
XX*
XXALSCRNH HEX CCCCCCCCCDCDCBCC
XX HEX CCCCCDCDCBCCCCCC
XX HEX CDCDCDCBCCCCCCCD
XX*
XXALSCRNL HEX 0050A0F04090E030
XX HEX 80D02070C01060B0
XX HEX 0050A0F04090E030
XX*
XXCHRCONV HEX 207F7F090C0D0A2A
XX HEX 2B200B191C16131F
XX HEX 1A1A1A1A1A171D1B
XX HEX 1E153C3E223D232E
XX*
XXXSAVE HEX 00
XXUNDER HEX 00
XXUNDSAVE HEX 00
XXXREG HEX 00
XXCURSIS HEX 00
XXCOUNTERL HEX 00
XXCOUNTERH HEX 00
XX*
XX********************************
XX*                              *
XX* CARD ACCESS EQUATES          *
XX*                              *
XX********************************
XX*
XXCONTROL EQU $C0B0
XXREGDATA EQU $C0B1
XXDATAE EQU $C300
XXDATAD EQU $CFFF
XX*
XXSAVEAREA EQU $8400
XXSTUFFBUF EQU $2006
XXMODEINS EQU $301
XXMODEWRAP EQU $305
XXMODEBACK EQU $308
XXMODETOP EQU $30A
XXMODEDBL EQU $309
XXMODECHR EQU $30B
XXMODEINV EQU $30C
XXCX EQU $30F
XXCY EQU $310
XXBLINK EQU $311
XXSCRLTOP EQU $312
XXSCRLBOT EQU $313
XX*
XXMODETAB EQU $380
XX*
XX********************************
XX*                              *
XX* CONTROL ROUTINES             *
XX*                              *
XX********************************
XX*
XX*
XX*
XXPUTREG STY CONTROL
XX STA REGDATA
XX RTS
XX*
XX*
XX*
XX********************************
XX* 0) INIT SCREEN               *
XX********************************
XX*
XXINITSCRN STA $C059
XX LDY #15
XXINITLOOP LDA INITDATA,Y
XX JSR PUTREG
XX DEY
XX BPL INITLOOP
XX RTS
XX*
XX*
XX********************************
XX* 1) ZAP - CLEAR THE SCREEN    *
XX* RETURNS WITH A, X AND Y      *
XX* SCRAMBLED                    *
XX********************************
XX*
XXZAP LDY #23 ;CLEAR LINES 0-23 WITH "MODEBACK".
XXZAP1 JSR CLRLINE ;80 COLUMN SCREEN
XX JSR STUFFBUF
XX DEY  ;NEXT LINE.
XX BPL ZAP1 ;BRANCH IF THERE IS MORE TO CLEAR
XX RTS  ;OTHERWISE, QUIT
XX*
XX********************************
XX* 2) CLEAR LINE IN Y REG       *
XX* RETURNS WITH Y INTACT AND    *
XX* X AND A SCRAMBLED            *
XX********************************
XX*
XXCLRLINE
XX LDA #0
XX STA MODETAB,Y
XX BIT DATAE
XX*
XX LDA ALSCRNL,Y
XX STA CLR2+1 ;SET UP THE ABSOLUTE STORAGE BELOW
XX LDA ALSCRNH,Y
XX STA CLR2+2
XX*
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX LDX #79 ;80 COLUMNS TO CLEAR
XX JSR VFIX
XX LDA MODEBACK ;STORE A MODEBACK.
XXCLR2 STA $FFFF,X ;$FFFF IS FILLED IN BY THE LINES ABOVE.
XX DEX
XX CPX #$F
XX BEQ CLFIX
XX CPX #$1F
XX BEQ CLFIX
XX CPX #$3F
XX BEQ CLFIX
XX INX
XX DEX
XX BPL CLR2 ;BRANCH IF NOT A LEFT EDGE YET
XX*BIT DATAD ;DISABLE 80 COLUMN STORAGE
XX JMP STUFFBUF
XX*
XXCLFIX JSR VFIX
XX TXA
XX PHA
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX PLA
XX TAX
XX*
XX CPY #6
XX BEQ CHCL32
XX CPY #$C
XX BEQ CHCL64
XX CPY #$13
XX BEQ CHCL16
XXEXITCLBS LDA MODEBACK
XX JMP CLR2
XX
XXCHCL32 CPX #$1F
XX BNE EXITCLBS
XX JMP SWAP
XXCHCL64 CPX #$3F
XX BNE EXITCLBS
XX JMP SWAP
XXCHCL16 CPX #$F
XX BNE EXITCLBS
XX JMP SWAP
XX*
XXSWAP
XX TXA
XX PHA
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX*
XX PLA
XX TAX
XX LDA SCRNTABL,Y
XX STA CLR2+1
XX LDA SCRNTABH,Y
XX STA CLR2+2
XX LDA MODEBACK
XX JMP CLR2
XX*
XX*
XX********************************
XX* 3) MOVE A LINE FROM X TO Y   *
XX*    RETURNS WITH X AND Y      *
XX*    UNMOLESTED, BUT A         *
XX*    GETS SCRAMBLED            *
XX********************************
XX*
XXMOVELINE
XX LDA MODETAB,X
XX STA MODETAB,Y
XX TXA
XX PHA
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX PLA
XX TAX
XX CPX #6
XX BEQ OLMVLN
XX CPX #$C
XX BEQ OLMVLN
XX CPX #$13
XX BEQ OLMVLN
XX CPY #6
XX BEQ OLMVLN
XX CPY #$C
XX BEQ OLMVLN
XX CPY #$13
XX BEQ OLMVLN
XX JMP FASTMOVE
XX*
XX*
XXOLMVLN TXA
XX PHA
XX TYA
XX PHA
XX TXA
XX TAY
XX*
XX LDA ALSCRNL,Y ;MOVE SCREEN LINES. (USED BY BOTH
XX STA SOURCE+1 ;SCROLL ROUTINES.)
XX LDA ALSCRNH,Y
XX STA SOURCE+2
XX*
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX LDX #79 ;START AT RIGHT SIDE (COL 79)
XX JSR VFIX
XXSOURCE LDA $FFFF,X
XX STA LBUFF,X
XX DEX
XX CPX #$F
XX BEQ CLFIX1
XX CPX #$1F
XX BEQ CLFIX1
XX CPX #$3F
XX BEQ CLFIX1
XX INX
XX DEX
XX BPL SOURCE ;BRANCH IF NOT A LEFT EDGE YET
XX TXA
XX PHA
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX PLA
XX TAX
XX JMP MOVEXYGT
XX*
XXCLFIX1 CPY #6
XX BEQ CHCL321
XX CPY #$C
XX BEQ CHCL641
XX CPY #$13
XX BEQ CHCL161
XXEXITCLB1 JMP SOURCE
XX*
XX
XXCHCL321 CPX #$1F
XX BNE EXITCLB1
XX JMP SWAP1
XXCHCL641 CPX #$3F
XX BNE EXITCLB1
XX JMP SWAP1
XXCHCL161 CPX #$F
XX BNE EXITCLB1
XX JMP SWAP1
XX*
XXSWAP1 JSR VFIX
XX TXA
XX PHA
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX PLA
XX TAX
XX LDA SCRNTABL,Y
XX STA SOURCE+1
XX LDA SCRNTABH,Y
XX STA SOURCE+2
XX JMP SOURCE
XX*
XXMOVEXYGT
XX PLA
XX TAY
XX LDA ALSCRNL,Y
XX STA DEST+1
XX LDA ALSCRNH,Y
XX STA DEST+2
XX*
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XX LDX #79
XX JSR VFIX
XXMOVELOP LDA LBUFF,X
XXDEST STA $FFFF,X
XX DEX
XX JSR XYBELONG
XX BMI MOVELOP1
XX BCC SWAP2
XXMOVELOP1 INX
XX DEX
XX BPL MOVELOP
XX JSR STUFFBUF
XX PLA
XX TAX
XX RTS
XX
XX*
XXSWAP2 TXA
XX PHA
XX JSR STUFFBUF
XX PLA
XX TAX
XX LDA SCRNTABL,Y
XX STA DEST+1
XX LDA SCRNTABH,Y
XX STA DEST+2
XX JMP MOVELOP1
XX*
XX*
XX********************************
XX* 4) STORE AT X,Y. STORES ACC. *
XX*    AT X,Y. RETURNS WITH Y    *
XX*    UNTOUCHED, BUT X AND A    *
XX*    ARE GONE.                 *
XX********************************
XX*
XX*
XXSTOREXY PHA
XX BIT DATAE
XX TXA
XX PHA
XX JSR STUFFBUF
XX PLA
XX TAX
XX JSR VFIX
XX JSR XYBELONG
XX BMI XYDONOR2
XX BCC XYDONORM
XXXYDONOR2 LDA ALSCRNL,Y
XX STA STRBYTE+1
XX LDA ALSCRNH,Y
XX STA STRBYTE+2
XX JMP DOFINAL
XXXYDONORM LDA SCRNTABL,Y
XX STA STRBYTE+1
XX LDA SCRNTABH,Y
XX STA STRBYTE+2
XX*
XXDOFINAL PLA
XXSTRBYTE STA $FFFF,X
XX*
XX JSR STUFFBUF ;"INTERUPT" TO CHECK MODEM
XX RTS
XX*
XX********************************
XX* 5) CLEAR FROM CX,CY TO END   *
XX*    OF LINE. RETURNS NOTHING  *
XX*    INTACT.                   *
XX********************************
XX*
XXCLEAREOL LDX CX
XX CPX #0
XX BNE CLEAREOX
XX LDY CY
XX JMP CLRLINE
XXCLEAREOX LDX #79 ;START AT THE LAST COLUMN
XX LDY CY ;GET LINE TO DO THE CLEAR ON.
XX LDA MODEBACK ;"SPACE"
XXCLEAREO1 STX XREG ;STORE THE X REG.
XX JSR STOREXY ;STORE IT.
XX LDX XREG ;GET X BACK.
XX CPX CX ;ARE WE DONE YET?
XX BEQ QUITCLR ;BRANCH IF YES.
XX DEX
XX JMP CLEAREO1 ;LOOP, IF NOT.
XXQUITCLR RTS
XX*
XX********************************
XX* 6) CLEAR FROM (CX,CY) TO END *
XX*    OF SCREEN. NOTHING EVEN   *
XX*    GETS CLOSE TO RETURNING   *
XX*    INTACT.                   *
XX********************************
XX*
XXCLEAREOS JSR CLEAREOL ;CLEAR TO END OF LINE.
XX*
XX LDY #23 ;START WITH LAST LINE
XXCLRLOOP CPY CY ;DONE? (YREG=CY?)
XX BEQ CLRDONE ;BRANCH IF SO.
XX JSR CLRLINE ;OTHERWISE CLEAR LINE Y
XX DEY  ;DO NEXT LINE
XX JMP CLRLOOP ;DO IT.
XXCLRDONE RTS
XX*
XX********************************
XX* 7) SCROLL THE DISPLAY UP ONE *
XX*    LINE. YOU'LL BE LUCKY IF  *
XX*    THE PROCESSOR STATUS BYTE *
XX*    RETURNS THE SAME....      *
XX********************************
XX*
XXSCROLLUP
XX LDY SCRLTOP ;DEST LINE
XX INY
XX TYA
XX TAX
XX DEY
XXSCRUP1 JSR MOVELINE ;SWAP ODD LOCS ON LINE Y
XX INY  ;INC Y AND X
XX INX
XX CPX SCRLBOT ;AT BOTTOM?
XX BLT SCRUP1 ;BRANCH IF NOT
XX BEQ SCRUP1
XX LDY SCRLBOT ;CLEAR...
XX JMP CLRLINE ;BOTTOM LINE
XX
XX*
XX********************************
XX* 8) SCROLL THE DISPLAY DOWN   *
XX*    REGISTERS? WHAT DOES #7   *
XX*    SAY? GOOD. FOLLOW THAT.   *
XX********************************
XX*
XXSCROLLDO LDY SCRLBOT ;START FROM...
XX DEY
XX TYA
XX TAX
XX INY
XX*
XXSCRDOWN1 JSR MOVELINE ;MOVE THE LINES UP ONE BY ONE.
XX DEY  ;NEXT LINES
XX DEX
XX CPY SCRLTOP
XX BNE SCRDOWN1 ;LOOP IF NOT FINISHED
XX LDY SCRLTOP ;CLEAR TOP LINE
XX JMP CLRLINE
XX
XX*
XX********************************
XX* 9) HIDE THE CURRENT CURSOR.  *
XX*    REGISTERS: DESTROYED      *
XX********************************
XX*
XXHCP BIT CURSIS
XX BMI DOHCP
XX RTS
XXDOHCP LDA UNDER ;PUT BACK THE CHAR UNDER THE CURSOR.
XX LDX CX ;GET THE CURSOR LOCATIONS
XX LDY CY
XX JSR STOREXY ;AND STORE IT TO THE SCREEN
XX LDA #0
XX STA CURSIS
XX JMP RESET
XX*
XX********************************
XX* 9A) CURSOR BLINK ROUTINE     *
XX********************************
XX*
XXCCHECK LDX BLINK ;HAS THE BLINK BEEN TURNED ON?
XX BNE CCHECK1 ;BRANCH IF YES
XX RTS ;OTHERWISE, EXIT.
XX*
XXCCHECK1 INC COUNTERL ;INCREMENT THE FLASH COUNTER
XX BEQ INCHC ;HAVE WE 256 LOOPS?  BRANCH IF SO.
XX JMP CHECKH ;CHECK FOR OUT OF BOUNDS
XXINCHC INC COUNTERH ;INCREMENT THE HIGH BYTE
XXCHECKH LDX COUNTERH ;GET IT BACK FOR CHECKING
XX CPX BLINK ;HAVE WE HIT THE BLINK TIME?
XX BEQ TOGGLE ;IF SO, TOGGLE THE CURSOR
XX RTS  ;AND SAY BYE, BYE
XX*
XXTOGGLE BIT CURSIS ;WHAT IS THE CURRENT CURSOR STATUS? (ON OR OFF?)
XX BPL ISOFF ;BRANCH IF OFF
XX JSR HCP ;HIDE THE CURSOR
XX LDA #00 ;AND RESET THE
XX STA CURSIS ;CURSOR STATUS BYTE
XX RTS
XXISOFF JSR SCP ;SHOW THE CURSOR
XX LDA #$80 ;AND RESET THE
XX STA CURSIS ;CURSOR STATUS BYTE
XX RTS
XXRESET LDA #0 ;RESET THE CURSOR COUNTERS
XX STA COUNTERL
XX STA COUNTERH
XX RTS
XX*
XX*
XX********************************
XX* 10) SHOW CURSOR POSITION.    *
XX* REGISTERS YOU ASK? DESTROYED *
XX********************************
XX*
XXSCP BIT CURSIS
XX BMI SCPEXIT
XX LDX CX ;GET X AND...
XX LDY CY ;Y
XX JSR PICKUP ;PICK IT OFF THE SCREEN
XX STA UNDER ;GOT IT, NOW STORE THE ACC.
XX EOR #$80 ;INVERT THE CHARACTER (THE NEW CURSOR)
XX LDX CX ;PLACE THE NEW "CURSOR" ON THE SCREEN
XX JSR STOREXY
XX LDA #$80
XX STA CURSIS
XX**
XX* SET DOUBLE, ETC.
XX*
XX LDY CY ; GET THE LINE
XX LDA MODETAB,Y ;GET THE CURRENT MODE OF THE LINE.
XX ROL ;SHIFT OVER TO ACCESS THE HIGE BIT.
XX BCS SETDUBMD ;SET DOUBLE MODE
XX LDX #0
XX STX MODEDBL ;CLEAR IT
XX LDX #$FF ;SET THE UPPER HALF OF THE SET
XX STX MODETOP
XX*
XX JMP SCPEXIT
XXSETDUBMD LDX #$FF
XX STX MODEDBL
XX ROL ;SHIFT OVER TO ACCESS TOP/BOTTOM BIT
XX BCS SETBOT
XX LDX #00
XX STX MODETOP
XX JMP SCPEXIT
XXSETBOT LDX #$FF
XX STX MODETOP
XXSCPEXIT
XX JMP RESET
XX*
XX********************************
XX* 11) GET THE CHARACTER AT     *
XX*     (X,Y) ON THE SCREEN AND  *
XX*     PUT IN ACC. REGISTERS: Y *
XX*     REMAINS INTACT           *
XX********************************
XX*
XXPICKUP BIT DATAE
XX TXA
XX PHA
XX JSR STUFFBUF
XX PLA
XX TAX
XX JSR VFIX
XX JSR XYBELONG
XX BCC XYDONOR1
XX LDA ALSCRNL,Y
XX STA STRBYT1+1
XX LDA ALSCRNH,Y
XX STA STRBYT1+2
XX JMP STRBYT1
XXXYDONOR1 LDA SCRNTABL,Y
XX STA STRBYT1+1
XX LDA SCRNTABH,Y
XX STA STRBYT1+2
XX*
XXSTRBYT1 LDA $FFFF,X
XX*
XX JSR STUFFBUF ;"INTERUPT" TO CHECK MODEM
XX RTS
XX*
XX*
XX********************************
XX* 12) OUTPUT WHAT EVER IS IN   *
XX*     ACC. WITH RESPECT TO     *
XX*     THE INVERSE FLAG.        *
XX*     KILLS X AND Y. ONLY GETS *
XX*     A SCRAMBLED WHEN SCREEN  *
XX*     SCROLLS                  *
XX********************************
XX* THIS (BELOW) IS JUST A SUBROUTINE OF CHOUT.
XXCONCHRSET
XX BIT MODECHR ;ADDED TO HANDLE GRAPHIC CHARACTER SETS.
XX BPL CONEXIT ;NOTHING TO CONVERT. OH WELL.
XX CMP #$5F ;PART OF THE CONVERSION SET?
XX BLT CONEXIT
XX*
XX SEC
XX SBC #$5F
XX TAY
XX LDA CHRCONV,Y ;GET THE CONVERTED CHARACTER
XXCONEXIT BIT MODETOP
XX BMI REALEXIT
XX LDA #$2D ;OR OUTPUT A DASH IF DOUBLE WIDE BOTTOM HALF.
XXREALEXIT RTS
XX*
XXNEXTLINE HEX 00
XX*
XXCHOUT JSR CONCHRSET
XX PHA
XX JSR HCP
XX BIT NEXTLINE
XX BPL SKIPSCRL
XX*
XX* THE SECTION DETERMINES IF THE LAST STORE RESULTED IN
XX* THE POSSIBILITY OF THE SCREEN SCROLLING ON THE
XX* NEXT STORE.  FOR EXAMPLE: THE SCREEN SHOULD
XX* NOT SCROLL WHEN OUTPUT IS MADE TO COLUMN 80 OF LINE
XX* 24.  BUT SHOULD ON THE NEXT OUTPUT UNLESS
XX* THE CURSOR POSITION IS MOVED.
XX*
XX LDX CX
XX CPX #79
XX BNE SKIPSCRL
XX BIT MODEWRAP
XX BPL SKIPSCRL
XX LDX #0
XX STX CX
XX INC CY
XX LDY CY
XX CPY SCRLBOT
XX BLT SKIPSCRL
XX BEQ SKIPSCRL
XX*
XX JSR SCROLLUP
XX DEC CY
XX*
XXSKIPSCRL LDX #00
XX STX NEXTLINE
XX BIT MODEINS ;INSERT MODE ON?
XX BPL NOINS
XX JSR INSTCHAR
XXNOINS
XX LDX CX ;GET THE X
XX LDY CY ;AND Y LOCATIONS.
XX PLA
XX
XX BIT MODEBACK
XX BPL CHINVRS
XX EOR #$80
XXCHINVRS BIT MODEINV ;INVERSE?
XX BPL NORMOUT ;NOPE, DO NORMAL
XX EOR #$80
XXNORMOUT JSR STOREXY
XX INC CX
XX LDX CX
XX CPX #80
XX BLT OKAY1
XXDOCR1 LDA #$FF
XX STA NEXTLINE
XX DEC CX
XXOKAY1 JMP SCP
XX*
XX*
XX*
XX*
XXDOCR LDX #00
XX STX CX
XXDOLF INC CY ;AND DO A LINE FEED.
XX LDY CY ;INCREMENT Y AND DO A RANGE CHECK.
XX CPY #24 ;OFF SCREEN?
XX BEQ DOSCR ;BRANCH IF SO AND DO SCROLL UP.
XX CPY SCRLBOT
XX BGE DODOSCR
XXOKAY JMP SCP ;DISPLAY CURSOR.
XXDODOSCR BEQ OKAY
XX*
XX*
XXDOSCR JSR SCROLLUP ;SCROLL THE SCREEN UP
XX LDY SCRLBOT ;RESET THE CURSOR POSITION TO THE LAST LINE.
XX STY CY ;STORE IT.
XX JMP SCP ;SHOW THE NEW CURSOR.
XX*
XX********************************
XX* 13) INSERT A NEW LINE AT CY  *
XX*     AND RETURN CX TO LEFT    *
XX*     SIDE. NO REGISTERS       *
XX*     RETURN O.K.              *
XX********************************
XX*
XXINSERTLN JSR HCP ;HIDE CURSOR
XX LDX #0 ;RESET TO LEFT SIDE
XX STX CX
XX LDY CY ;GET Y
XX CPY #00 ;AT TOP?
XX BEQ DOBACKIN ;IF SO, JUST SCROLL BACKWARDS (BELOW)
XX*
XX LDY #23 ;START AT BOTTOM
XX LDX #22
XXINSERTL1 JSR MOVELINE ;MOVE ON PAIR OF LINES
XX DEY  ;NEXT PAIR. UP ONE
XX DEX
XX CPX CY ;DONE?
XX BGE INSERTL1 ;BRANCH IF => CY AND DO AGAIN
XX JSR CLEAREOL ;CLEAR TO END OF LINE
XX JMP SCP ;SHOW CURSOR AND EXIT
XX*
XXDOBACKIN JSR SCROLLDO
XX JMP SCP
XX*
XX********************************
XX* 14) DELETE LINE AT CY AND    *
XX*     RETURNS CX TO LEFT SIDE. *
XX*     NO REG'S INTACT          *
XX********************************
XX*
XXKILLLN LDX #0
XX STX CX ;RESET X TO LEFT EDGE
XX JSR HCP ;HIDE THE CURSOR
XX LDY CY ;GET Y (DEST. LINE)
XX CPY #23 ;ALREADY AT BOTTOM?
XX BEQ KILLLNCL ;IF SO, JUST ERASE THE BOTTOM LINE
XX*
XX
XX TYA  ;XFER Y TO X
XX TAX
XX INX  ;AND INCREMENT X TO GET SOURCE LINE.
XXKILLLN1 JSR MOVELINE ;MOVE SOURCE TO DEST.
XX INY  ;NEXT!
XX INX
XX CPX #24 ;AT BOTTOM?
XX BNE KILLLN1 ;DO AGAIN IF NOT
XXKILLLNCL LDY #23 ;OTHERWISE, CLEAR THE BOTTOM LINE.
XX JSR CLRLINE
XX JMP SCP ;SHOW THE CURSOR.
XX*
XX********************************
XX* 16) CLEAR FROM BEGINNING OF  *
XX*     LINE TO THE CURSOR       *
XX********************************
XX*
XXCLEARBLC JSR HCP
XX LDX CX
XX STX OLDX
XX LDY CY
XX STY OLDY
XX*
XXERSLOOP LDA MODEBACK
XX JSR STOREXY
XX LDY OLDY
XX DEC OLDX
XX LDX OLDX
XX BPL ERSLOOP
XX JSR SCP
XX RTS
XX*
XXOLDX HEX 00
XXOLDY HEX 00
XX*
XX********************************
XX* 17) CLEAR FROM HOME TO       *
XX*     CURSOR                   *
XX********************************
XX*
XXCLEARHC JSR HCP
XX LDY CY
XX BEQ SKIPCLR
XX*
XX DEY
XX STY OLDY
XXCLRLOOP1 JSR CLRLINE
XX DEC OLDY
XX LDY OLDY
XX BPL CLRLOOP1
XX JSR CLEARBLC
XXSKIPCLR RTS
XX*
XX********************************
XX* 18) DELETE THE CHARACTER     *
XX*     UNDER THE CURSOR AND MOVE*
XX*     EVERYTHING ELSE OVER.    *
XX********************************
XX*
XX*
XXDELTCHAR JSR HCP
XX LDX CX
XX STX OLDX
XX*
XXDELTCHLP LDX OLDX
XX INX
XX LDY CY
XX JSR PICKUP
XX LDX OLDX
XX LDY CY
XX JSR STOREXY
XX*
XX INC OLDX
XX LDX OLDX
XX CPX #79
XX BLT DELTCHLP
XX
XX LDX #79
XX LDY CY
XX LDA MODEBACK
XX JSR STOREXY
XX JSR SCP
XX RTS
XX*
XX********************************
XX* 19) INSERT A BLANK IN THE    *
XX*     CURRENT LINE.            *
XX********************************
XX*
XX*
XXINSTCHAR
XX LDX CX
XX CPX #79
XX BEQ EXIT
XX JSR SCP
XX LDX #78
XX STX XSAVE
XX*
XXINSERTLP LDX XSAVE
XX JSR PICKUP
XX LDX XSAVE
XX INX
XX JSR STOREXY
XX LDX XSAVE
XX CPX CX
XX BEQ INSLOPEX
XX DEC XSAVE
XX JMP INSERTLP
XXINSLOPEX LDX CX
XX LDY CY
XX LDA MODEBACK
XX JSR STOREXY
XXEXIT RTS
XX*
XX********************************
XX* 20) FILL THE SCREEN W/E'S    *
XX********************************
XX*
XXMODEBSTR HEX 00
XX*
XXFILLE JSR HCP
XX LDX MODEBACK
XX STX MODEBSTR
XX*
XX LDX #69
XX STX MODEBACK
XX JSR ZAP
XX LDX MODEBSTR
XX STX MODEBACK
XX JSR SCP
XX RTS
XX*
XX********************************
XX* 21) INVERT THE SCREEN.       *
XX********************************
XX*
XXFIXLINE
XX*
XX********************************
XX* FIX THE LINE IN Y            *
XX********************************
XX*
XX BIT DATAE
XX*
XX LDA ALSCRNL,Y
XX STA CLR3+1 ;SET UP THE ABSOLUTE STORAGE BELOW
XX STA CLR32+1
XX LDA ALSCRNH,Y
XX STA CLR3+2
XX STA CLR32+2
XX*
XX LDX #79 ;80 COLUMNS TO CLEAR
XX JSR VFIX
XXCLR3 LDA $FFFF,X ;$FFFF IS FILLED IN BY THE LINES ABOVE.
XX EOR #$80
XXCLR32 STA $FFFF,X
XX DEX
XX CPX #$F
XX BEQ CLFIX2
XX CPX #$1F
XX BEQ CLFIX2
XX CPX #$3F
XX BEQ CLFIX2
XX INX
XX DEX
XX BPL CLR3 ;BRANCH IF NOT A LEFT EDGE YET
XX*BIT DATAD ;DISABLE 80 COLUMN STORAGE
XX JMP STUFFBUF
XX*
XXCLFIX2 JSR VFIX
XX*
XX CPY #6
XX BEQ CHCL322
XX CPY #$C
XX BEQ CHCL642
XX CPY #$13
XX BEQ CHCL162
XXEXITCLB2 LDA MODEBACK
XX JMP CLR3
XX
XXCHCL322 CPX #$1F
XX BNE EXITCLB2
XX JMP SWAP3
XXCHCL642 CPX #$3F
XX BNE EXITCLB2
XX JMP SWAP3
XXCHCL162 CPX #$F
XX BNE EXITCLB2
XX JMP SWAP3
XX*
XXSWAP3 LDA SCRNTABL,Y
XX STA CLR32+1
XX STA CLR3+1
XX LDA SCRNTABH,Y
XX STA CLR32+2
XX STA CLR3+2
XX LDA MODEBACK
XX JMP CLR3
XX*
XX*
XXFIXSCRN JSR HCP
XX LDY #23
XXFIXLOOP JSR FIXLINE
XX DEY
XX BPL FIXLOOP
XX JSR SCP
XX RTS
XX*
XX*
XX********************************
XX* SAVE SCREEN! SAVE SCREEN!    *
XX********************************
XX*
XXSAVEBANK LDX #$00
XXSAVEBAN1 LDA $CC00,X
XXSAVER STA $FFFF,X
XX DEX
XX BNE SAVEBAN1
XX*
XX INC SAVER+2
XX INC SAVER1+2
XX JSR STUFFBUF
XX BIT $CFFF
XX LDA DATAE
XXSAVEBAN2 LDA $CD00,X
XXSAVER1 STA $FFFF,X
XX DEX
XX BNE SAVEBAN2
XX*
XX INC SAVER+2
XX INC SAVER1+2
XX JSR STUFFBUF
XX RTS
XX*
XXRESTBANK LDX #00
XXRESTER LDA $FFFF,X
XX STA $CC00,X
XX DEX
XX BNE RESTER
XX INC RESTER+2
XX INC RESTER1+2
XX JSR STUFFBUF
XX BIT $CFFF
XX BIT DATAE
XXRESTER1 LDA $FFFF,X
XX STA $CD00,X
XX DEX
XX BNE RESTER1
XX*
XX INC RESTER+2
XX INC RESTER1+2
XX JSR STUFFBUF
XX RTS
XX*
XX********************************
XX* SAVE A SCREEN TO MEMORY      *
XX* STARTING AT #SAVE AREA       *
XX********************************
XX*
XXSAVESCRN JSR HCP
XX LDX #<SAVEAREA
XX STX SAVER+1
XX STX SAVER1+1
XX LDX #>SAVEAREA
XX STX SAVER+2
XX STX SAVER1+2
XX*
XX LDA $C0B0
XX JSR SAVEBANK
XX LDA $C0B4
XX JSR SAVEBANK
XX LDA $C0B8
XX JSR SAVEBANK
XX LDA $C0BC
XX JSR SAVEBANK
XX*
XX
XXQUITSAVE LDY #$A0
XXQSLOOP LDA $300,Y
XX STA $8100,Y
XX DEY
XX CPY #$FF
XX BNE QSLOOP
XX*
XX BIT DATAD
XX RTS
XX*
XX********************************
XX* RESTORE SCREEN               *
XX********************************
XX*
XXRESTSCRN LDX #<SAVEAREA
XX STX RESTER+1
XX STX RESTER1+1
XX LDX #>SAVEAREA
XX STX RESTER+2
XX STX RESTER1+2
XX*
XX LDA $C0B0
XX JSR RESTBANK
XX LDA $C0B4
XX JSR RESTBANK
XX LDA $C0B8
XX JSR RESTBANK
XX LDA $C0BC
XX JSR RESTBANK
XX*
XXQUITREST LDY #$A0
XXQULOOP LDA $8100,Y
XX STA $300,Y
XX DEY
XX CPY #$7F
XX BNE QULOOP
XX LDY #$0F
XX LDA $8100,Y
XX STA $300,Y
XX INY
XX LDA $8100,Y
XX STA $300,Y
XX BIT DATAD
XX LDA UNDSAVE
XX STA UNDER
XX LDA #0
XX STA CURSIS
XX JSR SCP
XX RTS
XX********************************
XX* RESET THE SCREEN LINE TO     *
XX* NORMAL WIDTH, AFTER A DOUBLE *
XX* WIDTH CHANGE.                *
XX********************************
XX*
XX*
XXDORESET JSR HCP ;Reset the line width and reset cursor
XX*
XXDORESET1 LDX #0
XX STX DSOURCE
XX STX DDEST
XX JSR HCP
XX*
XXDORESET2 LDY CY
XX LDX DSOURCE
XX JSR PICKUP
XX LDY CY
XX LDX DDEST
XX JSR STOREXY
XX INC DSOURCE
XX INC DSOURCE
XX INC DDEST
XX LDY DDEST
XX CPY #40
XX BEQ DORESET3
XX JMP DORESET2
XXDORESET3 JSR SCP
XX LDA CX
XX PHA
XX JSR HCP
XX LDX #40
XX LDY CY
XX STX CX
XX JSR CLEAREOL
XX PLA
XX STA CX
XX JSR SCP
XX RTS
XX*
XX*
XX*
XXDSOURCE HEX 00
XXDDEST HEX 00
XX*
XX********************************
XX* DOUBLE (MAKE WIDE) THE       *
XX* CURRENT SCREEN LINE.         *
XX********************************
XX*
XXDOUBLEIT LDX #39
XX STX DSOURCE
XX LDY #78
XX STY DDEST
XX*
XXDBLOOP LDX DSOURCE
XX LDY CY
XX JSR PICKUP
XX LDX DDEST
XX LDY CY
XX JSR STOREXY
XX DEC DDEST
XX LDY CY
XX LDX DDEST
XX LDA MODEBACK
XX JSR STOREXY
XX DEC DDEST
XX DEC DSOURCE
XX*
XX LDY DSOURCE
XX BEQ DBLEXIT
XX JMP DBLOOP
XXDBLEXIT RTS
XX********************************
XX* GIVEN AN X AND Y COORDINATE, *
XX* THIS ROUTINE WILL SWITCH IN  *
XX* THE APPROPRIATE SECTION OF   *
XX* THE VIDEO SCREEN.            *
XX********************************
XX*
XXVFIX
XX*
XX TXA
XX PHA
XX JSR STUFFBUF
XX PLA
XX TAX
XX BIT $C300
XX CPY #7
XX BLT BANK1CHK
XX CPY #$D
XX BLT BANK2CHK
XX CPY #$14
XX BLT BANK3CHK
XXBANK4 LDA $C0BC
XX LDA #4
XX
XX RTS
XXBANK1CHK CPY #6
XX BEQ BN1MIDLN
XXSWINB1 LDA $C0B0
XX LDA #1
XX
XX RTS
XXBN1MIDLN CPX #$20
XX BLT SWINB1
XXSWINB2 LDA $C0B4
XX LDA #2
XX
XX RTS
XXBANK2CHK CPY #$C
XX BEQ BN2MIDLN
XX LDA $C0B4
XX LDA #2
XX
XX RTS
XXBN2MIDLN CPX #$40
XX BLT SWINB2
XXSWINB3 LDA $C0B8
XX LDA #3
XX
XX RTS
XX*
XXBANK3CHK CPY #$13
XX BEQ BN3MIDLN
XX LDA $C0B8
XX LDA #3
XX
XX RTS
XXBN3MIDLN CPX #$10
XX BLT SWINB3
XX LDA $C0BC
XX LDA #4
XX
XX RTS
XX*
XX*
XX********************************
XX* SEE IF X,Y BELONG TO THE     *
XX* ALTERNATE TABLE OR THE       *
XX* MASTER TABLE.                *
XX********************************
XX* CARRY CLEAR TO USE NORMAL,   *
XX* CARRY SET TO USE ALT.        *
XX********************************
XX*
XXXYBELONG TXA
XX PHA
XX JSR STUFFBUF
XX PLA
XX TAX
XX CLV
XX CPY #6
XX BEQ CHECKAL1
XX CPY #$C
XX BEQ CHECKAL2
XX CPY #$13
XX BEQ CHECKAL3
XX CLC
XX LDA #$FF
XX RTS
XX*
XXCHECKAL1
XX CPX #$20
XX BLT NORMFLGS
XX SEC
XX LDA #$FF
XX RTS
XXCHECKAL2
XX CPX #$40
XX BLT NORMFLGS
XX LDA #$FF
XX SEC
XX RTS
XXCHECKAL3
XX CPX #$10
XX BLT NORMFLGS
XX SEC
XX LDA #$FF
XX RTS
XXNORMFLGS CLC
XX JSR VFIX
XX LDA #$00
XX RTS
XX********************************
XX* FAST MOVE.  MOVE LINE WITHOUT*
XX* CHECKING. ASSUMES IN SAME    *
XX* AS SOURCE AND DESTINATION    *
XX********************************
XX*
XX*
XX*
XXFASTMOVE LDA SCRNTABL,X
XX STA SOURCE1+1
XX LDA SCRNTABH,X
XX STA SOURCE1+2
XX LDA SCRNTABL,Y
XX STA DEST1+1
XX LDA SCRNTABH,Y
XX STA DEST1+2
XX*
XX TXA
XX PHA
XX JSR STUFFBUF
XX LDX #79
XX JSR VFIX
XXSOURCE1 LDA $FFFF,X
XXDEST1 STA $FFFF,X
XX DEX
XX BPL SOURCE1
XX JSR STUFFBUF
XX PLA
XX TAX
XX RTS
XX*
XX*
XX*
XXLBUFF HEX 00
XX*
SHAR_EOF
if test 21248 -ne "`wc -c < 't.dcom.screen.vdx'`"
then
	echo shar: error transmitting "'t.dcom.screen.vdx'" '(should have been 21248 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0