home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
pdp8
/
os278-src.tar.Z
/
os278-src.tar
/
pip.pa
< prev
next >
Wrap
Text File
|
1992-09-18
|
58KB
|
2,833 lines
/PIP.PA FOR OS278
/PREVIOUS SOURCE:
/3 PIP.PA FOR OS/8 MONITOR
/
/
/
/
/
/
/
/
/
/COPYRIGHT (C) 1970,1971,1972,1973,1974,1975,1977,1982
/ BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
/ 4-MAY-1977 FILE: PIP.PA OS/8 VERSION 14A
/ABSTRACT----
/PIP (PERIPHERAL INTERCHANGE PROGRAM) IS A GENERAL FILE
/MANIPULATION PROGRAM FOR THE OS/8 PROGRAMMING SYSTEM.
/PIP ACCOMPLISHES DATA TRANSFERS BETWEEN ANY DEVICES IN THE OS/8
/CONFIGURATION.
/VB5 05-JAN-83 ADDED LOWER CASE SUPPORT FOR SQUISH RESPONSE
/VB1-VB4 CHANGES ON VB0 TO REFLECT CHANGES IN DMII
/VERSION B0 MODIFICATIONS:
/CHANGED THE /Y SWITCH TO TRANSFER THE FIRMWARE ON AN RX50
/ADDED /X SWITCH FOR FIRMWARE TRANSFER ONLY
/VERSION 4 MODIFICATIONS:
/1. ADDED RL02 SIZE TO DEVLEN TABLE
/2. CHANGED DIRMSG TO: USE CCL 'DIRECT' FOR OS/78 ASSEMBLIES
/3. VERSION NUMBER IS NOW 78A TO CONFORM WITH V4 RELEASE STANDARDS
/VERSION 3 MODS:
/FIXED PROBLEM WITH ONE-PAGE WRITE
/IN /S OR /Z, =OPTION IS TAKEN MODULO 100 (OCTAL)
/ WITH 100, 200, ETC. MEANING USE 0 ADDITIONAL WDS.
/DATES STILL DON'T LINE UP
/'0 FREE BLOCKS'
/ALLOW FILLING UP DEVICE TO VERY LAST BLOCK
/ALLOW 7-BIT ^C
/ALTMODE ON CD LINE RETURNS TO MONITOR WHEN DONE
/NO HALT ON /L IF NO TTY HANDLER (ACTS AS NOP)
/ /V PRINTS VERSION NUMBER FIRST TIME CALLED
/ /O AFFIRMS /Y ON ZERO SYS OR ARE YOU SURE
/=NNNN ON /I OPTION SPECIFIES LENGTH TO CLOSE FILE
/MAINTENANCE RELEASE CHANGES:
/1. FIXED LENGTH OF ALL VARIETIES OF RF08
/2. ADDED RX01 TO INTERNAL LENGTH TABLES
/3. CHANGED VERSION NUMBER TO V10
/4. ADDED CHECK FOR 7-BIT CTRL/Z TO ASCII HANDLER
/ DISABLED /E,/F,/L
/ FIXED /Y OPTION PER SPR
/ DEVICE UPGRADE KIT CHANGES(V12C):
/ 1.ADDED RX02 SUPPORT
/ 2.ADDED /Y OPTION CHANGES TO SUPPORT NEW MONITOR
/DETAILS OF PIP:
/PIP RUNS WITH THE USR (USER SERVICE ROUTINES) ALWAYS IN CORE.
/THIS ELIMINATES SWAPPING THE MONITOR. IF ANY CHANGES ARE MADE
/TO PIP, CARE SHOULD BE TAKEN IN USING PAGE ZERO LOCATIONS, AS
/THEY MUST NOT DESTROY ANY MONITOR LOCATIONS.
/SAVE ARGUMENTS: .SAVE SYS PIP;13000=6400 (STARTING ADDRESS: 13000,
/ JSW INCLUDES BATCH OPTIMIZATION)
/CORE USED:
/FIELD 0
/00000-02777- OUTPUT BUFFER
/03000-06377- INPUT BUFFER
/06400-06577- USED FOR /Y COMMAND ONLY
/06600-07177- INPUT HANDLER
/07200-07577- OUTPUT HANDLER
/FIELD 1
/10000-11777- OS/8 I/O MONITOR
/12000-16577- EXECUTABLE CODE
/16600-17177- HOLDS NEW DIRECTORY SEGMENT FOR /S OPTION
/17200-17577- HOLDS OLD DIRECTORY SEGMENT IN /S OPTION
/FIELD 2
/20000-20777- RX50 FIRMWARE TRANSFER ROUTINE
/FIELD 3
/30000-37777- BUFFER AREA FOR FIRMWARE TRANSFER ROUTINE
/MAJOR PIECES OF CODE AND THEIR FUNCTION (BRIEFLY).
/THIS IS A LIST OF ROUTINES AS THEY APPEAR PHYSICALLY, AND
/NOT AS THEY ARE LOGICALLY CONNECTED.
/ICHAR- GENERAL CHARACTER INPUT ROUTINE. ASSIGNS NEW
/ DEVICE HANDLERS AS NEEDED.
/OOPEN- ENTERS A FILE ON A SPECIFIED DEVICE.
/OUTDMP- WRITES OUTPUT BUFFER TO OUTPUT DEVICE.
/OCLOSE- CLOSES FILE CREATED BY OOPEN
/OCHAR- CHARACTER OUTPUT ROUTINE. WRITES CHARACTERS
/ TO OUTPUT BUFFER, CALLING OUTDMP WHEN FULL.
/OTYPE- USES DEVICE NUMBER IN OUTPUT AREA OF CD TO
/ INSPECT THE DEVICE CONTROL BLOCK WORD. THIS
/ GIVES A CODE FOR THE TYPE OF DEVICE.
/SLASHG- HANDLES I/O ERRORS. IF /G IS SET, HARD I/O
/ ERRORS ARE IGNORED. IF /S AND /G ARE ON, A
/ SPECIAL RETURN IS TAKEN.
/IMAGE- IMAGE MODE PROCESSOR FOR PIP.
/SQTRA- MAIN SUBROUTINE OF IMAGE MODE, AND /S OPTION.
/PIP, PIP+1- MAIN ENTRANCES TO PIP. THE CODE ON THIS PAGE
/ INSPECTS CD OPTION WORDS AND BRANCHES TO PROPER
/ ROUTINES.
/ASCII- THE DEFAULT TRANSFER MODE IN PIP IS ASCII.
/DELETE- DELETES FILES ON OUTPUT SIDE OF CD LIST.
/DZERO- ZEROES DIRECTORY OF FIRST OUTPUT DEVICE.
/PIPERR- ERROR ROUTINR FOR PIP.
/DIRPRE- DIRECTORY PRINTING ROUTINE.
/BINARY- BINARY MODE PROCESSOR. HANDLES ABSOLUTE AND
/ RELOCATABLE BINARY FILES.
/ERPRNT- ERROR PRINTOUT.
/SQUISH- FILE COMPRESSION PROCESSOR. ELIMINATES 'HOLES'
/ IN DIRECTORY OF INPUT DEVICE.
/SYSCOP- SYSTEM COPY PROCESSOR. ALLOWS TRANSFER OF THE
/ OS/8 SYSTEM AREA.
AC0001=CLL CLA IAC
AC0002=CLL CLA CML RTL
AC0006=CLL CLA CML IAC RTL
AC4000=CLL CLA CML RAR
AC3777=CLL CLA CMA RAR
AC7775=CLL CLA CMA RTL
SEL=6750 /SELECT DRIVE PAIR
LCD=6751 /LOAD COMMAND
XDR=6752 /TRANSFER DATA
STR=6753 /SKIP IF READY TO TRANSFER
SER=6754 /SKIP ON ERROR
SDN=6755 /SKIP ON DONE
BOOTYP=7623 /MAGIC LOCATION IN RX SYSTEM HANDLER
/OPTIONS AVAILABLE IN PIP:
/A- ASCII TRANSFER; DEFAULT MODE
/B- BINARY MODE TANSFER
/C- DELETE TRAILING BLANKS. (ASCII MODE)
/D- DELETE FIRST OUTPUT FILE BEFORE PROCEEDING
/E- LIST INPUT DIRECTORY INCLUDING EMPTY FILES
/F- LIST INPUT DIRECTORY; ONLY FILE NAMES
/G- IGNORE ERRORS WHILE TRANSFERING
/I- IMAGE MODE TRANSFER
/L- LIST INPUT DIRECTORY; EXCLUDE EMPTY FILES
/O- OK TO PERFORM A SQUISH OR ZERO WITHOUT ASKING
/S- COMPRESS INPUT DEVICE ONTO OUTPUT DEVICE. ELIMINATES
/ 'HOLES' ON INPUT DEVICE.
/T- PROVIDE SIMPLE TTY FORMATTING. (ASCII ONLY)
/Y- COPY OS/8 SYSTEM AREA
/Z- ZERO OUTPUT DEVICE DIRECTORY BEFORE PROCEEDING
/=N- LEAVE N WORDS EXTRA PER DIRECTORY ENTR. VALID
/ ONLY WITH /S OR /Z.
/=N- WITH /I OPTION CLOSES OUTPUT FILE WITH THIS LENGTH
/V PRINTS VERSION # (FIRST TIME ONLY)
/COMMENTS ON THE PROGRAM:
/SINCE PIP RUNS WITH USR IN CORE, NO PAGE ZERO LITERALS
/CAN BE USED. THE LOCATIONS CURRENTLY USED IN
/FIELD 1 ON PAGE ZERO ARE:
OUTXR=10
INXR=11
TEMP1=12
IHNDLR=24 /HOLDS INPUT HANDLER ADDRESS
OHNDLR=25 /OUTPUT HANDLER ADDRESS
SQFLAG=26 /'SQUISH INDICATOR
OUWAST=27 /# WASTE WORDS ON OUTPUT
OUTBLK=30
OUDLEN=31
SAME=32
INBLK=33
RECCNT=34
/CONSTANTS USED BY THE DIRECTORY PRINTOUT ROUTINE (OVERLAPPING) ARE:
FLENGT=24
BLOKNO=25
DTYPE=27
DCOUNT=30
DLINK=31
WASTE=32
DDATE=33
ECOUNT=35
/PIP FOR OS/8 MONITOR
/EQUIVALENCES FOR GENERAL CHARACTER I/O ROUTINES
OUBUF=0 /MUST BE LOWER THAN INBUF
OUCTL=5400 /OUTPUT BUFFER OF 3000 WORDS
OUDEVH=7200 /PROVIDE ROOM FOR TWO-PAGE HANDLERS
INBUF=3000
INCTL=1600 /INPUT BUFFER OF 3400 WORDS
INRECS=7
INDEVH=6600
/PAGE 6400 IS FREE, EXCEPT DURING /Y COMMAND
/EQUIVALENCES NECESSARY TO INTERFACE WITH MONITOR
DCB=7760
MPARAM=7643 /CD PARAMETER AREA
OLDDIR=7 /POINTER TO MONITOR VARIABLE "OLDT9"
MTEMP=27 /MONITOR SCRATCH AREA ON "SYS" - ***VOLATILE***
PTP=20 /INTERNAL TYPE CODE FOR PAPER TAPE PUNCH
XR=10
TEMP=20
CHAR=21
INFPTR=22
INEOF=23
ABUF=6601 /LINE BUFFER - 150 CHARACTERS LONG
SQBUF1=6600 /DIRECTORY BUFFER FOR "SQUISH" OPTION
SQBUF2=7200 /""
FIELD 1
/TO ENABLE /E,/F,/L SET
/OS78=0
/TO DISABLE /E,/F,/L
IFNDEF OS78 <OS78=1>
/GENERAL CHARACTER I/O ROUTINES FOR BLEEP
/CALLED AS FOLLOWS:
/JMS I (IOPEN INITIALIZES THE INPUT ROUTINE
/JMS I (ICHAR READS A CHARACTER
/ERROR RETURN /AC>0 IF END OF FILE, AC<0 IF READ ERROR
/JMS I (OOPEN INITIALIZES THE OUTPUT ROUTINE
/ERROR RETURN AC>0 IF NO OUTPUT DEVICE/FILE, AC<0 IF ERROR
/JMS I (OCHAR OUTPUTS A CHARACTER
/ERROR RETURN OUTPUT ERROR OR TOO MUCH OUTPUT
/JMS I (OCLOSE CLOSES THE OUTPUT FILE
/ERROR RETURN FILE TOO LARGE TO BE CLOSED OR OUTPUT ERROR
/JMS I (OTYPE RETURNS DCB WORD OF OUTPUT DEVICE IN AC
/PARAMETERS NEEDED:
/INBUF= ADDRESS OF INPUT BUFFER
/INCTL= INPUT BUFFER CONTROL WORD
/OUBUF= ADDRESS OF OUTPUT BUFFER
/OUCTL= OUTPUT BUFFER CONTROL WORD (MUST BE NEGATIVE)
/INRECS= [INCTL/256]
/INDEVH= ADDRESS OF PAGE FOR INPUT HANDLER
/OUDEVH= ADDRESS OF PAGE FOR OUTPUT HANDLER
/ASSUMES I/O MONITOR IS RESIDENT IN CORE.
/CAN BE CALLED FROM ANY FIELD WITH BUFFERS IN ANY FIELD.
INFLD=INCTL&70 /GET FIELD OF INPUT BUFFER
OUFLD=OUCTL&70 /DITTO OUTPUT BUFFER
*2000
IN7400, 7400
IOPEN, 0
CLA CMA
DCA INCHCT /SET INCHCT TO FORCE A READ
ISZ INEOF /SET END-OF-FILE FLAG TO FORCE A NEW FILE
TAD (7617
DCA INFPTR /RESET FILE POINTER
RDF
TAD INCDIF
DCA .+1
INPTR, HLT /RESTORE CALLING FIELDS
JMP I IOPEN
ICHAR, 0
IN7600, 7600
RDF
TAD INCDIF
DCA INRTRN /SAVE CALLING FIELDS
INCHAR, CDF INFLD
ISZ INJMP /BUMP THREE-WAY UNPACK SWITCH
ISZ INCHCT
INJMPP, JMP INJMP
TAD INEOF
SNA CLA /DID LAST READ YIELD END-OF-FILE?
JMP INGBUF /NO - DO ANOTHER
GETNEW, JMS INNEWF /OPEN A NEW INPUT FILE
JMP EOFERR /NO FILE TO OPEN
INGBUF, TAD INCTR
CLL
TAD (INRECS
SNL
DCA INCTR /RESTORE INCTR IF IT HASN'T OVERFLOWED
SZL /IS THIS THE LAST READ?
ISZ INEOF /YES - SET END-OF-FILE FLAG
/NOT END-OF-FILE IF INPUT DEVICE
/IS NON-FILE STRUCTURED!
CLL CML CMA RTR /CONSTRUCT A CONTROL WORD FOR THE READ
RTR /FROM THE AMOUNT OF THE OVERFLOW
RTR /(IF ANY) AND THE STANDARD CONTROL WORD
TAD (INCTL+1
DCA INCTLW
INCDIF, CDF CIF 0
CDF 10
JMS I INHNDL /CALL THE DEVICE HANDLER
INCTLW, 0
INBUFP, INBUF
INREC, 0
JMS I (SLASHG /A HANDLER ERROR - SHOULD WE IGNORE?
INERRX-. /ADDRESS IF NOT
INBREC, TAD INREC
TAD (INRECS
DCA INREC /UPDATE THE RECORD NUMBER
TAD INCTLW
AND IN7600
CLL RAL
TAD INCTLW
AND IN7600
CMA
DCA INCHCT /COMPUTE THE NEW CHARACTER COUNT
TAD INJMPP
DCA INJMP /RESET THE CHARACTER SWITCH
TAD INBUFP
DCA INPTR /AND THE WORD POINTER
JMP INCHAR /GO BACK AND MAKE BELIEVE THIS NEVER HAPPENED
INERRX, ISZ INEOF /EITHER AN END-OF-FILE OR A BADDIE
SMA CLA /WHICH TYPE WAS IT?
JMP INBREC /END OF FILE - RESUME THY PROCESSING
INERR, CLA CLL CML RAR /BADDIE - GIVE ERROR RETURN WITH NEGATIVE AC
EOFERR, JMP INRTRN
INJMP, HLT /THIS IS THE THREE - WAY CHARACTER SWITCH
JMP ICHAR1
JMP ICHAR2
ICHAR3, TAD INJMPP
DCA INJMP
TAD I INPTR
IN200, AND IN7400
CLL RTR
RTR /COMBINE THE HIGH-ORDER FOUR BITS OF
TAD INCTLW
RTR /THE TWO WORD TO FORM THE THIRD CHARACTER
RTR
ISZ INPTR
JMP INCOMN
ICHAR2, TAD I INPTR
AND IN7400
DCA INCTLW /SAVE THE HIGH-ORDER BITS FOR THE THIRD CHAR
ISZ INPTR /BUMP THE WORD POINTER
ICHAR1, TAD I INPTR
INCOMN, AND (377
TAD (-232
INCTZF, SNA /IS THE CHARACTER A ^Z?
JMP GETNEW /YES - GET A NEW FILE
TAD (232 /RESTORE THE CHARACTER
ISZ ICHAR /BUMP RETURN TO NORMAL RETURN
INRTRN, 0 /RESTORE CALLING FIELDS
JMP I ICHAR /AND RETURN
/IOPEN IS UNNECESSARY.
INNEWF, -1 /ROUTINE TO OPEN NEW INPUT FILE
INCHCT=INNEWF
CDF 10
TAD (INDEVH+1
DCA INHNDL /INITIALIZE HANDLER ADDRESS
TAD I INFPTR /GET NEXT CD INPUT FILE ENTRY
SNA /ANY MORE?
JMP I INNEWF /NO - OUT OF INPUT
JMS I IN200
1 /ASSIGN, FETCH HANDLER
INHNDL, 0
HLT /HUH?
TAD I INFPTR
AND (7760 /GET LENGTH PART OF WORD
SZA /LENGTH OF 0 MEANS LENGTH >=256
TAD (17 /ADD HIGH-ORDER BITS
CLL CML RTR
RTR
DCA INCTR /STORE LENGTH OF FILE
ISZ INFPTR
TAD I INFPTR
DCA INREC /STORE STARTING RECORD NUMBER OF FILE
ISZ INFPTR
DCA INEOF /ZERO END-OF-FILE FLAG
ISZ INNEWF
JMP I INNEWF
INCTR=IOPEN
PAGE
OOPEN, 0 /OPEN OUTPUT FILE
OU7600, 7600
/ RDF
/ TAD OUCDIF
/ DCA OORETN
TAD OU7601
DCA OUBLK
TAD (OUDEVH+1
DCA OUHNDL
CDF 10
TAD I OU7600 /GET DEVICE NUMBER WORD OF OUTPUT FILE ENTRY
AND (17 /STRIP OFF ANY LENGTH INFO
SNA /IS THERE AN OUTPUT DEVICE?
JMP ONOFIL /NO - INHIBIT OUTPUT
JMS I (200
1 /ASSIGN, FETCH HANDLER
OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY
HLT /HUH?
OUENTR, TAD I OU7600
JMS I (200
3 /ENTER OUTPUT FILE
OUBLK, 7601 /REPLACED WITH STARTING BLOCK
OUELEN, 0 /REPLACED WITH LENGTH OF HOLE
JMP OEFAIL /FAILED - MAYBE WE ASKED TOO MUCH
DCA OUCCNT
DCA I (OUTINH /ZERO OUTPUT INHIBIT FLAG
JMS I (OUSETP
ISZ OOPEN
OORETN, CDF CIF 10 /RESTORE CALLING FIELDS
JMP I OOPEN
OEFAIL, TAD I OU7600
AND (7760 /GET REQUESTED LENGTH
SNA CLA /WAS IT AN INDEFINITE REQUEST
JMP ONTERR /YES - CANNOT ENTER THE FILE
TAD I OU7600
AND (17 /MAKE THE REQUESTED LENGTH ZERO
DCA I OU7600
JMP OUENTR /TRY, TRY AGAIN
ONTERR, CLA CLL CML RAR
JMP OORETN /TAKE THE ERROR RETURN WITH AC<0
ONOFIL, ISZ I (OUTINH
JMP OORETN /TAKE THE ERROR RETURN WITH AC=0
OUTDMP, 0
DCA OUCTLW /STORE THE CONTROL WORD
CDF 10
TAD I (OUTINH
SZA CLA
JMP OUNOWR
TAD OUCCNT
SNA
ISZ OUCTLW
TAD OUBLK
DCA OUREC /COMPUTE THE STARTING BLOCK NUMBER OF THIS TRANSFER
TAD OUCTLW
CLL RTL
RTL
RTL
AND (17 /COMPUTE THE NUMBER OF RECORDS
TAD OUCCNT /UPDATE THE NUMBER OF BLOCKS IN THE FILE
DCA OUCCNT
TAD OUCCNT
CLL CML
TAD OUELEN
SNL SZA CLA /DOES THE LENGTH EXCEED THE GIVEN LENGTH?
JMP I OUTDMP /YES - SIGNAL OUTPUT ERROR
OUCDIF, CDF CIF 0
CDF 10
JMS I OUHNDL
OUCTLW, 0
OUBUF
OUREC, 0
JMS I (SLASHG
.+2-.
OUNOWR, ISZ OUTDMP /BUMP OUTDMP TO NORMAL RETURN
JMP I OUTDMP
OCLOSE, 0
CDF 10
TAD I (OUTINH
SZA CLA /IS OUTPUT INHIBITED?
JMP OCISZ /YES - CLOSE IS A NOP
JMS I (OTYPE
AND (770
TAD (-PTP /CHECK FOR PAPER TAPE PUNCH OUTPUT
SZA CLA /AND SKIP ^Z OUTPUT IF TRUE
TAD (232 /OUTPUT A ^Z
JMS I (OCHAR
JMP OCRET
JMS I (OCHAR
JMP OCRET
FILLLP, JMS I (OCHAR
JMP OCRET
JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE
SPA CLA
TAD (100 /IF ITS A DIRECTORY DEVICE FORCE A RECORD
TAD (77 /BOUNDARY - OTHERWISE A HALF-RECORD
AND I (OUDWCT
SZA CLA /UP TO THE BOUNDARY YET?
JMP FILLLP /NO - FILL WITH ZEROS
TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT
TAD (OUCTL&3700
SNA /A FULL WRITE LEFT?
JMP NODUMP /YES - DON'T DO IT - THE ^Z IS ALREADY OUT
TAD (4000+OUFLD /PUT IN THE FIELD BITS AND THE WRITE BIT
JMS OUTDMP
JMP OCRET /AN ERROR OCCURRED WHILE DUMPING THE BUFFER
NODUMP, TAD I OU7600 /GET THE DEVICE NUMBER
JMS I (200
4 /CLOSE THE OUTPUT FILE
OU7601, 7601 /POINTER TO THE OUTPUT FILE NAME
OUCCNT, 0
SKP /ERROR WHILE CLOSING THE FILE - BAD!
OCISZ, ISZ OCLOSE
OCRET, CDF CIF 10 /RESTORE CALLING FIELDS
JMP I OCLOSE
PAGE
OUSETP, 0 /ROUTINE TO INITIALIZE CHARACTER POINTERS
TAD (OUCTL&3700 /GET SIZE OF BUFFER IN DOUBLEWORDS
CIA /PAL10 IS DEFINITELY NOT NICE
DCA OUDWCT
/ TAD (OUBUF
IFNZRO OUBUF <ERROR!> /V3
DCA OUPTR /INITIALIZE WORD POINTER
TAD OUJMPE
DCA OUJMP /INITIALIZE THREE-WAY CHARACTER SWITCH
JMP I OUSETP
OCHAR, 0
AND (377
DCA OUTEMP
RDF
TAD LEAVE
DCA OUCRET
TAD OUTINH
SZA CLA /IS THERE AN OUTPUT FILE?
JMP OUCOMN /NO - EXIT
OUCHAR, CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD
ISZ OUJMP /BUMP THE CHARACTER SWITCH
OUJMP, HLT /THREE WAY CHARACTER SWITCH
JMP OCHAR1
JMP OCHAR2
OCHAR3, TAD OUTEMP
CLL RTL
RTL
AND (7400
TAD I OUPOLD
DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH
/ORDER 4 BITS OF THIRD CHAR
TAD OUTEMP
CLL RTR
RTR
RAR
AND (7400
TAD I OUPTR
DCA I OUPTR /UPDATE SECOND WORD FROM LOW ORDER 4 BITS
TAD OUJMPE
DCA OUJMP /RESET SWITCH
ISZ OUPTR
ISZ OUDWCT /BUMP DOUBLEWORD COUNTER EVERY 3 CHARS
JMP OUCOMN
TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE
JMS I (OUTDMP /DUMP THE BUFFER
JMP OUCRET /OUTPUT ERROR - GIVE ERROR RETURN
JMS OUSETP /RE-INITIALIZE THE POINTERS
JMP OUCOMN
OCHAR2, TAD OUPTR
DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO
ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD
OCHAR1, TAD OUTEMP
DCA I OUPTR
OUCOMN, ISZ OCHAR
OUCRET, HLT /RESTORE CALLING FIELDS
JMP I OCHAR
OUTEMP, 0
OUPOLD, 0
OUPTR, 0
OUJMPE, JMP OUJMP
OUDWCT, 0
OUTINH, 0
OTYPE, 0
/GET THE DEVICE POSITION PROVIDED BY THE COMMAND DECODER
/IN THE OUTPUT FILE SLOT. USE IT TO FIND THE DEVICE
/INFORMATION MAINTAINED IN THE DEVICE CONTROL WORD
/TABLE. DCW STRUCTURE:
/BIT 0 SET IF DEVICE IS FILE STRUCTURED
/BIT 1 SET IF DEVICE IS READ ONLY
/BIT 2 SET IF DEVICE IS WRITE ONLY
/BITS 3-8 IS OS/8 6-BIT DEVICE CODE
/BITS 9-11 ARE UNIQUE TAPE DEVICE INFORMATION
/ (ONLY BIT 11 IS USED AT PRESENT)
RDF
TAD LEAVE
DCA OTRTN
CDF 10
TAD I (7600
AND (17
TAD (DCB-1
DCA OUTEMP
TAD I OUTEMP
OTRTN, HLT
JMP I OTYPE
CTCTST, 0
TAD (200 /V3
KRS
TAD (-203
SNA CLA /IS THE TELETYPE BUFFER A ^C
KSF /WITH THE TELETYPE FLAG ON?
JMP I CTCTST /NO
LEAVE, CDF CIF 0 /YES - GO TO MONITOR
JMP I (7600 /THROUGH THE "SAVE CORE" RETURN
/UNLESS LOCKED OUT BY SETCTC ROUTINE
SLASHG, 0
DCA CTCTST
TAD SQFLAG
SZA CLA /ARE WE SQUISHING?
JMP I (SQIOER /YES
TAD CTCTST
SPA CLA /ONLY IGNORE HARD ERRORS
TAD I (MPARAM
AND (40
SZA CLA / "G" SWITCH
SLGRET, JMP I SLASHG /IGNORED!
TAD I SLASHG
TAD SLASHG
DCA SLASHG /SET UP NON-IGNORE ADDRESS
TAD CTCTST
JMP I SLASHG /RETURN WITH AC RESTORED
IFZERO OS78 <
DIR, DCA DTYPE /SAVE TYPE OF REQUEST
TAD I (7600
SZA CLA /IS THERE AN OUTPUT FILE?
JMP I (DIRPRE /YES
DCA TTYDEV+1
JMS I (200
12 /ASSIGN WITHOUT FETCH
TTYDEV, 5524 /COMPRESSED CODE FOR "TTY"
0
0
JMP I (PIP /V3 WHAT - NO TELETYPE!
TAD TTYDEV+1
DCA I (7600
JMP I (DIRPRE
>
IFNZRO OS78 <
DIR, JMS I (PIPERR /TYPE OUT MESSAGE
14
DIRMSG, TEXT "USE CCL 'DIRECT'"
>
PIPCLR, JMS I (SRSTOR /CLEAR OUT 07600
JMP I (PIP
PAGE
/PIP PROPER BEGINS HERE
/**********************
/IMAGE MODE PROCESSOR FOR PIP
IMAGE, JMS I (FIXLEN
JMS I (OUTOPN
JMS IMTRA
IMCLOS, TAD I (OUTINH
SZA CLA /WAS THERE AN OUTPUT FILE?
JMP I (PIPCLR /NO - DON'T CLOSE IT
JMS I (OUK /GET THE LENGTH OF THE OUTPUT FILE
DCA IMCCNT
TAD I IM7600
JMS I (200
4 /CLOSE
7601 /FILE NAME
IMCCNT, 0
JMP I (AOUERR
JMP I (PIPCLR
ENDFUJ, 0 /PART OF DIRECTORY PRINTING ROUTINE
JMS I (PRNUM
TAD (-6
JMS I (PRWD /PRINT SIX WORDS
0006 / F
2205 /RE
0500 /E
0214 /BL
1703 /OC
1323 /KS
JMS I (PCRLF
JMS I (PCRLF /LEAVE A SPACE BETWEEN DIRECTORIES
ISZ INEOF /SIMULATE "END OF FILE" FOR INPUT ROUTINE
CLA CMA
DCA I (INCHCT /AS WELL AS "END OF BUFFER"
JMP I ENDFUJ
IMHNDL, /V3
SQTRA, 0
TAD SQTRA
DCA IMTRA /FAKE A CALL TO "IMTRA"
TAD RECCNT /SETTING UP THE ARGS TO DO THE SQUISHING FOR US
DCA I (INCTR
TAD IHNDLR
DCA IMHNDL
TAD INBLK
DCA IMREC
TAD OUTBLK
DCA I (OUCCNT
DCA INEOF
JMP IMRCLP
IMTRA, 0
JMS I (IOPEN /INITIALIZE INPUT ROUTINE
AGAIN, TAD INEOF /IOPEN ALWAYS SETS INEOF
SNA CLA /KEEP READING?
JMP IMRCLP /YES
/NO, OPEN NEXT FILE
IMFILP, JMS I (INNEWF /SET UP PARAMS FOR NEXT FILE
JMP I IMTRA /NO NEXT FILE
TAD I (INHNDL
DCA IMHNDL /GET DEVICE HANDLER ENTRY
TAD I (INREC
DCA IMREC /AND STARTING BLOCK NUMBER
IMRCLP, TAD I (INCTR
CLL
TAD (15
SNL /IF LINK IS ON, THERE ARE LESS THAN 16 BLOCKS LEFT
DCA I (INCTR
SZL
ISZ INEOF
CLL CML CMA RTR
RTR
RTR
TAD (3201 /FORM A FULL OR PARTIAL READ CONTROL WORD
DCA IMCTLW
JMS I (CTCTST /CHECK FOR ^C
CIF 0
JMS I IMHNDL
IMCTLW, 0
OUBUF
IMREC, 0
JMS I (SLASHG
IMERRX-.
TAD IMREC
TAD (15
DCA IMREC /UPDATE BLOCK NUMBER
CLA CLL CML RAR
TAD IMCTLW
IMOUT, JMS I (OUTDMP /WRITE OUT WHAT WE JUST READ IN
JMP I (AOUERR /WRITE ERROR - BAD!
JMP AGAIN /V3
IMERRX, ISZ INEOF /SIGNAL EOF OR WORSE
SPA CLA /WHICH ONE IS IT?
JMP IM7600
TAD (6377 /MARCH DOWN THROUGH CORE
IMEFLP, DCA CHAR /LOOKING FOR THE FIRST NON-ZERO WORD
CDF 0
TAD I CHAR
SZA CLA
JMP IMNZRO
CLA CMA CLL
TAD CHAR
SZL /IF WE GO THROUGH THE BUFFER WITHOUT A NON-ZERO WORD
JMP IMEFLP
IM7600, 7600
JMS I (PIPERR /SOMETHING IS WRONG (HANDLER SHOULD HAVE INSERTED
4 /A ^Z AT LEAST)
IMNZRO, CDF 10
TAD CHAR
CLL CML RAR
AND IM7600
TAD (200 /GET THE LENGTH OF THE USEFUL PART OF THE BUFFER
JMP IMOUT /AS AN OUTPUT CONTROL WORD AND GO OUTPUT IT
PAGE
/** PIP STARTS HERE (OR HERE+1 IF CHAINED TO) **
PIPSA, JMP PIPCD /NORMAL ENTRY/RE-ENTRY - CALL CD
JMP NOPCD /ENTRY FROM CHAIN COMMAND - ASSUME CD AREA SET UP
/PART OF ASCII PROCESSOR - CLEAN UP AT END OF LINE AND END OF FILE
LFEED, TAD CHAR
DCA I XR /PUT THE LINE FEED IN THE LINE BUFFER
EOL, DCA I XR /MARK THE END OF USEFUL INFO
JMS I (CTCTST
TAD (ABUF-1
DCA XR /RESET BUFFER POINTER
EOLLP, TAD I XR /GET A CHARACTER FROM THE LINE BUFFER
PIPSNA, SNA /ZERO MEANS NO MORE CHARS
JMP EOFTST
JMS I (OCHAR /OUTPUT THE CHARACTER
JMP I (AOUERR
JMP EOLLP
EOFTST, TAD AEOFFG
SNA CLA /END OF INPUT ENCOUNTERED?
JMP I (ASCIGO /NO - GET NEXT LINE
ACLOSE, JMS I (OCLOSE /YES - CLOSE THE OUTPUT FILE
JMP I (AOUERR /ERROR ON CLOSE
PIP, TAD I (MPARAM-1 /V3
SMA CLA /ALTMODE TERMINATE LAST COMMAND STRING?
JMP PIPCD /NO
CDF CIF 0 /YES
JMP I (7605 /EXIT TO OS/8 WITHOUT SAVING CORE
PIPCD, JMS I (200 /OF COURSE THE MONITOR IS IN CORE!
5 /COMMAND DECODE
0 /NO ASSUMED EXTENSIONS ON INPUT
L20, /V3
NOPCD, JMS I (ONCE /REPLACED BY '20' BY ONCE-ONLY CODE
JMS I (SRSTOR /CLEAR /S OR /Y;READ MONITOR
DCA SQFLAG /CLEAR /S INDICATOR
TAD PIPSNA
DCA I (INCTZF /RESET INPUT SWITCH TO DETECT "^Z"'S
TAD I (MPARAM+1
AND (40 /"S" SWITCH
SZA CLA
JMP I (SQUISH /IT WAS ON - COMPRESS THE INDICATED DEVICES
TAD I (MPARAM+2
RTL
SZL CLA /"Z" SWITCH IN THE LINK
JMS I (DZERO /ZERO DIRECTORY BEFORE PROCEEDING
TAD I (MPARAM
AND (400 /"D" SWITCH
SZA CLA
JMS I (DELETE /DELETE OUTPUT FILE
TAD I (MPARAM+2 /IS /Y ON?
SPA CLA
JMP I (SYSCOP /YEP..TRANSFER SYSTEM HEAD
TAD I (MPARAM
AND (301 /"E","F" AND "L" SWITCHES
SZA /ANY ONE OF THEM ON?
JMP I (DIR /YES - LIST A DIRECTORY
TAD I (MPARAM
RTL
AND (40 /"I" SWITCH ROTATED TWO LEFT
SZA CLA
JMP I (IMAGE /IMAGE MODE TRANSFER
TAD I (7617 /MUST PRESERVE THE LINK
SNA CLA /V3 IMAGE MODE ALLOWS NO INPUT FILE
JMP PIP /TERMINATE HERE IF NO INPUT SIDE
SZL CLA /"B" SWITCH IN LINK
JMP I (BINARY /BINARY MODE TRANSFER
/DEFAULT MODE OF TRANSFER IS ASCII
ASCII, TAD I (MPARAM+1
AND L20
DCA COPTSW
TAD COPTSW
JMS I (ASCI2 /TEST FOR OUTPUT DEVICE
JMS I (OUTOPN
JMS I (IOPEN /OPEN THE INPUT FILES
DCA AEOFFG /ZERO THE END-OF-FILE FLAG
JMS I (LEADER
JMP I (ASCIGO
/ENTRY ON END OF INPUT
ASCEOF, SPA CLA /WAS IT END OF INPUT OR AN INPUT ERROR?
PER4, JMS I (PIPERR
4
ISZ AEOFFG /SET END-OF-INPUT FLAG
JMP EOL /PROCESS LAST LINE (IF ANY)
AEOFFG, 0
/SUBROUTINE TO OUTPUT RUBOUTS AFTER FORM CONTROL CHARACTERS
RUBOUT, 0 /UNLESS OUTPUT IS TO A DIRECTORY DEVICE
DCA TEMP /STORE COUNT
JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE
SPA CLA
JMP I RUBOUT /DIRECTORY DEVICE - DON'T BOTHER
RBTLP, TAD CHAR
TAD (-214
SNA CLA /IS THE FORM CONTROL CHAR A FORM-FEED?
IAC /YES - OUTPUT BLANK TAPE INSTEAD
TAD (377
DCA I XR /PUT IN BUFFER
ISZ TEMP
JMP RBTLP /LOOP FOR THE REQUISITE COUNT
JMP I RUBOUT
COPTSW, 0
DEND, SPA CLA
JMP PER4
JMP ACLOSE
PAGE
*3200
/ASCII PROCESSOR CONTINUED
ASCIGO, TAD (ABUF-2
DCA XR
DCA I XR /PROTECT AGAINST NULL LINE WITH "T" OPTION
DCA COLCT /ZERO COLUMN COUNTER FOR TAB CONVERSION
ACHLP, JMS I (ICHAR /GET A CHARACTER
JMP I (ASCEOF /END OF INPUT OR WORSE
AND (177 /MASK OUT PARITY BIT
SZA /IGNORE BLANK TAPE AND LEADER/TRAILER
TAD (-177
SNA
JMP ACHLP /DITTO RUBOUTS
TAD (177-32 /V3C
SNA
JMP I (ASCPTCH /7-BIT ^Z CHECK
TAD (232 /FORCE COLUMN 8 ON
DCA CHAR
TAD CHAR
TAD (-216
CLL
TAD ASCI5
SNL /IS THE CHARACTER A FORM CONTROL CHARACTER?
JMP CINSRT /NO
TAD ASCJMP /YES - GO TO APPROPRIATE ROUTINE
DCA .+1
HLT
ASCJMP, JMP I .+1
TAB
LFEED
VTAB
FFEED
CARRET
CINSRT, 7600 /GRP 2 CLA
TAD CHAR
ADCAXR, DCA I XR /STORE THE CHARACTER IN THE LINE BUFFER
ISZ COLCT /ALWAYS BUMP THE COLUMN POINTER
TESTXR, TAD XR
TAD (-ABUF-226
SPA CLA /HAS THE BUFFER OVERFLOWED?
JMP ACHLP /NO - GET NEXT CHARACTER
JMS I (PIPERR
1
TAB, TAD I (COPTSW
SNA CLA /DO WE WANT TO CONVERT?
JMP TABRBT /NO
TABLP, TAD (240
DCA I XR /OUTPUT A SPACE
ISZ COLCT
TAD COLCT
AND (7
SZA CLA /IS THE COLUMN COUNTER A MULTIPLE OF 8?
JMP TABLP /NOT YET
JMP TESTXR /YES - CHECK BUFFER OVERFLOW
TABRBT, TAD CHAR
DCA I XR
CLA CMA
JMS I (RUBOUT /TWO RUBOUTS FOLLOW A TAB
JMP TESTXR /CHECK FOR BUFFER OVERFLOW
VTAB, TAD I (COPTSW
SZA CLA /SHOULD WE CONVERT?
JMP VTLF /YES
TAD CHAR
DCA I XR
TAD (-4
JMS I (RUBOUT /FOUR RUBOUTS AFTER A VERTICAL TAB
JMP I (EOL
FFLF, TAD (-4 /NINE LINE FEED SIMULATE A FORM FEED
VTLF, TAD (-5 /FIVE LINE FEEDS SIMULATE A VERTICAL TAB
DCA TEMP
TAD (212
DCA I XR
ISZ TEMP
JMP .-3
JMP I (EOL /FORM FEED AND VERTICAL TAB ARE LINE ENDERS
FFEED, TAD I (COPTSW
SZA CLA /SHOULD WE CONVERT?
JMP FFLF /YES
TAD CHAR
DCA I XR
TAD (-11 /NINE RUBOUTS AFTER A FORM FEED
JMS I (RUBOUT
JMP I (EOL
CARRET, TAD I (MPARAM
RTL
SMA CLA /"C" SWITCH MEANS DELETE TRAILING BLANKS FROM CARDS
JMP NOTOPT /IT WASN'T ON
TOPT, TAD XR
DCA TEMP
TAD I TEMP
TAD (-240
SZA CLA /WAS THE LAST CHAR ON THE LINE A SPACE?
JMP NOTOPT /NO
CLA CMA
TAD XR /YES - BACK UP THE LINE POINTER
DCA XR
JMP TOPT
NOTOPT, TAD CHAR
DCA I XR /STORE THE CARRIAGE RETURN IN THE BUFFER
JMP TESTXR /CARRIAGE RETURN IS NOT A LINE TERMINATOR
COLCT, 0
OUTOPN, 0
JMS I (OOPEN
SMA CLA
JMP I OUTOPN
JMS I (PIPERR
ASCI5, 5
PAGE
/SUBROUTINES CALLED BY THE REST OF PIP
K770, 770 /** DON'T MOVE THIS CONSTANT
DELETE, 0
TAD P7600
DCA DPFILE
CLA CLL CMA RTL
DCA CHAR /MAXIMUM OF THREE OUTPUT FILES
DELOOP, TAD (7201
DCA DLHNDL
TAD I DPFILE
SNA /DOES THIS FILE EXIST?
JMP I DELETE /THAT'S ALL
JMS I C200
1 /ASSIGN HANDLER FOR THE DELETION
DLHNDL, 0
HLT
TAD I DPFILE /RELOAD DEVICE NUMBER FOR DELETE
ISZ DPFILE /BUMP DPFILE TO POINT TO THE FILE NAME
JMS I C200 /DEVICE NUMBER IN AC
DP4, 4 /CLOSE - USED AS DELETE IN THIS CASE
DPFILE, 0 /POINTER TO FILE NAME
0 /ZERO LENGTH FOR DELETE
JMS I (PIPERR /FILE WASN'T THERE TO BE DELETED
3
TAD DPFILE
TAD DP4
DCA DPFILE
ISZ CHAR
JMP DELOOP /DELETE AS MANY FILES AS HE LISTED(UP TO 3)
JMP I DELETE
DZERO, 0 /SUBROUTINE TO ZERO THE DIRECTORY OF THE
/FIRST OUTPUT DEVICE
JMS I (OTYPE
CLL RTL
SZL /IS DEVICE READ-ONLY?
JMP OZERR /YES - ERROR
RTR
SMA /FILE-STRUCTURED DEVICES WILL HAVE 4000 BIT SET
JMP NONDIR /NON-DIRECTORY DEVICE
AND K770 /MASK OUT DEVICE TYPE
CLL RTR
RAR
TAD (DEVLEN /USE IT TO INDEX A TABLE OF DEVICE LENGTHS
DCA PIPERR
TAD (OUDEVH+1
DCA OZHNDL
TAD I P7600
JMS I C200
1 /ASSIGN DEVICE, FETCH HANDLER
OZHNDL, 0
HLT
TAD I PIPERR
SNA /IS THE LENGTH ZERO?
JMS I (DVREDE /IF SO, GO "READ LENGTH"
DCA PIPERR /STORE LENGTH
TAD I (MPARAM+2 /IF /Y ON, DO SYSTEM ZERO
SPA CLA
JMP ZRO70
TAD OZHNDL /BUT IF NOT, CHECK FOR SYSTEM ZERO
TAD (-7607
SZA CLA
JMP ZRO70+1 /NOT SYSTEM FILES BEGIN AT 7
JMS I (CONFRM /ASK IF HE'S SURE
SYSZRO /V3
ZRO70, TAD (61
TAD (7
DCA I (DFORG
DCA I (SQFLAG /AND CLEAR OUT SQUISHES
TAD PIPERR
TAD I (DFORG
DCA I (DLENGT
JMS I (GETEQ
DCA I (DWASTE /DEFINE # OF WASTE WORDS
DCA I (MPARAM+3 /KILL = OPTION FOR FUTURE /I TRANSFERS
CIF 0
JMS I OZHNDL
5410 /V3 OUTPUT 6 BLOCKS FROM FIELD 1
DIRECT
1 /ALL DIRECTORIES ARE IN RECORD 1
OZERR, JMS I (PIPERR /ERROR WHILE ZEROING DIRECTORY
2
DCA OLDDIR /ZERO DIRECTORY POINTER TO FORCE A NEW READ
NONDIR, CLA /NON DIRECTORY RETURN
JMP I DZERO
PIPERR, 0
P7600, 7600 /V3 CLA
JMS I (SRSTOR /RESET 07600!
CDF 10 /JUST IN CASE
TAD I PIPERR /GET ARG
TAD (ERRTBL
DCA TEMP
TAD I TEMP
JMS I (ERPRNT
JMP I (PIP /RESTART PIP
LEADER, 0
JMS I (OTYPE
C200, AND K770 /GET THE TYPE OF THE OUTPUT DEVICE
TAD (-PTP /IS IT A PAPER TAPE PUNCH?
SZA CLA
JMP I LEADER /NO
TAD P7600
DCA TEMP
JMS I (OCHAR /PUT OUT SOME LEADER
JMP I (AOUERR
ISZ TEMP
JMP .-3
JMP I LEADER
PAGE
/TABLE OF DEVICE LENGTHS FOR /Z OPTION
DEVLEN, 0 /00-TTY
0 /01-PTR
0 /02-PTP
0 /03-CARD READER
0 /04-LPT
0 /05-COM0/1
0 /06-
0 /07-
0 /10-
0 /11-
0 /12-
0 /13-
0 /14-
0 /15-
0 /16-
0 /17-
0 /20-TM8E,MAGTAPE
6437 /21-TD8E
0 /22-BAT
1520 /23-RK8E,RK05
0 /24-NULL
7022 /25 RX01 FLOPPY DISK
17 /26 RL01 DEVICE A OR B
0 /27-
6401 /30-RX50 FLOPPY DISK
4027 /31-RL01 DEVICE C
0 /32-RX02 MUST BE ZERO TO FORCE A READ OF FLOPPY DENSITY
7600 /33-KT8A DEVICE FOR 32-64K MEMORY
7400 /34-KT8A DEVICE FOR 64-96K MEMORY
7200 /35-KT8A DEVICE FOR 96-128K MEMORY
0 /36-ONE OF VT278 SUPPORTED SERIAL DEVICES.
17 /37-RL02 DEVICES A-E
ZBLOCK 40 /SUPPOSED TO BE RESERVED FOR USER DEVICES.
FIXLEN, 0 /ROUTINE TO ESTIMATE OUTPUT FILE LENGTH
TAD I (7600
AND (7760
SZA CLA /DID THE USER PROVIDE AN ESTIMATE?
JMP I FIXLEN /YES - USE IT
DCA CHAR
TAD (7617
DCA TEMP
FIXLP, TAD I TEMP /GET NEXT INPUT FILE
SNA
JMP FIXOVR /NO MORE INPUT FILES
AND (7760
CIA CLL /GET LENGTH AS A POSITIVE NUMBER
/(LENGTH OF ZERO TURNS LINK ON)
TAD CHAR
DCA CHAR /UPDATE CUMULATIVE LENGTH
SZL CLA /DID CUMULATIVE LENGTH OVERFLOW 256 BLOCKS?
JMP I FIXLEN /YES - CAN'T ESTIMATE IT
ISZ TEMP
ISZ TEMP
JMP FIXLP
FIXOVR, TAD CHAR
TAD I (7600
DCA I (7600 /STICK LENGTH IN OUTPUT FILE DESCRIPTOR
JMP I FIXLEN
NOYES, TEXT /NO/
TEXT /YES/
/DATA BLOCK FOR CONFRM:
/CALL+1: POINTER TO QUESTION TEXT
/CALL+2: RETURN HERE IF ANSWER WAS YES
/OTHERWISE RESTART PIP
CONFRM, 0
TAD I (MPARAM+1
RTL /'O' BIT TO SIGN
SPA CLA
JMP GOTCON /V3 'O' MEANS OK, ASSUME 'YES'
TAD I CONFRM /V3
JMS I (ERPRNT
KSF
JMP .-1
JMS I (CTCTST
KRB /LOOK AT HIS REPLY
AND (137 /IGNORE PARITY AND LOWER CASE
TAD (-"Y!7600 /V3
SNA CLA /IS IT YES?
ISZ SQFLAG /SET SQFLAG TO 1 (NEEDED 1 LATER)
TAD SQFLAG /USE SQFLAG AS INDEX FOR MESSAGE
CLL RAL
TAD (NOYES
JMS I (ERPRNT
TAD SQFLAG
SNA CLA
JMP I (PIP
CNFMXT, ISZ CONFRM
JMP I CONFRM
GOTCON, ISZ SQFLAG /SET SQFLAG
JMP CNFMXT /AND TAKE SKIP EXIT
PAGE
/DIRECTORY PRINTER FOR PIP
MDATE=7666
DIRPRE, JMS I (OUTOPN /OPEN THE OUTPUT FILE
TAD (ABUF
DCA CHAR /ABUF WILL BE A TEMPORARY ARRAY OF STARTING FILES
TAD (7617
DCA TEMP
TAD I (7617
SNA
JMS I (DSKNUM
DCA I (7617 /DEFAULT DIRECTORY IS DSK:
DFUJLP, TAD I TEMP
SNA /ARE WE THROUGH WITH THE INPUT DEVICES?
JMP GETDIR /YES
AND (17
DCA I TEMP /ONLY THE DEVICE NUMBER IS IMPORTANT
TAD I TEMP
TAD (DCB-1
DCA PRWD
CLA CLL CML RTL
TAD TEMP
DCA INFPTR /THIS SERVES NO FUNCTION EXCEPT IMPROVING ERROR MESSAGES
TAD I PRWD
SMA CLA /IS THE DEVICE A DIRECTORY DEVICE?
JMS I (PIPERR /NO
6
ISZ TEMP
TAD I TEMP
DCA I CHAR /SAVE THE STARTING BLOCK NUMBER
CLA IAC
DCA I TEMP /READ FROM THE DIRECTORY
ISZ TEMP
ISZ CHAR
JMP DFUJLP
GETDIR, TAD (ABUF
DCA CHAR
JMS PCRLF
TAD I (MDATE
JMS I (PDATE
JMS PCRLF
JMS I (IOPEN /RESET POINTERS - WERE GONNA FAKE OUT THOSE "GENERAL"
/ROUTINES
JMP I (NXTDIR
PRWD, 0 /ROUTINE TO PRINT SIXBIT TEXT
SNA /IS COUNT ZERO?
CMA /MAKE IT ONE
DCA PRCT /STORE COUNT
PRWDLP, TAD I PRWD
PR212, RTR
RTR
RTR
JMS PR6BIT
TAD I PRWD
JMS PR6BIT
ISZ PRWD
ISZ PRCT
JMP PRWDLP
JMP I PRWD
PRCT, 0
PR6BIT, 0
AND (77
SZA
TAD (240 /V3
AND (77 /V3
TAD (240 /V3
JMS I (OCHAR
JMP I (AOUERR
JMP I PR6BIT
PRNUM, 0
DCA PRWD
DCA TEMP
TAD (PWRTEN
DCA PCRLF
PRNMLP, DCA PR6BIT
TAD I PCRLF
SNA
JMP PRLAST /V3
CLL
TAD PRWD
SNL
JMP .+4
DCA PRWD
ISZ PR6BIT
JMP PRNMLP+1
CLA
TAD PR6BIT
TAD TEMP
SNA
PBLJMP, JMP PRBLNK /INCREMENTED BY PDATE TO KILL LEADING BLANKS
TAD (260
JMS PR6BIT
CLA CLL CML RAR
DCA TEMP
ISZ PCRLF
JMP PRNMLP
PRBLNK, JMS PR6BIT
JMP .-3
PRLAST, TAD PRWD /V3
TAD (260 /V3
JMS PR6BIT /V3
JMP I PRNUM /V3
PCRLF, 0
TAD (215
JMS I (OCHAR
JMP I (AOUERR
TAD PR212
JMS I (OCHAR
JMP I (AOUERR
JMP I PCRLF
PWRTEN, -1750;-144;-12;0 /V3
PAGE
/MAIN DIRECTORY PRINTING LOOP
NXTDIR, JMS I (ICHAR /FAKE, FAKE
JMP I (DEND
CLA /WE DON'T WANT THE CHARACTER
DCA ECOUNT
TAD (INBUF-1 /WE WANT THE BUFFER!
NEWSEG, DCA XR
CDF 0
TAD I XR
DCA DCOUNT /NUMBER OF ENTRIES
TAD DCOUNT
CLL
TAD (100
SNL CLA
JMS I (PIPERR
11
TAD I XR
DCA BLOKNO /FIRST BLOCK OF FILE STORAGE
TAD I XR
DCA DLINK /LINK TO NEXT SEGMENT
ISZ XR /BUMP XR PAST FLAG WORD
TAD I XR
DCA WASTE
NAMELP, CDF 0
TAD I XR
SNA /WHAT TYPE OF ENTRY IS IT?
JMP DEMPTY /A FREE FILE
DCA NAME1 /A PERMENANT OR TENTATIVE FILE
TAD I XR
DCA NAME2
TAD I XR
DCA NAME3
TAD I XR
DCA NAME4
TAD I XR
DCA DDATE
TAD WASTE /COMPENSATE FOR THE DATE INCREMENT
CMA /AND THE WASTE WORDS
TAD XR
DCA XR
TAD I XR
SNA /IS IT A TENTATIVE FILE?
JMP ADDLEN+1 /YES - TENTATIVE FILES ARE ALWAYS IGNORED
CIA
DCA FLENGT /NO - STORE THE LENGTH
CDF 10
TAD I CHAR /GET THE STARTING FILE FOR THIS LISTING
CIA CLL
TAD BLOKNO
SNL CLA /ARE WE THERE YET?
JMP ADDLEN /NO - KEEP GOING
CLA CLL CMA RTL
JMS I (PRWD /PRINT THREE WORDS
NAME1, 0
NAME2, 0
NAME3, 0
TAD NAME4
SNA CLA /IS THERE AN EXTENSION?
TAD (-16 /NO - PRINT A BLANK
TAD (56 /YES - PRINT A PERIOD
JMS I (PR6BIT
JMS I (PRWD
NAME4, 0 /ZERO PRINTS AS TWO MORE BLANKS
PRLNGT, TAD DTYPE
AND (100
SZA CLA /WAS THE LISTING SWITCH /F?
JMP PRTCRL /YES - DON'T PRINT LENGTH
TAD FLENGT
JMS I (PRNUM
TAD WASTE
SZA CLA
TAD DDATE
JMS I (PDATE /PRINT THE CREATION DATE OF THE FILE
PRTCRL, JMS I (PCRLF
ADDLEN, TAD FLENGT
TAD BLOKNO
DCA BLOKNO /UPDATE BLOCK NUMBER
ISZ DCOUNT
JMP NAMELP /LOOP UNTIL ALL FILES ARE PROCESSED
TAD DLINK
SNA CLA /MULTI-SEGMENT DIRECTORY?
JMP ENDDIR /NO - FINISH UP
TAD XR
AND (7400
TAD (377 /BUMP XR TO NEXT BLOCK
JMP NEWSEG /PROCESS NEXT LINK
DEMPTY, TAD I XR
CIA
DCA FLENGT /STORE LENGTH OF FREE ENTRY
CDF 10
TAD FLENGT
TAD ECOUNT
DCA ECOUNT /BUMP COUNT OF FREE BLOCKS
TAD DTYPE
AND (200
SNA CLA /IS THE /E SWITCH ON?
JMP ADDLEN /NO - DON'T LIST FREE FILES
TAD (-4
JMS I (PRWD
TEXT /<EMPTY>/
JMS I (PR6BIT
TAD FLENGT
JMS I (PRNUM
JMP PRTCRL
ENDDIR, ISZ CHAR /BUMP TEMP ARRAY TO NEXT ENTRY
TAD ECOUNT
JMS I (ENDFUJ
JMP NXTDIR
PAGE
/BINARY MODE PROCESSOR FOR PIP
BIN360, 360
BINARY, JMS I (FIXLEN
JMS I (OUTOPN
JMS I (IOPEN
JMS I (LEADER /PUT OUT BLANK TAPE IF HS PUNCH OUTPUT
JMS LTCODE
NEWTAP, JMS I (ICHAR
JMP BEOF /END OF FILE ON INPUT
SNA
JMP NEWTAP /BLANK TAPE - KEEP GOING
TAD BN7600
SZA CLA
JMP NEWTAP
JMS I (ICHAR
JMP BEOF
TAD BN7600
SNA
JMP .-4
TAD BIN200
DCA CHAR
TAD CHAR
BIN200, AND BIN360
TAD (-240 /CHECK TYPE OF TAPE
SNA /IS IT RELOCATABLE?
JMP RELBIN /YES
TAD (-40 /IF A FIELD SETTING, IT'S ABSOLUTE
AND (7700
SNA
JMP ABSLUT
TAD BIN200 /CHECK FOR ORIGIN ALSO
SZA CLA
JMP NEWTAP /NOTHING..NEXT FRAME
ABSLUT, CLA CMA
JMS LTCODE
ABSBIN, JMS RCOPY1 /COPY THIS FRAME AND READ NEXT
TAD BN7600
BNM140, SZA CLA /IS IT TRAILER?
JMP ABSBIN /NO - KEEP GOING
BEOT, CLA CMA /END OF TAPE
JMS LTCODE /PUT OUT SHORT LEADER/TRAILER
JMP NEWTAP /GET NEXT TAPE
LTCODE, 0 /SUBROUTINE TO PUNCH 200 CODE
SMA /SHORT LEADER/TRAILER?
JMS I (OTYPE
SPA CLA /DIRECTORY DEVICE?
TAD (70 /YES
TAD (-100
DCA TEMP
LTLOOP, TAD BIN200
JMS I (OCHAR /OUTPUT 64 OR 8 FRAMES OF L/T CODE
JMP I (AOUERR
ISZ TEMP
JMP LTLOOP
JMP I LTCODE
RELBIN, TAD (SKP
DCA I (INCTZF /DISABLE CONTROL-Z CHECKING ON INPUT
CLA CMA
JMS LTCODE /PUT OUT SHORT LEADER/TRAILER
RELLP, TAD CHAR
RTR
RTR
AND (17
TAD (RELTBL
DCA TEMP
TAD I TEMP /GET DATA WORD FOR THIS FRAME
SMA SZA /POSITIVE MEANS SPECIAL OR ERROR
JMP RELERR
RELSNA, SNA
JMP RELEND /ZERO MEANS CHECKSUM FRAME
DCA TEMP /NEGATIVE MEANS COUNT OF NUMBER OF SLAVE FRAMES
JMS RCOPY1
BN7600, 7600
ISZ TEMP
JMP .-3 /COPY THIS FRAME AND ALL SLAVE FRAMES
JMP RELLP /GET NEXT CONTROL FRAME
RELEND, JMS RCOPY1 /COPY THE FIRST FRAME OF THE CHECKSUM
JMS I (OCHAR
JMP I (AOUERR /OUTPUT THE SECOND FRAME
JMP BEOT /END TAPE - START NEXT ONE
BEOF, JMS LTCODE
JMS I (OCLOSE
JMP I (AOUERR
JMP I (PIP
RCOPY1, 0 /ROUTINE TO ADVANCE "CHAR" TO NEXT INPUT CHARACTER
TAD CHAR
JMS I (OCHAR
JMP I (AOUERR
JMS I (ICHAR
JMP INEFER
DCA CHAR
TAD CHAR
JMP I RCOPY1
INEFER, SMA CLA /DETECT FATALITIES
JMS I (PIPERR
7
JMS I (PIPERR /A REAL BAD READ
4
RELERR, CLL RAR
SZA CLA /CODE OF 1 MEANS SPECIAL
JMS I (PIPERR /ILLEGAL RELOCATABLE INPUT
10
JMS RCOPY1
CLL CML CMA RTL /MULTIPLY NAME COUNT BY -6 (APPROXIMATELY)
TAD CHAR
CLL CML RAL /(ACTUALLY THIS PRODUCES -6X-1 WHICH IS WHAT WE WANT)
JMP RELSNA
PAGE
ERPRNT, 0 /ERROR MESSAGE PRINTOUT ROUTINE
DCA TEMP
ERLP, TAD I TEMP
RTR
RTR
RTR
JMS ERPCH /PRINT HIGH-ORDER CHARACTER
TAD I TEMP
JMS ERPCH /PRINT LOW-ORDER CHARACTER
ISZ TEMP
JMP ERLP
ERPCH, 0
AND (77
SNA
JMP ERCRLF /0 CHARACTER TERMINATES
JMS CHPRNT
JMP I ERPCH
FILENR, TAD ("#
JMS I (TTYOUT
TAD INFPTR /GET PTR TO CURRENT INPUT FILE
TAD (321 /MAGIC NUMBER
CLL RAR
JMP FILENR-2
CHPRNT, 0
TAD (-37 /IS IT A _?
SNA
JMP FILENR /YES..PRINT FILE NUMBER
IAC
SNA /MAYBE ^?
JMP I (SQFILE /YEP..PRINT FILE NAME
SPA
TAD (100
TAD (236
JMS I (TTYOUT
JMP I CHPRNT
ERCRLF, TAD (215
JMS I (TTYOUT
TAD (212
JMS I (TTYOUT
JMP I ERPRNT
PDATE, 0 /PRINTS THE DATE
SNA
JMP I PDATE /NO DATE TO PRINT
DCA ERPRNT
ISZ I (PBLJMP
JMS I (PR6BIT
TAD ERPRNT
CLL RTL
RTL
RAL
AND (17
JMS I (PRNUM
TAD (57
JMS I (PR6BIT
TAD ERPRNT
RTR
RAR
AND (37
JMS I (PRNUM
TAD (57
JMS I (PR6BIT
TAD ERPRNT
AND (7
TAD (106
JMS I (PRNUM
CLA CMA
TAD I (PBLJMP
DCA I (PBLJMP /RESET PRNUM TO PRINT LEADING SPACES
JMP I PDATE
DSKNUM, 0
DCA DSKNAM+1
JMS I (200
12
DSKNAM, 5723
0
0
HLT
TAD DSKNAM+1
JMP I DSKNUM
RELTBL, -2;-2;2;-10;-2;-2;-2;2;0;2;-2;2;2;2;2;1
ERRTBL, ERR0
ERR1
ERR2
ERR3
ERR4
ERR5
ERR6
ERR7
ERR8
ERR9
ERR10
ERR11
IFNZRO OS78 <DIRMSG>
PAGE
/ERROR MESSAGE TEXT GOES HERE
ERR0, TEXT /NO ROOM FOR OUTPUT FILE/
ERR1, TEXT /LINE TOO LONG IN FILE_/
ERR3, TEXT /ERROR DELETING FILE/
ERR4, TEXT /INPUT ERROR, FILE_/
ERR5, TEXT /CAN'T OPEN OUTPUT FILE/
ERR6, TEXT /DEVICE_ NOT A DIRECTORY DEVICE/
ERR7, TEXT /PREMATURE END OF FILE, FILE_/
ERR8, TEXT /ILLEGAL BINARY INPUT, FILE_/
ERR9, TEXT /BAD DIRECTORY ON DEVICE_/
ERR10, TEXT /DIRECTORY ERROR/
TTYOUT, 0
TLS
TSF
JMP .-1
CLA
JMP I TTYOUT
PAGE
/SQUISH PROCESSOR
SQUISH, JMS I (CONFRM
SURE /V3
SQUISX, DCA I (OUELEN /INITIALIZE PARAMS TO FAKE OUT "IMTRA"
DCA I (OUBLK
DCA I (7621 /ZERO SECOND FILE FOR "INNEWF"
DCA I (CTCFLG
JMS I (IOPEN
JMS I (INNEWF
JMP I (PIP /NO INPUT
TAD (OUDEVH+1
DCA SOHND
TAD I SQ7600
SNA
JMP I (PIP /NO OUTPUTEE, NO SQUISHEE
JMS I (200
1
SOHND, 0
HLT
JMS INTEST
JMS I (OTYPE
CLL RTR
RAR
AND (77
TAD (DEVLEN
DCA TEMP
TAD SOHND /SET UP OZHNDL
DCA I (OZHNDL /IN CASE OF JMP TO DVREDE
TAD I TEMP /GET ENTRY FROM DEVICE LENGTH TABLE
SNA /IS THE DEVICE LENGTH ZERO ?
JMS I (DVREDE /IF SO, READ THE LENGTH
DCA OUDLEN /SAVE OUTPUT DEVICE LENGTH
JMS I (GETEQ
DCA OUWAST
TAD SOHND
DCA OHNDLR
TAD OHNDLR
DCA I (OUHNDL
TAD I (INHNDL
DCA IHNDLR
JMS SETCTC /DISALLOW ^C DURING SQUISH
JMS I (CTCFLG
CIF 0
JMS I IHNDLR
1400
0
1
JMP I (SQIDER+1
CIF 0
JMS I (7607
5400
0
MTEMP /MOVE THE INPUT DIRECTORY TO SYS:
JMP I (SQIDER+1
CLA IAC
DCA I (SQBUF2+2
DCA I (CTCFLG
TAD SOHND /SETUP DIRECTORY START
JMS I (SQDTST
JMS I (SETSAM /IF IHNDLR=OHNDLR, SAME=1
CLA CMA
DCA I (SQBUF2
DCA I (OUTSEG
JMP I (NEWOUT
INTEST, 0 /TEST IF INPUT IS DIRECTORY
TAD I (7617
AND (17
TAD (DCB-1
DCA TEMP
TAD I TEMP
SMA CLA
JMS I (PIPERR
6
JMP I INTEST
SETCTC, 0 /MODIFY 076000 TO RETURN TO SQCTLC. PREVENTS ^C
/EXIT DURING SYSTEM HEAD MANIPULATION. NORMAL
/^C FUNCTION GETS RESTORED BY SRSTOR.
TAD CDIF10
CDF 0
DCA I SQ7600
TAD (5602 /JMP I .+1
DCA I (7601
TAD (SQCTLC
DCA I (7602
CDIF10, CIF CDF 10
JMP I SETCTC
OUK, 0 /V3 ON IMAGE MODE TRANSFER
/CLOSE OUT FILE WITH = OPTION
/IF NOT TOO SMALL
TAD I (OUCCNT
CLL CIA
TAD I (MPARAM+3
SNL /IS = OPTION LARGER?
SQ7600, 7600 /RETURN OUCCNT IF IT'S LARGER
TAD I (OUCCNT /RETURN LOW ORDER = OPTION IF IT'S LARGER
JMP I OUK
PAGE
NEWIN, TAD (MTEMP-1
DCA INSEG
JMS I (CTCFLG
CIF 0
JMS I (7607
0210
S7200, SQBUF2
INSEG, 0
JMP I (SQIDER
DCA I (CTCFLG
TAD I (SQBUF2+1
DCA INBLK
TAD (SQBUF2+4
DCA INXR
SGETIN, TAD I INXR
SNA
JMP SEMPTY
DCA I OUTXR
TAD OUTXR
DCA OUSAVE
JMS I (CYWAST /COPY WASTE WORDS
TAD I INXR
DCA RECCNT
TAD RECCNT
SNA
JMP SNULL
CMA CLL /V3
TAD OUTBLK
TAD OUDLEN
SZL CLA
JMP SNULER
TAD RECCNT
DCA I OUTXR
CLA CMA
TAD I (SQBUF1
DCA I (SQBUF1
TAD INBLK
CIA
TAD OUTBLK
SNA CLA
TAD SAME
SNA CLA
MOVFIL, JMS I (SQTRA /MOVE THE FILE DOWN
TAD RECCNT
CIA
TAD OUTBLK
DCA OUTBLK
TAD RECCNT
DMTX, CIA
TAD INBLK
DCA INBLK
TAD OUTXR
CIA
TAD OUWAST
TAD OUWAST
TAD (SQBUF1+365
SMA CLA /DO WE HAVE ROOM FOR TWO MORE ENTRIES?
JMP NEXTIN
/DIRECTORY SEGMENT OVERFLOW ON OUTPUT...
ISZ I (OUTSEG
TAD I (OUTSEG
IAC
DCA I (SQBUF1+2 /STORE LINK TO NEXT SEGMENT
TAD I (SQBUF1+2
TAD (-7
SMA CLA
JMP I (SQIDER-1 /TOO MANY SEGMENTS
JMS I (OUTDIR /OUTPUT THIS SEGMENT
NEWOUT, TAD (SQBUF1-1
DCA OUTXR /INITIALIZE XR FOR NEXT OUTPUT SEGMENT
DCA I (OUTINH /ZAP ANY OLD OUTPUT INHIBIT FLAG
DCA I OUTXR
TAD OUTBLK
DCA I OUTXR
DCA I OUTXR
DCA I OUTXR
TAD OUWAST
DCA I OUTXR
NEXTIN, ISZ I S7200
JMP SGETIN
TAD I (SQBUF2+2
SNA /ANY MORE INPUT SEGMENTS?
JMP I (SQOVER
JMP NEWIN
SNULER, TAD (NOROOM
JMS I (ERPRNT
SNULL, CLA CMA
TAD OUSAVE
DCA OUTXR
JMP DMTX-1
SEMPTY, TAD I INXR
JMP DMTX
OUSAVE, 0
SURE, TEXT /ARE YOU SURE?/
SETSAM, 0
TAD IHNDLR
CIA
TAD OHNDLR
SNA CLA
IAC
DCA SAME
JMP I SETSAM
PAGE
SQOVER, DCA I OUTXR
TAD OUDLEN
TAD OUTBLK
SNA
JMP CKZERO
DCA I OUTXR
CLA CMA
TAD I (SQBUF1
DCA I (SQBUF1
CKZERO, TAD I (SQBUF1
SZA CLA
JMP ZEROK
CLA CLL CML RAR
JMS OUTDIR /READ IN LAST DIRECTORY
DCA I (SQBUF1+2 /ZERO OUT LINK WORD
SKP
ZEROK, ISZ OUTSEG
JMS OUTDIR
ZEROKS, JMS SRSTOR
JMP I (PIP
DCA I (SQBUF1+2
SQIDER, JMS OUTDIR
JMS SRSTOR
JMS I (PIPERR
12
OUTDIR, 0
TAD (4210
DCA .+4
JMS CTCFLG
CIF 0
JMS I OHNDLR
0
SQBUF1
OUTSEG, 0
JMP SQIDER+1
DCA CTCFLG
JMP I OUTDIR
SQIOER, TAD (IOMSG
JMS I (ERPRNT
JMP I (SLGRET
SQCTLC, KCC /JUMPED TO BY CODE AT 07600
JMS I (TSTSAM /TEST IF OPERATION IS SYS: TO SYS:
TAD (CTCMSG /YES--PRINT MESSAGE, ELSE TO TO ZEROKS TO REMOVE
/CONTROL C LOCKOUT
JMS I (ERPRNT
TAD CTCFLG
SZA CLA
JMP I CTCFLG /HAS LOCATION TO CONTINUE INTERRUPTED ^C CHECKING
TAD I (MPARAM+1 /IS IT /S?
AND (40
SNA CLA
JMP I (SYSCPY /NO../Y
JMP I (MOVFIL
SRSTOR, 0
JMS I (7700 /MAKE SURE MONITOR IS IN CORE
10
DCA .-2 /AND WIPE THE CALL AWAY
TAD (4207
CDF 0
DCA I (7600
TAD (5000
DCA I (7601
DCA I (7602
CDF 10
JMP I SRSTOR
/IF A ROUTINE CANNOT BE INTERRUPTED, USE THIS ROUTINE TO SET UP
/A RETURN POINT IF ^C IS ENCOUNTERED. SETCTC PATCHES THE NORMAL
/^C EXIT TO COME TO SQCTLC. IF NO RESTART POINT EXISTS (0) AND
/NO Y OR S COMMAND IS IN PROCESS, ^C LOCKOUT IS REMOVED, AND
/THE FILE IS MOVED.
/OTHERWISE ERROR "CANNOT BE INTERRUPTED" IS PRINTED AND OPERATION
/CONTINUED.
CTCFLG, 0
JMP I CTCFLG
CTCMSG, TEXT /SORRY - NO INTERRUPTIONS/
IOMSG, TEXT /I-O ERROR IN ^ - CONTINUING/
NOROOM, TEXT /NO ROOM IN ^ - CONTINUING/
PAGE
K7760, 7760
SYSCOP, TAD K7622 /SET INFPTR IN CASE OF /Y ERROR
DCA INFPTR /WILL FILE #1
JMS I (SETCTC /KLUDGE UP 07600
SYSCPY, TAD (INDEVH+1
DCA YIHAND /SET TO ASSIGN INPUT HANDLER
TAD (OUDEVH+1
DCA YOHAND
TAD (2000
DCA K2000 /THIS MAY GET CLOBBERED READING IN DIRECT.
IAC /V12B
DCA OFSET
TAD I K7617
SNA CLA /IS THERE AN INPUT DEVICE?
ISZ I K7617 /MAKE INPUT =SYS
JMS I (INTEST /SEE IF OPERATIONS ARE TO SAME DEVICE
TAD I K7617
JMS I K200 /ASSIGN HANDLER
1
YIHAND, 0
K7622, 7622 /THINLY DISGUISED HALT
TAD I K7617
K200, AND K7760 /CHECK INPUT FILE LENGTH
SNA /IF BLANK,INPUT SYSTEM HEAD
JMP YSOUT
TAD (-6340 /CHECK FOR PROPER LENGTH
SZA CLA
JMP PER13 /ERROR..NOT SYSTEM HEAD
TAD I (7601 /IS THERE OUTPUT DEVICE?
SZA CLA /IF YES..WE CAN DO IMAGE XFER
JMP I (IMGTST
TAD I (7620
YOUSYS, DCA YINREC /PICK UP STARTING RECORD
CIF 0
JMS I YIHAND /READ IN FIRST INPUT RECORDS
K2000, 2000 /(0-15 IF SYSTEM HEAD,0-7 IF FILE)
OUBUF
YINREC, 0
JMP I (PER4 /INPUT ERROR
TAD I (7620 /IF INPUT FROM A FILE, OPEN
SNA CLA /TEST LOC 605
TAD (3000 /IF FROM HEAD, TEST 3605
TAD (605
DCA I (HDTST
JMS I (TSTHED /TEST FOR VALID SYSTEM HEAD
TAD YINREC
TAD OFSET /BUMP TO NEXT RECORD
DCA NXTRD
TAD I (7600 /IF NO OUTPUT, FORGET IT
SNA
JMP I (PIPCLR /RESET AND GO TO PIP
JMS I K200
1
YOHAND, 0
HLT /V3
JMS I (FAKE
JMS I (SETSAM
JMS I (TSTIO /TEST OUTPUT. SEE IF DIRECT. DEV.
CIF 0
JMS I YOHAND /READ OUTPUT DIRECTORY INTO PLACE
1400
400
1
JMP I (PER4
CDF 0
TAD I (401 /NOW TEST FOR VALID OUTPUT DEVICE
CDF 10
TAD (-10 /IF LESS THAN 10, DON'T XFER
SPA CLA
JMS I (PIPERR
11
TAD (-10 /V12B
DCA YINREC /XFER COUNTER
JMP YDUMP
YLOOP, CIF 0
JMS I YIHAND /READ NEXT
K3400, 1600 /V12B 7 BLOCKS
OUBUF
NXTRD, 0
JMP I (PER4
TAD NXTRD
TAD (7 /V12B
DCA NXTRD
YDUMP, TAD (5600 /V12B
JMS I (OUTDMP /WRITE BUFFER
JMP I (AOUERR
ISZ YINREC /DONE YET?
JMP YLOOP /NOT YET..LOOP
CIF CDF 20
JMP I (RX50CK /THIS WILL RETURN TO PIPCLR WHEN DONE.
YSOUT, TAD I (7601 /HERE IF INPUT FROM SYSTEM HEAD
SZA CLA /IS THERE AN OUTPUT FILE?
JMP I (YTSOUT /YES, SET UP FOR IMAGE MODE
YNOOUT,
TAD (7 /AND RESTART READ AT RECORD 16
DCA OFSET
JMP YOUSYS
OFSET, 0
PER13, JMS I (PIPERR
13
K7617, 7617 /V3
PAGE
DIRECT, -1
DFORG, 0 /FILE STORAGE
0
0
DWASTE, 0 /#WASTE WORDS
0
DLENGT, 0
MOVE, 0
IMGTST, DCA SAME /V12B
TAD I (YIHAND /V12B
DCA IHNDLR /V12B
JMP I (IMAGE /V12B
TAD (6777
MOVE1, DCA TSTSAM
CDF 0
TAD I MWAST
DCA I TSTSAM
CMA
TAD MWAST
DCA MWAST
CMA
TAD TSTSAM
ISZ TEMP
JMP MOVE1
CLA
CDF 10
JMP I MOVE
ERR11, TEXT /BAD SYSTEM HEAD/
YTSOUT, TAD I (7617 /O.K. SETUP CD AREA FOR IMAGE XFER
TAD (7760 /FROM SYSTEM AREA OF INPUT DEVICE
DCA I (7617
TAD I (7617
AND (17
TAD (6360
DCA I (7621
TAD K7
DCA I (7622
DCA SAME /ALLOW ^C IF TO OUTPUT FILE
TAD I (YIHAND /TEST FOT VALID SYSTEM
DCA IHNDLR
CIF 0
JMS I IHNDLR
0200
3400
K7, 7
JMP I (PER4
JMS I (TSTHED
JMP I (IMAGE
TSTSAM, 0
TAD SAME /IF /Y IS TO SAME DEVICE AS INPUT (SYS)
SNA CLA /^C GIVES MESSAGE AND RETRIES OPERATION
JMP I (ZEROKS
JMP I TSTSAM
ERR2, TEXT /OUTPUT ERROR/
SQFILE, DCA MWAST
TAD I (OUSAVE
DCA TSTSAM /IF ERROR DURING /S
DCA DWASTE
CLA CLL CMA RTL
DCA MOVE /-3 FOR FILE NAME
SQFIL3, TAD I TSTSAM /FIRST 2 CHARS. IN NAME
CLL RTR
RTR
RTR
SQFIL5, AND (77
SZA /IF ZERO, DON'T BOTHER
JMS I (CHPRNT
ISZ DWASTE /RIGHT HALF OR NEW WORD?
JMP SQFIL4 /RIGHT HALF
ISZ TSTSAM
ISZ MOVE /EXHAUSTED ALL?
JMP SQFIL3 /NOPE
TAD MWAST /DONE WITH IT YET?
SZA CLA
JMP I (FILENR-1 /YES
TAD I TSTSAM /IS THERE AN EXTENSION?
SNA CLA
JMP I (FILENR-1 /NO..CONTINUE ORIGINAL MSG
TAD (256
JMS I (TTYOUT
ISZ MWAST /SIGNAL END
CLA CMA
JMP SQFIL3-1
SQFIL4, CLA CMA
DCA DWASTE
TAD I TSTSAM /GET RIGHT HALF
JMP SQFIL5
MWAST, 0
DCA TEMP
TAD I INXR
DCA I OUTXR /ROUTINE TO COPY WASTE WORDS
ISZ TEMP
JMP .-3
JMP I MWAST
PAGE
FAKE, 0
TAD I (YIHAND
DCA IHNDLR
TAD I (YOHAND
DCA OHNDLR
DCA I (OUCCNT
DCA I (OUBLK
DCA I (OUELEN
TAD I (YOHAND
DCA I (OUHNDL
JMP I FAKE
CYWAST, 0 /ROUTINE TO COPY WASTE WORDS
CLA CLL CMA RTL /THREE MORE FOR FILE NAME
JMS I (MWAST /COPY THEM
TAD I (SQBUF2+4 /NOW ADJUST I/O WASTE WORDS
CIA
TAD OUWAST /DIFF. BETWEEN OUT AND IN WORDS
SMA /IF <0, MORE OUT THAN IN
JMP CGEWST /POS. MORE IN THAN OUT (OR SAME)
DCA TEMP1
TAD I (SQBUF2+4
SZA
JMS I (MWAST /COPY ALL INPUT WORDS
DCA I OUTXR /AND 0 ALL EXTRA OUTPUT WORDS
ISZ TEMP1
JMP .-2
JMP I CYWAST
CGEWST, DCA TEMP1
TAD OUWAST /XFER ONLY ENOUGH OUTPUT WDS.
SZA
JMS I (MWAST
TAD INXR
TAD TEMP1 /POINT INPUT TO NEXT FILE
DCA INXR
JMP I CYWAST
TSTHED, 0 /TESTS FOR KEYBOARD MONITOR
CDF 0
TAD I HDTST /V12C
CDF 10
TAD (-7200
SZA CLA
JMP I (PER13 /IF NOT CLA, NOT VALID
JMP I TSTHED
HDTST, 3605 /MAGIC LOCATION (205) IN KEYMON TO SEE IF THIS IS
/THE CORRECT SYSTEM HEAD.
TSTIO, 0 /SEE IF OUTPUT IS DIRECTORY DEVICE
JMS I (OTYPE /GET DCB WORD FOR OUTPUT
SMA CLA /IF NOT NEG., NOT DIRECT DEVICE
JMS I (PIPERR
5
TAD OHNDLR /IF OUTPUT=SYS, SET NO INTERRUPT
TAD (171
SNA CLA
ISZ SAME
JMP I TSTIO
ASCI2, 0 /SEE IF VALID ASCII OUTPUT
DCA TSTIO
TAD I (7600
SNA CLA
JMP I (PIP /NO..BACK TO PIP
TAD TSTIO /SEE IF /C IS ON
SNA CLA
JMS I (FIXLEN /NO..TRY TO ESTIMATE OUTPUT
JMP I ASCI2
SQDTST, 0 /ROUTINE TO CHECK /S DIRECTORIES
DCA NOHND /PRESERVE POSSIBLE SYS ON OUTPUT
TAD (7 /DEFAULT TO BLOCK 7
DCA OUTBLK /INITIAL GUESS
CDF 10 /NOW TRY TO READ DIRECTORY OF OUTPUT
JMS I (OTYPE /IF NON-FILE, DON'T READ IT
SMA CLA
JMP P1A
CIF 0 /COULD BE NON-FILE, HOWEVER.
JMS I NOHND
0210
1400
P1, 1
JMP I (SQIDER+1 /ERROR IN READ
P1A, DCA OLDDIR /WIPES ANY DIRECT. SEGMENT
TAD I (1401
TAD (-70 /IS OUTPUT A SYS DEVICE?
SNA CLA
JMP SYSDIR /YES.
TAD NOHND /IS OUTPUT THE SYSTEM DEVICE?
TAD (171
SZA CLA
JMP .+3
SYSDIR, TAD (70
DCA OUTBLK
JMP I SQDTST
NOHND=FAKE
SYSZRO, TEXT /ZERO SYS?/
AOUERR, SMA CLA /WAS IT A DEVICE ERROR OR ARE WE OUT OF SPACE?
JMP BOUERR /OUT OF SPACE
PER2, JMS I (PIPERR
2
BOUERR, JMS I (PIPERR
0
ASCPTCH,TAD (ACHLP+1 /V3C FAKE OUT ICHAR
DCA I (ICHAR /SIMULATE CALL TO ICHAR FROM 'ACHLP'
JMP I (GETNEW /V3C SIMULATE OCCURRENCE OF 8-BIT ^Z IN ICHAR
PAGE
/THIS IS ONCE-ONLY CODE
ONCE, 0
STA
TAD ONCE
DCA ONCENF
TAD (20
DCA I ONCENF /RESTORE L20, DON'T ALLOW REENTRY
CLL CLA IAC RTL
AND I (MPARAM+1
SNA CLA /IS /V SET?
JMP LEVONE /NO RETURN
TAD (VER /YES
JMS I (ERPRNT /PRINT VERSION NUMBER
LEVONE, CLL CLA IAC /CHECK FOR X SWITCH FIRMWARE XFER
AND I (7644
SNA CLA
JMP I ONCE /RETURN
CIF CDF 20 /FOUND IT GOTO FIRMWARE ROUTINE
JMP I (RX50CK
VER, TEXT "PIP: VERSION B5"
ONCENF, 0
GETEQ, 0 /V3
TAD I (MPARAM+3
SNA
IAC
AND (77 /CONVERT 0 TO 1 AND 100 TO 0
CIA
JMP I GETEQ
DVREDE, 0 /READ DEVICE WITH BAD BLOCK REFERENCED
TAD I (OZHNDL /GET DEVICE ENTRY POINT
DCA NEWHL
CIF 0
JMS I NEWHL /DO THE READ
0011
0
-111 /NEGATIVE BLOCK - RETURNS MINUS LENGTH
CIF 10
JMP I DVREDE /ERROR RETURN FOR READ YIELDS DESIRED RESULTS
NEWHL, 0
FIELD 2
*10
XR210, 0
*20
INDRV, 0 /WILL CONTAIN DRIVE# AND DRIVE PAIR INFO FOR INPUT DEV
OUTDRV, 0 /WILL CONTAIL DRIVE# AND DRIVE PAIR INFO FOR OUTPUT DEV
XTEMP, 0
XTEMP1, 0
L70, 70 /THE FOLLOWING DATA IS USED BY 8 BIT HANDLER
K100, 100
BUF, 0
RETRY, 0
SYS, 0
QUO, 0
REC, 0
BC, 0
FN, 0
DENSW, 7000
T1, 0
L12, 12
LM12, -12
L6, 6
LM6, -6
L79, 117
SEEK, 117
/READ 5 BLOCKS FROM INPUT DEVICE
XFER, 0 /CALL I/O ROUTINE FOR 5 BLOCK XFER
TAD I XFER /GET STARTING BLOCK #
DCA XFER1 /AND SAVE IT IN CALL
TAD I XFER
DCA XFER3
ISZ XFER /SETUP RETURN TO CALLER + 2
JMS RXCALL /CALL I/O ROUTINE
0005 /READ 5 BLOCKS
XFER1, 0000 /STARTING BLOCK #
XFER2, 0000 /DRIVE # & SELECT BIT
JMP FRMIN /ERROR RETURN
CLL CLA
/WRITE 5 BLOCKS TO OUTPUT DEVICE
JMS RXCALL
4005 /WRITE 5 BLOCKS
XFER3, 0000 /STARTING BLOCK #
XFER4, 0000 /DRIVE # & SELECT BIT
JMP FRMOUT /ERROR RETURN
CLL CLA
JMP I XFER /ALL DONE LEAVE
/ LOAD COMMAND SUBROUTINE
FLPWC=.
LDCMD, 0
TAD K100 /SET 8 BIT MODE
LCD /AND LOAD IT
JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
CLA IAC
XDR
CLA
JMP I LDCMD /NO RETURN TO CALLER
WAIT, 0
STR /TEST XFER FLAG
SKP
JMP I WAIT /STR FOUND, RETURN TO CALLER + 1
SDN
JMP WAIT+1 /LOOP UNTIL STR OR SDN SETS
ISZ WAIT /SDN FOUND, RETURN TO CALLER + 2
SER /CHECK FOR ANY ERROR CONDITIONS
JMP I WAIT /NONE FOUND RETURN TO CALLER + 2
ERRSET, AC4000 /ERROR FOUND
ISZ RETRY /HAS ERROR RETRY COUND EXPIRED
JMP RECOVR /NO
JMP EXFLD /YES RETURN TO CALLER WITH - AC
FIXIT, 0 /CALCULATE DRIVE NUMBER AND DRIVE PAIR
AND (7
TAD (-7 /IS IT SYS
SNA
JMP YESSYS /NO. SPECIAL CASE
TAD (7 /YES, RESTORE VALUE
CLL RTR
DCA XTEMP
TAD XTEMP /FIND DRIVE #
SPA CLA
IAC
DCA XTEMP1 /AND STORE IT
TAD XTEMP /FINE DRIVE PAIR
RAR
SZL CLA
TAD (20
TAD XTEMP1
JMP I FIXIT /RETURN INFO
YESSYS, CDF 0 /SYS DEVICE GET INFO FROM MAGIC
TAD I (BOOTYP /DRIVE# & PAIR STORED IN HANDLER
CDF 20
JMP I FIXIT
*0200
RX50CK, CLL CLA
CDF 10
TAD I (7617 /IS INPUT DEVICE AN RX50
AND (17
TAD (7757
DCA XTEMP
TAD I XTEMP
RTR
RAR
AND (77 /ALL RX50 DEVICE NUMBERS = 30
TAD (-30 /IS INPUT DEVICE AN RX50
SZA CLA
JMP RX50EX /NO LEAVE
TAD I (7600 /YES, BUT IS OUTPUT DEVICE AN RX50
AND (17
TAD (7757
DCA XTEMP
TAD I XTEMP /GET OUTPUT DEVICE NUMBER
RTR
RAR
AND (77
TAD (-30 /IS OUTPUT DEVICE NUMBER 30
SZA CLA
JMP RX50EX /NO LEAVE
TAD (INDEVH+1 /YES, NOW FIND WHAT DRIVE NUMBER
DCA IN50
TAD I (7617 /SET AC = TO INTERNAL HANDLER NUMBER
CDF 20
SNA
IAC /IF AC = 0 SET DEV SYS
CIF 10
JMS I (200 /CALL USR TO FETCH HANDLER
0001 /FETCH
IN50, 0000 /THIS WILL CONTAIN ENTRY POINT OF HANDLER
HLT
CLL CLA
TAD IN50
JMS FIXIT
DCA INDRV
CDF 10
TAD (OUDEVH+1 /YES, NOW FIND WHAT DRIVE NUMBER
DCA OUT50
TAD I (7600 /SET AC = TO INTERNAL HANDLER NUMBER
CDF 20
SNA
IAC /IF NON ZERO SET DEV TO SYS
CIF 10
JMS I (200 /CALL USR TO FETCH HANDLER
0001 /FETCH
OUT50, 0000 /THIS WILL CONTAIN ENTRY POINT OF HANDLER
HLT
CLL CLA
TAD OUT50
JMS FIXIT
DCA OUTDRV
TAD INDRV /SETUP XFER ROUTINES FOR HANDLER CALL
DCA XFER2
TAD OUTDRV
DCA XFER4
JMS XFER /XFER TRACK 0
0000
JMS XFER
0005
CDF 10 /CHECK FOR /X SWITCH
CLL CLA IAC
AND I (7644
CDF 20
SZA CLA
JMP SKIP /X SWITCH ACTIVE JUMP OVER BLOCK 0 FIX
TAD OUTDRV /FIX BLOCK 0
DCA .+4
JMS RXCALL
0001 /READ 1 BLOCK
0012 /STARTING AT BLOCK 12 (TRK 1, SEC 1)
0000
JMP ZEROIN /ERROR RETURN
STA /FIX DISK ID WORDS IN BLOCK 0
DCA XTEMP /SET UP POINTER
JMS STORE
JMS STORE
AC0002
JMS STORE
IAC
JMS STORE
JMS STORE
JMS STORE
TAD (10
JMS STORE
TAD (10
JMS STORE
TAD (11
JMS STORE
TAD (346
JMS STORE
JMS STORE
IAC
JMS STORE /ALL DONE SO
TAD OUTDRV /WRITE TRK 1, SEC 1 BACK OUT
DCA .+4 /THAT IS BLOCK 0
JMS RXCALL
4001
0012
0000
JMP ZEROUT /ERROR RETURN
JMP SKIP
PAGE
SKIP, CLL CLA /XFER LAST 2 TRACKS
JMS XFER
1414
JMS XFER
1421
JMS XFER
1426
JMS XFER
1433
RX50EX, CLL CLA /LEAVE
CIF CDF 10 /RETURN TO PIP
JMP I (PIPCLR
STORE, 0 /STORE BLOCK 0 ID WORDS IN BUFFER AREA
ISZ XTEMP
NOP
CDF 30
DCA I XTEMP
CDF 20
JMP I STORE
FRMIN, JMS PNTERR /ERROR READING FIRMWARE
FRMTXT
JMS PNTERR
INTXT
JMS PNTERR
CRLF
JMP RX50EX
FRMOUT, JMS PNTERR /ERROR WRITING FIRMWARE
FRMTXT
JMS PNTERR
OUTTXT
JMS PNTERR
CRLF
JMP RX50EX
ZEROIN, JMS PNTERR /ERROR READING BLOCK 0
RDTXT
JMS PNTERR
ZROTXT
JMS PNTERR
OUTTXT
JMS PNTERR
CRLF
JMP RX50EX
ZEROUT, JMS PNTERR /ERROR WRITING BLOCK 0
WRTTXT
JMS PNTERR
ZROTXT
JMS PNTERR
OUTTXT
JMS PNTERR
CRLF
JMP RX50EX
PNTERR, 0 /PRINT ERROR MESSAGE
CLL CLA CMA
TAD I PNTERR
DCA XR210
ISZ PNTERR
PNTLOP, TAD I XR210
SNA
JMP I PNTERR
TLS
TSF
JMP .-1
CLA
JMP PNTLOP
PAGE
FRMTXT, "F;"i;"r;"m;"w;"a;"r;"e;" ;"e;"r;"r;"o;"r;" ;"o;"n;" ;0
INTXT, "i;"n;"p;"u;"t;" ;"d;"e;"v;"i;"c;"e;".;0
OUTTXT, "o;"u;"t;"p;"u;"t;" ;"d;"e;"v;"i;"c;"e;".;0
RDTXT, "E;"r;"r;"o;"r;" ;"r;"e;"a;"d;"i;"n;"g;" ;0
WRTTXT, "E;"r;"r;"o;"r;" ;"w;"r;"i;"t;"i;"n;"g;" ;0
ZROTXT, "b;"l;"o;"c;"k;" ;"0;" ;"o;"n;" ;0
CRLF, 15;12;0
PAGE
/HANDLER ROUTINE MAX XFER IS 10 PAGES (5 BLOCKS)
/THIS ROUTINE CAN XFER A HALF OF A BLOCK IF RXCALL START UP CODE
/IS MODIFIED. THE I/O ROUTINE IS A MODIFIED RX50 NONSYSTEM HANDLER
/TO READ AND WRITE IN 8 BIT MODE. TO GET A BETTER UNDERSTANDING
/OF WHAT IS HAPPENING HERE REFER TO THE RX50 NONSYSTEM HANDLER.
RXCALL, 0
CLL CLA
TAD (-6
DCA RETRY
RSTART, CLL CLA
TAD RXCALL
DCA SYS /POINTER TO ARG'S, EXIT
TAD I SYS /SET UP READ WRITE WORD
RAL
SNL CLA
AC0002
DCA FN
AC3777 /MASK OUT R/W BIT
AND I SYS /SET UP LOOP CONTROL COUNT
BSW
CLL RTL
RAL
AND L7600
CIA
DCA BC /-# OF BYTES TO XFER
ISZ SYS
TAD I SYS
DCA REC /BLOCK ADDRESS
ISZ SYS
IAC
AND I SYS
SEL
CLL CLA
TAD I SYS
AND (7776
TAD FN
DCA FN
ISZ SYS /SET UP FOR ERROR RETURN
DCA BUF /BUFFER IS AT LOC 0 FIELD 0
JMS DIVSUB /CALL DIVISION SUBROUTINE OTHER PAGE
AC0002 /MASK OUT READ WRITE BIT
AND FN /SPLIT READ AND WRITE
SZA CLA /SKIP IF WRITE
JMP STREAD /READ GOES TO START IN MIDDLE OF LOOP
/WRITE FALLS THRU TO NEXT LISTING PAGE
/WRITE FALLS THRU TO THIS LOOP
/
/ TOP OF MAIN LOOP
/
TOP, TAD FN /SET SILO TO LOAD-UNLOAD
JMS LDCMD /COMMAND TO CONTROLLER
TAD DENSW /MAKE SILO LOOP COUNT, 7400 FOR RX50
DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY
CLL /FLAG FOR BC OVERFLOW
TRLOOP, TAD FN
AND (2
CDF 30
SNA CLA /NO WRITE GET DATA
TAD I BUF /IN CASE WRITE, FETCH A WORD
CDF 20
JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
XDR /TO OR FROM AC
SZL /LINK SET IF BLOCK COUNT EXPIRED, ODD PAGE THING
JMP INCWC /THROUGH AWAY DATA, JUST COUNT TRANSFERS
CDF 30
DCA I BUF /STILL WORDS TO GET
CDF 20
ISZ BUF
REMD, 0 /HOME FOR SECTOR NUMBER, ALWAYS 00XY, HENCE NOP
ISZ BC /TEST FOR END OF TRANSFER
SKP /NO, GO ON
STL /YES
INCWC, CLA
ISZ FLPWC /256 WORD COUNTER
JMP TRLOOP
JMS WAIT /WAIT FOR SDN
JMP ERRSET
TAD BC /WENT TO ZERO IF TRANSFER COMPLETE
SZA CLA
JMP STREAD
AC0002
AND FN
SZA CLA
JMP EXIT
STL /INDICATES THAT BLOCK COUNT HAS EXPIRED
/
/ MIDDLE OF MAIN LOOP
/
STREAD, TAD K4 /LEAVE THE LINK ALONE
TAD FN /TURNING SILO COMMAND INTO READ-WRITE COMMAND
JMS LDCMD /I/O COMMAND TO CONTROLLER
TAD REMD /PRECOMPUTED SECTOR #
JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
XDR
L7600, 7600 /CLEAR AC, AND IS LITERAL
JMS WAIT /WAIT FOR STR
SKP
JMP ERRSET
TAD QUO
XDR /TRACK # IS ALWAYS NON0 !!
ISZ REC /MOVE TO NEXT RECORD NUMBER
JMS DIVSUB /DO TRACK SECTOR FOR NEXT OPERATION
JMS WAIT /WAIT FOR SDN
JMP ERRSET
SNL CLA /EXIT IF LINK SET, DIVIDE ROUTINE MUST PRESERVE !!
JMP TOP /STILL MORE
EXIT, ISZ SYS /KICK TO OK EXIT
EXFLD, DCA BUF
SEL
TAD BUF
CDF 20
JMP I SYS /OUT
K4, 4 /MAKES 0 GO TO 4 AND 2 GO TO 6
PAGE
/ DIVSUB
/
/ CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR #
/ ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE
/
DIVSUB, 0
CLA
DCA QUO /CLEAR DIVIDE QUOTIENT
RAR
DCA SAVL /SAVE THE CONTENTS OF THE LINK
TAD REC /THIS FOR TRACK-SECTOR
SKP
DIVLOO, ISZ QUO /MAIN DIIVIDIE LOOP
TAD LM12 /DIVIDE BY 10 TO GET TRACK
SMA /SKIP IF DONE
JMP DIVLOO
TAD L12 /REMAINDER 0-9
DCA T1 /HOLD IT IN TEMPORARY
TAD T1 /FOR INTERLEAVE OF 3
TAD T1
TAD T1
CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0
TAD LM12 /DIVIDE BY 10 TO GET SECTOR
SMA SZA /SKIP IF DONE
JMP .-2
TAD L12 /RESTORE POSITIVE VALUE TO BE SECTOR
DCA REMD
TAD SAVL
CLL RAL /RESTORE LINK
JMP I DIVSUB /OUT
SAVL, 0 /TEMPORARY SO WE CAN SAVE LINK THROUGH ALL THE
/EVIL ARITHMETIC
RECOVR, TAD SEEK /ERROR RETRY ROUTINE
SNA CLA /THIS WILL ALTERNATE BETWEEN TRACKS 1 AND 79
TAD L79
DCA SEEK
TAD FN
AND (20
TAD L6
JMS LDCMD /AND LOAD IT
JMS WAIT /WAIT FOR OPERATION TO COMPLETE
SKP /STR NORMAL RETURN
JMP ERRSET /DONE ERROR RETURN
CLA IAC /SELECT SECTOR 1
XDR
CLA
JMS WAIT /WAIT FOR OPERATION TO FINISH
SKP
JMP ERRSET
TAD SEEK /SEEK TO TRACK 1 OR 79
XDR
JMS WAIT /WAIT FOR OPERATION TO COMPLETE
JMP ERRSET
JMP RSTART