mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-07 03:15:54 +00:00
438 lines
11 KiB
Plaintext
438 lines
11 KiB
Plaintext
TITLE WHODPY - DPY interface for WHO
|
||
|
||
SEARCH WHOMAC
|
||
|
||
$SETUP (WHODPY)
|
||
|
||
Comment |
|
||
|
||
This module contains all the interfaces to OToole's DPYPAK that
|
||
WHO uses. It handles all display related functions.
|
||
|
||
|
|
||
; TABLE OF CONTENTS FOR WHODPY
|
||
;
|
||
;
|
||
; SECTION PAGE
|
||
; 1. DPINI - Initialize display................................ 3
|
||
; 2. DPSLP
|
||
; 2.1 DPY sleep routine................................. 4
|
||
; 2.2 Command processor routines........................ 5
|
||
; 3. Subroutines
|
||
; 3.1 IXCT - Execute routine for each 'I'............... 7
|
||
; 4. DPXIT - DPY user exit..................................... 8
|
||
; 5. DPLIN - Initialize per display output..................... 9
|
||
; 6. DPROL - Roll the screen n lines........................... 10
|
||
; 7. DPCLR - CLean up at the end of a display cycle............ 11
|
||
; 8. DPCHR - Output a character to DPYPAK...................... 12
|
||
; 9. Storage................................................... 13
|
||
SUBTTL DPINI - Initialize display
|
||
|
||
DPINI:: SKPYES S.DPY## ;SEE IF /DPY
|
||
POPJ P, ;NO--JUST RETURN
|
||
PUSHJ P,DP.SAC
|
||
MOVE T1,[ASCII/VT52 /];AS GOOD AS ANY TO TRY
|
||
MOVEM T1,DP.TRM
|
||
MOVEI 16,[-2,,0
|
||
[7]
|
||
DP.TRM]+1
|
||
PUSHJ P,DPYINI##
|
||
CAMN 0,[-1]
|
||
$FATAL (TNS,<Terminal type not supported for /DPY>)
|
||
PUSHJ P,DPYZAP##
|
||
PUSHJ P,DP.RAC
|
||
MOVE T1,[POINT 7,DP.BUF]
|
||
MOVEM T1,DP.PTR
|
||
SETZM DP.LIN
|
||
SETZM DP.OLN
|
||
SETZM DP.LLN
|
||
SETZM DP.SLN
|
||
SETZM DP.NUM
|
||
TRO F,FR.DPY ;FLAG DPY IS INITED
|
||
PJRST OPNDPY## ;AND OPEN TERMINAL W/O ECHO
|
||
SUBTTL DPSLP -- DPY sleep routine
|
||
|
||
DPSLP:: PUSHJ P,.SAVE2## ;SAVE P2
|
||
MOVE P1,T1 ;SAVE SLEEP TIME
|
||
DPSL.1: CAIG P1,^D60 ;MORE THAN 60 SECONDS?
|
||
SKIPA T1,P1 ;NO--SLEEP FOR WHAT WE GOT
|
||
MOVEI T1,^D60 ;YES--SLEEP FOR MAX
|
||
IMULI T1,^D1000 ;FIXUP FOR HIBER (MS)
|
||
TXO T1,HB.RTC ;WAKE ON CHARACTER INPUT
|
||
HIBER T1, ;GO SLEEP
|
||
$FATAL (HUF,<HIBER UUO failure>)
|
||
DPSL.4: INCHRS T1 ;GET A CHAR
|
||
JRST DPSL.2 ;NOTHING
|
||
CAIL T1,"0" ;NUMBER?
|
||
CAILE T1,"9" ;..
|
||
JRST DPSL.A ;NO
|
||
MOVE T2,DP.NUM ;GET NUMBER
|
||
IMULI T2,^D10 ;SHIFT OVER
|
||
ADDI T2,-"0"(T1) ;ADD IN DIGIT
|
||
MOVEM T2,DP.NUM ;STORE IT
|
||
JRST DPSL.4 ;AND TRY FOR NEXT CHAR
|
||
DPSL.A: CAIL T1,"a" ;SEE IF LOWER CASE
|
||
CAILE T1,"z" ;..
|
||
CAIA ;NO
|
||
SUBI T1,"a"-"A" ;YES--CONVERT
|
||
MOVSI T2,-CMDLEN ;LENGTH OF RUNTIME COMMANDS
|
||
DPSL.3: LDB T3,[POINT 7,CMDTAB(T2),6];GET A CHAR
|
||
CAIE T1,(T3) ;MATCH?
|
||
AOBJN T2,DPSL.3 ;NO--LOOP FOR ALL
|
||
MOVE T1,CMDTAB(T2) ;GET BITS
|
||
MOVEI T3,0 ;GET A ZERO
|
||
EXCH T3,DP.NUM ;CLEAR COUNTER,,MOVE INTO T3
|
||
PUSHJ P,(T1) ;CALL ROUTINE
|
||
JRST DPSL.4 ;AND TRY FOR ANOTHER CMD
|
||
DPSL.2: SUBI P1,^D60 ;MINUS WHAT WE DID
|
||
JUMPG P1,DPSL.1 ;LOOP IF MORE
|
||
POPJ P, ;AND RETURN
|
||
|
||
DEFINE XX(CHAR,DISP),<EXP <CHAR>B6!DISP>
|
||
|
||
CMDTAB: XX "R",C.REFRESH
|
||
XX "I",C.INCREMENTAL
|
||
XX "A",C.SIZE
|
||
XX "C",C.CHANNEL
|
||
XX "D",C.DDBS
|
||
XX "P",C.PERFORMACE
|
||
XX "O",C.ORIGIN
|
||
XX "M",C.MAP
|
||
XX "H",C.HELP
|
||
XX "E",C.EXIT
|
||
XX "S",C.SLEEP
|
||
XX "B",C.BATCH
|
||
XX .CHCNZ,C.EXIT
|
||
XX .CHCNC,C.EXIT
|
||
XX "+",C.ADD
|
||
XX "-",C.SUB
|
||
XX " ",.POPJ##
|
||
CMDLEN==.-CMDTAB
|
||
XX "?",C.ERROR ;**MUST BE LAST OUTSIDE CMDLEN**
|
||
SUBTTL DPSLP -- Command processor routines
|
||
|
||
C.EXIT: PUSHJ P,DPXIT
|
||
EXIT 1,
|
||
PJRST DPCON
|
||
|
||
C.INCR: MOVEI T1,1 ;GET A BIT
|
||
XORM T1,S.INCREMENTAL## ;TOGGLE IT
|
||
POPJ P, ;AND RETURN
|
||
|
||
C.PERF: MOVEI T1,[MOVEI T1,1
|
||
XORM T1,.FZPRF##(I)
|
||
POPJ P,]
|
||
PJRST IXCT
|
||
|
||
C.MAP: MOVEI T1,[MOVEI T1,1
|
||
XORM T1,.FZMAP##(I)
|
||
POPJ P,]
|
||
PJRST IXCT
|
||
|
||
|
||
C.SLEEP:JUMPE T3,C.SLOW ;ZERO IS SPECIAL CASE
|
||
MOVEM T3,S.REPEAT## ;STORE REPEAT TIME
|
||
POPJ P, ;AND RETURN
|
||
|
||
C.SLOW: MOVEI T1,[MOVE T1,.FZFMT##(I)
|
||
CAIN T1,%SLOW## ;SLOW?
|
||
SKIPA T1,[%NORMAL##];YES--MAKE NORMAL
|
||
MOVEI T1,%SLOW## ;NO--MAKE SLOW
|
||
MOVEM T1,.FZFMT##(I);SAVE
|
||
PJRST SETFM##]
|
||
PJRST IXCT
|
||
|
||
C.ADD: CAIN T3,0 ;SEE IF DEFAULT
|
||
SKIPA T1,MAXL## ;YES--FIX UP
|
||
MOVEI T1,(T3) ;NO--COPY INTO T1
|
||
PUSHJ P,DPROL ;ROLL THE SCREEN
|
||
ADDM T1,DP.SLN ;ADD SCROLLING LINES
|
||
POPJ P, ;AND RETURN
|
||
|
||
C.SUB: CAIN T3,0 ;SEE IF DEFAULT
|
||
MOVE T3,MAXL## ;YES--FIX UP
|
||
CAMLE T3,DP.SLN ;SEE IF SCROLLING MORE THAN WE GOT
|
||
SKIPA T1,DP.SLN ;YES--GET SCROLL WHAT WE HAVE
|
||
MOVEI T1,(T3) ;NO--SCROLL IT ALL
|
||
MOVNS T1 ;INDICATE UP
|
||
PUSHJ P,DPROL ;ROLL THE SCREEN
|
||
MOVE T1,DP.SLN ;GET CURRENT SCROLL
|
||
SUB T1,T3 ;MINUS WHAT WE DID
|
||
CAIGE T1,0 ;SEE IF .LT. 0
|
||
MOVEI T1,0 ;YES--MAKE 0
|
||
MOVEM T1,DP.SLN ;SAVE NEW SCROLL WINDOW
|
||
POPJ P, ;AND RETURN
|
||
|
||
C.BATCH:MOVX T3,IFMBATCH## ;GET THE BIT FOR BATCH
|
||
JRST CTOG
|
||
|
||
C.CHAN: JUMPE T3,CHAN.1
|
||
MOVEM T3,S.COLUMN##
|
||
PUSHJ P,DP.SAC
|
||
PUSHJ P,DPYZAP##
|
||
PUSHJ P,DP.SAC
|
||
POPJ P,
|
||
|
||
CHAN.1: SKIPA T3,[IFMCHANNEL##] ;GET THE BIT FOR CHANNEL
|
||
C.SIZE: MOVX T3,IFMSIZE## ;GET THE BIT FOR SIZE
|
||
JRST CTOG
|
||
|
||
C.DDBS: SKIPA T3,[IFMDDBS##] ;GET BIT FOR DDBS
|
||
C.ORIGI: MOVX T3,IFMORIGIN## ;GET THE BIT FOR ORIGIN
|
||
CTOG: MOVEI T1,[IORM T3,.FZINM##(I)
|
||
XORM T3,.FZINF##(I)
|
||
POPJ P,]
|
||
PJRST IXCT
|
||
|
||
C.REFRESH:
|
||
PUSHJ P,DP.SAC
|
||
PUSHJ P,DPYREF##
|
||
PJRST DP.RAC
|
||
|
||
C.ERROR:OUTCHR [.CHBEL]
|
||
POPJ P,
|
||
|
||
C.HELP: MOVE T1,MAXS## ;DPYPAK SAYS THIS IS BIG ENOUGH
|
||
PUSHJ P,M$GMEM## ;ALLOCATE THE CORE
|
||
POPJ P, ;ERROR--NO HELP!
|
||
MOVEM T2,DP.COR ;STORE
|
||
PUSHJ P,DP.SAC ;SAVE THE ACS
|
||
MOVEI 16,[-1,,0
|
||
@DP.COR]+1
|
||
PUSHJ P,DPYSAV## ;SAVE THE CURRENT SCREEN
|
||
PUSHJ P,DPYZAP## ;CLEAR IT OUT
|
||
OUTSTR HELTXT ;OUTPUT THE HELP
|
||
MOVEI T1,^D60*^D1000 ;LET HIM READ
|
||
TXO T1,HB.RTC ;OR TYPE AHEAD IF IMPATIENT
|
||
HIBER T1, ;ZZZ
|
||
JRST E$$HUF ;FAILED?
|
||
INCHRS T1 ;EAT HIS CHAR IF HE TYPED ONE
|
||
JFCL ;GUESS HE WAITED 60 SECONDS
|
||
PUSHJ P,DPYZAP## ;START CLEAN AGAIN
|
||
MOVEI 16,[-1,,0
|
||
@DP.COR]+1
|
||
PUSHJ P,DPYRST## ;MAKE THE SCREEN COME BACK
|
||
PUSHJ P,DP.RAC ;RESTORE ACS
|
||
MOVE T1,MAXS## ;SIZE OF BLOCK
|
||
MOVE T2,DP.COR ;ADDRESS
|
||
PUSHJ P,M$RMEM## ;DEALLOCATE IT
|
||
HALT
|
||
POPJ P, ;AND RETURN
|
||
|
||
DEFINE TEXT(STR),<
|
||
XLIST
|
||
ASCIZ |STR|
|
||
LIST
|
||
>
|
||
|
||
HELTXT: TEXT <
|
||
Type one of the following characters
|
||
|
||
space Update screen now
|
||
nn+ Scroll display up n lines (default=1 display page)
|
||
nn- Scroll display down n lines (default=1 display page)
|
||
A Toggle access table display (implies DDB display also)
|
||
C Toggle channel display
|
||
nnC Set screen display to n columns
|
||
D Toggle DDB display
|
||
E Exit now
|
||
H Help text
|
||
I Toggle incremental vs total statistics
|
||
M Toggle mapping to alternate mode
|
||
O Toggle program origin display
|
||
P Toggle performance display
|
||
R Refresh the screen now
|
||
S Toggle normal/slow format display mode
|
||
nnS Set sleep time to n seconds
|
||
|
||
Wait 60 seconds or type any character to proceed
|
||
>
|
||
SUBTTL Subroutines -- IXCT - Execute routine for each 'I'
|
||
|
||
IXCT: PUSHJ P,.SAVE1## ;SAVE P1
|
||
MOVEI P1,(T1) ;COPY ROUTINE ADDRESS
|
||
PUSHJ P,S$FIRST## ;POSITION TO FIRST SCAN SPEC
|
||
IXCT.L: PUSHJ P,(P1) ;CALL ROUTINE
|
||
PUSHJ P,S$NEXT## ;POSITION TO NEXT SCAN SPEC
|
||
POPJ P, ;ALL DONE
|
||
JRST IXCT.L ;AND LOOP
|
||
SUBTTL DPXIT - DPY user exit
|
||
|
||
DPXIT:: SKIPG S.DPY## ;SEE IF /DPY
|
||
POPJ P, ;NO--JUST RETURN
|
||
OUTCHR [.CHCRT] ;<CR> TO RESET SCNSERS CHAR POSITION
|
||
MOVE T1,MAXL## ;GET MAX LINE
|
||
TLNE F,(FL.WATCH) ;ANY WATCH BITS?
|
||
SUBI T1,2 ;YES--TWO LESS LINES
|
||
MOVEM T1,DP.ARG ;STORE
|
||
PUSHJ P,DP.SAC ;SAVE THE AC'S
|
||
MOVEI 16,[-4,,0
|
||
[^D1]
|
||
DP.ARG
|
||
[^D80]
|
||
MAXL##]+1
|
||
PUSHJ P,DPYCSC## ;CLEAR SECTION
|
||
MOVE T1,MAXL## ;GET MAX LINE
|
||
SUBI T1,1 ;A LITTLE LESS (EXIT 1, DOES CRLF)
|
||
MOVE F,DP.AC ;RESTORE F
|
||
TLNE F,(FL.WATCH) ;WATCH ON?
|
||
SUBI T1,1 ;YES--COMPENSATE FOR ANOTHER LINE
|
||
MOVEM T1,DP.ARG
|
||
MOVEI 16,[-3,,0
|
||
[-1]
|
||
[^D1]
|
||
DP.ARG]+1
|
||
PUSHJ P,DPYCHR##
|
||
PUSHJ P,DPYXIT## ;RESET TERMINAL PARAMETERS
|
||
TRZ F,FR.DPY ;DPY IS OVER
|
||
PJRST DP.RAC ;RESTORE AC'S AND RETURN
|
||
|
||
DPCON:: SKIPG S.DPY##
|
||
POPJ P,
|
||
TRO F,FR.DPY ;DPY IS BACK!
|
||
PUSHJ P,DP.SAC
|
||
PUSHJ P,DPYTTY##
|
||
PUSHJ P,DPYREF##
|
||
PJRST DP.RAC
|
||
SUBTTL DPLIN - Initialize per display output
|
||
|
||
DPLIN:: SKPYES S.DPY## ;SEE IF /DPY
|
||
POPJ P, ;NO--JUST RETURN
|
||
SETZM DP.LIN ;START WITH LINE 0
|
||
SETZM DP.OLN ;AND NO LINES OUTPUT
|
||
MOVEI T1,DPCHR ;POINT TO SCANS CHARACTER LISTER
|
||
MOVEM T1,.TOUTZ## ;STORE
|
||
POPJ P, ;RETURN
|
||
SUBTTL DPROL - Roll the screen n lines
|
||
|
||
DPROL: JUMPE T1,.POPJ##
|
||
PUSHJ P,DP.SAC
|
||
MOVEM T1,DP.ROL
|
||
MOVEI 16,[-1,,0
|
||
DP.ROL]+1
|
||
PUSHJ P,DPYROL##
|
||
PUSHJ P,DP.RAC
|
||
POPJ P,
|
||
SUBTTL DPCLR - CLean up at the end of a display cycle
|
||
|
||
DPCLR:: SKPYES S.DPY## ;SEE IF /DPY
|
||
POPJ P, ;NO--RETURN
|
||
MOVE T1,DP.OLN ;GET LINES OUTPUT THIS PASS
|
||
PUSH P,T1 ;SAVE IT
|
||
CAMGE T1,DP.LLN ;MORE THAN LAST?
|
||
PUSHJ P,LINCLR ;NO--CLEAR THE REST
|
||
POP P,DP.LLN ;AND SAVE FOR NEXT PASS
|
||
POPJ P, ;AND RETURN
|
||
|
||
LINCLR: PUSHJ P,DP.SAC ;SAVE THE ACS
|
||
LINC.1: AOS T1,DP.OLN ;COUNT LINES
|
||
CAMLE T1,DP.LLN ;ALL LINES CLEAR?
|
||
PJRST DP.RAC ;YES--RESTORES ACS AND CONTINUE
|
||
PUSHJ P,FNDLIN ;CONVERT TO DPYPAK LINE/COLUMN
|
||
PJRST DP.RAC ;OUT OF RANGE
|
||
MOVEM T1,DP.AG1 ;SAVE LINE
|
||
MOVEM T2,DP.AG2 ;STARTING COLUMN
|
||
MOVEM T3,DP.AG3 ;ENDING COLUMN
|
||
MOVEI 16,[-4,,0
|
||
DP.AG2
|
||
DP.AG1
|
||
DP.AG3
|
||
DP.AG1]+1
|
||
PUSHJ P,DPYCSC## ;CLEAR SECTION
|
||
JRST LINC.1 ;AND LOOP
|
||
SUBTTL DPCHR - Output a character to DPYPAK
|
||
|
||
DPCHR:: CAIN T1,.CHCRT ;<CR>?
|
||
POPJ P, ;YES
|
||
CAIN T1,.CHLFD ;<LF>?
|
||
JRST DP.CH1 ;YES
|
||
IDPB T1,DP.PTR ;STORE CHAR
|
||
POPJ P, ;AND RETURN
|
||
|
||
DP.CH1: PUSHJ P,.SAVT4## ;SAVE T1-T4
|
||
AOS T1,DP.LIN ;GET CURRENT LINE
|
||
PUSHJ P,FNDLIN ;GET DPYPAK LINE
|
||
JRST DP.CH2 ;LINE OUT OF RANGE
|
||
MOVEM T1,DP.AG1 ;SAVE LINE
|
||
MOVEM T2,DP.AG2 ;STARTING COLUMN
|
||
MOVEM T3,DP.AG3 ;ENDING COLUMN
|
||
MOVE T4,DP.LIN ;GET CURRENT LINE
|
||
MOVEM T4,DP.OLN ;SAVE AS LAST OUTPUT
|
||
REPEAT 0,<
|
||
MOVE T1,DP.LIN ;GET LINE
|
||
IDIVI T1,7
|
||
MOVE T1,[0
|
||
CA.BLD
|
||
CA.UDS!CA.NAB
|
||
CA.BNK
|
||
CA.RVD!CA.NAB
|
||
CA.BLD!CA.UDS
|
||
CA.BNK!CA.RVD
|
||
CA.BNK!CA.RVD!CA.UDS](T2)
|
||
>
|
||
MOVEI T1,0
|
||
MOVEM T1,DP.ATR
|
||
PUSHJ P,DP.SAC
|
||
MOVEI 16,[-6,,0
|
||
DP.BUF
|
||
DP.AG2
|
||
DP.AG1
|
||
DP.AG3
|
||
DP.AG1
|
||
DP.ATR]+1
|
||
PUSHJ P,DPYRSC##
|
||
PUSHJ P,DP.RAC
|
||
DP.CH2: MOVE T1,[POINT 7,DP.BUF]
|
||
MOVEM T1,DP.PTR
|
||
SETZM DP.BUF
|
||
MOVE T1,[DP.BUF,,DP.BUF+1]
|
||
BLT T1,DP.BUF+^D30
|
||
POPJ P,
|
||
|
||
DP.SAC: MOVEM 0,DP.AC
|
||
MOVE 0,[1,,DP.AC+1]
|
||
BLT 0,DP.AC+16
|
||
POPJ P,
|
||
|
||
DP.RAC: MOVE 0,[DP.AC+1,,1]
|
||
BLT 0,16
|
||
MOVE 0,DP.AC
|
||
POPJ P,
|
||
|
||
FNDLIN: SUBI T1,1 ;DPYPAK STARTS WITH LINE 1
|
||
SUB T1,DP.SLN ;MINUS SCROLL LINE
|
||
IDIV T1,MAXL## ;MODULE SCREEN SIZE
|
||
EXCH T1,T2 ;FLIP
|
||
CAIL T1,0 ;LINE WITHIN RANGE?
|
||
CAML T1,MAXL## ;..
|
||
POPJ P, ;NO--NON SKIP
|
||
MOVE T3,MAXC## ;TERMINAL WIDTH
|
||
IDIV T3,S.COLUMN## ;NUMBER OF COLUMNS DESIRED
|
||
IMULI T2,(T3) ;COMPUTE LEFTMOST COLUMN
|
||
ADDI T2,1 ;..
|
||
ADDI T3,(T2) ;FORM RIGHTMOST COLUMN
|
||
SUBI T3,2 ;ALLOW A LITTLE LESS
|
||
AOJA T1,.POPJ1## ;BUMP LINE NUMBER AND RETURN
|
||
SUBTTL Storage
|
||
|
||
$LOW
|
||
|
||
DP.PTR: BLOCK 1
|
||
DP.LIN: BLOCK 1
|
||
DP.LLN: BLOCK 1
|
||
DP.SLN: BLOCK 1
|
||
DP.OLN: BLOCK 1
|
||
DP.NUM: BLOCK 1
|
||
DP.ROL: BLOCK 1
|
||
DP.BUF: BLOCK ^D30+1
|
||
DP.AC: BLOCK 20
|
||
DP.TRM: BLOCK 1
|
||
DP.ARG: BLOCK 1
|
||
DP.AG1: BLOCK 1
|
||
DP.AG2: BLOCK 1
|
||
DP.AG3: BLOCK 1
|
||
DP.ATR: BLOCK 1
|
||
DP.COR: BLOCK 1
|
||
|
||
END
|