1
0
mirror of https://github.com/PDP-10/its.git synced 2026-05-27 07:17:32 +00:00
Files
PDP-10.its/src/draw/disp.500
2018-05-05 19:19:09 +02:00

2522 lines
46 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;<DRAW>DISP.FAI.150, 15-NOV-75 19:20:54, EDIT BY HELLIWELL
;BLINKO, DPYSET, OUTDPY, MRKPAG, MAINOU, HYDPOG
VERSION(DISP,13)
NOCMU,<
NODEC,<
NOIII,<
BLINKO: TLNN DSPACT
POPJ P,
PUSH P,T
HRRZ T,BUFPTR
SETZM 1(T)
SUBI T,DPYBUF-3-BLINKL
MOVEM T,BLINK+1
MOVE T,PGLASS
DPB T,[POINT 4,BLDPY,12] ;SET PG NUM
CAIGE T,20
XCT BLDPY
PUSHJ P,MRKPAG
POP P,T
POPJ P,
>;NOIII
>;NODEC
>;NOCMU
DPYSET: MOVEI TT,1
MOVEM TT,SIZ
MOVE TT,S2H(TT)
DPB TT,[POINT 3,BSOR,27]
MOVE TT,DEFBRT
MOVEM TT,BRT
DPB TT,[POINT 3,BSOR,24]
TLO DSPOFF ;START OFF SCREEN IN CASE HE SCREWS UP!
SETZM XDISP
SETZM YDISP
DPYST1:
NOIII,< MOVE TT,[POINT 36,DPYBUF,35] >
III,< MOVE TT,[POINT 36,DPYBUF] >
MOVEM TT,BUFPTR
SETZM DPYBUF
POPJ P,
NOCMU,<
IFN DECSW!IIISW,<
BLINKO:
PGP,< SETOM BLNKIT >
>;IFN DECSW!IIISW
OUTDPY: TLNN DSPACT
POPJ P,
PUSH P,T
HRRZ T,BUFPTR
SETZM 1(T)
SUBI T,DPYBUF-1
NOIII,< MOVEM T,HEAD+1 >
III,< HRLM T,HEAD >
MOVE T,PGLASS
DPB T,[POINT 4,DPYDPY,12]
CAIGE T,20
XCT DPYDPY
III,< JFCL >
PUSHJ P,MRKPAG
POP P,T
POPJ P,
>;NOCMU
MRKPAG: MOVEI T,1
LSH T,@PGLASS
IORM T,PAGACT
IORM T,REALACT
POPJ P,
MAINOU: TLNN DSPACT
POPJ P,
PUSHJ P,OUTDPY
AOS T,PGLASS
MAINO1: CAILE T,17 ;NOW CLEAR ALL OTHER PG'S NOT USED
POPJ P,
PUSHJ P,HYDPOG
AOJA T,MAINO1
NOCMU,<
HYDPOG: TLNN DSPACT
POPJ P,
PUSH P,T
MOVEI T,1
LSH T,@(P)
ANDCAM T,PAGACT
POP P,T ;SOME PEOPLE EXPECT T TO BE SAVED!
POPJ P,
DOPOGS: TLNN DSPACT
POPJ P,
MOVE T,PAGACT
ANDCM T,REALACT ;THESE ALL SHOULD BE ON
SKIPE T
HALT .+1
MOVE T,PAGACT ;WHAT WE WANT ACTIVE
ANDCA T,REALACT ;WHAT IS ACTIVE
MOVEI TT,17
DOPOG1: MOVEI TTT,1
LSH TTT,(TT)
TDNN T,TTT ;DOES THIS POG NEED CLEARING?
JRST DOPOG2 ;NO
DPB TT,[POINT 4,HYDDPY,12]
XCT HYDDPY
III,< JFCL >
DOPOG2: SOJG TT,DOPOG1
MOVE T,PAGACT
MOVEM T,REALACT
POPJ P,
>;NOCMU
;SETDEF, DPYBRT, TXTDPB, INSOUT, DPYBIG
SETDEF: MOVE T,STDBIG
PUSHJ P,DPYBIG
MOVE T,DEFBRT
DPYBRT: CAILE T,7 ;IN CASE HE IS LOSING!
MOVEI T,7
CAMN T,BRT
POPJ P, ;SEE THE TIME WE SAVE
MOVEM T,BRT
DPB T,[POINT 3,BSOR,24]
POPJ P, ;NO
TXTDPB: TRO T,1 ;MAKE SURE IS TEXT
TLNN DSPOFF ;ARE WE CURRENTLY OFF SCREEN?
IDPB T,BUFPTR ;NO, DEPOSIT TEXT, OR WHATEVER
POPJ P,
INSOUT: IDPB TT,BUFPTR
HRRZ TT,BUFPTR
CAIG TT,DPYBUF+DPYLEN ;THIS BUFFER FULL YET?
POPJ P,
PUSHJ P,OUTDPY ;YES, USE ANOTHER
AOS TT,PGLASS
CAIN TT,20
OUTSTR[ASCIZ/RAN OUT OF PIECES OF GLASS!
/]
JRST DPYST1
;SETUP BSOR WITH HARDWARE CHARACTER SIZE
;T = SOFTWARE SIZE
DPYBIG: CAMN T,SIZ
POPJ P,
MOVEM T,SIZ
CAILE T,CSIZES
MOVEI T,CSIZES
MOVE T,S2H(T)
DPB T,[POINT 3,BSOR,27]
POPJ P,
;AVECT, AVECTX, AVECTZ, AVECTY
AVECT: MOVE TT,XDISP
MOVEM TT,XGO
MOVE TT,YDISP
MOVEM TT,YGO
TLNE DSPOFF
JRST AVECTW
MOVEI TT,106
PUSHJ P,VECT
CAIA
JRST INSOUT
TLNN M,LWINDOW ;WINDOWING LINES?
POPJ P, ;NO
PUSHJ P,SEGWN1 ;CALC INTERSECTION POINT
PUSHJ P,FUCKUP
JRST AVECTZ
AVECTX: PUSHJ P,VECT
JRST AVECTY
PUSHJ P,SEGWN0
PUSHJ P,FUCKUP ;CAN'T LOSE
MOVE T,XDISP
MOVEM T,XGO
MOVE T,YDISP
MOVEM T,YGO
AVECTZ: TRO TT,146 ;INVIS TO EDGE
TDO TT,BSOR
PUSHJ P,INSOU2 ;THIS WAY
HRLZ TT,XGO
LSH TT,=18-=11
MOVE T,YGO
DPB T,[POINT 11,TT,21]
TRO TT,106
TDO TT,BSOR
JRST INSOUT
AVECTY: PUSHJ P,SEGWN0
POPJ P, ;DOESN'T INTERSECT SCREEN
TRO TT,146
TDO TT,BSOR
PUSHJ P,INSOU2
PUSHJ P,SEGWN1
PUSHJ P,FUCKUP ;MUST GO OUT IF IT CAME IN!
TRO TT,106
TDO TT,BSOR
JRST INSOUT
;VECTORS, CHAR POSITIONING, TFUDGE
PINPOS: MOVEI TT,146
PUSHJ P,VECT
POPJ P,
PUSHJ P,TFUDGE
JRST INSOU2
AVECTW: TLNE M,LWINDOW ;IF NOT WINDOWING LINES, JUST DO AIVECT
JRST AVECTX
AIVECT: MOVEI TT,146
PUSHJ P,VECT
POPJ P,
INSOU2: LDB T,[POINT 7,@BUFPTR,35]
CAIE T,46 ;CAN REPLACE RELATIVE INVISIBLE
CAIN T,146 ;OR ABSOLUTE INVISIBLE
SOS BUFPTR ;WITH ABSOLUTE INVISIBLE
JRST INSOUT
MPC,<
ROUTE,<
APOINT: MOVEI TT,126
PUSHJ P,VECT
POPJ P,
JRST INSOUT
>;ROUTE
>;MPC
IFN 0,< ;CURRENTLY NOT USED, BUT MAY BE USEFUL LATER
RIVECT: MOVEI TT,46
PUSHJ P,VECT
POPJ P,
JRST INSOUT
>;IFN 0
VECT: HLRE TTT,T
HRRE T,T
SUB TTT,XOFF
MPC,< TRNE M,FLIP ;INVERTING X?
MOVN TTT,TTT ;YES!
>;MPC
SUB T,YOFF
SCALE (TTT)
SCALE (T)
CALVCT: MOVEM T,YDISP
MOVEM TTT,XDISP
CAIGE TTT,%RIGHT
CAMG TTT,[%LEFT]
JRST VECTOF
CAIGE T,%TOP
CAMG T,[%BOTTOM]
JRST VECTOF
TLZ DSPOFF ;ASSUME NOT OFF YET
DPB T,[POINT 11,TT,21]
DPB TTT,[POINT 11,TT,10]
IOR TT,BSOR ;ADD BRIGHTNESS, SIZE
JRST CPOPJ1
VECTOF: TLO DSPOFF
POPJ P,
TITVCT: SKIPE T
PUSHJ P,DPYBRT
SKIPE T,TT
PUSHJ P,DPYBIG
MOVEI TT,146
DPB TTT,[POINT 11,TT,21]
HLRZ TTT,TTT
DPB TTT,[POINT 11,TT,10]
TDO TT,BSOR
PUSHJ P,TFUDGE ;FUDGE FOR TEXT
TLZ DSPOFF ;FAKE OUT TEXT ROUTINES
JRST INSOU2
;SMLVCT, BIGSET, SM2SET, TFUDGE, ATTFIX
;POSITION TO X,Y AND SET CHAR SIZE, FUDGE FOR CHAR GEN LOSSAGE
;T = X,,Y
;RETURNS
;TT = VECTOR
MPC,<
SMLVCT: SKIPA TT,STDBIG ;STD SIZE FOR TEXT
>;MPC
BIGSET: MOVEI TT,3 ;SIZE 3, BIG CHARS
SM2SET: PUSH P,T
MOVE T,TT
PUSHJ P,DPYBIG ;SETUP BSOR WITH HARDWARE CHAR SIZE
POP P,T ;X,,Y
MOVEI TT,146
PUSHJ P,VECT
POPJ P,
AOS (P) ;SKIP RETURN
;FUDGE VECTOR IN TT TO COMPENSATE FOR CHARACTER GENERATOR
;FALLS THRU
TFUDGE: PUSH P,TTT
MOVE TTT,SIZ
MOVE TTT,S2H(TTT)
LDB T,[POINT 11,TT,21] ;GET Y PART
ADD T,YTEXTF-1(TTT)
DPB T,[POINT 11,TT,21]
HRLZ T,XTEXTF-1(TTT)
POP P,TTT
LSH T,=18-=11
ADD TT,T
POPJ P,
;OFFSET LAST VECTOR PUT OUT BY X(A) AND Y(TT)
;ATTFIX(A=X, TT=Y)
ATTFIX: LSH A,=36-=11
ADDM A,@BUFPTR
LDB A,[POINT 11,@BUFPTR,21]
ADD A,TT
DPB A,[POINT 11,@BUFPTR,21]
POPJ P,
;BIGAIV, SMLAIV
BIGAIV: PUSHJ P,BIGSET ;SET X,Y FOR BIG CHAR
POPJ P,
CENCHR: MOVE TTT,SIZ ;MOVE BEAM SO CHAR IS CENTERED AT X,Y
MOVE T,DPYPTX(TTT)
CHRCN2: LSH T,=36-=11-1
TLZ T,(1B11)
SUB TT,T
LDB T,[POINT 11,TT,21]
MOVE TTT,DPYPTY(TTT)
ASH TTT,-1
SUB T,TTT
DPB T,[POINT 11,TT,21]
JRST INSOUT
MPC,<
SMLAIV: PUSHJ P,SMLVCT
POPJ P,
JRST CENCHR
SMGAIV: PUSHJ P,SMLVCT
POPJ P,
MOVE TTT,SIZ
MOVE T,DPYPTX(TTT)
ASH T,1
JRST CHRCN2
SM1AIV: PUSHJ P,SMLVCT
POPJ P,
JRST CENCHR
SM2AIV: MOVE TT,STDBIG
AOS TT
PUSHJ P,SM2SET
POPJ P,
JRST CENCHR
>;MPC
;VHLINE
NOCMU,<
VHLINE: TLNN DSPACT
POPJ P,
PUSH P,T
MOVEI TT,146
TLNE LOCATE ;LOCATING?
PUSHJ P,VECT
NODEC,<
MOVE TT,[XWD %NLOC,20] ;OFF SCREEN, DON'T DISPLAY
TRZ TT,34000 ;CLEAR BRIGHTNESS FIELD
CAMN TT,LOCAT
JRST VHLIN1
NOIII,< PGSEL 0
UPGMVM TT,LOCAT
>;NOIII
>;NODEC
NOGT,< ;;JB
VB10,<
JRST VHLIN2
EXCH TT,TTT
PUSHJ P,MAKWRD
EXCH TT,TTT
MOVEM TT,LOCATW
SKIPA TT,[XWD 400000,LOCATS]
VHLIN2: MOVE TT,[XWD 0,%NLOC]
>;VB10
PGP,<
SETZ TT, ;FLAG FOR VH LINE OFF
TRZ TT,34000 ;CLR BRIGHTNESS BITS
CAMN TT,LOCAT ;ANYTHING NEW?
JRST VHLIN1 ;NO, QUIT
PUSHJ P,PUSHAL ;SAVE ACS
JUMPE TT,VHLIN2 ;TURN OFF?
PUSHJ P,TXYSET ;SET UP XY OF LINES
RTNCAL (INTERA,<[PLIT VHLIN4],[PLIT TSXDAT]>) ;SET UP VH LINES
VHLIN3: PUSHJ P,CHCINT ;MAKE IT HAPPEN
PUSHJ P,POPALL ;RESTORE ACS
>;PGP
MOVEM TT,LOCAT
III,<; DPYOUT 0,FBUF
JFCL
>;III
VHLIN1: POP P,T
POPJ P,
PGP,<
VHLIN2: RTNCAL (INTERA,<[PLIT VHLIN5],[PLIT NULARG]>) ;TURN OFF THE VH LINES
JRST VHLIN3 ;GO MAKE IT HAPPEN
EVHL4-.-1
VHLIN4: ASCIZ !BEGIN
ON HCA
Y[9]=$1;
X[10]=$0;
'302'=1;
END,
END!
2
EVHL4__.
EVHL5-.-1
VHLIN5: ASCIZ !BEGIN
ON HCA
'302'=0;
END,
END!
0
EVHL5__.
>;PGP
>;NOGT ;;JB
GT,< ;;JB HORIZONTAL AND VERTICAL GT40 CODE.
JRST VHLIN2 ;;JB IF NOT ON SCREEN, NO LINES.
PUSHJ P,BRKTT ;;JB BREAK UP THE III INSTRUCTION NOW.
BMODS 10,1,2 ;;JB SET TO ALTER SUBPICTURE 10.
HLRZ T,TT ;;JB GET THE XIN T
PUSH P,T ;;JB STICK THE X ON THE LIST.
PUSH P,TT ;;JB AND THE Y NOW.
BMODF ;;JB SEND OUT AND CLEAN UP STACK.
STAPIC 11 ;;JB START DISPLAYING SUBPICTURE 11.
JRST VHLIN1 ;;JB AND EXIT NOW.
VHLIN2: STOPIC 11 ;;JB STOP DISPLAYING SUBPICTURE 11.
VHLIN1: POP P,T ;;JB RESTORE AVED REGISTERS NOW.
POPJ P, ;;JB AND RETURN TO THE CALLER.
>;GT ;;JB END OF THIS CRAP NOW.
>;NOCMU
;CALCOF, CONBOX
;CALCOF - POSITION FOR CONNECTOR STRING (ADJUST FOR STRING LENGTH LATER)
;E = POINT
CALCOF: FETCH(A,E,PXY) ;MAIN LOCN
FETCH(B,E,PLOC)
MOVE B,1(B) ;CHARACTER OFFSET
MOVE C,STDBIG ;CONNECTOR CHAR SIZE
;CALCOL - CALC CHAR OFFSET
;A = MAIN X,Y
;B = OFFSET X,Y
;C = CHARACTER SIZE
CALCOL: PUSHJ P,CALCF1 ;ADD IN CHARACTER OFFSET
POPJ P,
PUSHJ P,TFUDGE ;FUDGE FOR CHARACTER GENERATOR ERRS
JRST INSOU2 ;INSERT IN BUFFER
CALCF1:
MD,< HRRE T,B ;OFFSET Y
IMUL T,DPYPTY(C)
IDIV T,VIRPTY(C)
HLRE TT,B ;OFFSET X
IMUL TT,DPYPTX(C)
IDIV TT,VIRPTX(C)
MOVE TTT,TT ;DIV CAN'T BE IN TTT
HLRE TT,A ;MAIN X
SUB TT,XOFF
SCALE(TT)
ADD TTT,TT
HRRE TT,A ;MAIN Y
SUB TT,YOFF
SCALE(TT)
ADD T,TT
MOVEI TT,146
JRST CALVCT
>;MD
MPC,< MOVE T,B
ADJUST(ADD,T,A)
MOVEI TT,146
JRST VECT
>;MPC
;ABCALC - POSITION BEAM TO A+B
;A = INTERNAL X,Y
;B = CHARACTER OFFSET (IN VIR CHAR PTS)
MD,<
ABCALC: MOVE C,STDBIG
PUSHJ P,CALCF1
POPJ P,
PUSHJ P,TFUDGE
JRST INSOU2 ;ADD VECTOR TO LIST
;DISPLAY CONNECTOR BOX
;E = POINT
CONBOX: FETCH(A,E,PXY)
FETCH(B,E,PLOC)
MOVE B,1(B)
MOVE C,STDBIG
PUSHJ P,CALCF1 ;INITIAL POSITION
POPJ P, ;OFF SCREEN
PUSHJ P,INSOU2 ;START THERE
TITCON: MOVE C,STDBIG
MOVE T,DPYPTY(C)
ASH T,-1
DPB T,[POINT 7,T,35-7] ;MAKE IT +,+
MOVEI TT,2
DPB T,[POINT 14,TT,35-4-2]
TRC T,37600 ;MAKE IT +,-
ADDI T,200
DPB T,[POINT 14,TT,35-4-2-14-2]
IDPB TT,BUFPTR
MOVE A,E
PUSHJ P,CONCAL ;CALC LENGTH OF CON STRING
IMUL T,DPYPTX(C)
DPB T,[POINT 11,T,10]
HRRI T,6
IDPB T,BUFPTR ;TOP OF BOX
TDC TT,[BYTE(7)<-1>,-1(2)0(7)<-1>,-1]
ADD TT,[BYTE(7)1,1(2)0(7)1,1]
IDPB TT,BUFPTR ;RIGHT TIT
TLC T,777600 ;BOTTOM OF BOX
ADD T,[BYTE(11)1]
IDPB T,BUFPTR
POPJ P,
;DISPIN - DISPLAYS A PIN# AT BPOINT
;E = BPOINT
;A = PIN#
DISPIN: TLNE DSPOFF
POPJ P,
PUSH P,A
PUSH P,B
PUSH P,C
SETZM CHRCNT
PUSH P,PUTCHR
MOVE TTT,[AOS CHRCNT]
MOVEM TTT,PUTCHR
FETCH(C,E,BBODY)
FETCH(B,C,BSOC)
FETPAK(C,C)
PUSHJ P,PINPLS
POP P,PUTCHR
MOVN A,CHRCNT ;GET -LEN OF PIN #
FETCH(TT,E,BBODY)
FETCH(TTT,TT,BORI)
FETCH(T,E,BPLOC) ;TYPIN BLOCK FROM TYPE DEF
MOVEI C,DPYPTX ;SIGNAL PIN IS GOING TO DISPLAY
PUSHJ P,PINCAL ;CALC X,Y OFFSET FOR PIN #
PUSHJ P,ATTFIX ;OFFSET LAST VECT BY A AND TT
PUSHJ P,NUMSET ;SETUP DPY FOR CHARS
MOVE A,-2(P) ;PIN#
FETCH(C,E,BBODY)
FETCH(B,C,BSOC)
FETPAK(C,C)
PUSHJ P,PINPLS ;PRINT SOCKET PIN LOC
POP P,C ;RESTORE POINT
POP P,B ;RESTORE BODY
POP P,A ;RESTORE THE PIN #,,BITS
JRST FINTXT
;PINCAL - COMPUTE III POSITIONING FOR START OF TEXT FOR PIN
;A = -# CHARS IN PIN NAME
;C = CHARACTER SIZE TABLE ... DPY/PLT
;T = TYPIN
;TTT = BORI
;RETURNS
;A = X
;TT = Y
PINCAL: ADD C,STDBIG ;CHAR SIZE TABLE FOR STD CHAR
FETCH(T,T,TPPOS) ;GET PIN-POS BITS
PUSH P,T
PUSHJ P,PINORI ;ROTATE PIN-POS BY ORIENTATION IN TTT
IFN =35-POSB,<LSH T,POSB-=35> ;SHIFT TO RIGHT
ANDI T,(1POSW)-1
IMUL A,(C) ;PIN TEXT SIZE IN PTS
XCT PNXTAB(T)
XCT PFXTAB(T) ;FUDGE X A LITTLE, BECAUSE CHAR SPACING IS SO TIGHT
MOVN TT,DPYPTX-DPYPTY(C) ;- HEIGHT OF STD CHAR
XCT PNYTAB(T)
PUSH P,F
MOVE F,TTT ;SAVE ORIENTATION FOR CALL ON ORIENT
LDB TTT,[POINT XOFFW,-1(P),XOFFB] ;UNITS ARE 1 CURSOR STEP
TRNE TTT,1(XOFFW-1)
ORCMI TTT,(1XOFFW)-1
ASH TTT,1 ;MAKE IT DRAWING COORD
SCALE (TTT)
HRLZ T,TTT
LDB TTT,[POINT YOFFW,-1(P),YOFFB]
TRNE TTT,1(YOFFW-1)
ORCMI TTT,(1YOFFW)-1
ASH TTT,1 ;MAKE IT DRAWING COORD
SCALE (TTT)
HRR T,TTT
PUSHJ P,ORIENT ;ROTATE OFFSET
POP P,F ;RESTORE F
HLRE TTT,T
ADD A,TTT
HRRE TTT,T
ADD TT,TTT
POP P,(P)
POPJ P,
;HERE IS A FUDGE SO NUMBER ISN'T ON LINE!
PNXLTL__2 ;+-X
PNXTAB: SETZ A, ;0
ASH A,-1 ;X/2
JFCL ;X
JFCL ;X
JFCL ;X
ASH A,-1 ;X/2
SETZ A, ;0
SETZ A, ;0
PFXTAB: ADDI A,PNXLTL
JFCL
SUBI A,PNXLTL
SUBI A,PNXLTL
SUBI A,PNXLTL
JFCL
ADDI A,PNXLTL
ADDI A,PNXLTL
PNYTAB: SETZ TT, ;0
SETZ TT, ;0
SETZ TT, ;0
ASH TT,-1 ;-Y/2
JFCL ;-Y
JFCL ;-Y
JFCL ;-Y
ASH TT,-1 ;-Y/2
>;MD
;NUMSET, DISNUM, DISDEF, DISNM1, PIDCAL, CONNUM, BODNUM
;NUMSET - SETUP DPY BUFFER FOR CHARACTER MODE
NUMSET: MOVE TTT,[IDPB TTT,BFPTR2]
EXCH TTT,PUTCHR ;SET UP FOR PUTBYT
MOVEM TTT,DSPPSV
DTXSET: MOVSI TTT,(<POINT 7,0,34>)
HRR TTT,BUFPTR
MOVEM TTT,BFPTR2
NUMST1: MOVEI TT,1
MOVEM TT,1(TTT)
HRLZI TT,1(TTT)
HRRI TT,2(TTT)
BLT TT,MAXLIN/5+1(TTT) ;THIS ALLOWS FOR ENOUGH CHARS!
POPJ P,
DISNUM: TLNE DSPOFF
POPJ P,
PUSHJ P,NUMSET
PUSHJ P,PUTDEC
JRST FINTXT
;DISDEF, DISRID
MD,<
;DISDEF - DISPLAYS DEFAULT PIN NAME FROM TYPE
; (AS A BODY PIN FORMAT, NOT SOCKET PIN FORMAT)
;T -- POINTER TO TYPIN BLOCK
;TTT -- ORIENTATION
DISDEF: TLNE DSPOFF
POPJ P,
PUSH P,A
PUSHJ P,PIDCAL ;CALC PIN ID OFFSET
PUSHJ P,ATTFIX
PUSHJ P,NUMSET
PUSHJ P,OUTPID
JRST FNTXTA
OUTPID: PUSH P,T
FETCH(A,T,TPNAM)
PUSHJ P,BPINPN
POP P,T
FETCH(T,T,TPBIT)
DEC,< TRNN T,ASSL!ASSH
JRST STOPTR
PUTBYT "-"
TRNE T,ASSH
PUTBYT "H"
TRNE T,ASSL
PUTBYT "L"
STOPTR:
>;DEC
TRNE T,BUSSED
PUTSTR[ASCIZ\/B\]
POPJ P,
;DISRID - DISPLAY REAL PINID FROM BODY DEF
;T = PINBLOCK(TPIN) FROM TYPE
;TTT=BORI
DISRID: TLNE DSPOFF
POPJ P,
PUSH P,A
PUSH P,C
PUSH P,T
SETZ A,
FETCH(T,T,TPID)
DSRID1: IDIVI T,=10
SUBI A,1
JUMPN T,DSRID1
MOVE T,(P)
MOVEI C,DPYPTX ;CHARS DESTINED FOR DISPLAY
PUSHJ P,PINCAL ;CALC X,Y FOR START OFF TEXT
PUSHJ P,ATTFIX
PUSHJ P,NUMSET
POP P,T
FETCH(T,T,TPID)
PUSHJ P,DISNUM
POP P,C
POP P,A
JRST FINTXT
;PIDCAL - CALCULATE X,Y OFFSET FOR PIN NAME
;T = TPIN BLOCK
;TTT = BORI ??
;RETURNS
;A = X
;TT = Y
PIDCAL: PUSH P,T
PUSH P,TTT
FETCH(A,T,TPNAM)
SETZM CHRCNT
PUSH P,PUTCHR
MOVE T,[AOS CHRCNT]
MOVEM T,PUTCHR
PUSHJ P,BPINPN ;PRINT AS BODY PIN
POP P,PUTCHR
MOVN A,CHRCNT
POP P,TTT ;ORIENTATION
MOVE TT,(P)
FETCH(TT,TT,TPBIT)
TRNE TT,BUSSED
SUBI A,2 ;2 MORE FOR BUSSED THRU
DEC,< TRNE TT,ASSH!ASSL
SUBI A,2 ;2 MORE FOR H OR L
>;DEC
MOVE T,(P) ;T=TYPIN, A=-CHARCT, TTT=BORI
PUSH P,C
MOVEI C,DPYPTX
PUSHJ P,PINCAL ;CALC X,Y OFFSET FOR PIN #
POP P,C
POP P,T ; RETURNS A,TT
POPJ P,
>;MD
;BODNUM - DISPLAY BODY LOC
;E = BODY
BODNUM: TLNE DSPOFF
POPJ P,
PUSHJ P,NUMSET
PUSH P,A
PUSH P,TT
MD,< FETCH(A,E,BBRS)
PUSHJ P,SLTOUT ;PRINTS BAY-RACK-SLOT
FETCH(A,E,BSOC)
>;MD
MPC,< FETCH(A,E,BLN) >
PUSHJ P,LOCOUT ;PRINTS BODY LOC ON CARD
POP P,TT
FNTXTA: POP P,A
FINTXT: MOVE TTT,DSPPSV
MOVEM TTT,PUTCHR
FINDTX: MOVE TTT,BFPTR2
HRRM TTT,BUFPTR
POPJ P,
;E = POINT
CONNUM: TLNE DSPOFF
POPJ P,
PUSHJ P,NUMSET
PUSH P,A
FETCH(A,E,PLOC)
MOVE A,(A)
PUSHJ P,CSLTLP
JRST FNTXTA ;POPS A
;DTXT
;B = POINTER TO BARE TEXT STRING
DTXT: JUMPE B,CPOPJ ;POINT,BODY TEXT
ADD B,[POINT 7,1]
SETZM ALTTFG
CAIA
ALTTXT: SETOM ALTTFG ;ALTER MODE TEXT DPY
TLNE DSPOFF
POPJ P,
SETZM LINCNT ;COUNT LINES HERE
SETZM CHRCNT
PUSHJ P,DTXSET ;SETUP POINTERS ETC.
DTLOP1: TLNN B,760000 ;BYTE POINTER OUT?
JRST [ HRR B,-1(B)
TRNE B,-1
JRST .+1
JRST FINDTX]
ILDB T,B
JUMPE T,DTLOP1
SKIPN ALTTFG ;ALTER MODE
CAME T,EOLCHR ;NO, END OF LINE CHR?
CAIA
JRST DTLOP4 ;YES, END WITHOUT DPY'ING IT
IDPB T,BFPTR2
AOS TT,CHRCNT
CAIGE TT,MAXLIN ;FAKE UP CRLF IF LINE TOO LONG
JRST [ CAME T,EOLCHR ;BUT ALWAYS BREAK ON EOL
JRST DTLOP1
JRST DTLOP4]
MOVE TTT,BFPTR2
PUSHJ P,NUMST1 ;SETUP SOME MORE BUFFER
SKIPN ALTTFG
JRST DTLOP1
DTLOP4: PUSHJ P,FINDTX
SKIPN ALTTFG
JRST DTXCLF
AOS TT,LINCNT
CAIL TT,MAXPAG
POPJ P, ;QUIT IF MAX LINES EXCEEDED
DTXCLF: MOVEI TT,46
MOVE T,SIZ ;CURRENT SIZE
MOVN TTT,DPYPTY(T)
DPB TTT,[POINT 11,TT,21] ;DOWN L.F.
MOVN TTT,DPYPTX(T)
IMUL TTT,CHRCNT
DPB TTT,[POINT 11,TT,10] ;BACK TO LEFT MARGIN
IDPB TT,BUFPTR
SETZM CHRCNT ;NO CHARS IN THIS LINE YET
PUSHJ P,DTXSET
JRST DTLOP1
;STARTP, DSPSET, DSPOUT, UPSET, UPSCAL, UPSIDE
STARTP: TLNN DSPACT
POPJ P,
DPYCLR
NOCMU,<NOGT,<
DPYOUT 0,FBUF
III,< JFCL >
>>
CMU,< PUSH P,T
PUSH P,TT
SETZ T, ;MAKE SURE OUR FOLLOW FLAG IS CORRECT!
TRNE M,CURSOR
TRO T,FOLFLG
MOVEM T,FBFLGS
JSP TT,INATYO ;SET POG 0 PARAMETERS
PG0SET
PASBUF
MOVE TT,[-CMUFBL,,CMUFBF]
MOVE T,(TT)
PUSHJ P,ATYOW
AOBJN TT,.-2
PUSHJ P,DOATYO
>;CMU
NODEC,<
GLISIZ__2 ;2 LINES PER GLITCH IN SCROLLER
PAPPOS__-400 ;USE BOTTOM QUARTER OF SCREEN
NOCMU,< GLTCHS__4 >
CMU,< GLTCHS__<PAPPOS-%BOTTOM>/CHGHT/GLISIZ-1 > ;SQUEEZE AS MANY LINES AS POSSIBLE IN!
DPYPOS PAPPOS
III,< JFCL >
DPYSIZ GLTCHS*1000+GLISIZ
III,< JFCL >
>;NODEC
CMU,< POP P,TT
POP P,T
>;CMU
POPJ P,
NODEC,<
DCLAIM:
DTRY: SETZM TVISOFF
SETZM ISDPY
CMU,< SKIPLE DONTDPY ;LET HIM PRETEND
JRST FAKDPY
>;CMU
SKIPE DONTDPY
JRST DSPSET
NOIII,< SETO T,
GETLIN T
ITS,< TLNE T,420000 ;EITHER "III" OR "DATA DISK" BITS
SETOM TVDPY ;WE ARE ON TV
>;ITS
NOCMU,< TLNN T,400000
JRST DSPSET
>;NOCMU
>;NOIII
III,< DPYADD [DPYBUF] ;NOOP WHICH SKIPS ON DISPLAY
JFCL
MOVE T,40
TRNE T,200
>;III
CMU,< HRRZI TT,(T) ;GET THE TTY NUMBER
TRO TT,200000 ;MAKE SURE THE BIT IS ON
MOVEI T,3001
MOVE TTT,[2,,T]
; TRMOP. TTT,
TRMOP TTT,
HALT .
CAMN TTT,[SIXBIT /GRAPHI/]
FAKDPY:
>;CMU
SETOM ISDPY
NOCMU,< JRST DSPOUT >;START THE WORLD
CMU,< SKIPE ISDPY
PUSHJ P,INIGDP
>;CMU
>;NODEC
;NOW SETUP DSPACT
DSPSET: TLZ DSPACT
SKIPN ISDPY ;CAN IT BE ACTIVE AT ALL
POPJ P,
TLNN M,DSKACT!MACACT
TLO DSPACT ;DISPLAY IS STILL ACTIVE
POPJ P,
ENDDSP: TLNN DSPACT
POPJ P,
PUSHJ P,PUSHIT
; TLNE M,XWINDOW ;ARE WE WINDOWING?
; JRST ENDSP1
SETZM 1(P) ;USE THIS AS A FLAG
MOVE T,CURSE
CAML T,LEFT
CAMLE T,RIGHT
JRST [ AOS 1(P)
HLREM T,XOFF ;SET X OFFSET
JRST .+1]
HRRE T,T
CAML T,BOTTOM
CAMLE T,TOP
JRST [ AOS 1(P)
MOVEM T,YOFF
JRST .+1]
SKIPE 1(P) ;CHANGE X OR Y (OR BOTH)
PUSHJ P,CHANG1 ;YES, RE-CALC THINGS
JRST ENDSP1
DSPOUT: SKIPN ISDPY
POPJ P,
PUSHJ P,PUSHIT
PUSHJ P,DSPSET
PUSHJ P,STARTP
TRO MCHG!NEEDCL ;MAKE SURE IT HAPPENS
SETOM LPNTR ;UPDATE ARROW
SETOM CLOSUP ;UPDATE CLOSES TEXT
ENDSP1: PUSHJ P,FILEUP
PUSHJ P,POPIT
POPJ P,
ITS,<
.TVOFF: SKIPE ISDPY
SKIPE DONTDPY
POPJ P,
SKIPE TVDPY
SKIPE TVISOFF
POPJ P,
TLNE M,DSKACT!MACACT
POPJ P,
SETOM TVISOFF
DPYCLR
POPJ P,
TVMORE: SKIPE ISDPY
SKIPE DONTDPY
POPJ P,
SKIPE TVDPY
TLNE M,DSKACT!MACACT
POPJ P,
TVMOR1: OUTSTR [ASCIZ /-MORE-/]
INCHRW 1(P)
OUTSTR [ASCIZ /
/]
SETZM TVISOFF
JRST DSPOUT
>;ITS
UPSET: SKIPN A,CURSET
POPJ P,
MOVE T,1(A)
PUSHJ P,BIGAIV
MOVEI T,"C"+"C"+1
JRST DCLSET
NOCMU,<
UPLVL: TLNN DSPACT
POPJ P,
HRRZ T,MACPNT
SUBI T,MACPDL-1
IDIVI T,5
NODEC,< MOVEI TTT,LVLWRD
JRST UPONE
>;NODEC
VB10,<
PUSHJ P,UPONE
HRRM TT,LVLWRD
POPJ P,
>;VB10
PGP,<
MOVE TTT,[XWD UPLDAT,LVLWRD]
JRST UPONE
UPLDAT: =103
XWD %LEFT+24*CWIDTH*TITBIG,SCRTOP-TITBIG*CHGHT
>;PGP
GT,< ;;JB
PUSHJ P,UPONE1 ;;JB MAKE LEVEL A GOOD NUMBER.
ANDI TT,77777 ;;JB MAKE IT JUST 15 BITS NOW.
DPB TT,[POINT 7,TT,20] ;;JB CONVERT TO REVERSED 8 BIT FORMAT NOW.
LSH TT,-=7 ;;JB AND MOVE INTO PLACE.
MOVEM TT,GTLWRD ;;JB SAVE IN THE CORRECT SPOT NOW.
JRST SENDHD ;;JB AND SEND OUT THE HEADER NOW.
>;GT ;;JB END OF THIS CODE.
UPSCAL: TLNN DSPACT
POPJ P,
MOVE T,NSCALE
NODEC,< MOVEI TTT,SCLWRD
JRST UPONE
>;NODEC
VB10,<
PUSHJ P,UPONE
HRLM TT,SCLWRD
POPJ P,
>;VB10
PGP,<
MOVE TTT,[XWD SCLDAT,SCLWRD]
JRST UPONE
SCLDAT: =102
XWD %LEFT+14*CWIDTH*TITBIG,SCRTOP-TITBIG*CHGHT
>;PGP
GT,< ;;JB START OF MY SCALING CODE.
PUSHJ P,UPONE1 ;;JB CONVERT SCALE LEVEL TO NUMBER.
ANDI TT,77777 ;;JB CONVERT TO 15 BIT QUANTITY.
DPB TT,[POINT 7,TT,20] ;;JB REVERSE CHARACTERS AND CONVERT TO.
LSH TT,-=7 ;;JB TO 8 BIT FORMAT.
MOVEM TT,GTSWRD ;;JB SAVE IN THE LIST NOW.
JRST SENDHD ;;JB AND SEND OUT THE CHANGE NOW.
>;GT ;;JB
NOGT,< ;;JB DON'T PUT THIS IN IF THERE'S A GT40.
UPONE: PUSHJ P,UPONE1
NOVB10,<
LSH TT,1
PGP,<
UPONE3: TLNN TT,774000
JRST UPONE2
>;PGP
TRO TT,1
JRST PUT
>;NOVB10
VB10,< ADDI TT,404040
POPJ P,
>;VB10
>;NOGT ;;JB .
>;NOCMU
PGP,<
UPONE2: LSH TT,7
JRST UPONE3
>;PGP
UPONE1: IDIVI T,=10
HRLM TT,(P)
SKIPE TT,T
PUSHJ P,UPONE1
HLRZ T,(P)
NOVB10,<
LSH TT,7
ADDI TT,60(T)
>;NOVB10
VB10,<
LSH TT,6
ADDI TT,20(T)
>;VB10
POPJ P,
NOCMU,<
NOGT,< ;;JB NORMAL STUFF.
READY: PUSH P,T
NODEC,< MOVEI T,"*"+"*"+1 >
VB10,< MOVEI T,<BYTE (6) 0,0,0,35,"*",37> >
PGP,< MOVEI T,1 >
JRST SREADY
NREADY: PUSH P,T
NODEC,< MOVEI T,12 >
VB10,< MOVEI T,<BYTE (6) 0,0,0,35,"-",37> >
PGP,< SETZ T, >
SREADY: TLNN DSPACT
JRST XREADY
III,< MOVEM T,REDWRD
DPYOUT 0,FBUF
JFCL
>;III
NODEC,<
NOIII,<
PGSEL 0
MOVEM T,REDWRD
ITS,< SKIPN TVDPY >
UPGMVM T,REDWRD
>;NOIII
>;NODEC
VB10,< HRRM T,REDWRD >
PGP,< MOVEM T,REDWRD ;SAVE READYNESS STATE BIT
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT RDYPRG],[PLIT REDWRD]>) ;SEND TO PGP
PUSHJ P,CHCINT ;MAKE IT HAPPEN
PUSHJ P,POPALL ;RESTORE ACS
>;PGP
XREADY: POP P,T
POPJ P,
PGP,< ERDYP-.-1
RDYPRG: ASCIZ !BEGIN
ON HCA
'205'=$0;
END,
END!
1
ERDYP__.
STORAGE(IMPURE)
1
REDWRD: 0
STORAGE(PURE)
>;PGP
>;NOGT ;;JB END OF THEIR STUFF.
GT,< ;;NOW DEFHNE MY STUFF.
READY: PUSH P,[RDYCJ] ;;JB PUSH THE "READY" COMMAND CHAR ON THE STACK.
XREADY: EXCH T,0(P) ;;JB PICK UP THE DESIRED CHARACTER.
CAMN T,JBREDY ;;JB ALREADY IN THAT MODE?
JRST JBXRDY ;;JB IN CORRECT MODE. EXIT NOW.
TLNE DSPACT ;;JB DISPLAY ACTIVE?
IONEOU T ;;JB YES. SEND OUT THE CHARACTER NOW.
MOVEM T,JBREDY ;;JB SAVE THE STATE OF THE DISPLAY NOW.
JBXRDY: POP P,T ;;JB RESTORE THE REGISTER NOW.
POPJ P, ;;JB EXIT.
NREADY: PUSH P,[NRDYCJ] ;;JB GET THE NOT READY COMMAND NOW.
JRST XREADY ;;JB AND LOOP INTO THE MAIN CODE.
>;GT ;;JB END OF THIS CRAP.
>;NOCMU
MPC,<
UPSIDE: MOVEI T,TITBRT ;BRIGHTNESS
MOVEI TT,TITBIG ;SIZE
MOVE TTT,[%LEFT+400,,SCRTOP-CHGHT*TITBIG*2];X,Y
PUSHJ P,TITVCT
TLNE SID,FRONT ;WHICH SIDE ARE WE ON
SKIPA T,[ASCID/Compo/]
MOVE T,[ASCID/Solde/]
IDPB T,BUFPTR
TLNE SID,FRONT
SKIPA T,[ASCID/nent/]
MOVE T,[ASCID/r/]
TRNE M,FLIP
IORI T,""+""
IDPB T,BUFPTR
PUSHJ P,UPLOC
CHKVAL: TLO DSPOFF
TRNE M,FLIP
JUMPGE SID,CPOPJ
TRNN M,FLIP
JUMPL SID,CPOPJ
MOVEI T,TITBRT
MOVEI TT,TITBIG
MOVE TTT,[%LEFT+600,,SCRTOP-CHGHT*TITBIG*2]
PUSHJ P,TITVCT
MOVE T,[ASCID/Text /]
IDPB T,BUFPTR
MOVE T,[ASCID/Inval/]
IDPB T,BUFPTR
MOVE T,[ASCID/id/]
IDPB T,BUFPTR
POPJ P,
>;MPC
UPLOC: SKIPN CRDLOC ;ANY CARD LOC?
MPC,< POPJ P, > ;NO, CHECK FOR VALID TEXT
MD,< JRST UPMOD >
MOVEI T,TITBRT
MOVEI TT,TITBIG
MOVE TTT,[%LEFT,,SCRTOP-CHGHT*TITBIG*2]
PUSHJ P,TITVCT
PUSHJ P,NUMSET
PUSH P,A
HLRZ A,CRDLOC
PUSHJ P,SLTOUT
POP P,A
PUSHJ P,FINTXT
TLO DSPOFF
MD,<
UPMOD: SKIPN TVARIABLE
SKIPE TPREFIX
JRST UPMOD1
SKIPN TMODULE
SKIPE TREV
JRST UPMOD1
>;MD
POPJ P,
MD,<
UPMOD1: MOVEI T,TITBRT
MOVEI TT,TITBIG
MOVE TTT,[%RIGHT-TITBIG*CWIDTH*=21,,SCRTOP-TITBIG*CHGHT]
PUSHJ P,TITVCT
SKIPN B,TMODULE
JRST UPVARI
PUSHJ P,DTXT
MOVEI T,"-"
IDPB T,TTT
HRRM TTT,BUFPTR
UPVARI: SKIPN B,TVARIABLE
JRST UPPREF
PUSHJ P,DTXT
MOVEI T,"-"
IDPB T,TTT
HRRM TTT,BUFPTR
UPPREF: SKIPN B,TPREFIX
JRST UPREV
PUSHJ P,DTXT
UPREV: MOVEI T,40*2+1
IDPB T,BUFPTR
SKIPE B,TREV
PUSHJ P,DTXT
TLO DSPOFF
POPJ P,
>;MD
IFN UMLSW!LAYSW,<
MPC,<
DUPIN: MOVEI T,TITBRT
MOVEI TT,TITBIG
MOVE TTT,[%LEFT+1100,,SCRTOP-TITBIG*CHGHT*2]
PUSHJ P,TITVCT
MOVE T,UPINS
PUSHJ P,DISNUM
PUTSTR [ASCIZ/ "WILD"/]
TLO DSPOFF
POPJ P,
>;MPC
>;IFN UMLSW!LAYSW
MD,<
;E = POINT
OFFCLD: MOVEI T,TITBRT
MOVEI TT,TITBIG
MOVE TTT,[%LEFT+600,,SCRTOP-CHGHT*TITBIG*2]
PUSHJ P,TITVCT
PUSHJ P,TITCON
PUSHJ P,CONNUM
TLO DSPOFF ;NOW WE ARE OFF FOR SURE
POPJ P,
>;MD
IFN UMLSW!LAYSW,<
OFFERD: MOVEI T,TITBRT
MOVEI TT,TITBIG
MOVE TTT,[%LEFT+200,,SCRTOP-CHGHT*TITBIG*2]
PUSHJ P,TITVCT
MOVE T,E ;# OF ERRORS
SETZ TTT,
OFFER1: IDIVI T,=10
ADDI TT,60
IOR TTT,TT
ROT TTT,-7
JUMPN T,OFFER1
TRO TTT,1
IDPB TTT,BUFPTR
MOVE TT,[ASCID/ _??/]
IDPB TT,BUFPTR
TLO DSPOFF ;NOW WE ARE OFF FOR SURE
POPJ P,
>;UMLSW!LAYSW
;GETPOS, SETPOS, UPCURS
;THIS IS ONLY CALLED ONCE FROM COMMAND LOOP FOR BULLSEYE CURSOR MOVING
GETPOS: TLNN DSPACT
JRST [ MOVE T,CURSE
POPJ P,]
NOIII,<
NODEC,<
NOCMU,<
PGSEL 0
UPGMVE T,SAVWRD
MOVEM T,SAVWRD
>;NOCMU
>;NODEC
DEC,<
VB10,<
NOVIROS,<MOVE T,CURCUR >
VIROS,< PUSHJ P,RDLPEN >
>;VB10
NOVB10,<PUSHJ P,RDLPEN >
>;DEC
CMU,< PUSH P,TT
JSP TT,INATYO
GETCUR
GET2REGS
PUSHJ P,DOATYO
GETPS7: PUSHJ P,ATYIB
GETPS8: CAIE TT,22
JRST GETPS7
PUSHJ P,ATYIB
CAIE TT,2
JRST GETPS8
PUSHJ P,ATYIB
MOVEM TT,CHKSUM
HRLZI T,(TT)
PUSHJ P,ATYIB
ADDM TT,CHKSUM
DPB TT,[POINT 8,T,9]
PUSHJ P,ATYIB
ADDM TT,CHKSUM
DPB TT,[POINT 8,T,35]
PUSHJ P,ATYIB
ADDM TT,CHKSUM
DPB TT,[POINT 8,T,27]
PUSHJ P,ATYIB ;GET THE CHECKSUM
ADD TT,CHKSUM
ADDI TT,22+2 ;ADD THE HEADER IN
TRNE TT,377 ;MAKE SURE WE GOT A 0 CHECKSUM
HALT .
TLNE T,100000 ;SIGN EXTEND THE ANSWERS
TLO T,600000
TRNE T,100000
TRO T,600000
POP P,TT
>;CMU
CAMN T,CURCUR
JRST [ MOVE T,POSS1
POPJ P,]
MOVEM T,CURCUR
PUSH P,TT
PUSH P,TTT
PUSHJ P,GETSET
JRST ISPOS
>;NOIII
;SETPOS - MOVE CURSOR TO X,,Y
;T = NEW X,Y
;CHECKS FOR SCREEN EDGE
;CURSOR LOCATIONS
;CURSE - INTERNAL COORDS
;POSS1 - INTERNAL COORDS, CLIPPED TO WINDOW EDGE
;CURCUR - III DISPLAY COORDS
SETPOS: PUSH P,TT
PUSH P,TTT
MPC,<
MOVEM T,CURSE
HRRE T,CURSE
IDIV T,STPSIZ
ASH T,-1
IMUL T,STPSIZ
ASH T,1
HLRE TT,CURSE
ASH TT,-1
IDIV TT,STPSIZ
ASH TT,1
IMUL TT,STPSIZ
HRL T,TT
>;MPC
ISPOS:
MD,< TDZ T,[1,,1] >
MOVEM T,CURSE
TLNN DSPACT
JRST [ MOVSI T,400000
MOVEM T,POSS1 ;INVALIDATE THESE
NOCMU,< SETOM CURCUR >
CMU,< MOVEM T,CURCUR >
JRST ISSET]
SETZM EDGE ;MUST WIN THIS MANY TIMES
MOVEI TTT,1
HLLZ TT,T
CAMLE TT,RIGHT
MOVE TT,RIGHT
CAMGE TT,LEFT
MOVE TT,LEFT
HLLM TT,POSS1
HLRE TT,TT
SUB TT,XOFF
MPC,< TRNE M,FLIP
MOVN TT,TT
>;MPC
SCALE (TT)
NOCMU,< DPB TT,[POINT 11,TTT,10] >
CMU,< HRLZ TTT,TT >
HRRE T,T
CAMLE T,TOP
MOVE T,TOP
CAMGE T,BOTTOM
MOVE T,BOTTOM
HRRM T,POSS1
SUB T,YOFF
SCALE (T)
NOCMU,< DPB T,[POINT 11,TTT,21] >
CMU,< HRR TTT,T >
MOVEM TTT,CURCUR
MOVE T,POSS1
CAMN T,CURSE ;DID WE HIT EDGE?
JRST ISSET ;NO
SETOM EDGE ;WENT OFF EDGE
TLNN M,DSKACT!MACACT!XWINDOW
MOVEM T,CURSE ;STORE TRUNCATED CURSOR POS IF TTY INPUT AND WINDOW
ISSET: POP P,TTT
POP P,TT
TRNE M,CURSOR
JRST SNDCUR ;IF LIGHT PEN TRACKING, SEND CURSOR POS
POPJ P,
;PUT CURSOR ONTO GRID, CONVERT TO INTERNAL COORDS
;T = III LOCATION ON SCREEN
;RETURNS
;T = X*2,,Y*2 - INTERNAL COORD FORM
GETSET:
NOCMU,< MOVE TT,T
ASH TT,=11-=36
>;NOCMU
CMU,< HLRE TT,T >
UNSCAL (TT)
MPC,< TRNE M,FLIP
MOVN TT,TT
IDIV TT,STPSIZ
ASH TT,-1
IMUL TT,STPSIZ
ASH TT,1
>;MPC
ADD TT,XOFF
NOCMU,< LSH T,=11
ASH T,=11-=36
>;NOCMU
CMU,< HRRE T,T >
UNSCAL (T)
MPC,< MOVE TTT,TT
IDIV T,STPSIZ
ASH T,-1
IMUL T,STPSIZ
ASH T,1
>;MPC
ADD T,YOFF
MPC,< HRL T,TTT >
MD,< HRL T,TT >
TDZ T,[(1)1]
POPJ P,
;UPDATE CURSOR ON SCREEN
NOGT,< ;;JB MAJOR ELIMINATION OF CODE.
UPCURS: TLNN DSPACT
POPJ P,
MOVE T,CURSE
CAME T,POSS1 ;IS CURCUR VALID
PUSHJ P,SETPOS ;NO, MAKE IT VALID
SNDCUR:
STAN,< MOVE TT,CURCUR ;WHERE SHOULD IT BE
MOVEI TTT,SAVWRD
JRST PUT
>;STAN
ITS,< MOVE TT,CURCUR ;WHERE SHOULD IT BE
MOVEI TTT,SAVWRD
JRST PUT
>;ITS
III,< MOVE TT,CURCUR
TRZ TT,177
TRO TT,146
MOVEM TT,SAVWR1
MOVEM TT,SAVWR2
MOVEM TT,SAVWR3
MOVEM TT,SAVWR4
MOVEM TT,SAVWR5
DPYOUT 0,FBUF
JFCL
POPJ P,
>;III
VB10,<
MOVE TTT,CURCUR ;WHERE SHOULD IT BE
MOVEM TTT,SAVWR2
PUSHJ P,MAKWRD
CAMN TTT,SAVWRD
POPJ P,
MOVEM TTT,SAVWRD
SKIPE TT,FV1SAV
PUSHJ P,FOLOW4
SKIPE TT,FV2SAV
PUSHJ P,FOLOW5
POPJ P,
>;VB10
PGP,< MOVE TT,CURCUR ;GET POS OF CURSOR
TLNE DSPACT ;DISPLAYING?
CAMN TT,SAVWRD ;YES, CURSOR MOVED?
POPJ P, ;NO
MOVEM TT,SAVWRD ;YES, SAVE NEW POS
PUSHJ P,TXYSET ;SET UP XY COORDS
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT CURPRG],[PLIT TSXDAT]>) ;SEND CURSOR XY TO PGP
XRTN: PUSHJ P,CHCINT ;MAKE IT HAPPEN
PUSHJ P,POPALL ;RESTORE ACS
POPJ P,
ECURPG-.-1
CURPRG: ASCIZ !BEGIN
ON HCA
TSX=$0;
TSY=$1;
XY[2,6,8]=TSXY;
Y[3]=TSY;
X[4]=TSX;
END,
END!
2
ECURPG__.
TXYSET: LDB TTT,[POINT 11,TT,10] ;GET COORD X
TRNE TTT,2000 ;SIGN EXTEND
ORCMI TTT,1777
MOVEM TTT,TSXDAT ;SAVE FOR PGP
LDB TTT,[POINT 11,TT,21] ;REPEAT FOR Y
TRNE TTT,2000
ORCMI TTT,1777
MOVEM TTT,TSYDAT
POPJ P,
>;PGP
CMU,<
PUSH P,TT
PUSH P,TTT
JSP TT,INATYO
SETCUR
PASREGS
HLRE T,CURCUR
PUSHJ P,ATYOW
HRRE T,CURCUR
PUSHJ P,ATYOW
PUSHJ P,DOATYO
POP P,TTT
POP P,TT
POPJ P,
>;CMU
;CURBRT, CLRCLC, SETCLC, CURSOFF, CURSON, FOLOW1, FOLOW2, CLEAR1, CLEAR2
NOCMU,<
CURBRT: ANDI T,7
NODEC,<
LSH T,=11
MOVEI TT,46(T)
MOVEI TTT,FBRT
JRST PUT
>;NODEC
VB10,<
MOVEI TT,160010(T)
MOVEM TT,FBRT
POPJ P,
>;VB10
PGP,<
CAMN T,FBRT ;ANY CHANGE?
POPJ P, ;NO
MOVEM T,FBRT ;YES, SAVE VALUE
PUSHJ P,MAKBRI ;SCALE BRIGHTNESS TO PGP CAPABILITY
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT FBRPRG],[PLIT PGPBRI]>) ;SET CURSOR BRIGHTNESS
JRST XRTN ;MAKE IT HAPPEN
EFBPG-.-1
FBRPRG: ASCIZ !BEGIN
ON HCA
I[2,3,4,9,10]=$0;
END,
END!
1
EFBPG__.
STORAGE(IMPURE)
1
FBRT: 5
1
%CLOC: 1
STORAGE(PURE)
>;PGP
;CLOCATE CROSS
CLRCLC:
NODEC,< SKIPA TT,[XWD ONOFF,20] >
VB10,< SKIPA TT,[XWD ONOFF-1,0] >
PGP,< TDZA TT,TT >
SETCLC:
NODEC,<
MOVEI TT,12
MOVEI TTT,%CLOC
JRST PUT
>;NODEC
VB10,<
MOVSI TT,%CLOC+1
HLLM TT,%CLOC
POPJ P,
>;VB10
PGP,<
MOVEI TT,1 ;UNBLANK CLOCATE
CAMN TT,%CLOC ;ALREADY IN DESIRED STATE?
POPJ P, ;YES
MOVEM TT,%CLOC ;NO, SAVE STATE
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT CLCPRG],[PLIT %CLOC]>) ;SET STATE OF CLOCATE
JRST XRTN ;MAKE IT HAPPEN
ECLCPG-.-1
CLCPRG: ASCIZ !BEGIN
ON HCA
'301'=$0;
END,
END!
1
ECLCPG__.
>;PGP
CURSOFF:TRZN M,CURSOR
POPJ P,
NODEC,<
MOVE TT,[XWD CROSS,20]
MOVEI TTT,ONOFF
JRST PUT
>;NODEC
VB10,<
NOVIROS,<
MOVE TT,[XWD 400000,CROSS]
MOVEM TT,ONOFF
>;NOVIROS
POPJ P,
>;VB10
PGP,< SETZM ONOFF
CURSO1: PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT COFPRG],[PLIT ONOFF]>) ;TURN ON CROSS
JRST XRTN ;MAKE IT HAPPEN
ECOFPG-.-1
COFPRG: ASCIZ !BEGIN
ON HCA
TSA=$0;
'110'=1-$0;
END,
END!
1
ECOFPG__.
STORAGE(IMPURE)
1
ONOFF: 0
STORAGE(PURE)
>;PGP
CURSON: TROE M,CURSOR
POPJ P,
NODEC,<
MOVEI TT,12
MOVEI TTT,ONOFF
JRST PUT
>;NODEC
VB10,<
NOVIROS,<
MOVEI TT,ONOFF+1
MOVEM TT,ONOFF
>;NOVIROS
POPJ P,
>;VB10
PGP,< AOS ONOFF
JRST CURSO1
>;PGP
FOLOW2: MOVEI TT,106
PUSHJ P,VECT
VB10,<
JRST CLEAR2
MOVEM TT,FV2SAV
FOLOW5: PUSH P,TT
PUSHJ P,CLEAR2+1
FOLOW3: POP P,TT
TLNN DSPACT
POPJ P,
SETOM VBSIZE
SETOM VBBRIT
SETZM VBMODE
HRLI TTT,222200
MOVEM TTT,COMPTR
HRRZM TTT,COMCTR
PUSHJ P,PUSHIT
MOVE A,SAVWRD
TRZ A,776000
HRRZM A,VBX
HLRZS A
ANDI A,1777
MOVEM A,VBY
MOVE A,SAVWR2
TRZ A,37777
TRO A,140
PUSHJ P,DISPN2
MOVE A,TT
PUSHJ P,DISPNT
PUSHJ P,POPIT
POPJ P,
FV1SAV: 0
FV2SAV: 0
>;VB10
PGP,<
JRST CLEAR2 ;OFF SCREEN, FLUSH
TLNE DSPACT ;DISPLAYING?
CAMN TT,FVECT2 ;YES, ANY CHANGE?
POPJ P, ;NO
MOVEM TT,FVECT2 ;YES, SAVE NEW DATA
PUSHJ P,TXYSET ;EXTRACT XY
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT FV2PRG],[PLIT TSXDAT]>) ;SET XY
JRST XRTN ;MAKE IT HAPPEN
CHCINT: RTNCAL (HCINT) ;MAKE IT HAPPEN
POPJ P,
EFV2PG-.-1
FV2PRG: ASCIZ !BEGIN
ON HCA
'114'=1;
[7]='114'\1\;
[8]='114'\2\;
X[7]=$0;
Y[7]=$1;
XY[8]=TSXY;
END,
END!
2
EFV2PG__.
>;PGP
CLEAR2:
NODEC,< MOVEI TT,12 > ;OFF SCREEN, DO CLEAR
VB10,< SETZM FV2SAV >
NOPGP,< MOVEI TTT,FVECT2
JRST PUT
>;NOPGP
PGP,<
TLNE DSPACT ;DISPLAYING?
SKIPN FVECT2 ;YES, ANY CHANGE?
POPJ P, ;NO
SETZM FVECT2 ;YES, SAVE STATE
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT CV2PRG],[PLIT NULARG]>) ;TURN OFF FOLLOW LINE
JRST XRTN ;MAKE IT HAPPEN
ECV2PG-.-1
CV2PRG: ASCIZ !BEGIN
ON HCA
'114'=0;
[7]='114'\1\;
[8]='114'\2\;
END,
END!
0
ECV2PG__.
>;PGP
FOLOW1: MOVEI TT,106
PUSHJ P,VECT
VB10,<
JRST CLEAR1
MOVEM TT,FV1SAV
FOLOW4: PUSH P,TT
PUSHJ P,CLEAR1+1
JRST FOLOW3
>;VB10
PGP,<
JRST CLEAR1 ;OFF SCREEN, FLUSH
TLNE DSPACT ;DISPLAYING?
CAMN TT,FVECT1 ;YES, ANY CHANGE?
POPJ P, ;NO
MOVEM TT,FVECT1 ;YES, SAVE NEW DATA
PUSHJ P,TXYSET ;EXTRACT XY
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT FV1PRG],[PLIT TSXDAT]>) ;SET XY
JRST XRTN ;MAKE IT HAPPEN
EFV1PG-.-1
FV1PRG: ASCIZ !BEGIN
ON HCA
'113'=1;
[5]='113'\1\;
[6]='113'\2\;
X[5]=$0;
Y[5]=$1;
XY[6]=TSXY;
END,
END!
2
EFV1PG__.
>;PGP
CLEAR1:
NODEC,< MOVEI TT,12 >
VB10,< SETZM FV1SAV >
NOPGP,< MOVEI TTT,FVECT1 >
PGP,<
TLNE DSPACT ;DISPLAYING?
SKIPN FVECT1 ;YES, ANY CHANGE?
POPJ P, ;NO
SETZM FVECT1 ;YES, SAVE STATE
PUSHJ P,PUSHAL ;SAVE ACS
RTNCAL (INTERA,<[PLIT CV1PRG],[PLIT NULARG]>) ;TURN OFF FOLLOW LINE
JRST XRTN ;MAKE IT HAPPEN
ECV1PG-.-1
CV1PRG: ASCIZ !BEGIN
ON HCA
'113'=0;
[5]='113'\1\;
[6]='113'\2\;
END,
END!
0
ECV1PG__.
>;PGP
PUT:
NODEC,<
TLNE DSPACT
CAMN TT,(TTT)
POPJ P,
NOIII,< PGSEL 0
UPGMVM TT,(TTT)
>;NOIII
>;NODEC
VB10,<
MOVE TT,[XWD 400000,400000]
MOVEM TT,4(TTT)
MOVEM TT,3(TTT)
MOVEM TT,2(TTT)
MOVEM TT,1(TTT)
>;VB10
PGP,< TLNE DSPACT ;DISPLAYING?
CAMN TT,(TTT) ;YES, ANY CHANGE?
POPJ P, ;NO
>;PGP
MOVEM TT,(TTT)
III,<; DPYOUT 0,FBUF
JFCL
>;III
PGP,<
PUT1: PUSHJ P,PUSHAL ;SAVE ACS
MOVEM TTT,TSXDAT ;SAVE PTR TO DATA
JRA TTT,.+1
MOVEM TTT,OUTBLK ;SEGMENT TO FLUSH
RTNCAL (INTERA,<[PLIT PUTPRG],[PLIT [PLIT OUTBLK]]>) ;FLUSH THE OLD COPY
PUSHJ P,CHCINT ;DO IT
MOVE TTT,OUTBLK ;CALC SEG NUMBER
ADDI TTT,=100
MOVEM TTT,TSYDAT
HLRZ TT,TSXDAT
HLRE B,1(TT) ;GET REFPT
HRRE C,1(TT)
RTNCAL (REFPT,<B,C>)
MOVEI T,TITBRT ;SET PARAMETERS
PUSHJ P,MAKBRI
SETZM PGPBRI+1
SETZM PGPBRI+2
RTNCAL (PARAMS,[PLIT PGPBRI])
RTNCAL (ROSEG,TSYDAT) ;OPEN IT
MOVE A,TSXDAT
HRL A,OUTBLK
PUSHJ P,DRWDEM
RTNCAL (CSEG,TSYDAT) ;CLOSE IT
RTNCAL (ENDPIC) ;FORCE OUTPUT
PUSHJ P,POPALL ;RESTORE ACS
>;PGP
POPJ P,
PGP,< EPUTPG-.-1
PUTPRG: ASCIZ !BEGIN
ON HCA
$$0=OUT;
END,
END!
1
EPUTPG__.
STORAGE(IMPURE)
2
OUTBLK: 0
-1
STORAGE(PURE)
>;PGP
>;NOGT ;;JB END OF THE ELIMINATION.
>;NOCMU
;;JB ************************************ ALL CODE FROM HERE ON IS JB'ERS.
GT,<
UPCURS: TLNN DSPACT ;DISPLAY ACTIVE?
POPJ P, ;NO. LEAVE US.
MOVE T,CURSE ;GET THE CURSOR POSITION OW.
CAME T,POSS1 ;IS CURCUR VALID?
PUSHJ P,SETPOS ;NO. UPDATE CURCUR.
SNDCUR: MOVE TT,CURCUR ;OK. NOW GET THE CURSOR AS AN III INSTRUCTION.
PUSHJ P,BRKTT ;BREAK IT UP INTO XWD X,Y
CAMN TT,JBCUR ;SAME AS BEFORE?
POPJ P, ;YES! EXIT NOW.
MOVEM TT,JBCUR ;NO. SAVE IT AWAY FOR POSTERITY.
BMODS 1,1,2 ;PREPARE TO MODIFY BLOCK 1 (THE CURSOR).
PUSH P,TT ;SAVE THE X NOW.
PUSH P,TT ;AND THE Y.
HLRZM TT,-1(P) ;WHOOPS. WRONG SIDE NOW.
BMODF ;LIST SET UP. SEND OUT CHANGE NOW.
SKIPE TT,FV1SAV ;HEY. ARE WE FOLLOWING?
PUSHJ P,FOL1A ;YES. FOLLOW 1.
SKIPE TT,FV2SAV ;HEY. ARE WE FOLLOWING TWO?
PUSHJ P,FOL2A ;YES. FOLLOW IT.
POPJ P, ;ELSE RETURN NOW.
; MISCELLANEOUS DATA.
STORAGE(IMPURE)
JBCUR: 0 ;CURRENT CURSOR POSITION.
FV1SAV: 0 ;CURRENT FOLLOW POSITION 1
FV2SAV: 0 ;CURRENT FOLLOW 2 POSITION.
STCHPS: 0 ;STACK UPDATE VALUE.
STORAGE(PURE)
CLRCLC: TLNN DSPACT
POPJ P,
STOPIC 5 ;STOP V & H LINE BY NOT DISPLAYING
POPJ P, ;THE APPROPRIATE SUBPICTURE.
SETCLC: TLNN DSPACT
POPJ P,
STAPIC 5 ;DISPLAY THEM BY DISPLAYING THE SUBPICTURE.
POPJ P,
CURSOF: TRZN M,CURSOR
POPJ P,
STOPIC(2)
STAPIC(12)
MOVEI 16,NLPXY
JRST STLPXY
CURSON: TROE M,CURSOR
POPJ P,
CURSN1: STOPIC(12)
STAPIC(2)
MOVEI 16,LPXY ;POINTER TO X,Y POS TABLE FOR CURSOR
JRST STLPXY ;SEND TO GT40
CURBRT: TLNN DSPACT
POPJ P,
ANDI T,7 ;SET CURRENT CURSOR BRIGHTNESS.
BMODS 1,0,3 ;MODIFY COMMAND WORD AND X,Y
LSH T,7 ;SHIFT TO CRRECT SPOT NOW.
ADDI T,116000 ;CREATE A GOOD ABSOLUTE LONG POINT INSTRUCTION.
PUSH P,T ;PLACE THE ITEM ON THE STACK NOW.
HLRZ T,JBCUR
PUSH P,T ;PUSH X
PUSH P,JBCUR ;PUSH Y
BMODF ;AND SEND IT OUT.
POPJ P,
; THIS ROUTINE CONTROLS THE FOLLOWING OF THE CURSOR (TWO LINES).
CLEAR1: TLNN DSPACT
POPJ P,
STOPIC 6 ;STOP SHOWING SUBPICTURE 6 NOW.
SETZM FV1SAV ;CLEAR THEFLAG NOW.
POPJ P, ;RETURN TO THE CALLER.
FOLOW1: TLNN DSPACT
POPJ P,
MOVEI TT,106 ;MAKE IT ABSOLUTE LONG VECTOR.
PUSHJ P,VECT ;CREAT IT NOW.
JRST CLEAR1 ;IF NOT THERE, CLEAR IT OUT.
PUSHJ P,BRKTT ;BREAK UP TT NOW.
MOVEM TT,FV1SAV ;AND SAVE IT AWAY NOW.
FOL1A: BMODS 6,3,2 ;MODIFY SUBPICTURE 6, FOR TWO WORDS.
HLLO TT,FV1SAV ;PICK UP THE DESIRED LOCATION NOW.
SUB TT,JBCUR ;SUBTRACT OFF OUR CURSOR POSITION.
PUSH P,TT ;PLACE ON THE STACK (NOT REALLY).
TLZ TT,756000 ;CHOP OFF CRAP NOW.
TLO TT,40000 ;MAKE VISIBLE.
TLNN TT,20000 ;NEGATIVE?
JRST .+3 ;NAW.
TLC TT,1777 ;YES. NEGATE IT NOW.
ADDI TT,1
HLRZM TT,0(P) ;AND PLACE ON THE STACK.
HRRZ TT,FV1SAV ;PICK UP THE Y NOW.
SUB TT,JBCUR ;KNOCK OFF THE CURSOR NOW.
ANDI TT,21777 ;JUST LEAVE SIGN AND MAGNITUDE.
TRNN TT,20000 ;NEGATIVE?
JRST .+3 ;NOPE.
TRC TT,1777 ;YES. NEGATE IT.
ADDI TT,1 ;THIS WAY TO PRESERVE THE BITS.
PUSH P,TT ;SAVE IT ONE THE STACK NOW.
BMODF ;AND SEND OUT THE CHANGE NOW.
STAPIC 6 ;AND DISPLAY IT NOW.
POPJ P, ;AND RETURN TO THE CALLER.
CLEAR2: TLNN DSPACT
POPJ P,
STOPIC 7 ;STOP SHOWING SUBPICTURE 7 NOW.
SETZM FV2SAV ;CLEAR THE FLAG NOW.
POPJ P, ;RETURN TO THE CALLER.
FOLOW2: TLNN DSPACT
POPJ P,
MOVEI TT,106 ;MAKE IT ABSOLUTE LONG VECTOR.
PUSHJ P,VECT ;CREAT IT NOW.
JRST CLEAR2 ;IF NOT THERE, CLEAR IT OUT.
PUSHJ P,BRKTT ;BREAK UP TT NOW.
MOVEM TT,FV2SAV ;AND SAVE IT AWAY NOW.
FOL2A: BMODS 7,3,2 ;MODIFY SUBPICTURE 7, FOR TWO WORDS.
HLLO TT,FV2SAV ;PICK UP THE DESIRED LOCATION NOW.
SUB TT,JBCUR ;SUBTRACT OFF OUR CURSOR POSITION.
PUSH P,TT ;PLACE ON THE STACK (NOT REALLY).
TLZ TT,756000 ;CHOP OFF CRAP NOW.
TLO TT,40000 ;MAKE VISIBLE.
TLNN TT,20000 ;NEGATIVE?
JRST .+3 ;NAW.
TLC TT,1777 ;YES. NEGATE IT NOW.
ADDI TT,1
HLRZM TT,0(P) ;AND PLACE ON THE STACK.
HRRZ TT,FV2SAV ;PICK UP THE Y NOW.
SUB TT,JBCUR ;KNOCK OFF THE CURSOR NOW.
ANDI TT,21777 ;JUST LEAVE SIGN AND MAGNITUDE.
TRNN TT,20000 ;NEGATIVE?
JRST .+3 ;NOPE.
TRC TT,1777 ;YES. NEGATE IT.
ADDI TT,1 ;THIS WAY TO PRESERVE THE BITS.
PUSH P,TT ;SAVE IT ONE THE STACK NOW.
BMODF ;AND SEND OUT THE CHANGE NOW.
STAPIC 7 ;AND DISPLAY THE SUBPICTURE NOW.
POPJ P, ;AND RETURN TO THE CALLER.
; THIS ROUTINE WILL BREAK UP THE III LONG VECTOR
; IN "TT" INTO (XWD X,Y).
BRKTT: ROT TT,=11 ;GET X INTO LOW ORDER BITS.
DPB TT,[POINT 11,TT,28] ;PLACE THEM INTO 18-28.
ROT TT,=11 ;NOW MOVE INTO 7-17.
AND TT,[1777,,1777]
ADD TT,[GTX,,GTY]
AND TT,[XWD 1777,1777] ;AND CHOP OFF STRAY BITS.
POPJ P, ;AND RETURN TO THE CALLER NOW.
; FILE UPDATER.
NOLAST: TLNN DSPACT
POPJ P,
MOVE T,[POINT 7,NAMBUF] ;PICK UP POINTER TO FILE NAME.
MOVEM T,TMP1 ;SAVE IT AWAY NOW.
MOVEM TTT,TMP2 ;SAVE TTT FOR A SECOND.
MOVEI TTT,GTFNAM ;PICK UP THE POINTER TO OUR NAME NOW.
MOVEI T,=25 ;25 CHARACTERS LONG.
NOLAS1: ILDB TT,TMP1 ;GET A CHARACTER.
JUMPGE TTT,NOLAS2 ;PLACE IN RIGHT HALF OF GT40 WORD.
LSH TT,=8 ;PLACE IN LEFT HALF.
IORM TT,0(TTT) ;PLACE COMPLETED WORD IN MEMORY.
AOJA TTT,NOLAS3 ;UPDATE THE POINTER NOW.
NOLAS2: MOVEM TT,0(TTT) ;PLACE THE 8 BITS IN RIGHT OF MEMORY NOW.
NOLAS3: TLC TTT,400000 ;FLIP THE SIGN BIT NOW.
SOJG T,NOLAS1 ;LOOP BACK AND GET THE NEXT ITEM.
JRST SENDHD ;AND WHEN DONE, SEND OUT CHANGES TO THE HEADING.
; SPECIAL DISPLAY SUBPICTURE TABLES.
; 1=CURSOR
; 2=BULLSEYE CURSOR
; 3=HEADING
; 4=UNUSED
; 5=HORIZONTAL AND VERTICAL LINES THROUGH CURSOR.
; 6=FOLLOW 1 CODE.
; 7=FOLLOW 2 CODE.
; 10=POSITIONING FOR LINES THROUGH LETTERS.
; 11=MAIN ROUTINEFOR LINES WHICH CALLS #10.
; 12=CROSS CURSOR
;PLEASE NOTE!!!!!!!!!! CALLS BETWEEN SUB-PICTURES ARE BY SUB-PICTURE #
; THESE ARE CONVERTED TO BLOCK #S BY TRANS8.
JBTABL: XWD -PIC1Z,PIC1
XWD -PIC2Z,PIC2
XWD -PIC3Z,PIC3
XWD -PIC4Z,PIC4
XWD -PIC5Z,PIC5
XWD -PIC6Z,PIC6
XWD -PIC7Z,PIC7
XWD -PIC10Z,PIC10
XWD -PIC11Z,PIC11
XWD -PIC12Z,PIC12
0 ;0= END OF LIST.
LPXY: 1 ;SUBPICTURE 1
JBCURX-PIC1 ;OFFSET INTO BLOCK
1 ;SAME FOR Y
JBCURY-PIC1
NLPXY: 0
0
0
0
STORAGE(IMPURE)
PIC1: 117124 ;PICTURE 1=CURSOR POSITIONING.
JBCURX: GTX
JBCURY: GTY ; BOTH THE X ANY ARE CHANGED.
DISTOP
0
PIC1Z__.-PIC1
XWD 1,0 ;DEFINE AS SUBPICUTRE 1, NO SHOW.
DEFINE CP(SX,X,SY,Y)
< IFIDN<SX><-><20000+>X*1000+IFIDN<SY><-><100+>Y*4+40000
>
DEFINE BULLSEYE
< <CP (+,0,+,1)>-40000 ;FOO, LOSING GT40
CP +,0,-,1 ;START WITH POINT AT CENTER
CP +,0,+,2
CP +,2,-,2
CP -,2,-,2
CP -,2,+,2
CP -,2,+,0
CP +,1,+,3
CP +,3,+,1
CP +,3,-,1
CP +,1,-,3
CP -,1,-,3
CP -,3,-,1
CP -,3,+,1
CP -,3,+,3
CP +,0,+,3
CP +,1,+,2
CP +,2,+,1
CP +,3,+,0
CP +,3,+,0
CP +,2,-,1
CP +,1,-,2
CP +,0,-,3
CP +,0,-,3
CP -,1,-,2
CP -,2,-,1
CP -,3,+,0
CP -,3,+,0
CP -,2,+,1
CP -,1,+,2
>
PIC2: DISTOP ;THE X ON THE CURSOR.
1 ;CALL 1 TO POSITION THE CURSOR.
130160 ;RELATIVE POINT MODE, ENB LP, NO BLINK
BULLSEYE ;ONCE WITH LP AND NOT BLINK
DISTOP
1 ;REPOSITION TO CURSOR
130130 ;NOW BLINK, BUT NO LP
BULLSEYE
130120 ;LP AND BLINK OFF
DISTOP ;END
0
PIC2Z__.-PIC2
XWD 2,0
PIC4: DISTOP ;PIC4 NO LONGER USED.
0
PIC4Z__.-PIC4
XWD 4,0 ;DO NOT SHOW IT.
PIC5: DISTOP ;5 IS THE BIG LINES THROUGH CURSOR.
1 ;GET THE POSITION NOW.
110127 ;LONG RELATIVE VECTOR MODE.
241777 ;TO RIGHT
0
221777 ;BACK LEFT TO CENTER (INV)
1777 ;BUT UP TO TOP.
240000 ;NOW DOWN VIS TO CENTER
21777
240000 ;KEEP GOING NOW.
21777
221777 ;NOW TO LEFT X, NO Y.
1777
241777 ;BACK TOCENTER VISIBLE.
0
DISTOP ;ENDOF THE PCITURE NOW.
0
PIC5Z__.-PIC5
XWD 5,-1 ;DEFINE AND SHOWIT NOW.
PIC6: DISTOP ;CALL SUBPICTURE 1
1 ;TO POSITION THE CURSOR NOW!
110124 ;THE FOLLOW 1 LONG VECTOR COMMANDS.
0
0
DISTOP
0
PIC6Z__.-PIC6
XWD 6,0 ;DO NOT INITALLY SHOW IT.
PIC7: DISTOP ;CALL SUBPICTURE 1 [CURSOR] NOW.
1
110124 ;GET INTO LONG VECTOR MODE.
0 ;DEL X AND DEL Y GOHERE.
0
DISTOP
0
PIC7Z__.-PIC7
XWD 7,0 ;SAME AS FOR 6.
PIC10: 117124 ;THIS CENTERS ON THE LETTER IN QUESTION.
0 ;X AND Y INSERTED
0
DISTOP
0
PIC10Z__.-PIC10
XWD 10,0
PIC11: DISTOP ;CROSS HAIRS FOR GOING THROUGH LETTERS.
10 ;CALL SUBPICTURE 10
110126
241777
0
221777
1777
240000
21777
240000
21777
221777
1777
241777
0
DISTOP
0
PIC11Z__.-PIC11
XWD 11,0 ;DO NOT SHOWIT INITIALLY.
PIC12: DISTOP
1 ;CALL CURSOR X,Y
104124 ;NOW DRAW CROSS
42010
22110
62110
00020
44120
DISTOP
0
PIC12Z__.-PIC12
XWD 12,-1
STORAGE(PURE)
>;GT END OF THE BIGGY IN "DISP"
;;JB RESUMING NORMAL COMMENTS FROM THIS POINT ON.
;SEGWN0, SEGWN1, SEGWIN
;SEGMENT WINDOWING
SEGWN0: PUSH P,G
MOVEI G,0
JRST SEGWIN
SEGWN1: PUSH P,G
MOVEI G,1
SEGWIN: PUSH P,F
MOVE TTT,@XDISP1(G) ;ON SCREEN POINT
MOVE T,@YDISP1(G)
SUB TTT,@XGO1(G) ;- OFF SCREEN POINT
SUB T,@YGO1(G)
MOVEI F,0 ;0 DOWN LEFT
JUMPGE T,.+2
ADDI F,1 ;+1 UP
JUMPGE TTT,.+2
ADDI F,2 ;+2 RIGHT
MOVE TT,@YGO1(G) ;OFF Y
XCT TBTAB1(F) ;0,2 BELOW BOTTOM - 1,3 ABOVE TOP
SKIPN T ;CROSSES, IS IT HORZ?
JRST TRYLR ;CAN'T CROSS VERTICALLY
MOVE TT,@YDISP1(G) ;ON Y
XCT TBTAB1(F) ;OTHER SIDE OF SCREEN EDGE?
JRST TRYLR ;NO, MAYBE LEFT AND RIGHT
SUB TT,TBTAB(F) ;DIST TO EDGE
MOVN TT,TT
IMUL TT,TTT ;MULT BY X DIF
IDIV TT,T ;DIV BY Y DIF
ADD TT,@XDISP1(G)
CAIGE TT,%RIGHT ;INTERSECT ON SCREEN?
CAMG TT,[%LEFT]
JRST TRYLR ;NO
LSH TT,=36-=11 ;PUT X IN POSITION
MOVE T,TBTAB(F)
DPB T,[POINT 11,TT,21]
JRST LWIN1
TRYLR: MOVE TT,@XGO1(G) ;OFF X
XCT LRTAB1(F) ;0,1 OFF LEFT - 2,3 OFF RIGHT
CAMN TT,@XDISP1(G) ;CROSSES, IS IT VERT.
JRST LWLOSE ;LOSE
MOVE TT,@XDISP1(G) ;ON X
XCT LRTAB1(F) ;OTHER SIDE OF SCREEN EDGE?
JRST LWLOSE ;NO COMPLETELY OFF
SUB TT,LRTAB(F) ;DIST TO EDGE
MOVN TT,TT
IMUL TT,T ;MULT BY Y DIF
MOVE TTT,@XDISP1(G) ;ON SCREEN POINT
SUB TTT,@XGO1(G) ;- OFF SCREEN POINT
IDIV TT,TTT ;DIV BY X DIF
ADD TT,@YDISP1(G)
CAIGE TT,%TOP
CAMG TT,[%BOTTOM] ;INTERSECT ON SCREEN?
JRST LWLOSE ;NO
MOVE T,LRTAB(F)
LSH TT,=36-=11-=11
DPB T,[POINT 11,TT,10]
LWIN1: POP P,F
POP P,G
JRST CPOPJ1
LWLOSE: POP P,F
POP P,G
POPJ P,
;TABLES FOR SEGWIN
XGO1: XGO
XDISP1: XDISP
XGO
YGO1: YGO
YDISP1: YDISP
YGO
LRTAB: %LEFT+1
%LEFT+1
%RIGHT-1
%RIGHT-1
LRTAB1: CAMG TT,[%LEFT]
CAMG TT,[%LEFT]
CAIL TT,%RIGHT
CAIL TT,%RIGHT
TBTAB: %BOTTOM+1
%TOP-1
%BOTTOM+1
%TOP-1
TBTAB1: CAMG TT,[%BOTTOM] ;DO WE GET THROUGH TOP OR BOTTOM FROM E TO A?
CAIL TT,%TOP
CAMG TT,[%BOTTOM]
CAIL TT,%TOP
;UPDATE FILENAME FROM NAMBUF
NOCMU,<
NOGT,< ;;JB
NOLAST:
NODEC,<
TLNN DSPACT
POPJ P,
III,< HRRZS (P) > ;USE STACK AS FLAG
NOIII,< PGSEL 0 >
MOVSI T,-NFWRDS
FILUP1: MOVE TT,NAMBUF(T)
CAME TT,FILWRD(T) ;SAVE A SYSTEM CALL!
NOIII,< UPGMVM TT,FILWRD(T) >
III,< HRROS (P) > ;FLAG DIFFERENCE
MOVEM TT,FILWRD(T)
AOBJN T,FILUP1
III,< SKIPGE (P)
DPYOUT 0,FBUF
JFCL
>;III
POPJ P,
>;NODEC
VB10,<
MOVE T,[POINT 7,NAMBUF]
MOVEM T,TMP1
MOVE T,[POINT 6,FILWRD]
MOVEM T,TMP2
MOVEI T,=25
NOLAS1: ILDB TT,TMP1
SKIPN TT
MOVEI TT,35
CAIE TT,"["
CAIN TT,"]"
JRST [PUSH P,TT
MOVEI TT,36
IDPB TT,TMP2
POP P,TT
CAIN TT,"["
MOVEI TT,53
CAIN TT,"]"
MOVEI TT,54
IDPB TT,TMP2
NOLAS3: MOVEI TT,35
JRST NOLAS2]
NOLAS2: IDPB TT,TMP2
SOJG T,NOLAS1
MOVE TT,TMP2
CAME TT,[POINT 6,FILWRD+4,29]
JRST NOLAS3
POPJ P,
>;VB10
PGP,< TLNN DSPACT ;DISPLAYING?
POPJ P, ;NO
MOVSI T,-NFWRDS ;CHECK FOR CHANGES
MOVE TT,NAMBUF(T)
CAME TT,FILWRD(T)
JRST NOLAS1 ;FOUND A CHANGE
AOBJN T,.-3
POPJ P, ;NO CHANGES, WIN
NOLAS1: MOVE T,[XWD NAMBUF,FILWRD] ;REMEMBER DATA
BLT T,FILWRD+NFWRDS-1
MOVE TTT,[XWD NLSDAT,FILWRD]
JRST PUT1
NLSDAT: =104
XWD %LEFT+31*CWIDTH*TITBIG,SCRTOP-CHGHT*TITBIG
>;PGP
;UPDATE MODE
PMODE:
NOPGP,< TLNN DSPACT
POPJ P,
MOVE T,MODE
MOVE T,DMODE(T)
NODEC,<
CAMN T,MODWRD
POPJ P,
NOIII,< PGSEL 0
UPGMVM T,MODWRD
>;NOIII
MOVEM T,MODWRD
III,< DPYOUT 0,FBUF
JFCL
>;III
>;NODEC
VB10,<
LSH T,-=10
TLZ T,77601
ADDI T,7200(T)
LSH T,=11
TLNN T,7700
TLO T,3500
HLRM T,MODWRD
>;VB10
POPJ P,
>;NOPGP
PGP,< MOVE TT,MODE ;GET MODE CHRS
MOVE TT,DMODE(TT)
MOVE TTT,[XWD PMDDAT,MODWRD]
JRST PUT
PMDDAT: =101
XWD %LEFT+5*CWIDTH*TITBIG,SCRTOP-CHGHT*TITBIG
>;PGP
>;NOGT ;;JB
GT,< ;;JB
PMODE: TLNN DSPACT ;;JB DISPLAY ACTIVE?
POPJ P, ;;JB RETURN NOW.
MOVE T,MODE ;;JB PICK UP THE MODE NOW.
MOVE T,DMODE(T) ;;JB PICK UP THE CHARACTERS NOW.
ROT T,7 ;;JB MOVE IN THE FIRST CHARACTER NOW.
DPB T,[POINT 7,T,14] ;;JB STICK IN RIGHT AFTER THE SECOND ONE.
ROT T,=15 ;;JB MOVE IN THE 15 BITS NOW.
ANDI T,77777 ;;JB AND MAKE SURE IT'S JUST FIFTEEN.
MOVEM T,GTMODE ;;JB AND SAVE IN OUR LIST NOW.
JRST SENDHD ;;JB SEND OUT THE HEADING NOW.
>;GT ;;JB
>;NOCMU
;MUST BE 2 OR LESS CHARS
STORAGE(IMPURE)
DMODE: ASCID/S/ ;SET MODE
ASCID/B/ ;BODY MODE
ASCID/P/ ;POINT MODE
ASCID/L/ ;LINE MODE
ASCID/T/ ;TEXT MODE
ASCID/PA/ ;ALTER TEXT (POINT SUBMODE)
ASCID/MA/ ;MACRO ALTER MODE
SPMODT: ASCID/SP/ ;SPECIAL POINTER MODE (FIXED UP BY INDIVIDUAL PIECES OF CODE)
MD,< ASCID/BT/ ;BODY TEXT MODE
ASCID/BA/ ;BODY TEXT ALTER MODE
ASCID/E/ ;EDIT MODE
ASCID/EI/ ;EDIT INSERT MODE
ASCID/ET/ ;EDIT TEXT MODE
ASCID/EP/ ;EDIT PIN MODE
ASCID/EG/ ;EDIT GET MODE
ASCID/EA/ ;EDIT ALTER MODE
>;MD
REPEAT NUMODES+<DMODE-.>,<ASCID/?/>
STORAGE(PURE)