Trailing-Edge
-
PDP-10 Archives
-
tops10_tools_bb-fp64a-sb
-
10,7/who/whodpy.mac
There are 4 other files named whodpy.mac in the archive. Click here to see a list.
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