mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 09:21:15 +00:00
501 lines
16 KiB
Plaintext
501 lines
16 KiB
Plaintext
TITLE WHYCRS - Read AVAIL.SYS and report reloads
|
||
SUBTTL G.M. Uhler/GMU 22-Dec-82
|
||
|
||
|
||
;Copyright (C) 1980, 1981, 1982, 1983 by
|
||
;Digital Equipment Corporation, Maynard, Mass.
|
||
;
|
||
;
|
||
;This software is furnished under a license and may be used and copied
|
||
;only in accordance with the terms of such license and with the
|
||
;inclusion of the above copyright notice. This software or any other
|
||
;copies thereof may not be provided or otherwise made available to any
|
||
;other person. No title to and ownership of the software is hereby
|
||
;transferred.
|
||
;
|
||
;The information in this software is subject to change without notice
|
||
;and should not be construed as a commitment by Digital Equipment
|
||
;Corporation.
|
||
;
|
||
;Digital assumes no responsibility for the use or reliability of its
|
||
;software on equipment which is not supplied by Digital.
|
||
|
||
|
||
SEARCH JOBDAT,MACTEN,SCNMAC,UUOSYM
|
||
.REQUEST REL:SCAN,REL:HELPER
|
||
.DIRECTIVE .XTABM,FLBLST
|
||
SALL
|
||
|
||
|
||
WCSVER==1
|
||
WCSMIN==0
|
||
WCSEDT==2
|
||
WCSWHO==0
|
||
|
||
TWOSEG
|
||
RELOC 400000
|
||
LOC .JBVER
|
||
VRSN. (WCS)
|
||
RELOC
|
||
|
||
|
||
|
||
;Assembly and loading instructions
|
||
;
|
||
; .R MACRO
|
||
; *WHYCRS=WHYCRS
|
||
; *^C
|
||
; .R LINK
|
||
; *WHYCRS,REL:SCAN,REL:HELPER/G
|
||
;AC definitions
|
||
|
||
F==0 ;Flags
|
||
T1==1 ;First of four temporaries
|
||
T2==2
|
||
T3==3
|
||
T4==4
|
||
P1==5 ;First of four preserved registers
|
||
P2==6
|
||
P3==7
|
||
P4==10
|
||
N==P3 ;SCAN convention
|
||
C==P4 ;SCAN convention
|
||
P==17 ;PDL pointer
|
||
|
||
|
||
;Parameter definitions
|
||
|
||
.PDLEN==50 ;Size of PDL
|
||
BLKSIZ==200 ;Size of a disk block
|
||
DSK==1 ;Input channel
|
||
OUT==2 ;Output channel
|
||
WRKLEN==1200 ;Number of words in working entry
|
||
|
||
|
||
;Offsets in the header for ERROR.SYS
|
||
|
||
.EHTYP==0 ;Type, versions, lengths
|
||
EH.TYP==777B8 ;Mask for type field
|
||
EH.CRS==1B16 ;Entry extracted from CRASH.EXE
|
||
EH.FFM==7B20 ;Mask for format version field
|
||
EL.FVR==0 ;Format version of ERROR.SYS
|
||
EH.HFM==7B23 ;Mask for header version field
|
||
EL.HVR==2 ;Header version of ERROR.SYS
|
||
EH.HLN==7B26 ;Mask for header length field
|
||
EL.HED==5 ;Length of standard header
|
||
EH.BLN==777B35 ;Mask for body length
|
||
.EHDTM==1 ;Universal date/time of entry
|
||
.EHUPT==2 ;Uptime of system when entry created
|
||
.EHASN==3 ;CPU serial number of cpu on which error was detected
|
||
.EHSEQ==4 ;Sequence number of entry
|
||
|
||
;Offsets in AVAIL.SYS monitor run values (.ESMRV) body
|
||
|
||
MRVPSN==0 ;-Len,,Offset from MRVPSN to ASCIZ system name
|
||
MRVVER==1 ;Monitor version number
|
||
MRVUPT==2 ;Uptime in universal date/time format
|
||
MRVCTM==3 ;Monitor crash time (+/- 6 min) in universal date/time fmt
|
||
MRVRTM==4 ;Monitor reload time in universal date/time format
|
||
MRVWHY==5 ;Why reload code in SIXBIT
|
||
MRVIDT==6 ;Sum of all incremental date/time changes since reload
|
||
MRVSNM==7 ;First of 5 words of ASCIZ system name
|
||
;Flag definitions
|
||
|
||
FL.WTF==1B35 ;Write this character to output file
|
||
FL.HDR==1B34 ;Header needed on next entry
|
||
FL.ISC==1B33 ;Input scan block allocated
|
||
FL.OSC==1B32 ;Output scan block allocated
|
||
|
||
|
||
;Macro definitions
|
||
|
||
DEFINE ERROR (FIRST,LABEL),<
|
||
PUSHJ P,ERRMSG
|
||
XLIST
|
||
IFNB <LABEL>, <CAIA [ASCIZ\?'FIRST'\]
|
||
JRST LABEL
|
||
>
|
||
IFB <LABEL>, <CAI [ASCIZ\?'FIRST'\]>
|
||
LIST
|
||
>
|
||
WHYCRS: JFCL ;No CCL entry
|
||
RESET ;Clear the world
|
||
MOVE P,[IOWD .PDLEN,PDL] ;Setup push down list
|
||
MOVEI T1,WHYCRS ;Setup restart
|
||
MOVEM T1,.JBREN ; address
|
||
MOVE T1,.JBFF ;Get initial value of .JBFF
|
||
MOVEM T1,MINCOR ;Save for core downs
|
||
MOVE T1,[.ISCBL,,.ISCBK] ;Point to .ISCAN block
|
||
PUSHJ P,.ISCAN## ;Initialize SCAN
|
||
WCSSCN: SETZM Z.BGN ;First word to zero
|
||
MOVE T1,[Z.BGN,,Z.BGN+1] ;Setup BLT pointer
|
||
BLT T1,Z.END ;Clear it all
|
||
SETOM P.BGN ;Initialize /BEGIN,
|
||
SETOM P.END ; /END,
|
||
SETOM P.REAS ; and /REASON switch values
|
||
SETZM F ;No flags
|
||
MOVE T1,MINCOR ;Get min core needed
|
||
MOVEM T1,.JBFF ;Start of buffers
|
||
CORE T1, ;Reduce core to a minimum
|
||
JFCL ;Don't care
|
||
MOVE T1,[.TSCBL,,.TSCBK] ;Point to .TSCAN block
|
||
PUSHJ P,.TSCAN## ;Crack the command line
|
||
PUSHJ P,APLDFL ;Apply defaults
|
||
JRST WCSSCN ;Error in command
|
||
PUSHJ P,OPNFIL ;Open input and output files
|
||
JRST WCSSCN ;Failed
|
||
SETCM T1,P.BGN ;Get value of /BEGIN
|
||
SKIPN T1 ;Value specified?
|
||
SETOM T1 ;No, SETCAM will make this zero
|
||
SETCAM T1,P.BGN ;Save for checks
|
||
SETCM T1,P.END ;Get value of /END
|
||
SKIPN T1 ;Value specified?
|
||
MOVX T1,1B0 ;No, SETCAM will make this -1_-1
|
||
SETCAM T1,P.END ;Save for checks
|
||
MOVE T1,ILKBLK+.RBSIZ ;Get size of input file
|
||
SUBI T1,WRKLEN ;Minus size of working entry
|
||
SKIPG P1,T1 ;If only working entry in file,
|
||
JRST WCSSCN ; quit now
|
||
PUSH P,.JBFF ;Save pointer to table
|
||
ADDB T1,.JBFF ;Add size of stuff we want to read
|
||
CORE T1, ;Get the core
|
||
ERROR <Can't get core for AVAIL data>
|
||
MOVE P2,0(P) ;Pointer to first word of table
|
||
USETI DSK,<WRKLEN/BLKSIZ>+1 ;Set to read 1st block past working entry
|
||
RDLOOP: INPUT DSK,IOW ;Read next block
|
||
STATZ DSK,IO.ERR!IO.EOF ;Errors?
|
||
ERROR <IOERR or unexpected EOF on input file>
|
||
MOVSI T1,BUF+1 ;Skip resync word in block
|
||
HRRI T1,(P2) ; and move to next slot in buffer
|
||
BLT T1,BLKSIZ-2(P2) ;Move it
|
||
ADDI P2,BLKSIZ-1 ;Bump buffer pointer by len of entry
|
||
SUBI P1,BLKSIZ ;Done another 200 wds
|
||
JUMPG P1,RDLOOP ;Loop if more
|
||
POP P,P1 ;P1=1st word of AVAIL data
|
||
TXO F,FL.WTF ;Write data to file now
|
||
|
||
PRLOOP: LDB T1,[POINTR .EHTYP(P1),EH.TYP] ;Get entry code
|
||
LDB P2,[POINTR .EHTYP(P1),EH.HLN] ; and header length
|
||
ADDI P2,(P1) ;Compute address of first word of body
|
||
CAIN T1,.ESEOF ;EOF?
|
||
JRST ENDIT ;Yes, go finish up
|
||
CAIE T1,.ESMRV ;Monitor run value entry?
|
||
JRST PRENDL ;No, try next
|
||
MOVE T1,MRVCTM(P2) ;Get date/time of crash
|
||
CAML T1,P.BGN ;Is it in the desired range?
|
||
CAMLE T1,P.END ;?
|
||
JRST PRENDL ;No, ignore it
|
||
SETCM T1,P.REAS ;Get /REASON value
|
||
JUMPE T1,PRLOO1 ;Automatic match if none specified
|
||
HLRZ T1,MRVWHY(P2) ;Get reason for crash
|
||
CAIE T1,'S..' ;STOPCD?
|
||
SKIPA T1,MRVWHY(P2) ;No, just get SIXBIT reason
|
||
HRLZ T1,MRVWHY(P2) ;Yes, get just 3 character name
|
||
CAME T1,P.REAS ;Match with /REASON?
|
||
JRST PRENDL ;No, skip it
|
||
PRLOO1: AOS TOTAL ;Count it
|
||
HLRZ T2,MRVCTM(P2) ;Get date
|
||
IDIVI T2,7 ;Compute day in T3
|
||
CAIE T3,3 ;Saturday?
|
||
CAIN T3,4 ; or Sunday?
|
||
JRST NOTPTM ;Yes, not prime time
|
||
HRRZ T2,MRVCTM(P2) ;Get time
|
||
CAIL T2,252525 ;Before 0800?
|
||
CAILE T2,600000 ; after 1800?
|
||
JRST NOTPTM ;Yes, don't count it
|
||
AOS PRIME ;Bump count of prime-time reloads
|
||
SKIPA T1,[[ASCIZ/* /]] ;Flag prime-time reloads with a *
|
||
NOTPTM: MOVEI T1,[ASCIZ/ /] ;No flag if not prime time
|
||
PUSH P,T1 ;Save prefix
|
||
MOVEI T1,[ASCIZ\
|
||
Monitor name Ver Crash date/time Reload date/time Reason
|
||
------------------------ ----- ------------------ ------------------ ------
|
||
\]
|
||
TXON F,FL.HDR ;Need to print a header?
|
||
PUSHJ P,.TSTRG## ;Yes, put it out
|
||
POP P,T1 ;Get prefix back
|
||
PUSHJ P,.TSTRG## ;Type it
|
||
MOVSI T2,(POINT 7,0) ;Build byte pointer to
|
||
HRR T2,MRVPSN(P2) ; system name
|
||
ADDI T2,MRVPSN(P2) ;Relocate it
|
||
MOVEI T3,^D25 ;Print 25 characters
|
||
NMLOOP: ILDB T1,T2 ;Get next one
|
||
JUMPE T1,NMENDL ;End of string?
|
||
PUSHJ P,.TCHAR## ;Put it out
|
||
SOJG T3,NMLOOP ;Loop for all
|
||
CAIA ;Skip space
|
||
NMENDL: PUSHJ P,.TSPAC## ;Pad out string to the
|
||
SOJG T3,.-1 ; full 25 characters
|
||
|
||
MOVE T1,MRVVER(P2) ;Monitor version number
|
||
PUSHJ P,.TOCTW## ;Type it
|
||
PUSHJ P,.TSPAC## ; and a space
|
||
MOVE T1,MRVCTM(P2) ;Crash date/time
|
||
PUSHJ P,.TDTTM## ;Type it
|
||
PUSHJ P,.TSPAC## ; and a space
|
||
MOVE T1,MRVRTM(P2) ;Reload date/time
|
||
PUSHJ P,.TDTTM## ;Type it
|
||
PUSHJ P,.TSPAC## ; and a space
|
||
MOVE T1,MRVWHY(P2) ;SIXBIT why reload
|
||
HLRZ T2,T1 ;Get left half
|
||
CAIN T2,'S..' ;Was it a STOPCD?
|
||
HRLZS T1 ;Yes, don't print S..
|
||
PUSHJ P,.TSIXN## ;Type it
|
||
PUSHJ P,.TCRLF## ;Add a CRLF
|
||
|
||
PRENDL: LDB T1,[POINTR .EHTYP(P1),EH.BLN] ;Get size of body of this entry
|
||
ADDI T1,(P2) ;Find end of entry
|
||
MOVE P1,T1 ;Setup new pointer
|
||
JRST PRLOOP ;Loop for next
|
||
|
||
ENDIT: PUSHJ P,.TCRLF## ;Add a CRLF
|
||
MOVEI T1,[ASCIZ/
|
||
* = Reload occurred during prime-time
|
||
/]
|
||
SKIPE PRIME ;Were there any?
|
||
PUSHJ P,.TSTRG## ;Yes, print message
|
||
MOVEI T1,[ASCIZ/
|
||
Total number of reloads in specified range = /]
|
||
PUSHJ P,.TSTRG## ;Type it
|
||
MOVE T1,TOTAL ;Get number
|
||
PUSHJ P,.TDECW## ;Type it
|
||
MOVEI T1,[ASCIZ/
|
||
Total prime-time reloads in specified range = /]
|
||
PUSHJ P,.TSTRG## ;Type it
|
||
MOVE T1,PRIME ;Get the number
|
||
PUSHJ P,.TDECW## ;Type it
|
||
MOVEI T1,[ASCIZ/
|
||
(Monday-Friday, 0800-1800)
|
||
/]
|
||
PUSHJ P,.TSTRG##
|
||
RELEASE OUT, ;Close output
|
||
RELEASE DSK, ;Close input
|
||
JRST WCSSCN ;and try next command
|
||
;Subroutine to convert the SCAN blocks to OPEN, LOOKUP and
|
||
;ENTER blocks and then open the appropriate files.
|
||
;Call:
|
||
; PUSHJ P,OPNFIL
|
||
; Return here if something failed
|
||
; Return here if all ok
|
||
|
||
OPNFIL: MOVEI T1,ISCBLK ;Point to input scan block
|
||
MOVEI T2,IOPBLK ;Point to OPEN block
|
||
MOVEI T3,ILKBLK ;Point to LOOKUP block
|
||
PUSHJ P,.STOPN## ;Convert SCAN block
|
||
ERROR <Input SCAN block conversion failed>,.POPJ##
|
||
MOVX T1,.IODMP ;Dump mode for input file
|
||
DPB T1,[POINTR IOPBLK,IO.MOD] ;Store it
|
||
MOVX T1,.RBSIZ ;Get size of lookup block
|
||
MOVEM T1,ILKBLK+.RBCNT ;Store it
|
||
OPEN DSK,IOPBLK ;Open the channel
|
||
ERROR <Input device OPEN failed>,.POPJ##
|
||
LOOKUP DSK,ILKBLK ;Lookup the file
|
||
ERROR <Input file LOOKUP failed>,.POPJ##
|
||
MOVEI T1,OSCBLK ;Point to output scan block
|
||
MOVEI T2,OOPBLK ;Point to output OPEN block
|
||
MOVEI T3,OENBLK ;Point to output ENTER block
|
||
PUSHJ P,.STOPN## ;Convert SCAN block
|
||
ERROR <Output SCAN block conversion failed>,.POPJ##
|
||
MOVX T1,.IOASC ;Use ASCII mode for output file
|
||
DPB T1,[POINTR OOPBLK,IO.MOD] ;Store it
|
||
MOVSI T1,OBUF ;Output buffer header
|
||
MOVEM T1,OOPBLK+.OPBUF ;Store it
|
||
MOVX T1,.RBSIZ ;Get size of ENTER block
|
||
MOVEM T1,OENBLK+.RBCNT ;Store it
|
||
OPEN OUT,OOPBLK ;Open channel
|
||
ERROR <Output device OPEN failed>,.POPJ##
|
||
ENTER OUT,OENBLK ;Enter file
|
||
ERROR <Output file ENTER failed>,.POPJ##
|
||
JRST .POPJ1## ;Give skip return
|
||
|
||
|
||
;Subroutine to print an error message.
|
||
;Call:
|
||
; PUSHJ P,ERRMSG
|
||
; CAI [ASCIZ\msg to print\]
|
||
; Return here always
|
||
|
||
ERRMSG: HRRZ T1,@0(P) ;Get message address
|
||
PUSHJ P,.TSTRG## ;Type it
|
||
PUSHJ P,.TCRLF## ;Add a CRLF
|
||
JRST .POPJ1## ;Give skip return
|
||
;Subroutine to write one character to the output file or TTY.
|
||
;Call with character in T1 and with FL.WTF set to write to the
|
||
;output file
|
||
;Call:
|
||
; PUSHJ P,TYPCHR
|
||
; Return here always
|
||
|
||
TYPCHR: TXNN F,FL.WTF ;Write to file?
|
||
JRST TYPCH1 ;No, TTY
|
||
SOSG OBUF+.BFCTR ;Room for more?
|
||
OUTPUT OUT, ;No, flush
|
||
IDPB T1,OBUF+.BFPTR ;Store in buffer
|
||
POPJ P, ;Return
|
||
TYPCH1: OUTCHR T1 ;Write it to TTY
|
||
POPJ P, ;Return
|
||
|
||
|
||
;Subroutine to return the address of the input scan block
|
||
;Call:
|
||
; PUSHJ P,ALCINP
|
||
; Return here always with:
|
||
; T1=Address of scan block
|
||
; T2=Length of scan block
|
||
|
||
ALCINP: TXOE F,FL.ISC ;Already been here once?
|
||
ERROR <Multiple input specs illegal>,WCSSCN
|
||
MOVEI T1,ISCBLK ;Point at scan block
|
||
MOVX T2,.FXLEN ; and length
|
||
POPJ P,
|
||
|
||
|
||
;Subroutine to return the address of the output scan block
|
||
;Call:
|
||
; PUSHJ P,ALCOUT
|
||
; Return here always with:
|
||
; T1=Address of scan block
|
||
; T2=Length of scan block
|
||
|
||
ALCOUT: TXOE F,FL.OSC ;Already been here once?
|
||
ERROR <Multiple output specs illegal>,WCSSCN
|
||
MOVEI T1,OSCBLK ;Point at scan block
|
||
MOVX T2,.FXLEN ; and length
|
||
POPJ P,
|
||
;Subroutine to check input and output scan blocks and apply any
|
||
;defaults that the user did not type.
|
||
;Call:
|
||
; PUSHJ P,APLDFL
|
||
; Return here if error
|
||
; Return here if ok
|
||
|
||
APLDFL: MOVX T1,FX.NDV ;Get null device bit
|
||
TDNN T1,OSCBLK+.FXMOD ;User type a device?
|
||
SKIPN OSCBLK+.FXDEV ; or nothing at all?
|
||
SKIPA T2,[SIXBIT/TTY/] ;Default output device is TTY
|
||
JRST APLDF1 ;Use his device
|
||
MOVEM T2,OSCBLK+.FXDEV ;Store default device in block
|
||
ANDCAM T1,OSCBLK+.FXMOD ;Clear bit
|
||
ANDCAM T1,OSCBLK+.FXMOM ; and mask
|
||
APLDF1: SETCM T1,OSCBLK+.FXNMM ;Get mask for filename
|
||
JUMPE T1,APLDF2 ;Go if no wildcards
|
||
AOSN T1 ;Error if wildcards
|
||
SKIPE OSCBLK+.FXNAM ;...
|
||
JRST APLOER
|
||
MOVE T1,[SIXBIT/WHYCRS/] ;Default filename is WHYCRS
|
||
MOVEM T1,OSCBLK+.FXNAM ;Store it
|
||
SETOM OSCBLK+.FXNMM ;Set full mask
|
||
APLDF2: HRRZ T1,OSCBLK+.FXEXT ;Get mask for extension
|
||
CAIN T1,777777 ;Full mask?
|
||
JRST APLDF3 ;Yes, use his extension
|
||
SKIPE OSCBLK+.FXEXT ;Error if wildcards
|
||
JRST APLOER ;...
|
||
HRLOI T1,'LST' ;Default extension is LST
|
||
MOVEM T1,OSCBLK+.FXEXT ;Store it
|
||
APLDF3: MOVEI T1,OSCBLK ;Point to output scan block
|
||
PUSHJ P,CHKDIR ;Check for wildcards in directory
|
||
APLOER: ERROR <Wildcards illegal in output spec>,.POPJ##
|
||
MOVX T1,FX.NDV ;Get null device bit
|
||
TDNN T1,ISCBLK+.FXMOD ;User type a device?
|
||
SKIPN ISCBLK+.FXDEV ;Or nothing at all?
|
||
SKIPA T2,[SIXBIT/SYS/] ;Default input device is SYS
|
||
JRST APLDF4 ;Use his
|
||
MOVEM T2,ISCBLK+.FXDEV ;Store device
|
||
ANDCAM T1,ISCBLK+.FXMOD ;Clear bit
|
||
ANDCAM T1,ISCBLK+.FXMOM ; and mask
|
||
APLDF4: SETCM T1,ISCBLK+.FXNMM ;Get mask for filename
|
||
JUMPE T1,APLDF5 ;Go if fully specified
|
||
AOSN T1 ;Error if wildcards
|
||
SKIPE ISCBLK+.FXNAM ;...
|
||
JRST APLIER ;...
|
||
MOVE T1,[SIXBIT/AVAIL/] ;Default filename is AVAIL
|
||
MOVEM T1,ISCBLK+.FXNAM ;Store it
|
||
SETOM ISCBLK+.FXNMM ;Set full mask
|
||
APLDF5: HRRZ T1,ISCBLK+.FXEXT ;Get mask for extension
|
||
CAIN T1,777777 ;Full mask?
|
||
JRST APLDF6 ;Yes, use his extension
|
||
SKIPE ISCBLK+.FXEXT ;Error if wildcards
|
||
JRST APLIER ;...
|
||
HRLOI T1,'SYS' ;Default extension is SYS
|
||
MOVEM T1,ISCBLK+.FXEXT ;Store it
|
||
APLDF6: MOVEI T1,ISCBLK ;Point to input scan block
|
||
PUSHJ P,CHKDIR ;Check for wildcards in directory
|
||
APLIER: ERROR <Wildcards illegal in input spec>,.POPJ##
|
||
JRST .POPJ1## ;Give skip return
|
||
;Subroutine to check the directory specified in a scan block for
|
||
;wildcards.
|
||
;Call:
|
||
; MOVEI T1,address of scan block
|
||
; PUSHJ P,CHKDIR
|
||
; Return here is wildcard found
|
||
; Return here if no wildcards
|
||
|
||
CHKDIR: MOVX T2,FX.DIR ;Get directory specified bit
|
||
TDNN T2,.FXMOD(T1) ;[-]??
|
||
JRST .POPJ1## ;Yes
|
||
SETCM T2,.FXDIM(T1) ;Get mask for PPN
|
||
JUMPN T2,.POPJ## ;Error if wildcards
|
||
MOVEI T1,.FXDIR+2(T1) ;Point to first SFD
|
||
HRLI T1,-<.FXLND-1> ;Make it an AOBJN pointer
|
||
CHKDI1: SKIPN (T1) ;End of list?
|
||
JRST .POPJ1## ;Yes, give skip return
|
||
SETCM T2,1(T1) ;Get mask for next word of directory
|
||
JUMPN T2,.POPJ## ;Error if wildcards
|
||
ADDI T1,1 ;Step to next word
|
||
AOBJN T1,CHKDI1 ;Loop for all
|
||
JRST .POPJ1## ;Give good return
|
||
;High segment data areas
|
||
|
||
DEFINE SWTCHS,<
|
||
XLIST
|
||
SP BEGIN,P.BGN,.SWDTP##,,FS.VRQ
|
||
SP END,P.END,.SWDTP##,,FS.VRQ
|
||
SP REASON,P.REAS,.SIXSW##,,FS.VRQ
|
||
LIST
|
||
>
|
||
|
||
DOSCAN (WCSSW) ;Generate scan tables
|
||
|
||
|
||
.ISCBK: IOWD 1,[SIXBIT/WHYCRS/] ;Name is WHYCRS
|
||
EXP 0
|
||
EXP TYPCHR ;Character typer address
|
||
.ISCBL==.-.ISCBK
|
||
|
||
.TSCBK: IOWD WCSSWL,WCSSWN
|
||
XWD WCSSWD,WCSSWM
|
||
XWD 0,WCSSWP
|
||
EXP -1
|
||
EXP 0
|
||
XWD ALCINP,ALCOUT
|
||
.TSCBL==.-.TSCBK
|
||
|
||
|
||
;Low segment data areas
|
||
|
||
RELOC
|
||
|
||
MINCOR: BLOCK 1 ;Initial size of program
|
||
PDL: BLOCK .PDLEN ;Push down list
|
||
IOW: IOWD BLKSIZ,BUF ;IOWD for buffer
|
||
EXP 0 ;Terminator
|
||
|
||
Z.BGN==. ;Start of block to zero on startup
|
||
ISCBLK: BLOCK .FXLEN ;Input SCAN block
|
||
OSCBLK: BLOCK .FXLEN ;Output SCAN block
|
||
IOPBLK: BLOCK .OPBUF+1 ;Input OPEN block
|
||
OOPBLK: BLOCK .OPBUF+1 ;Output OPEN block
|
||
ILKBLK: BLOCK .RBSIZ+1 ;Input LOOKUP block
|
||
OENBLK: BLOCK .RBSIZ+1 ;Output ENTER block
|
||
P.BGN: BLOCK 1 ;Value of /BEGIN switch
|
||
P.END: BLOCK 1 ;Value of /END switch
|
||
P.REAS: BLOCK 1 ;Value of /REASON switch
|
||
TOTAL: BLOCK 1 ;Total number of reloads
|
||
PRIME: BLOCK 1 ;Total number during prime-time
|
||
OBUF: BLOCK .BFCTR+1 ;Output buffer header
|
||
BUF: BLOCK BLKSIZ ;Buffer for input file
|
||
Z.END==.-1 ;End of area to zero
|
||
|
||
|
||
END WHYCRS
|