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
/
os278.pa
< prev
next >
Wrap
Text File
|
1992-09-18
|
89KB
|
4,358 lines
/OS278 SYSTEM MONITOR
/ADAPTED FROM:
/12 OS8 MONITOR SYSTEM OS8 VERS. 3F
/
/
/
/
/
/
/
/
/
/COPYRIGHT (C) 1970,1971,1972,1973,1974,1975,1977
/ 1982 BY DIGITAL EQUIP. CORP.
/
/
/
/
/
/
/
/
/
/
/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.
/
/
/
/
/
/
/
/
/
/
/13-APRIL-1977 RL/EF/HJ/SR
/THIS VERSION OF OS/8 IS THE BATCH OPERATING SYSTEM
/AS WELL AS THE STANDARD KEYBOARD SYSTEM. THIS SYSTEM
/IS EXTERNALLY COMPATIBLE WITH ALL PREVIOUS OS/8-PS/8
/USER PROGRAMS. HOWEVER, INTERNALLY THE SYSTEMS ARE
/QUITE DIFFERENT. THE MARCH 1972 OS/8 WILL NOT RUN BATCH.
/THIS VERSION IS COMPATIBLE WITH CCL.
/ SYMBOLIC REFERENCES TO VARIOUS OVERLAYS:
MEOVLY=26 /DIRECTORY OVERFLOW OVERLAY FOR "ENTER"
MCDREC=51 /COMMAND DECODER
MSOVLY=54 /"SAVE W. ARGS" OVERLAY
MSOVL2=55 /SECOND PART OF SAVE W. ARGS
MERRTN=56 /MONITOR ERROR ROUTINE
MRUNRC=57 /"CHAIN" OVERLAY
ODTREC=60 /SYSTEM ODT
MFREE=70 /BEGINNING OF FILE STORAGE
CCB=7400
CSOVLY=400
RSOVL1=1400
RSOVL2=2000
EXOVLY=64 /EXTENDED MEMORY OVERLAY
LXM=6200 /EXTENDED MEMORY LOAD INSTRUCTION
VERSNO="B&77
PATCHLEV="3
VERDATE=5604 //FOR THE INITIAL DIRECTORY TRANSFERRED UNDER BUILD.
//DATE IS 16-NOV-82. SEE "DPROPR" IN ABSLDR.
/V3 CHANGES:
/1. CCL SUPPORT
/2. FIXED KILLER CLOSE BUG
/3. ADDED VERSION NUMBER
/4. ^U, RO TO BOL, AND LF ALL PRINT '.' AGAIN
/5. CALL TO USR WITH CODE OF 0 GIVES ERROR
/6. MONITOR ERROR MESSAGES NOW GIVE EXPLANATION
/7. ENTER NOW MOVES 7 FILES TO MAKE ROOM INSTEAD OF HALF SEGMENT
/8. DIRECTORY VERIFICATION HAS IMPROVED
/V3 FIXES TO ABSLDR:
/1. ALLOWED PARITY ^C
/2. PUT IN SELF-STARTING STUFF
/3. FIXED CCB BUG FOR 17600
/FIXES TO FIELD RELEASE
/1. ABSLDR CHECKS PAGE 0 LITERALS
/2. FIXED BUG RE MONITOR ERROR MESSAGES
/3. ADDITIONAL INFO FIX
/4. BATCH FIX
/FIXES FOR MAINTENANCE RELEASE:
/1. CHANGED VERSION NUMBER OF MONITOR TO V3M
/2. INCORPORATED PATCH RE LOC 13121 AFTER MONITOR ERROR
/ [SEQ #1, DSN APRIL 1975]
/3. ALLOW CHAIN TO WORK ON FULL FIELD SAVES
/ [SEQ #2, DSN JUNE 1975]
/4. ALLOW ABSLDR/I TO WORK ON FULL FIELD CORE IMAGES
/ [SEQ #1, DSN OCTOBER 1975]
/5. ADDED INTERNAL VERSION NUMBER TO ABSLDR AT LOCATION 2200
/ MAINT. RELEASE VERSION # IS V4
/6. SET INITIAL ABSLDR DATE TO 1-NOVEMBER-1975
/V3D AND OS/78 CHANGES:
/1. ACCEPT DEC STANDARD DATE FORMAT FOR INPUT (DD-MMM-YY)
/2. CHANGED VERSION NUMBER TO V3Q
/3. ADDED DATE/78 CHANGES
/4. FIXED BUG ABOUT WAITING FOR TTY FLAG & BATCH
/5. ADDED STUFF FOR LINKER [USES SOFSET]
/6. CHANGED ABSLDR DATE TO 1-JUNE-77
/7. DISALLOW RUN OF PROGRAM WITH BIT 4 OF JSW ON [OS/78 ONLY]
/8. ASSIGNED RESIDENT BITS FOR SCOPE AND OS/78
/9. ALLOW @ IN KBM COMMAND
/10. COULD RUN INIT.CM ON SYSTEM START-UP
/11. CHANGED BAD CORE IMAGE MSG TO CORE IMAGE ERR
/12. CHANGED ABSLDR/I SO THAT IT SETS UP JSW AND SA
/V3F CHANGES:
/1. ADDED MONITOR SUPPORT FOR KT8A
/ A. R,RUN, GET COMMANDS NOW LOAD 128K
/ B. SAVE COMMAND CAN SAVE UP TO 128K
/2. ADDED HIGROUND SUPPORT
/3. ABSLDR ALSO UPDATED TO SUPPORT 128K
/V4 CHANGES:
/1. ADAPTED TO RUN ON A VT278. THE PRIMARY CHANGES ARE:
/ A. CHANGED THE SENSE OF THE TTY I/O FLAGS TO SUPPORT THE
/ VT278. CAN NO LONGER WAIT ON A TSF JMP .-1 FOR A MECHANICAL
/ TTY TO COME UP. KCC IS TREATED AS A LOGICAL "KEYBOARD
/ ENABLE", NOT AS A CLEAR (ENABLE) RECVR FLAG.
/ B. THE CONVENTION IS ESTABLISHED THAT THE KEYBOARD SHOULD BE
/ ENABLED UPON EXIT FROM A PROGRAM. ALL OS/8 (OS/78) UTILITIES
/ AND MONITOR ROUTINES WILL ASSUME THE KEYBOARD MAY NOT HAVE
/ BEEN ENABLED. THUS, A KCC OR KRB WILL BE ISSUED PRIOR TO EXPECTING
/ ANY TTY INPUT.
/ C. ON A VT278, THE IOT 01 (6031,6041) ON THE TTY WILL CLEAR THE
/ FLAG AFTER TESTING IT. THUS THE SEQUENCE KSF JMP .-1 KRS ...
/ KSF JMP .-1 IS NOT PERMITTED UNLESS A KCC OR KRB INSTRUCTION
/ HAS BEEN ISSUED BETWEEN THE KSF INSTRUCTIONS. THE SAME APPLIES
/ TO TTY OUTPUT.
/ D. KT8A INSTRUCTIONS FOR MEMORY ABOVE 32K CONFLICT WITH CONTROL
/ PANEL MEMORY INSTRUCTIONS FOR THE VT278. FOR STANDARD OS/78
/ V4 PROGRAMS, ROUTINES USING LXM AND RXM INSTRUCTIONS ARE
/ DISABLED WITH THE "SET SYS OS278" COMMAND. USER PROGRAMS
/ CAN SENSE THE "OS278 BIT" (BIT 9 OF OS78 WORD IS SET) TO TREAT
/ THE SITUATION AS THEY WISH.
/ E. DEFAULT IS SCOPEBIT SET
SCOPBIT=7602
/2. INCLUDED ALL PATCHES PUBLISHED IN DSN SERIES SINCE THE RELEASE OF V3:
/
/ A. FIXED CCB BUG IN RUN COMMAND FOR KTA8 EXTENDED MEMORY (AT RUN2)
/ B. ABSLDR /I BUG WITH KT8A MEMORY
/OS278
/VB0 INITIAL VERSION
/VB1 CHANGED PROMPT FROM . TO >
/VB2 CHANGED PROMPT FROM > TO }
/04-JAN-82 ADDED LOWER CASE INPUT
EJECT OS78 V4 KEYBOARD MONITOR
/KEYBOARD MONITOR. LIVES IN BLOCK 7-12. AFTER A KYMON COMMAND HAS BEEN
/DETECTED THE TOP PORTIONS OF KMON CAN BE USED FOR OVERLAY AREAS, SO
/DON'T EXPECT MUCH TO BE PRESENT FROM 0-1777 ONCE THINGS GET ROLLING!
FIELD 0
MTHREE=CLA CLL CMA RTL
*200
PRINT, JMP I HNDL /MUST BE AT 200 FOR BATCH
NOP /****GETS CIF CDF N FOR BATCH*****
TLS /****GETS JMP I .+1******
TSF /*GETS BOSPRT*****
JMP .-1 //V4: V3 USED TO WAIT FOR TTY FLAG.
CLA //V4: NOP ABOVE NECESSARY TO KEEP THIS CLA HERE FOR
// PIP, AND WHO KNOWS WHAT ELSE.
TAD [7000 //V4: DUMB, BUT WON'T HURT ANYTHING.
DCA PRINT+1
JMP I PRINT
GETNAM, 0 /ROUTINE TO ACCESS TTY INPUT
DCA NM1 /FIRST OFF,INITIALIZE
DCA NM2 /SET UP SYMBOLS FOR STORING NAME
DCA NM3
DCA NM4
TAD TNM1
DCA PN
CLA CMA
DCA PRDSW
GTNMX, DCA NMCT
TAD I LXR /LOCATE FIRST CHARACTER
TAD M240 /IS IT A SPACE?
SNA /IF SO TEST NEXT CHARACTER
JMP .-3
TAD [240 /WE'VE GOT FIRST CHARACTER
SKP
GTNMLP, TAD I LXR /GET ANOTHER CHARACTER
DCA TMP
TAD TMP
TAD M256 /IS IT A PERIOD?
SNA
JMP PERIOD /IF SO, PROCESS IT
TAD [-2
CLL
TAD M12
SNL CLA /IS IT GT ASCII CHARACTER (#9)?
JMP NINSRT /IF NO, INSERT IN NAME
TAD M301
TAD TMP
CLL CML
TAD [-32
SNL CLA /IS IT GT ASCII(Z),IF SO
JMP EONAME /END OF NAME
NINSRT, TAD NMCT /CHECK FOR MAXIMUM CHARS
TAD [-6
SMA CLA
JMP GTNMLP /IF MAXIMUM SAVE NO MORE
TAD NMCT /SET UP POINTER TO STORE CHARACTER
CLL RAR
TAD PN
DCA TEMP1 /HERE IS POINTER TO NM1,NM2,ETC.
TAD TMP
AND [77 /ISOLATE SIX BITS FOR STORAGE
SZL
JMP .+4 /NO MORE ROOM
RTL
RTL
RTL
TAD I TEMP1 /OR IT IN AND STORE
DCA I TEMP1
ISZ NMCT
JMP GTNMLP
PERIOD, ISZ PRDSW
JMP EONAME
ISZ PN
TAD N4
JMP GTNMX
EONAME, TAD NMCT
SZA CLA
ISZ GETNAM
JMP I GETNAM
HNDL, 4000 /ROUTINE TO RELOAD NON-SYS HANDLER FOR SAVE ROUTINE
JMS I [SHNDLR
0200 /READ TWO PAGES
1000 /INTO 1000
LDBLK, 0 /SET UP BY SAVE ROUTINE
JMP KMONER
JMP I HNDL
PRINTQ, JMS PRMESG
TEXT /?/
0
KMER3, JMS I [PRMESG
TEXT /NO/
TNM1, NM1
M240, -240
*325
PRINLP, JMS PRWD
ISZ PRMESG
SKP
IFNZRO .-330 <CCLTRB,ERRR>
PRMESG, 0 /ERROR MESSAGE PRINTING ROUTINE
CLA
TAD I PRMESG
SZA
JMP PRINLP
NOP //V4: NO NEED FOR V3 WAIT. TSF
NOP // JMP .-1
JMP I ERRET /RETURN TO MONITOR
PRWD, 0
DCA TMP
TAD TMP
RTR
RTR
RTR
JMS PCHAR
TAD TMP
JMS PCHAR
JMP I PRWD
PCHAR, 0
AND [77
SNA
JMP I PCHAR
TAD [240
AND [77
TAD [240
JMS I PCH
JMP I PCHAR
M12, -12
M256, -256
M301, -301
N4, 4
*367
SAVE12, JMS I [SHNDLR /RELOAD THE USR (I/O MONITOR) AND RETURN TO
/THE KEYBOARD MONITOR (KEYMON) WHEN EXITING
/FROM SAVE COMMAND.
0610
0
MONTOR
JMP KMONER
CLA CMA
CDF 10
DCA I [7700 /MCALL1. A -1 SAYS USR HAS BEEN LOADED.
JMP I [7605
*400 //THIS PAGE LIVES IN BLOCK 10 OF THE "HEAD". USEFUL
//INFORMATION WHEN FIGURING OUT WHAT SET DOES.
KMNTRY, JMP I GDEVNO /V3
0 /FREE LOCATION !
PCRLF, JMS I [CRLF
IFNZRO .-403 <BTCHER,XXXX>
KEYMON, JMS I GLINE
TAD [BEGLN-1 /ADDRESS REFERENCED BY INIT
DCA LXR
JMS I GNAME
/V3D JMP I [PRINTQ
XXX=[PRINTQ /NEED LITERAL IN SAME PLACE
NOP /V3D ALLOW @ IN NAME
JMS I [SRCH
-123; ASSIGN
-2301; SAVE
-2225; RUN
-705; GET
-2200; R
-2324; START
-1704; ODT
-0405; DEAS
IFNZRO .-431 <SEECCL,ZZZ>
-0401; DATE
0
JMP I .+1
CCLSW, PRQMRK /MODIFIED FOR CCL TO 'GETCCL'
IFNZRO CCLSW-435 <SEECCL,ZZ>
ASSIGN, TAD [12
JMS GDEVNO
TAD [UDNAME-1
DCA TM1
JMS I GNAME
JMP ASGN2+1 /NO USER DEV. DO A DEASSIGN
TAD NM2 /SEE IF WE HASH IT
SNA
JMP ASGN2 /DON'T HASH..ONLY 1 OR 2 CHARS
TAD NM1
RAL /LINK BECOMES 4000 IF NECESSARY
CLA CML RAR
TAD NM2
ASGN2, TAD NM1
JMP I [ASDONE
R, DCA I [GETSW
TAD P6203
JMS I [RESET
ISZ RUNSW
TAD [SHNDLR
DCA HANDAD
CLA IAC
JMP RGETPG
GDEVNO, KMINIT
DCA ASNM1-1
JMS I [MINCOR
JMS I GNAME
JMP I [KMER4
TAD NM1
DCA ASNM1
TAD NM2
DCA ASNM1+1
TAD HNDLAD
DCA HANDAD
CIF 10
JMS I SYSTEM
1
ASNM1, 0;0
HANDAD, KMINIT /ENTRY FOR "INIT" DRIVEN SYSTEM
JMP I [KMER1
TAD ASNM1+1
JMP I GDEVNO
GET, TAD [SKP
RUN, DCA I [GETSW
TAD P6203 /RESET JSW FOR OPTIMUM BATCH USE
JMS I [RESET /RESET DEVICE HANDLER TABLE
DCA RUNSW
CLA IAC
JMS GDEVNO
RGETPG, JMS RSCOMN
JMS I [MINCOR
TAD SENTER
CIF 10
JMS I SYSTEM
2
PGNAME, NM1 /LOOKUP THE FILE NAME REQUESTED
MOVBUF /USED AS POINTER TO FIELD 1 SR
JMP I [KMER2
JMP I [RLOADR /THEN GO TO IT.
RSCOMN, 0
DCA SENTER
TAD HANDAD
DCA DEVHND
JMS I GNAME
JMP I [KMER4
TAD NM4
SNA
TAD [2326 /DEFAULT EXTENSION IS .SV
DCA NM4
JMP I RSCOMN
SAVE, TAD [SAVE12 /CHANGE ERROR RETURN ADDRESS AS WE WILL DESTROY
/F0 AND F1 MONITOR.
DCA ERRET
TAD I [JSBITS
JMS I [RESET
CIF 10 /MOVE THE LINE BUFFER TO 1600 DURING
JMS I PGNAME+1 /A SAVE, AS HANDLER WIPES IT OUT
TAD LXR /LET'S MOVE THE REGISTER AROUND
TAD [SVLNBF-BEGLN
DCA LXR
TAD [1001
DCA HNDLAD
CLA IAC
JMS GDEVNO
JMS RSCOMN
JMP I [SAVE2
HNDLAD, /REPLACED WITH 1001 BY SAVE
WRCTLB, 7001 /WRITE OVERLAY AND CCB
JMS I [SHNDLR
4600
6200
MTEMP+6
JMP KMONER
JMP I WRCTLB
/LOADS SYSTEM ODT OVER THE MONITOR
ODT, JMS I PGTOUT
JMS I [SHNDLR
1001
0
ODTREC
IFNZRO .-600 <ODTERROR> //ODT RESUMES AT 601 AFTER OVERLAYING.
*600
START, DCA TEMP1
DCA TEMP2
TAD I LXR /V3
SZA /V3
JMP I STRTX /V3 (V4: USED TO BE ON PAGE 0)
TAD I [JFIELD
DCA I [MSTCDF
TAD I [JSBITS
AND [1000
SZA CLA
JMP I [KMER3
TAD I [JSBITS
JMS I [RESET /RESET ONLY IF NO START ADR SPECIFIED
TAD I [JSTART
STCOMN, DCA I [MSTADR
NOP //V4: V3 WAITED. V4 DOESN'T TSF
// JMP .-1
//NOP PLACE HOLDER ONLY BECAUSE LOCATION SHIFTS
//IN OS8 HAVE TOTALLY UNPREDICTABLE EFFECTS!
JMS I PGTOUT
TAD I [JSBITS
SPA CLA
JMP I [MSTCDF
TAD [SHNDLR
DCA I [MREAD-1
TAD [1000
DCA I [MREAD+1
DCA I [MREAD+2
TAD [MTEMP+4
DCA I [MREAD+3
TAD FUDJMP
DCA I [MSWITC
JMP I [MREAD
MINCOR, 0
CIF 10
JMS I SYSTEM
10
CDF 10
DCA I [OLDT9 /ZERO OUT "DIRECTORY IN CORE" KEY
CDF 0
TAD [200
DCA SYSTEM
JMP I MINCOR
RLOADR,
RUN1, TAD I [PGNAME
DCA FILE
JMS I DEVHND
0101
CCB
FILE, 0 /READ IN THE HEADER BLOCK
JMP KMONER /ERROR WHILE READING HEADER BLOCK
TAD I [CCB
JMS I [CCBTST /TEST FOR VALID CORE CONTROL
TAD I [CCB+3 /V3D
RAL /V3D
JMS I KRCHK /V3D CAN'T RUN SYSTEM CUSP UNDER OS78
TAD I [CCB+1
DCA I [MSTCDF
TAD I [CCB+2
DCA I [MSTADR /MOVE THE STARTING ADDRESS INTO UPPER CORE
TAD I [CCB+1
DCA I [JFIELD
TAD I [CCB+2
DCA I [JSTART
TAD I [CCB+3 /SET UP THE JOB INFORMATION AREA
JMS I [RESET /AND CLEAR INFORMATION ABOUT "RUN" HANDLER
TAD FUDJMP
DCA I [MSWITC /SET MSWITC TO INHIBIT LOADING 7400
GETSW, SKP /SKP FOR GET, NOP FOR RUN
JMP RUN2
TAD P6203
DCA I [MSTCDF
TAD [7600
DCA I [MSTADR /IF A GET, SET STARTING ADDRESS TO RETURN
/TO MONITOR
RUN2, TAD I R7400X //V4: SYSGEN PATCH 1 OF 4 LINES V3: EXTMP
CLL CMA RAL /POINT TO LAST DOUBLEWORD IN CCB
TAD TCCB4 /CCB4=CCB+4
DCA TM1 /TM1 POINTS TO SEG. ADDRESS
TAD I TM1 /STORE ADDRES TO READ POSSIBLE OVERLAY
DCA I [MREAD+2
ISZ TM1 /POINT TO SEGMENT CONTROL WORD
TAD DEVHND /IF THE HANDLER IS IN 7600, OR
TAD [200 /IF THE SEGMENT DOES NOT LOAD OVER
CLA RAL /7000, NO OVERLAY IS NEEDED. ALSO IF
TAD I TM1 /THE SEGMENT IS IN FIELDS 1-7.
AND [77
RUN5A, SZA CLA
JMP I [RUN6 // 2/4 V3: RUNVI /NO PROBLEMS.. READ STUFF IN
TAD I [MREAD+2 /SEE IF WE OVERLAY 7000
CLL CML RAR
TAD I TM1 /ADD IN CONTROL WORD
TAD [300
SPA /IF NEGATIVE, 7000 IS NOT OVERLAYED
JMP RUN5A
TAD [7600 /GETS 0, 100, 200, OR 300
SMA /IF POSITIVE READ 3 PAGE OVERLAY
ISZ I [PGNAME+1 /POINT TO NEXT TO LAST RECORD
TAD [300
DCA RDCNT
TAD I [PGNAME+1
CMA /GET RECORD TO READ OVERLAY FROM
TAD FILE
DCA R7000
JMS I DEVHND /READ OVERLAY FROM THE FILE INTO PAGES
RDCNT, 0 /BEFORE CCB
6200 /THEN WRITE THE WHOLE MESS OUT
R7000, 0
JMP KMER1 /NOT AVAILABLE
JMS I [WRCTLB /WRITE OUT THE OVERLAY+CCB
DCA .-1 /BUT ONLY ONCE!!
ISZ RUNSW
DCA I [MSWITC /ENABLE READ OF OVERLAY
TAD RDCNT /SEE IF THIS SEG IS EXHAUSTED
CIA
TAD I TM1
SPA SNA
ISZ I R7400X // 3/4 V3: EXTMP /ARE WE DONE ALL SEGMENTS?
SKP /NOT YET. LOOP UNTIL DONE
JMP I [MSWITC
RUN5, DCA I TM1 /SAVE ALTERED CONTROL WORD
JMP RUN2
/ASDONE, CDF 10
/ DCA I TM1 /THIS COULD BE OPTIMIZED
/ CDF 0
/ JMP I [KEYMON
KMER1, JMS I [PRNAME /DEVICE NOT AVAILABLE
JMS I [PRMESG
TEXT / NOT AVAIL/
TCCB4, 7404 /CCB+4
R7400X, R7400 // 4/4 V3: RUNVI, RUN6
STRTX, STRTEX //PICK UP THE STARTING ADDRESS ON THE NEXT PAGE.
//NO LITERALS HERE: WILL CONFLICT WITH RELOC MERGEX DURING ASSEMBLY.
//V4 RELEASE FOR OS78 REWORKS THIS PAGE SOMEWHAT. ANYTHING IN RELATIVE
//LOCATIONS 0-112 IS IN THE OS8 INPUT LINE BUFFER AND WILL BE CLOBBERED
//AFTER INITIALIZATION. AT INTGO A KCF IS ISSUED. IF A VT278, KEYBOARD
//FLAG WILL BE SET; IF NOT, IT WILL BE CLEARED. IF ANYTHING IS CHANGED
//ON THIS PAGE, CHECK TO SEE IF <SETERROR: . . .> HAS BEEN TRIGGERED!
AC0004=7307
*1000
/MUST BE AT 1000 FOR BATCH
BEGLN, "@ /KEYMON LINE BUFFER BEGINS HERE AFTER INIT CODE IS
"I
"N
"I
"T /DONE. CCL EXPECTS KMINIT TO BE IN THE NEXT LOCATION!
KMINIT, CDF 10 /INITIALIZATION - DESTROYED BY LINE BUFFER
ISZ I [7700 /LOC 17700=7777 IF I/O MONITOR IS KNOWN
JMP .+3 /++TO BE IN CORE, SO SET UP
TAD [200 /THE INITIAL POINTER FOR CALLS TO THE MONITOR
DCA SYSTEM /ACCORDINGLY
CDF 0
TAD I LXR
DCA I X1 /MOVE PMSRST TO MSWITC SO MONITOR KNOWS WHERE TO GO.
ISZ TEMP2
JMP .-3
CDF 10
TAD MVFROM /PUT MOVBUF AFTER 1600 SO IT'S USEABLE.
DCA I PDBUF
ISZ .-2
ISZ PDBUF
ISZ MVCNT
JMP .-5
CDF 0
TAD I PDBUF+1 /SEE IF BATCH IS SET. BATCH CONTROL WORD IS IN 17777.
/IF 2000 BIT IS SET, BATCH IS RUNNING. IF 400 BIT IS
/SET, BATCH KNOWS IT CAN USE HIGHEST FIELD UNMOLESTED.
RAL /IF YES, GO TO PAGE 0 TO CONTINUE
SMA CLA /IF IT ISN'T, CONTINUE NORMALLY
JMP INTGO /NORMAL KEYBOARD SYSTEM
//V4: DCA I RTWTPT /DON'T WAIT ON TTY FLAG IF BATCH IS RUNNING
TAD I [JSBITS /IS BOS IN PLACE?
AND [400
SNA CLA
JMP BATCH /NO. GO READ IT IN.
JMP BCHGO /YES. START IT UP.
//CHECK FOR 278 SYSTEM. RETURN TO MONITOR NO LONGER LOOKS FOR AN "UNPRINTED"
//CONTROL C IN THE TTY KEYBOARD BUFFER.
INTGO, KCF //IF VT278, WILL SET FLAG; IF NOT, FLAG IS CLEARED.
KSF
JMP I ERRET //TRADITIONALISTS WIN: WE'RE NOT ON A VT278.
KRB //ENABLE THE KEYBOARD FOR SURE,
AC0004 //AND TOSS WHAT EVER WAS THERE.
AND I KOS78 //WHERE THE CURRENT COPY OF OS-WHATEVER LIVES.
SZA CLA
JMP I ERRET //VT278 WITH THE BIT SET SAYS SYSTEM IS CONFIGURED.
//IF NOT PROPERLY CONFIGURED, SOME IOTS IN OS78
//WILL CONFLICT WITH THE 278, SO BITCH ABOUT IT
JMS I [PRMESG //EVERY TIME MONITOR IS CALLED.
TEXT "?SET SYS OS278"
ZBLOCK 2 //TWO FREE LOCATIONS--THREE IF YOU'RE
//CAREFUL: OS8 MONITOR NEEDS A ZERO TO TERMINATE PRMESG!!!
//ONLY GOING TO MOVE 6 LOCATIONS. COULD PROBABLY GET BY
//WITH LESS.
PMSRST, SHNDLR&177+4200 /JMS SHNDLR
0300
7000
MTEMP+6
IFNZRO .-1067 <SETERROR: SET SYS OSXXX HAS BEEN AFFECTED!>
MOD1, HLT /CONTAINS SECOND COPY OF OS/78 BIT AND OS278 BIT. (OS78
/IS THE 200 BIT, OS278 IS BIT 9 (THE 4 BIT).
CDF CIF 0
/TCF //IN VERSION 3
MVCNT, MOVBUF-MVT3-1
PDBUF, MOVBUF
MVRELOC=.
MVFROM, NOPUNCH
*7626
ENPUNCH
MOVBUF, 7777 /USED IN BATCH SETUP
TAD I MVT1 /MOVE THE LINE BUFFER FROM 1000
DCA I MVT2 /TO 1655
ISZ MVT1
ISZ MVT2
ISZ MVT3
JMP .-5
CIF CDF 0
JMP I MOVBUF
MVT1, BEGLN
MVT2, SVLNBF
MVT3, -111
*MVRELOC+14
IFNZRO .-1107 <SETERROR: SET SYS INIT IS AFFECTED!>
//KEYMON ENDS HERE. IF THIS LOCATION CHANGES,
//MODIFY "INIT" IN SET.
INIT, CDF 10 /V3D (INITIALIZATION)
TAD [400
DCA I ROT /RESTORE LOC 7677 TO '400'
CDF 0
DCA KMINIT /END LINE WITH 0
/TLS //IN V3
JMP I CRLF /FAKE OUT KBM AS IF USER TYPED @INIT
//KEYBOARD INPUT BUFFER EXTENDS TO 1112. ANYTHING AFTER THAT IS OK.
DIGTLP, TAD I LXR
STRTEX, TAD [-270
CLL
TAD [10
DCA TMP1 /V3
SNL
JMP EONUM
/V3 ISZ DIGFLG
JMS ROT //BUILD THE FIELD (TEMP1) AND THE LOCATION (TEMP2)
JMS ROT //FOR THE START COMMAND.
JMS ROT
TAD TEMP2
TAD TMP1
DCA TEMP2
JMP DIGTLP
EONUM, TAD TEMP1
AND [7
CLL RTL
RAL
TAD KM6203
DCA I [MSTCDF
TAD TEMP2
JMP I .+1
STCOMN
ROT, MBEGIN //USED BY INIT TO RESET MONITOR ENTRY POINT.
TAD TEMP2
CLL RAL
DCA TEMP2
TAD TEMP1
RAL
DCA TEMP1
JMP I ROT
DEAS, TAD [UDNAME-1
DCA X1
TAD [-17
DCA TM1
CDF 10
DCA I X1
ISZ TM1
JMP .-2
KM6203, CDF CIF 0
JMP I [KEYMON
ASDONE, CDF 10 /V3
DCA I TM1 /V3
JMP KM6203 /V3
CRLF, KEYMON+1 /V3D NEEDED FOR INIT
DCA RBFLAG //V4: CLEAR RUBOUT COUNTER ON RESTARTS.
TAD [215
JMS I PCH //--JUST DO CRLF AND .
TAD [212
JMS I PCH
JMP I CRLF
PAGE
/NOTE: XR=AMFLAG !
*1200
/TELETYPE INPUT ROUTINE
XGLINE, KEYMON+1 /MUST BE AT 1200 FOR BATCH & CCL
TAD PROMPT
JMS I PCH
DCA RBFLAG
TAD [BEGLN-1
CHLM1, DCA LXR
DCA AMFLAG /ZERO ALTMODE FLAG
CHLOOP, KSF //V4: STRANGELY ENOUGH, THIS LOOP IS OK FOR A VT278
JMP CHLOOP
TAD [200
KRS
DCA NM1
KCC
JMS SRCH
-225;CTRLU
-215;CARRET
-377;RUBOUT
-223;CHLOOP /Ignore ^S
-221;CHLOOP /Ignore ^Q
-233;ALTMOD
-212;CHLOOP /Ignore LF
-200;CHLOOP
-217;CHLOOP /IGNORE ^O
-203;CTRLC /MUST BE JUST BEFORE 0
/MUST BE HERE FOR CCL
0
JMS PRNT
CINSRT, TAD NM1
DCA I LXR
TAD LXR
TAD [-BEGLN-110
SPA CLA
JMP CHLOOP
CARRET, JMS I [CRLF
TAD LXR
TAD [1-BEGLN
SNA CLA
JMP XGLINE+1
DCA I LXR
DCA I LXR
JMP I XGLINE
/THIS AREA GETS MODIFIED BY SET COMMANDS (FOR REAL SCOPE RUBOUTS)
/**** BEWARE! ***
PRNT, 0
TAD NM1 /ECHO CHARACTER
JMS I PCH
TAD NM1
TAD K7440 /CONVERT LC CHAR TO UP CASE CHAR
SMA
TAD [7740
TAD [340
DCA NM1 /SAVE IT IN UPPER CASE
JMP I PRNT
K7440, 7440
CTRLC,
CTRLU, TAD ["^
JMS I PCH
TAD NM1 /MAGIC LOCATION THAT CONTAINS A 203, SO THAT EARLIER
TAD [100 /VERSIONS OF OS/8 COULD OUTPUT A ^C IF NECESSRARY
CLRLIN, JMS I PCH //SINCE V4 DOESN'T DO THIS ANYMORE, NM1 NEED NOT
RBSPCL, JMS I [CRLF //BE INITIALIZED TO BE A 203.
JMP XGLINE+1
ALTMOD, TAD ["$
DCA NM1
JMS PRNT
ISZ AMFLAG /NOTE ALTMODE
JMP CARRET+1
RUBOUT, TAD LXR
TAD [1-BEGLN
SNA CLA
JMP RBSPCL
TAD ["\ /MUST BE HERE
ISZ RBFLAG
JMS I PCH
CLA CMA
DCA RBFLAG
TAD LXR
DCA TEMP1
TAD I TEMP1
JMS I PCH
LBCKUP, CLA CMA
TAD LXR
JMP CHLM1
SRCH, 0
TAD I SRCH
ISZ SRCH
SNA
JMP I SRCH
TAD NM1
SNA CLA
JMP SFND
ISZ SRCH
JMP SRCH+1
SFND, TAD I SRCH
DCA TEMP1
JMP I TEMP1
*1357
PRQMRK, JMS I [PRNAME /SOMETHING WRONG--UNPACK THE FIRST 8 CHARACTERS
JMP I [PRINTQ /COLLECTED, PRINT THEM, AND A ?MARK.
IFNZRO PRQMRK-1357 <SEECCL,ZZXX>
ZBLOCK 1 /A FREE LOCATION!
IFNZRO .-1362 <FIXCCL,ERRRR>
GETCCL, TAD [6003
JMS I [RESET
TAD [67 /CCL OVERLAY BLOCK IS BLOCK 67 ***
DCA OV
JMP DATE2
DATE, TAD TMP
SNA CLA
JMP I [CCLSW-1 /USED TO BE JMP GETCCL
DATE2, JMS I [SHNDLR /READ IN DATE OVERLAY
0201
0400
OV, MSOVL2
JMP KMONER
JMP I [600
PAGE
*1400
SAVE2, TAD I LXR
SNA /ARE THERE ANY ARGS?
JMP SAVE2A /NO ... USE CCB
JMS I [SHNDLR /READ IN ARG OVERLAY
0201
CSOVLY
MSOVLY
JMP KMONER
JMP I CCBTST /GO TO IT
SAVE2A, JMS I [SHNDLR
0201
400
MTEMP+10
JMP KMONER
SAVE3, TAD [603
DCA XR
DCA LXR /INITIALIZE FOR GT32K I.D.
TAD I [600
JMS I [CCBTST
JMS I [SHNDLR
0101
400
MSOVL2
JMP KMONER
JMP I GETOUT
SAV2X, JMS I PGTOUT
TAD I [600 /UPDATE THE SEGMENT COUNT BY
CLL RAL /FIRST,MAKING SURE 4000 BIT IS SET
STL RAR
CIA
TAD MERTST /SUBTRACT # OF GT32K SEGS THIS ALLOW US TO BYPASS...
DCA EXTMP /SAVE COUNT FOR GT32K
TAD EXTMP
CLL RAL /WE WANT TO BUMP COUNTER TWICE FOR EVERY SEG
TAD [603 /ADD POINTER TO INITIAL SEGMENT
DCA XR
TAD EXTMP
CIA
DCA EXTMP
JMP I RCHK
KMER4, JMS I [PRMESG
TEXT /TOO FEW ARGS/
CCBTST, SAVE1A&177+400 /EXAMINE COUNT WORD OF CCB FOR VALIDITY
/ASCII AND BINARY FILES USUALLY FAIL THIS TEST
CLL RAL /INSURES 4000 BIT IS SET--128K INDICATOR
STL RAR
DCA EXTMP
MOD2, LXM /INITIALIZE EXTENDED MEMORY. //V4: GETS NOP
//FROM SET SYS VT278.
TAD EXTMP
CMA
AND [7740
SNA CLA
JMP I CCBTST /IT WAS VALID
CIERR, TAD [7605
DCA ERRET /RELOAD MONITOR ON THIS ERROR
JMS I [PRMESG /IT WASN'T - TELL THE USER
TEXT /IMAGE ERR/
ZBLOCK 1504-. //SERVES TO KEEP THINGS IN THEIR ORIGINAL PLACE
//ON THIS PAGE. ALSO TERMINATOR FOR THE IDIOT
//OS8 MESSAGE PRINTER.
//"CORE IMAGE ERR" WAS SHORTEND TO GET
KLUGE2, 204 //MASK FOR BOTH OS78 & VT278 SYSTEMS IN.
IFNZRO 1505-. <BALANCE OF PAGE IS OUT OF POSITION!>
GETOUT, SAVE3A&177+400 /SUBROUTINE TO KICK MONITOR OUT IF NECESSARY
TAD I [JSBITS
RAR
CLA
TAD SYSTEM
SZL SPA CLA /IS THE SYSTEM IN CORE AND SHOULD IT BE?
JMP I GETOUT
CIF 10 /YES AND NO - KICK IT OUT
JMS I SYSTEM
11 /BYE BYE
TAD [7700
DCA SYSTEM
JMP I GETOUT
KMER2, JMS PRNAME
JMS I [PRMESG
TEXT / NOT FOUND/
PRNAME, 4000
TAD NM1
JMS I [PRWD
TAD NM2
JMS I [PRWD
TAD NM3
JMS I [PRWD
TAD NM4
SNA CLA
JMP I PRNAME
TAD [256
JMS I [PCHAR
TAD NM4
JMS I [PRWD
JMP I PRNAME
RESET, 0
DCA I [JSBITS /MARK AREAS FOR I/O OPTOMIZATION
JMS I [MINCOR
CIF 10
JMS I SYSTEM
13 /RESET DEVICE HANDLERS AND OUTPUT FILES
JMP I RESET
RCHK, XLOD&177+400
AND I XTADR /V3D
AND KLUGE2 /CAN'T ALLOW BOTH OS78 BIT AND SYSTEM CUSP BIT
//V4: EXTEND TO INCLUDE VT278 SYSTEM FLAG
SZA CLA
JMP CIERR /V3D CAN'T FALL INTO KMER3
/BECAUSE HAVE TO RELOAD KBM TO RESET 'PGNAME'
TAD EXTMP
DCA I RR7400 /SET UP SEGMENT COUNT FOR RUN LOAD
JMP I RCHK
RR7400, R7400
SVXER, JMS I [PRMESG
TEXT /SAVE ERR/
XTADR, OS78
PAGE
*1600
RUN6, TAD I TM1 /STORE CONTROL WORD FOR LAST SEG.
DCA I [MREAD+1
TAD RUNSW /IS THIS R OR RUN?
SNA CLA
JMS I [WRCTLB /RUN
TAD I RFILE /V3D FOR LINKER
DCA I RCTL /V3D SAVE BLOCK NUMBER IN 'SOFSET'
TAD I RFILE
RUN7, IAC
DCA RUNFIL /STORE STARTING BLOCK NUMBER
RUN7A, TAD DEVHND
DCA I [MREAD-1
TAD DEVHND
DCA RUNHND /STORE DEVICE HANDLER ENTRY IN THIS PAGE
TAD I ADR1
DCA I ADR2
ISZ ADCNT
JMP .-3
JMP I .+1
RUN8&177+7400
ADCNT, RUN8&177+7600
RFILE, FILE
CHK32, 0 /PROTECTS MONITOR FROM GREATER THAN 32K FIELD 0 LOAD
TAD I RCTL1
AND T76A /ISOLATE CDEB BITS FOR FUTURE USE
DCA CDE
TAD I RCTL1
AND [7700 /LOAD EVERY FIELD INTO FIELD 1
TAD [10 /WE'LL BUMP IT UP FROM THERE---LATER
DCA I RCTL1
JMP I CHK32
T76A, 76
RCTL1, RCTL&177+7400
MOVUP, 0 /SUBROUTINE TO MOVE UP PROGRAM CODE
AND T3700 /CALCULATE THE NUMBER OF LOCS
RAL
TAD T177
CIA
DCA COUNT /STORE IT HERE
TAD CDE /PREPARE FOR CDF TO PROPER BANK & FIELD
CLL RTR
SZL
SVLNBF,
/
/NEXT 111 LOCATIONS DESTROYED BY THE LINE BUFFER DURING A SAVE
/
TAD TX20
CLL RTL
TAD T6201 /STORE IT IN EXTEND
DCA EXTEND
TAD I RADR1 /INITIALIZE THE INDEX REGS
TAD SPTST
DCA ADR1
TAD ADR1
DCA ADR2
TAD [7000 /SET EXTENDED MEMORY0
MOD3, LXM //V4: GETS CLA FROM SET SYS VT278
BACK, CDF 10 /MAKE THE MOVE
TAD I ADR1
EXTEND, 0
DCA I ADR2
ISZ COUNT
JMP BACK
CDF 0
TAD SPTST
DCA I HF2
TAD I RCTL1
JMP I MOVUP
T177, 177
T3700, 3700
T6201, 6201
CDE, 0
TX20, 20
HF2, HF3&177+7400
COUNT, 0
RADR1, RADR&177+7400
PAGE
*1710
RUN8, ISZ R7400 /IS THIS THE LAST PARAMETER PAIR?
JMP RUN9 /NO - KEEP LOADING
TAD RUNFIL
DCA I RMRD3 /MOVE THE RECORD NUMBER INTO THE FINAL READ
SKP //V4. V3 USED TO BE: TSF
RUNTWT, JMP .-1 /WAIT FOR THE TELETYPE TO DIE DOWN (RF08 IS FAST!)
/RUNTWT GETS NOPED BY KMINIT WHEN BATCH IS RUNNING
JMP I .+1
MREAD /READ THE LAST SEGMENT AND START UP
RUN9, TAD I RUNADR
DCA RADR /SET UP THE LOADING ADDRESS OF THE CURRENT SEGMENT
ISZ RUNADR
TAD I RUNADR
DCA RCTL /AND THE READ CONTROL WORD
TAD RCTL
AND TS7 /TEST FOR GREATER THAN 32K
SNA
DCA HF3
SZA CLA
JMS I CH32
JMS I RUNHND
RCTL, SOFSET /V3D THESE ARE STORED INTO ONLY AFTER MOVING
RADR, OS78 /V3D
RUNFIL, 0
JMP RERR /INPUT ERROR READING THE PROGRAM
TAD RCTL
ISZ HF3 /IF GREATER THAN 32K
JMP .+2
JMS I MOVUPT /LOAD HIGHER FIELDS
JMS ROTAT /GET THE BLOCK LENGTH OF THIS SEGMENT
TAD RUNFIL
DCA RUNFIL /UPDATE THE BLOCK NUMBER FROM IT
ISZ RUNADR
JMP RUN8 /BACK FOR ANOTHER ONE
HF3, -1
CH32, CHK32
MOVUPT, MOVUP
RERR, CIF 10
JMS I RU7700
TS7, 7
0 /TOTALLY MEANINGLESS
RUNADR, CCB+4
R7400, 7400
RMRD3, MREAD+3
RU7700, 7700
RUNHND, 0
IFNZRO ROTAT-SVLNBF-111&4000 <ERROR>
*1765 /MUST BE AT TOP OF PAGE
ROTAT, 0
CLL RTR
RTR
RTR
AND RU37
SNA
TAD RU37
IAC
CLL RAR
JMP I ROTAT
RU37, 37
PAGE
/2 PAGE OVERLAY TO KEYBOARD MONITOR FOR "SAVE" WITH ARGUMENTS.
*2000 /ASSEMBLED AT 2000 SO THAT WE CAN LIVE IN BLOCK 54
/OF THE SYSTEM HEAD, BUT RUNS AT 400 AS A SAVE OVERLAY.
SAVE1A, TAD [1603
DCA X1
DCA TM1
CDF 10
DCA I [OLDT9
S6203, CIF CDF 0
TAD (SGETOUT-RSOVL2 /POINTER TO NEW GETOUT
DCA PGTOUT /LIKEWISE "GETOUT"
JMS I [SHNDLR
0210
1400
MTEMP+10 /READ IN CONTROL BLOCK
JMP KMONER
JMS I (LXRBAK-RSOVL1 /RESET LXR TO LOOK AT FIRST CHAR
JMS I (LXRBAK-RSOVL1
DCA DASHFG
SNUMLP, JMS SGTNUM
JMP SDLOOK /NO NUMBER - GET DELIMETER
TAD I LXR
TAD (-"-
SNA CLA
JMP SVDASH
JMS I (LXRBAK-RSOVL1
TAD DASHFG
SNA CLA /WAS THERE A LOWER LIMIT?
JMS DASHSB /NO - SET LOWER LIMIT TO UPPER LIMIT
TAD TEMP1
CIA CLL CML
TAD OLD1
SZA CLA /ARE THE FIELDS THE SAME?
JMP KMER5 /NO - ERROR
TAD TEMP2
AND [7600
TAD [200
DCA TEMP2
TAD TEMP2
CIA
TAD OLD2
SZL CLA /IS UPPER LIMIT > LOWER LIMIT?
JMP KMER5 /NO - ERROR
CDF 10
TAD OLD1
DCA I X1
TAD OLD2
DCA I X1
TAD TEMP2
DCA I X1 /CREATE A TRIPLET(FIELD, LOW LIMIT, HIGH LIMIT)
/IN THE TABLE IN FIELD 1
ISZ TM1 /BUMP ENTRY COUNT
SDLOOK, CDF 0
TAD I LXR
SNA
JMP I (SVEND-RSOVL1
TAD (-",
SNA
JMP SNUMLP-1
TAD [",-";
SNA
JMP SSTADR
TAD [";-"=
SNA CLA
JMP I (SSBITS-RSOVL1
KMER5, JMS I [PRMESG
TEXT /BAD ARGS/
SVDASH, TAD DASHFG
SZA CLA
JMP KMER5
ISZ DASHFG
JMS DASHSB
JMP SNUMLP
SSTADR, JMS SGTNUM
JMP KMER5 /NULL STARTING ADR - ERROR
TAD TEMP1 /TRANSFORM FOR CDF --"37" TO "174"-128K
AND [7757 /ISOLATE '17' BITS
TAD (-10
SMA
TAD [-17
TAD (10
TAD TEMP1
CLL RTL
TAD S6203
CDF 10
DCA I (1601 /STORE AWAY STARTING FIELD
TAD TEMP2
DCA I (1602 /AND STARTING ADDRESS
JMP SDLOOK
DASHSB, 0
TAD TEMP1
AND (37 /ISOLATE FIELD( & BANK)
DCA OLD1
TAD TEMP2
AND [7600
DCA OLD2
JMP I DASHSB
DASHFG, 0
OLD1, 0
OLD2, 0
SGTNUM, 0 /GET A NUMBER ROUTINE
DCA DIGFLG /CLEAR DIGIT COLLECTED FLAG
DCA TEMP1
DCA TEMP2
JMS I (STARTX-RSOVL1
JMP .+4
TAD (20
SNA CLA
JMP .-4
JMS I (LXRBAK-RSOVL1 /SHOVE INDEX BACK
TAD DIGFLG /IS DIGIT PRESENT?
SZA CLA
ISZ SGTNUM
JMP I SGTNUM
PAGE
*2200 /LOADS INTO 600 BACK UP IN KYMON TERRITORY.
SSBITS, JMS I (SGTNUM-RSOVL1
JMP I (KMER5-RSOVL1
TAD TEMP2
CDF 10
DCA I [1603
JMP I (SDLOOK-RSOVL1
SVEND, JMS I [SHNDLR
0101
0400
MSOVL2 /READ IN SECOND PART OF OVERLAY
JMP KMONER
TAD TM1
SNA
JMP I (MOVECB-RSOVL2
CIA
CDF 10
DCA I [1600
/NOW SORT THE ENTRIES IN THE SEGMENT TABLE ON
/DECREASING FIELD AND INCREASING ADDRESS
/WITHIN THE FIELD.
TAD [1603
DCA P1
CLA IAC
TAD I [1600
SNA
JMP SORTED /RIDICULOUS TO SORT ONE ITEM
DCA TEMP1
OUTRLP, TAD (3
TAD P1
DCA P2
TAD TEMP1
DCA TEMP2
INERLP, TAD P1
DCA LXR
TAD P2
DCA X1
TAD I LXR
CIA CLL
TAD I X1
SNA CLA
JMP TIE /FIELDS ARE EQUAL - SORT ON ADDRESS IN FIELD
SZL
JMP SWITCH /WRONG ORDER - SWITCH 'EM
TIENTY, TAD P2
TAD (3
DCA P2 /INDEX TO NEXT ENTRY
SWNTRY, ISZ TEMP2
JMP INERLP
TAD P1
TAD (3
DCA P1 /ELEMENT IS IN PLACE - GO TO NEXT POSITION
ISZ TEMP1
JMP OUTRLP
JMP SORTED /SORT COMPLETE - CHECK FOR CONSISTENCY
TIE, TAD I LXR
CIA CLL
TAD I X1
SZL CLA /TEST FOR ADRESSES IN ASCENDING ORDER
JMP TIENTY /YES - DONT HAVE TO SWAP
SWITCH, JMS SWSUBR
JMS SWSUBR
JMS SWSUBR
CLA CLL CMA RTL
TAD P1
DCA P1 /RESET FIRST POINTER
JMP SWNTRY /AND DONT BUMP 2D POINTER, AS WE HAVE JUST BUMPED IT
SWSUBR, 0
ISZ P1
ISZ P2
TAD I P1
DCA TM1
TAD I P2
DCA I P1
TAD TM1
DCA I P2
JMP I SWSUBR
P1, 0
P2, 0
STARTX, 0
TAD I LXR /ANYTHING LEFT?
SNA
JMP I STARTX /NO.. TAKE EMPTY RETURN
SKP
ADGTLP, TAD I LXR
TAD (-270
CLL /SEE IF THIS IS A DIGIT
TAD [10
SNL
JMP AONUM /NO.. GET OUT
DCA TMP1
ISZ DIGFLG
JMS ROT2
JMS ROT2
JMS ROT2
TAD TEMP2
TAD TMP1
DCA TEMP2
JMP ADGTLP /KEEP LOOKING
AONUM, ISZ STARTX
JMP I STARTX
ROT2, 0
TAD TEMP2
CLL RAL /WE NEED THIS BECAUSE THE HANDLER
DCA TEMP2 /WIPED THE FIRST COPY (MAYBE!!!)
TAD TEMP1
RAL
DCA TEMP1
JMP I ROT2
LXRBAK, 0
CLA CMA
TAD LXR
DCA LXR
JMP I LXRBAK
SORTED, TAD I [1600
IAC
SNA
JMP I (MERGED-RSOVL2
DCA TEMP1
TAD [1603
DCA X1
TAD (1606
DCA LXR
JMP I [MRGLP-RSOVL2
PAGE
*2400 /SO WE CAN LIVE IN BLOCK 55.
/OVERLAYS 400 (SAVE1A) WHEN EXECUTING.
/CHECKS THE SORTED FILE FOR CONSISTENCY.
/OVERLAPPING SEGMENTS ARE ERRORS,
/ABUTTING SEGMENTS ARE TO BE CONDENSED IN
/THE INTERESTS OF SPEED
MRGLP, TAD I LXR
CIA
TAD I X1
SZA CLA
JMP NOCMPR /DIFFERENT FIELDS - INCOMPARABLE
ISZ X1
TAD I X1
CIA
CLL
TAD I LXR
SNA CLA
JMP BUTTNG /UPPER LIMIT(2)=LOWER LIMIT(1) - ABUTTING SEGMENTS
SZL CLA
JMP NXTONE /UPPER LIM(2)<LOWER LIM(1) - NORMAL CASE
CDF 0 /UPPER LIM(2) > LOWER LIM(1) - ERROR
JMS I [PRMESG
TEXT /BAD ARGS/
BUTTNG, CLA CMA
TAD X1
DCA X1
TAD I LXR
DCA I X1 /SET UPPER LIM(2) = UPPER LIM(1)
TAD X1
TAD (-1777
SZA CLA
JMP .-5 /AND COMPRESS OUT THE LOWER ENTRY
ISZ I [1600 /DECREMENT THE ENTRY COUNT (CAN'T OVERFLOW)
JMP I (SORTED-RSOVL1 /START OVER FROM BEGINNING
NOCMPR, ISZ X1
ISZ X1
ISZ LXR
NXTONE, ISZ LXR
ISZ TEMP1
JMP MRGLP /NOW ALL THAT REMAINS IS TO TRANSFORM OUR TRIPLETS
/INTO THE FORMAT WHICH THE RUN LOADER EXPECTS; I.E.
/DEVICE-HANDLER ARGUMENTS
MERGED, CDF 0 /LOAD IN MERGED OVERLAY
JMS I [SHNDLR
0100
0600
64
JMP KMONER
JMP I (MERGEX
MOVECB, TAD (-1777
DCA MERTST
JMP MERGED
CBMOVE, CDF 10 /FINAL CODE TO MOVE NEW CONTROL BLOCK
TAD I LXR /INTO PAGE 600 OF FIELD 0
CDF 0
DCA I X1
ISZ TEMP1
JMP CBMOVE
JMP I (SAVE3 /EXIT TO SAVE PROCESSOR
SAVE3A, ISZ XR
TAD I XR /GET THE I/O CONTROL WORD OF THIS SEGMENT
DCA ADR2 /CAUTION AUTO-INDEX TEST FOR GREATER THAN 32K
TAD ADR2
AND [7 /ARE THERE ANY BANK BITS?
SZA CLA
JMP XTAT /NO- PROCEED AS NORMAL
TAD SPTST /ONLY WANT TO ISOLATE FIRST FIELD
SNA CLA /BELOW 32K
JMP XTAT
TAD CLENGT /SET UP FIRST FIELD I.D.
DCA LXR /CAUTION AUTO-INDEX-SAVE BLOCK OFFSET
TAD EXTMP /SAVE NUMBER OF SEGS LEFT
DCA MERTST /... NEGATIVE OF # LEFT
DCA SPTST /SET I.D. "SET" FLAG
XTAT, TAD ADR2
JMS I PROTAT /EXTRACT THE LENGTH FROM IT
TAD CLENGT
DCA CLENGT /UPDATE THE LENGTH OF THE FILE
ISZ EXTMP
JMP SAVE3A /LOOP FOR ALL SEGMENTS OF THE FILE
TAD CLENGT /USE THIS LENGTH WHEN ENTERING THE FILE
CLL RTL
RTL
TAD SENTER
CIF 10
JMS I SYSTEM
3 /ENTER
SFILE, NM1
0 /LENGHT UNIMPORTANT
JMP I (SVXER /SAVERR CODE REPEATED
CIF CDF 10
TAD I [DVHREC
CDF 0
DCA I [LDBLK
TAD SENTER
JMS I SYSTEM
4 /CLOSE
NM1 /NAME FOR "CLOSE"
CLENGT, 1 /CLOSING LENGTH
JMP I (SVXER
JMP I (SAV2X
XLOD, JMS I [SHNDLR
0201
1200
64
JMP KMONER
JMP I (SAVXX /JMP T0 1400
SGETOUT,0 /REPLACES "GETOUT" WHICH WE'VE STORED OVER
TAD I [JSBITS
RAL /ONLY PERFORMS THOSE FUNCTIONS THAT "SAVE" NEEDS
SPA CLA
JMP I SGETOUT
CIF 10
JMS I SYSTEM
11
DECIMB, JMP I SGETOUT /DECIMB ONLY CALLED BY NEXT PAGE
/PART OF NEXT PAGE'S ROUTINE:
TAD NM2 /ALL NEW FOR V3D
TAD NM4 /ONLY ALLOW 2 CHARS FOR MM
SNA CLA
ISZ DECIMB
TAD NM1
RTR
RTR
JMP I DECIMB
PROTAT, ROTAT
*2600 /DATE PROCESSOR - LOADS IN 400, RUNS IN 600 AND
/ASSEMBLES HERE SO WE CAN LAND IN BLOCK 55 OF THE
/SYSTEM HEAD.
DATEXX, JMS DECIM
NUM2, DCA NUM2
TAD NUM2
TAD M40
SMA CLA
JMP BADNUM /DAY > 31
JMS I GNAME
L30, 30 /NOTHING FOUND WILL GIVE ERROR LATER
/ DCA NUM1 /NUM1 IS INITIALLY 0
NEWLUP, ISZ MONPTR
ISZ NUM1
TAD I MONPTR
ISZ MONPTR
SMA
JMP BADNUM /SYMBOLIC MONTH NOT FOUND
TAD NM1
SNA CLA /SKIP IF FIRST 2 LETTERS DON'T MATCH
TAD NM2
TAD I MONPTR
SZA CLA
JMP NEWLUP /SECOND 2 LETTERS DON'T MATCH
/*** TEST DELIMETER HERE
TAD NUM1
CLL RTL
RTL
RAL
TAD NUM2
RTL
RAL
DCA NUM2
DCA DDELIM /MAKE END-OF-LINE THE DELIMITER
JMS DECIM
TAD (-106 /SCALE DOWN TO RANGE 1970-1999
SPA
JMP BADNUM /DIDN'T MAKE THE RANGE
DCA NUM1
TAD NUM1
AND L30 /ISOLATE EXTENSION DATE BITS
CLL RTL
RTL
DCA TM1
TAD I (BIPCCL
AND L7177 /STORE THEM INTO BITS RESERVED FOR THIS PURPOSE
TAD TM1
TSLUP, DCA I (BIPCCL
TAD NUM1
AND [7
TAD NUM2 /COMBINE WITH MONTH AND DAY
CDF 10
DCA I (MDATE /STORE IN SYSTEM DATE CELL
TSF /7605 SETS THE DF
JMS L7177 /TIME OUT A BIT
JMP I [7605 /IN CASE RUNNING UNDER BATCH
L7177, 7177 /JMS IS LONGER THAN JMP
ISZ DDELIM /DDELIM IS 0 AT END
JMS TSLUP /WAIT FOR TELETYPE TO DIE DOWN (RF08)
JMP I [7605 /RETURN TO MONITOR
DDELIM, -"-
/WOULD LIKE TO BRANCH TO CCLSW-1 IF DATE ENDED WITH ALTMODE
CNV, 0
AND [77
SNA
JMP NUL
TAD (-60
SPA
JMP BADNUM
JMP I CNV
NUL, TAD TM1
JMP GODE
DECIM, 0
JMS I GNAME
M40, -40 /NOTHING THERE (LOGIC WILL CAUSE ERROR LATER)
TAD TMP
TAD DDELIM /COMPARE AGAINST DESIRED DELIMETER
SNA CLA /DASH OR NULL
JMS I (DECIMB-2400+400
JMP BADNUM /DELIMETER BAD
RTR
JMS CNV
DCA TM1
TAD TM1
CLL RTL
TAD TM1
RAL
DCA TEMP2
TAD NM1
JMS CNV
TAD TEMP2
GODE, SZA
JMP I DECIM
BADNUM, CLA /CRAP IN AC
TAD [7605
DCA ERRET
JMS I [PRMESG
TEXT /BAD DATE/
NUM1, 0 /MONTH NUMBER (MUST BE 0 INITIALLY)
MONS, -1201 /JAN
-1600
-0605 /FEB
-0200
-1501 /MAR
-2200
-0120 /APR
-2200
-1501 /MAY
-3100
-1225 /JUN
-1600
-1225 /JUL
-1400
-0125 /AUG
-0700
-2305 /SEP
-2000
-1703 /OCT
-2400
-1617 /NOV
-2600
-0405 /DEC
-0300
MONPTR, MONS-2600+600-1 /RELOCATES TO PAGE 600
/MUST BE POSITIVE
PAGE
*3000 /MONITOR ERROR PROCESSOR. LIVES IN BLOCK 56,
/LOADS INTO 11400.
/ ------------------------
DLYLPX, AND I 0 //THIS AREA CAN BE REPLACED WITH:
D7600, 7600 //TAD MERRNO
TAD MERRNO //AND (7
CLL RAL //BSW
ISZ I (ZERO-1400
ISZ I (ZERO-1400 /V3C
ISZ I (ZERO-1400 //SINCE 8E AND 8A SCOPE SYSTEMS DON'T HAVE TO
JMP DLYLPX /WAIT FOR TELEPRINTER (WITHOUT CDF'S)
/ -------------------------
SNA
JMP USRERR //KEEP THIS;
/ -------------------------
CLL RAL //TOSS THIS: ALL IT DOES IS GET RID OF THE
RTL
RTL
/ -------------------------
TAD (6040 //THE 4000 BIT AND WASTE TIME.
DCA I (MERTYP-1400
MERCMN, TAD (MERRXR-1400
JMS EPRINT
TAD I (FPUTX
RTR
RAR
AND (7
TAD (60
JMS MERPCH
CLA CLL CMA RAL
TAD I (MONITO
RAL
DCA T1
TAD (-4
DCA T2
MEROLP, TAD T1
RTL
RAL
DCA T1
TAD T1
AND (7
TAD (60
JMS MERPCH
ISZ T2
JMP MEROLP
TAD MERRNO
CLL RAL
SNA
JMP NOEXPL /NO EXPLANATION FOR USER ERRORS
CLL RAR
TAD (EXPLTBL-1401 /PRINT EXPLANATION
DCA T1 /GET ADDRESS INTO MESSAGE TABLE
TAD (240
JMS MERPCH
TAD ("(
JMS MERPCH
TAD I T1 /GET ADDRESS OF MESSAGE
JMS EPRINT
TAD (")
JMS MERPCH
TAD MERRNO
NOEXPL, TAD (3773
SPA CLA
CLA CMA
DCA I (7700
DCA OLDT9
CLA CLL CML RAR
DCA MERRNO
CDF 0
TAD I (JSBITS
AND (6777
TAD (1000
DCA I (JSBITS /SET THE CURRENT JOB UNSTARTABLE
CDF CIF 0
JMP I D7600 /EXIT TO KEYMON.
USRERR, CLA CLL
JMS I (FGET
TAD (4060
DCA I (UERTYP-1400
TAD (UERRXR-MERRXR
JMP MERCMN
MERPCH, 0
TLS
TSF
JMP .-1
CLA
JMP I MERPCH
ZERO, 0 //A WASTE TIME COUNTER. IF THE ABOVE IS TOSSED, DON'T
//NEED THIS.
EPRINT, 0
DCA T2
EPRLUP, TAD I T2
RTR
RTR
RTR
JMS EPR
TAD I T2
JMS EPR
ISZ T2
JMP EPRLUP
EPR, 0
AND (77
SNA
JMP I EPRINT
TAD (240
AND (77
TAD (240
JMS MERPCH
JMP I EPR
PAGE
*3200 /LOADS INTO 1600
MERRXR, TEXT \MONITOR ERROR 0 AT \
MERTYP=MERRXR+7
UERRXR, TEXT \USER ERROR 0 AT \
UERTYP=UERRXR+5
EXPLTBL,MON1-1400
MON2-1400
MON3-1400
MON4-1400
MON5-1400
MON6-1400
MON7-1400
MON1, TEXT \CLOSE ERROR\
MON2, TEXT \DIRECTORY I/O ERROR\
MON3, TEXT \DEVICE HANDLER NOT IN CORE\
MON4, TEXT \ILLEGAL USR CALL\
MON5, TEXT \I/O ERROR ON SYS:\
MON6, TEXT \DIRECTORY OVERFLOW\
MON7, TEXT \RESERVED\
/EXECUTION TIME LOADER FOR MONITOR "CHAIN" COMMAND
*3400 /EXECUTES IN FIELD 0 IN PAGE 7400
MCHNX, DCA MCHREC /STORE STARTING RECORD #
TAD MCHREC
DCA I (SOFSET /V3D SAVE STARTING ADDRESS
CIF 10
JMS I (200
13 /RESET ALL DEVICE ASSIGNMENTS
0 /BUT DON'T CLEAR OUTPUT FILES
CIF 10
JMS I (200
11 /KICK MONITOR OUT AND RESTORE CORE IF NECESSARY
JMS MCHRD /PARAMETERS PRESET TO READ CONTROL BLOCK INT0 7200
TAD I (7200 /TEST FOR SAVE FILE!
CMA /TEST FOR VALID CCB
AND (7740
SZA CLA
JMP CHERR
TAD I (7201
DCA I (MSTCDF /TRANSFER INFORMATION FROM CONTROL BLOCK
CLA IAC
TAD I (7202
DCA I (MSTADR /TO PAGE 7600
TAD I (7203
TAD (1000
DCA I (JSBITS
TAD (7204
DCA MCHT1
TAD MCHFJM
DCA I (MSWITC
TAD (TCF
DCA I (MSTCDF+1
MCHN1, ISZ I (7200
JMP MCHN2
TAD I MCHT1
DCA I (MREAD+2
ISZ MCHT1
TAD I MCHT1
DCA I (MREAD+1
TAD MCHREC
DCA I (MREAD+3
TAD (SHNDLR
DCA I (MREAD-1
JMP I (MREAD
MCHN2, TAD I MCHT1
DCA MCHADR /SET UP COMMAND TO READ NEXT SEGMENT
ISZ MCHT1
TAD I MCHT1
DCA MCHCTL
JMS MCHRD /READ IT
ISZ MCHT1
JMP MCHN1 /LOOP ON NUMBER OF SEGMENTS
MCHRD, 0
JMS I (SHNDLR
MCHCTL, 0101 /1 RECORD INTO FIELD 0 STARTING FORWARDS
MCHADR, 7200
MCHREC, 0
JMP CHERR /CHAIN ERROR
TAD MCHCTL
MCHBMP, CLL RTR
RTR
RTR
AND (37
SNA /V3C
TAD (40 /0 MEANS FULL 4K READ
IAC
CLL RAR
TAD MCHREC
DCA MCHREC
JMP I MCHRD
MCHT1, 0
MCHFJM, MSTCDF&177+5200 /"JMP MSTCDF"
CHERR, ISZ CHERR1
JMP CHERR /LET TTY DIE DOWN
ISZ CHERR2
JMP CHERR
CHTADC, TAD CHARS
SNA
JMP I (7600 /DONE..BACK TO MONITOR
TLS
TSF
JMP .-1
CLA
ISZ CHTADC /NEXT LETTER
JMP CHTADC
CHERR1, 0
CHERR2, -6
CHARS, "C;"H;"A;"I;"N;" ;"E;"R;"R;215;212;0
PAGE
*3600
RELOC 1400
/OVERLAY FOR SAVE COMMAND. RESIDES IN LAST HALF OF BLOCK 64; RUNS
/AT 1400.
SAVXX, TAD I SXFLE /STORES SFILE
DCA SWFILE
JMS I PHNDL /LOAD IN NON SYS HANDLER
JMS SWRITE /WRITE OUT CCB
TAD MERTST /MINUS THE # OF SEGS OF LT32K CODE
DCA I [600
TAD LXR /# OF BLOCKS OF GT 32K SEGS
SNA /LXR IS ZERO IF ALL SEGS ARE ABOVE 32K
JMP OVR32
TAD I SXFLE /LXR--- COMPENSATES FOR CCB
DCA SWFILE
SAVE4, TAD I XR
DCA SADR
CLA CLL CML RAR
TAD I XR
DCA SCTL
SAVE5, TAD SADR
RAL
SZL SPA CLA /DOES THIS SEGMENT START BELOW 2000?
JMP SAVE8 /NO - NOTHING TO WORRY ABOUT
TAD SCTL
AND T76
SZA CLA /FIELD 0?
JMP SAVE8 /NO - SAVE AS IS
SAVE6, JMS LOADF0 /LOAD THE FIELD 0 SAVE AREA OVER THE I/O MONITOR
SAVE7, CLA CMA
TAD SCTL
CLL RAL
TAD SADR
RAL
SZL SPA CLA /CHECK WHETHER UPPER LIMIT IS ABOVE 2000
JMP SAVE7A /IT IS - MUST MAKE 2 WRITES
TAD SCTL /TOTALLY CONTAINED IN 0-1777
TAD [10 /CHANGE FIELD 0 TO FIELD 1 AND CONTINUE
JMP SAVE8A
SAVE7A, TAD SCTL /WRITE IN 2 PARTS -
DCA TM1
TAD SADR
CIA /FIRST PART FROM FIELD 1, EVERYTHING BELOW 2000
TAD [2020
CLL CML RAR
DCA SCTL
JMS SWRITE
CLA CLL CML RTR
DCA SADR
TAD SCTL /SECOND PART FROM FIELD 0, EVERYTHING ABOVE 2000
AND [3700
CIA
TAD TM1
SMA /FULL FIELD SAVE IN F0 MAKES THIS +
TAD [4000 /COMPENSATE FOR THAT CASE
SAVE8A, DCA SCTL
SAVE8, JMS SWRITE
ISZ I [600
JMP SAVE4
STA /LXR BECOMES ONE BECAUSE OF CCB
TAD LXR /NUMBER OF BLOCKS OF GT32K SEGS
SNA CLA
JMP I [SAVE12
OVR32, TAD I SXFLE /RESET FILE TO INITIAL BLOCK
IAC /COMPENSATE FOR CCB
DCA SWFILE
TAD [603 /RESET CCB POINTER
DCA ADR1
TAD [7000
MOD4, LXM //V4: GETS CLA FROM SET SYS VT278
SAVE4B, TAD I ADR1 /IDENTICAL TO SAVE4 CODE
DCA SADR
CLA CLL CML RAR
TAD I ADR1
DCA SCTL
DCA ADR2 /SET UP TO MOVE GREATER THAN 32K CODE DOWN
DCA X1 /DITTO
DCA SXFLE /INTIALIZE FOR COUNTER
TAD SCTL /SET UP CDF FOR MOVE
AND T76 /ISOLATE BANK AND FIELD
CLL RTR /ADJUST MENT
SZL
TAD T20
CLL RTL
TAD FDC0
DCA .+1
XFSP, 0 /START OF MOVE LOOP
TAD I ADR2
CDF 70 /PUT THEM IN FIELD SEVEN
DCA I X1 /IT SEEMS LIKE A GOOD FIELD
ISZ SXFLE
JMP .-5
FDC0, CDF 0 /LOOP IS OFFICIALLY OVER
TAD SCTL /ADJUST SWRITE CONTROL WORD
AND [7700
TAD [70 /TO FIELD SEVEN
DCA SCTL
JMS SWRITE
ISZ EXTMP /IS THAT ALL THE SEGMENTS??
JMP SAVE4B /NO ---CONTINUE
JMP I [SAVE12 /TIME TO EXIT
LOADF0, 0
/ISZ F0OVLY /HAS THE FIELD 0 OVERLAY BEEN LOADED BEFORE?
/JMP I LOADF0 /EVIDENTLY
JMS I [SHNDLR
1010
F0OVLY, 0 /WILL BE 0 IF WE EXECUTE THIS CODE, OF COURSE
MTEMP+4
JMP KMONER
JMP I LOADF0
SWRITE, 0
JMS I DEVHND
SCTL, 4101
SADR, 600
SWFILE, 0
JMP KMONER
TAD SCTL
CLL RTR
RTR
RTR
AND RO37
SNA
TAD RO37
IAC
CLL RAR
TAD SWFILE
DCA SWFILE /BUMP RECORD NUMBER
JMP I SWRITE
RO37, 37
T76, 76
T20, 20
PHNDL, HNDL
SXFLE, SFILE&177+400
RELOC
PAGE
*4000 /SYSTEM GENERATOR - WRITES STUFF OUT USING SHNDLR
/AT THE BEHEST OF BUILD.
WRITE=JMS I SYSHND
JMS SYSSWP /SWAP SYSTEM DEVICE HANDLER INTO 7600
WRITE; 4200; 7400; 0; JMP BERR /BOOTSTRAP
TAD RBFLAG
SZA CLA
JMP .+6
WRITE; 4210; DCOUNT; 01; JMP BERR /DIRECTORY
WRITE; 5001; 0000; 07; JMP BERR /KEYBOARD MONITOR
WRITE; 4610; 0000; MONTOR; JMP BERR /USR
WRITE; 4111; 3400; MEOVLY; JMP BERR /"ENTER" OVERLAY
WRITE; 4701; 2000; MSOVLY; JMP BERR /SAVE OVERLAY,
/ERROR ROUTINE AND "CHAIN"
TAD RBFLAG
SZA CLA
JMP .+13
WRITE; 4101; LDRCTL; MFREE; JMP BERR /ABSLDR CONTROL BLOCK
WRITE; 5010; 2000;MFREE+1; JMP BERR /ABSLDR
JMS I (4200 /OUTPUT THE DEVICE HANDLERS
JMP BERR
JMS SYSSWP /SWAP BACK PAGE 7600
CLA CMA
HLT
CLA
JMP I .+1
BERR, 7600
JMS SYSSWP
HLT
JMP .-1
W6600, 6600
W7600, 7600
SYSSWP, 0
TAD W6600
DCA SYTM1
TAD W7600
DCA SYTM2
SWAPLP, TAD I SYTM1
DCA TMSY
TAD I SYTM2
DCA I SYTM1
TAD TMSY
DCA I SYTM2
ISZ SYTM1
ISZ SYTM2
JMP SWAPLP
JMP I SYSSWP
/CONTROL BLOCK FOR ABSOLUTE LOADER
LDRCTL, 7777 /ONE CONTIGUOUS LOAD
6213 /STARTING ADDRESS IN FIELD 1
2000 /STARTING LOCATION=12000
6003 /DOES NOT LOAD OVER EITHER MONITOR AREA
/ALSO DOES NOT USE THESE AREAS AT COMMAND TIME - TRUE
/ONLY FOR FIRST CALL TO COMMAND DECODER
2000 /FIRST(AND ONLY) SEGMENT STARTS AT 2000
1210 /IN FIELD 1 AND IS 10 PAGES LONG
IFNZRO LDRCTL-4113 <BLDER,XQX>
SYTM1, 0
SYTM2, 0
TMSY, 0
SYSHND, 7607
PAGE
*4264
RELOC 664 /LIVES IN BLOCK 64. RUNS IN FIELD 0 AT 600
MERGEX, CDF 10
TAD MERTST
SZA CLA
JMP MOVEC
TAD [1603 /LOADS INTO 600--MERGED--CODE
DCA LXR
TAD [1603
DCA X1
TAD I [1603
AND T1777
TAD T6000
DCA I [1603 /INITIALIZE STATUS BITS TO NO OVERLOADS
TAD I [1600
DCA TEMP1
MERGLP, TAD I LXR
AND TX37
CLL RTR /TRANSFORM 'ABCDE' TO 'CDEBA0'
RTR
SZL /TEST FOR 'B' BANK
TAD [400
CLL RAR
SZL /TEST FOR 'A' BANK
TAD [100
CLL RTR
RTR
RAR
DCA TEMP2
TAD I LXR
AND [7400
DCA TMP1
TAD TMP1
DCA I X1 /STORE ADDRESS
TAD TMP1
CIA
TAD I LXR /FORM UPPER LIM - LOWER LIM
CLL RAR
TAD TEMP2 /ADD IN FIELD
DCA I X1
TAD TMP1
CLL RAL
SZL SPA CLA /IS THE LOWER LIMIT < 2000?
JMP NXTSEG /NO
TAD TEMP2
RAR
SZA CLA /YES- IS THE FIELD 0 OR 1?
JMP NXTSEG /NO
SNL
IAC
CMA CML RTR
AND I [1603 /AND OUT THE PROPER OVERLOAD BIT
DCA I [1603
NXTSEG, ISZ TEMP1
JMP MERGLP
TAD I T1605 /TEST FIRST SEGMENT FOR GREATER THAN 32K
AND [7
SNA CLA /IF GREATER THAN 32K SET
JMP MOVEC
TAD I [1600 /THE 4000 BIT OF THE FIRST WORD OF THE CCB TO ZERO
RAL
CLL RAR
DCA I [1600
/REMOVED LXM PUT IT IN MOVE UP CODE
MOVEC, TAD T1577
DCA LXR
TAD T577
DCA X1
TAD [7600
DCA TEMP1
DCA MERTST /SET MOVE I.D. TO ZERO
JMP I MVECB /RETURN TIME
MVECB, CBMOVE&177+400
T1605, 1605
T1777, 1777
T6000, 6000
T1577, 1577
T577, 577
TX37, 37
RELOC
PAGE
*7400
NOPUNCH
*7600
ENPUNCH
/UPPER PAGE OF FIELD 1 - CHOCK FULL OF GOODIES
/LIKE THOUSANDS OF TABLES AND THE MONITOR CALL LOCATION
MOFILE, ZBLOCK 17 /OUTPUT FILE TABLE - 7600-7616 (3 ENTRIES MAX)
/5 WORDS PER ENTRY - DEVICE # AND FILE NAME
MIFILE, ZBLOCK 24 /INPUT FILE TABLE - 7617-7642 (10 ENTRIES MAX)
/2 WORDS PER ENTRY - DEVICE # AND RECORD #
/LAST WORD IN TABLE CONTAINS TERMINATION INDICATOR
/(0 FOR CR, 1 FOR ALTMODE) AND HIGH ORDER
/PART OF NUMERICAL ARGUMENT
MPARAM, ZBLOCK 4 /PARAMETER TABLE - 7643-7646
/FIRST 3 WORDS - MASK OF SWITCHES(A-Z,0-9).
/FOURTH WORD - CONTAINS THE LOW ORDER BITS OF
/THE NUMERICAL ARGUMENT
/TABLE OF DEVICE HANDLERS PRESENTLY IN CORE
DVHNDL, 7607;7607;0;0;0;0;0
0;0;0;0;0;0;0;0
MDATE, 0 /HOLDS THE CURRENT DATE- 4 BIT MONTH,
/5 BIT DAY, 3 BIT YEAR FROM 1970
MGET, CIF 0
JMS SHNDLR /INST FIELD IS 0
1000 /READ 4 RECORDS INTO FIELD 0
0 /LOCATIONS 0-1777
7 /KEYBOARD MONITOR FOLLOWS DIRECTORY
PJSBTS, JSBITS /SERVES AS A HALT (WATCH IT!)
SCDCIF, CDF CIF 0
JMP I .+1
MBEGIN, KMNTRY //SET SYS INIT WILL PATCH THIS LOCATION IN THE
//SYS HANDLER BOOTSTRAP TO 'INIT'.
MCALL1, 0
DCA MARG1 /SAVE AC AS IT MAY CONTAIN AN ARGUMENT
RDF /GET CALLING FIELD
TAD SCDCIF
DCA SMCIF
CDF 0
TAD I PJSBTS
RAR
CDF 10
SZL CLA /DOES JOB USE LOCS 10000-11777?
JMP MONRD /NO - DONT SAVE THEM
CIF 0
JMS SHNDLR
5010
0
MTEMP
HLT
MONRD, CIF 0
JMS SHNDLR
610
0
MONTOR
SCOPE, SCOPBIT /BIT 4 IS A 1 IF CONSOLE IS A SCOPE
JMP MSTART /START THE MONITOR UP IN PAGE 0
MRETRN, CIF 0
JMS SHNDLR
1010 /READ 10 RECS INTO FIELD 1
0
MTEMP /TEMP REGION ON SYS
HLT /SYS HAS PROBLEMS
SMCIF, 0
JMP I MCALL1
MARG1, 0
/TABLE OF USER DEVICE NAMES
/ALSO USED BY SYSTEM ODT
UDNAME, 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
DCB, ZBLOCK 17 /DEVICE CONTROL BLOCK - SET IN "CONFIG"
/********************************************************
/ MAP OF SYSTEM DEVICE AS OF DEC 80
/********************************************************
/ * 256 WORD BLOCKS *
/********************************************************
/ BLOCK # CONTENTS
/ ------- --------
/ 0 MONITOR BOOTSTRAP
/ 1- 6 DEVICE DIRECTORIES
/ 7-12 KEYBOARD MONITOR:
/ 0-377 PRINT, FETCH ROUTINES
/ 400-777 KMNTRY, DISPATCH FOR KMON COMMANDS
/ 1000-1377 KMINIT, INPUT LINE BUFFER
/ 1400-1777 KMON COMMAND PROCESSORS
/ 13-15 USR (ALSO KNOWN AS I/O MONITOR)
/ 16-25 DEVICE HANDLER RECORDS
/ 26 MONITOR "ENTER" OVERLAY
/ 27-50 MONITOR SCRATCH AREA FOR SAVING CORE:
/ 27-32 ARE FOR F1
/ 33-36 FOR FIELD 0; ALSO USED BY ODT FOR CODE THAT
/ WOULD RUN IN 0-1777
/ 37 USED BY SAVE COMMAND
/ 40-43 IS A STASH AREA FOR CODE THAT WOULD OVERLAY
/ ABSLDR (FIELD 1)
/ 51-53 COMMAND DECODER
/ 54-55 "SAVE WITH ARGUMENTS" AND "DATE" OVERLAYS
/ 56 MONITOR ERROR ROUTINE
/ 57 "CHAIN" PROCESSOR
/ 60-63 SYSTEM ODT
/ 64 HAS SAVE OVERLAYS TO SUPPORT KT8A MEMORY
/ 65 CCL REMINISCENSES
/ 66 TOP HALF HAS F1 7600 PAGE OF OS/8;
/ BOTTOM HALF HAS F2 7600 PAGE OF 2 PAGE SYS: HANDLER
/ 67 LIST OF VALID CCL COMMANDS
/ 70-END FILE STORAGE
SHNDLR=7607 /ENTRY POINT TO SYSTEMS HANDLER
*6600
NOPUNCH
*7600
ENPUNCH
/SYSTEM HANDLER AND FIELD 0 UPPER PAGE
/INCLUDES BOOTSTRAP AND PART OF MONITOR CALL ROUTINE
DVHORG=16 /DEVICE HANDLER RECORDS
MTEMP=27
MONTOR=13
JMS SHNDLR
5000 /SAVE MONITOR CORE - WRITE 5 BLOCKS FROM FIELD 0
0 /(LOCATIONS 0-1777)
MTEMP+4
7602 /TROUBLE WITH SYSTEM DEVICE
CDF CIF 10
JMP MGET /NOW GO READ IN THE KEYBOARD MONITOR
*6744 /INFORMATION ABOUT CURRENT JOB
NOPUNCH
*7744
ENPUNCH
JFIELD, 6203 /A CDF CIF N INSTRUCTION TO START THE JOB
JSTART, 7600 /THE STARTING ADDRESS
JSBITS, 1000 /VARIOUS STATUS BITS - USED FOR OPTIMIZATION
/BIT 4000 - JOB DID NOT LOAD INTO 00000-01777
/BIT 2000 - JOB DID NOT LOAD INTO 10000-11777
/BIT 1000 - JOB IS NOT RESTARTABLE
/BIT 400 - DOESN'T DESTROY BATCH MONITOR
/BIT 2 - JOB DOES NOT USE LOCS 00000-01777
/BIT 1 - JOB DOES NOT USE LOCS 10000-11777
SOFSET, 0 /FOR FUTURE (AND MAYBE PRESENT) USE
/DATA BREAK FILLERS FOR SYSTEM BOOTSTRAP
7750
7751
7752
7753
7754
7755
/MONITOR PATCH TO HELP BLEEP LOADER
0 /ADDRESS OF HANDLER FOR DEVICE USED
MREAD, HLT
0
0
0
HLT
MSWITC, JMP .+6 /ZEROED IF PG 7000 (HANDLER) MUST BE READ OVER
JMS SHNDLR
0300
7000 /THIS AREA MODIFIED BY ODT
MTEMP+6
MOD0,
OS78, HLT //BIT 4 IS SET IF OS/78 IS RUNNING, BIT 9 IS SET IF
//SYSTEM CONSOLE IS A VT278.
//THIS IS THE "ORIGINAL", BUT DOESN'T STAY AROUND
//LONG. THE COPY TO MODIFY IS IN KMINIT AT PMSRST
MSTCDF, CDF CIF 0
NOP //V4: CAN'T BE SETTING FLAGS WHEN THEY SHOULD BE
//CLEAR. V3 USED TO
/TCF EXIT WITH A CLEAR CONSCIENCE(ALSO A CLEAR FLAG)
JMP I .+1
MSTADR, 0
SBLOCK, 0
BIPCCL, 0 /MORE STATUS BITS.
/BIT 1: 1=> BATCH IS IN PROGRESS
/BITS 6-8: FIELD OF BATCH MONITOR
/HIGHEST CORE FIELD USED BY OS/8
/OR 0 TO MEAN OS/8 MAY USE ALL OF CORE
*0
VERSNO /OS/8 VERSION NUMBER
HLT /HIGHGROND NO LONGER SUPPORTED
PROMPT, "}
KMONER, CLA
TAD [7605
DCA ERRET
JMS I [PRMESG
TEXT /?ERROR/
/THE FOLLOWING REGISTERS ARE SET TO VITAL INITIAL VALUES. TO ALTER
/THESE VALUES IS TO BRING DISASTER DOWN UPON YOUR HEAD!
LXR, PMSRST-1
X1, MSWITC /THESE TWO ARE USED AT INITIALIZATION.
ADR1, RUN8-1
ADR2, RUN8&177+7377 /USED DURING R, AND RUN COMMANDS
XR,
AMFLAG, 0 /1 MEANS SAW ALTMODE
/MUST NOT MOVE FOR CCL AND BATCH
*20
RBFLAG, 0 /MUST BE AT LOCATION 20
TEMP2, -6 //V4: ONLY MOVE 6 LOCATIONS. TCF ISN'T ALLOWED IN VT278.
SYSTEM, 7700
PCH, PRINT
GLINE, XGLINE
GNAME, GETNAM
DEVHND, 7607
FUDJMP, MSTCDF&177+5200
P6203, 6203
TMP, PATCHLEV /MONITOR PATCH LEVEL MUST BE AT LOC 31 FOR CCL
PGTOUT, GETOUT
ERRET, PCRLF /MUST BE AT 33 FOR CCL
/THE FOLLOWING LOCS. ARE TEMPORARIES. HOWEVER, THERE IS NOW
/VITAL ONCE ONLY CODE TO HELP THE BATCH PROCESSOR. THIS CODE IS
/READ IN EVERY TIME THE KEYBOARD MONITOR IS RE-READ.
KOS78,
NM1, OS78 //POINTS TO OS78 WORD FOR INIT ROUTINES. GETS
//OVERWRITTEN WITH FIRST INPUT CHARACTER FROM KEYBOARD.
BATCH, /ENTRY TO READ NEW BATCH MONITOR
NM2, JMS I [7607 /THE BATCH INITIALIZER ALTERS SOME VALUES
NM3, 610 /IN THIS LIST...THIS ONE**********
NM4, 0 /THIS ONE*****GETS ADDRESS OF BOS.
TEMP1, 13 /******GETS RECORD OF BOS*****
TM1, SKP CLA /ERROR. DON'T RUN BATCH
TMP1, JMP BCHGO
NMCT, DCA I KM1 /CLEAR BATCH FLAG.
PN, JMP KMONER
PRDSW,
KM1, 7777
BCHGO,
RUNSW, CIF CDF 0
DIGFLG, JMP I .+1
SENTER, KMINIT /GETS ENTRY POINT (BOS)
KRCHK, RCHK
EXTMP, 0
MERTST, 0
SPTST, -1 /-1 USED IN RUN CODE
FIELD 1
EJECT USR ROUTINES
/FIELD 1
/OS/8 USER SERVICE ROUTINE.
/THIS PROCESSOR IS CALLED INTO MEMORY BY A JMS 7700 IN FIELD 1
/IT REPLACES MEMORY FROM 200-1777
/AND INTERPRETS THE WORDS AFTER THE JMS AS A MONITOR FUNCTION
/MONITOR FUNCTIONS ARE ASSIGN,LOOKUP,ENTER,ETC.
MAXCMD=13
*200
MONITO, 0 /MONITOR SUBROUTINE
DCA MACARG /STORE AC ARG
DCA USERFG /SET FLAG TO INDICATE WE WERE CALLED DIRECTLY
RDF /GET CALLING FIELD
TAD [CDF CIF 0
DCA FGETX
MRENTR, TAD FGETX
DCA FPUTX /FOR LOADING AND STORING CALLING SEQUENCE
JMS FGET /GET FIRST ARGUMENT[AND SET DATA FIELD 1)
ISZ MONITO
CLL
TAD [-MAXCMD-1
SZL
JMP MERROR
TAD JMPMAX
DCA .+1 /BRANCH TO APPROPRIATE ROUTINE WITH LINK ON
FGET, 0 /MUST PRESERVE LINK
TAD MONITO
JMS FGETW
JMP I FGET
/MONITOR COMMAND DISPATCH TABLE MUST BE JAMMED BEFORE 'FPUT'
MERROR
MASSIGN
MLOOKUP
MENTER
MCLOSE
MCD
MCHAIN
MERR
MESCAP
MESCPR
MASGN
MRSETP, MRESET
FPUT, 0 /MUST FOLLOW LAST ADDRESS IN JUMP TABLE
FPUTX, 0 /GETS CDF CIF OF CALLING FIELD
DCA I MONITO
CDF CIF 10
JMPMAX, JMP I FPUT
MEOERR, ISZ MERRNO
MIOERR, ISZ MERRNO
MERROR, ISZ MERRNO
ISZ MERRNO
ISZ MERRNO
ISZ MERRNO
MERR, CLA
CIF 0
JMS I [SHNDLR
0210
1400
MERRTN
HLT
JMP I .-3
MCD, CLA CLL CML RAR /CALL THE COMMAND DECODER, BUT FIRST
JMS CDSWAP /SWAP OUT MEMORY IF NECESSARY
JMS FGET
DCA T1
CIF 0
JMS I [SHNDLR
0601
0
MCDREC
JMP MIOERR
TAD FPUTX
CDF CIF 0
JMS I [200
DCA FPUTX
TAD FPUTX
DCA FGETX
JMS CDSWAP /RESTORE THE SWAPPED CORE IF NECESSARY
STL /LINK MUST BE ON AT MRESET
JMP I MRSETP /AFTER CD, RESET DEVICE AREA
MCHAIN, JMS FGET
DCA T1 /BUFFER THE ARGUMENT
CIF 0
JMS I [SHNDLR
0101
7400
MRUNRC
JMP MIOERR
TAD T1 /LOAD THE BUFFERED ARGUMENT
CDF CIF 0
JMP I .-5
MLNOTF, CLA
ISZ MONITO
MNEXT, TAD USERFG
MESCAP, CLL RAR
TAD MONITO
DCA I [7700
TAD FPUTX
DCA I [SMCIF
CLA IAC CML
CDF 0
AND I [JSBITS
CDF 10
RAR
SZL SPA CLA /RESTORE CORE IF USERFG=1 AND JSW[11]=0
JMP I [SMCIF
JMP I [MRETRN
MESCPR, CLL CML
JMP MESCAP+1
FGETW, 0
DCA FPUT
FGETX, HLT
TAD I FPUT
CDF CIF 10
JMP I FGETW
CDSWAP, 0
TAD ME1000 /FORM READ OR WRITE OPERATION FOR RESTORE OR SAVE.
DCA MCDCTL
CDF 0
TAD I [JSBITS
CDF 10
RTR
SZL CLA /IS IT NECESSARY TO SAVE MEMORY?
JMP I CDSWAP /NO
CIF 0
JMS I [SHNDLR
MCDCTL, 0
0
MTEMP+4
JMP MIOERR
JMP I CDSWAP
EOVFLO, CIF 0
JMS I [SHNDLR
0111
ME1000, 1000 /ENTER OVERLAY LOADS OVER ENTER (NATCH)
MEOVLY
JMP MIOERR
JMP I ME1000
*400
/ASSIGN PROCESSOR - TRANSLATE DEVICE NAME INTO DEVICE NUMBER
/(IF NECESSARY),GET DEVICE HANDLER INTO CORE(IF NECESSARY)
/AND ADJUST TABLES(IF NECESSARY). IS THIS REALLY NECESSARY?
MASGN, CLA IAC
MASSIGN, DCA ASFLAG
TAD MACARG
SZA /IS DEVICE NUMERIC OR SYMBOLIC?
JMP DFOUND /NUMERIC
JMS I [FGET /GET HIGH ORDER 2 CHARS OF NAME
ISZ I [MONITO
SNA
JMP I [MRTRN+1 /FIRST WORD OF NAME MUST BE NON-ZERO
DCA NAME
JMS I [FGET
SNA /IS NAME >2 CHARACTERS LONG?
JMP NOHASH /NO - DON'T HASH
TAD NAME
RAL
CLL CML RAR /FORCE SIGN BIT OF HASH NAME ON
DCA NAME
NOHASH, TAD [UDNAME-1 /SEARCH USER NAME TABLE FIRST
DSRCH, DCA XR
TAD [-17
DCA T2
DSRCLP, TAD I XR
CIA
TAD NAME
SNA CLA
JMP DSFND
ISZ T2
JMP DSRCLP
TAD XR
SMA CLA /WHICH TABLE DID WE JUST SEARCH?
JMP I [MRTRN+1 /SYSTEM TABLE - ERROR
TAD [SDNAME-1
JMP DSRCH /GO SEARCH SYSTEM TABLE
DSFND, TAD T2
TAD [20
JMS I [FPUT /PUT NUMBER INTO CALLING SEQUENCE
JMS I [FGET /GET IT BACK IN AC, BUMPING POINTER
ISZ I [MONITO
DFOUND, JMS I [MCKDEV /DETERMINE ITS VALIDITY (NON-ZERONESS)
/AND FORM POINTERS
SNA /IS THE DEVICE HANDLER IN CORE?
TAD I T2
SNA /DOES A HANDLER EXIST FOR THE DEVICE?
JMP I [MLNOTF /NO - SAME AS THE DEVICE NOT EXISTING
CMA RAL /GET THE COMPLEMENT OF THE HIGH ORDER BIT INTO THE LINK
SNL CLA /TWO PAGE HANDLER?(IF HANDLER IS IN CORE,
/THIS TEST IS RANDOM BUT WE DON'T CARE)
TAD [100 /YES - FORCE A TWO-PAGE READ
TAD [100
DCA DVHCTL
TAD T1
DCA T7 /SAVE T1 AS WE WILL DESTROY IT LATER
TAD I T1
TAD ASFLAG
SZA CLA /DOES HE ACTUALLY WANT US TO LOAD?
JMP AFINIS /NO.
JMS I [FGET /YES--FETCH PAGE IN WHICH HANDLER IS TO BE LOADED
RAR /GET THE LINK, WHICH HAS BEEN UNTOUCHED SINCE WE
/PUT THE "TWO PAGE HANDLER" FLAG INTO IT
SNL SMA /IF THIS HANDLER IS TWO-PAGE, IS HE ALLOWING IT TO BE?
JMP I [MLNOTF /NO - GIVE AN ERROR RETURN
RAL /YES - ROTATE BACK
AND [7600 /MAKE IT LEGAL
DCA DVHLOC
JMS GETREC
DCA DVHREC
CIF 0
JMS I [SHNDLR
DVHCTL, 0 /READ ONE OR TWO PAGES INTO FIELD 0
DVHLOC, 0
DVHREC, 0
JMP I [MIOERR /SYSTEM DEVICE ERROR
/NOW GO THROUGH THE TABLE OF AVAILABE HANDLERS
TAD [-17 /AND MARK OFF THOSE WHICH ARE NOW IN CORE
DCA T4
DVHCLP, TAD T4
JMS I [MCKDEV /LOW ORDER BITS OF T4 GO THROUGH 1-17
CMA
TAD DVHLOC
CLL CML RAR
TAD DVHCTL /IF A HANDLER ENTRY POINT IS WITHIN 200 WORDS OF THE
SMA CLA /LOADING ADDRESS (400 FOR A TWO-PAGE HANDLER)
DCA I T1 /MARK IT AS WIPED
JMS GETREC
CIA
TAD DVHREC
SZA CLA
JMP NOTINC
TAD I T2
AND [177
TAD DVHLOC
DCA I T1
NOTINC, ISZ T4
JMP DVHCLP
AFINIS, TAD I T7
JMP I [MRTRN /STORE HANDLER ADDRESS AND EXIT
GETREC, 0
TAD I T2 /GET RECORD OF DEVICE HANDLER
CLL RTL
RTL
RTL /EXTRACT THE RECORD NUMBER
AND [17
TAD [DVHORG-1 /ADD THE BASE OF DEVICE HANDLER STORAGE
JMP I GETREC
MCKDEV, 0 /MUST PRESERVE LINK
AND [17
SNA
JMP I [MERROR /DEVICE 0 IS ILLEGAL
DCA NAME
TAD NAME
TAD [SDVHND-1 /FORM POINTER INTO HANDLER IMAGE TABLE
DCA T2
TAD NAME
TAD [DVHNDL-1
DCA T1
TAD NAME
TAD [DCB-1
DCA T8 /FORM POINTER TO DCB ENTRY FOR DEVICE
TAD I T1
JMP I MCKDEV
IFNZRO .-564 <REASSEMBLE CONFIG>
/SDNAME IS LIST OF PERMANENT DEVICE NAMES.
SDNAME, ZBLOCK 17 /SYSTEM DNAME TABLE - SET UP BY "CONFIG"
IFZERO .+200&1000 <*600>
/LOOKUP PROCESSOR - GETS THE STARTING BLOCK OF AN INPUT FILE
/ON A SPECIFIED DEVICE.SKIPS IF FILE WAS FOUND OR DEVICE
/IS NOT FILE ORIENTED
MLOOKUP,CLL /SET RDCAT MODE TO INPUT
JMS MRDCAT
JMP ERETRN /NON-FILE STRUCTURED DEVICE
JMS MDSRCH /SEARCH THE DIRECTORY FOR THE FILE
JMP MRTRN+1 /NOT FOUND - TAKE ERROR RETURN
LRETRN, TAD T5
CIA
TAD I [DORG /CONVERT T5 TO A RECORD NUMBER
ERETRN, JMS I [FPUT
ISZ I [MONITO
TAD T6
CIA /STORE FILE LENGTH AS A NEGATIVE NUMBER
MRTRN, JMS I [FPUT /THIS CODE IS JUMPED TO BY SEVERAL ROUTINES
MRTRN2, ISZ I [MONITO
JMP I [MLNOTF
MRDCAT, 0
SZA
JMP MRDREN /NOT THE FIRST SEGMENT - DON'T SET UP POINTERS
DCA T5 /ZERO STARTING BLOCK NUMBER
DCA T6 /ZERO FILE LENGTH
TAD MACARG /GET DEVICE NUMBER FROM AC
JMS I [MCKDEV /CHECK LEGALITY AND FORM POINTERS
SNA
JMP I [MERROR+1 /DEVICE HANDLER IS NOT IN CORE - ERROR
DCA T9 /ADDRESS OF DEVICE HANDLER
JMS I [FGET
DCA T4 /STORE THE POINTER TO THE FILE NAME IN T4
SNL
CML RAR
RTR /FORM A MASK OF 2000 OR 1000 DEPENDING ON LINK
AND I T8
SZA CLA /TEST FOR READ-ONLY(L=1) OR WRITE-ONLY(L=0)
JMP MRTRN+1 /FAILED THE TEST - ERROR RETURN
TAD I T8
SMA CLA
JMP I MRDCAT /DEVICE IS NOT FILE-ORIENTED
ISZ MRDCAT
CLA IAC
MRDREN, DCA MCATRC /STORE SEGMENT NUMBER
TAD T9 /USE LOW ORDER BITS
AND [177 /OF DEVICE HANDLER ENTRY POINT
CLL RTL /AND THE REQUESTED SEGMENT NUMBER
RAL /TO FORM A "UNIQUE" KEY
TAD MCATRC /FOR THIS SEGMENT OF THIS DIRECTORY
/(THE UNIQUENESS DEPENDS ON EACH HANDLER HAVING A DIFFERENT
/STARTING OFFSET IN ITS PAGE)
CIA
TAD OLDT9 /COMPARE KEY AGAINST KEY OF CURRENT SEGMENT
SNA /ARE THEY THE SAME?
JMP INLRDY /YES - DON'T READ SEGMENT, ITS IN CORE
CIA
TAD OLDT9
DCA OLDT9 /STORE THE KEY OF THE NEW IN-CORE SEGMENT
CLA CLL CML RAR /CHANGE WRITE TO READ
JMS MWRCAT
INLRDY, TAD I [DCOUNT
CML CMA RAL
SZL SPA
JMP JMPME2
CMA CML RAR /NEW V3 DIRECTORY VERIFYER
DCA NFILES /FIRST WORD IN CATALOG = -# OF FILES IN CATALOG
TAD [DPROPR-1
DCA XR /SET XR TO POINT TO FIRST FILE ENTRY
JMP I MRDCAT /RETURN TO BUMPED ADDRESS
MDSRCH, 0
FSRCLP, TAD I XR
SNA CLA /EMPTY SPACES HAVE A ONE WORD ZERO DIRECTORY ENTRY
JMP SKPMTF /SO SKIP THE 4 WORD COMPARE ON THEM
CLA CMA
TAD XR
DCA XR
TAD [-4
DCA T6
TAD T4
DCA T7
SRCWDL, TAD T7
JMS I [FGETW
CIA
TAD I XR
SZA CLA /COMPARE ENTRY AGAINST ARGUMENT(8 CHARACTERS)
JMP NXTFIL
ISZ T7
ISZ T6
JMP SRCWDL
JMS BUMPXR /SKIP GARBAGE WORDS
TAD I XR
SNA
JMP SKPMTF+1 /UNCLOSED OUTPUT FILES DONT COUNT
CIA
DCA T6 /STORE FILE LENGTH
ISZ MDSRCH
JMP I MDSRCH
NXTFIL, TAD T6
IAC
JMS BUMPXR /SKIP REST OF NAME AND GARBAGE WORDS
SKPMTF, TAD I XR /GET LENGTH OF THIS ENTRY
TAD T5
DCA T5 /ADD TO BLOCK STARTING ADDRESS
ISZ NFILES
JMP FSRCLP
DCA T5 /RE-INITIALIZE BLOCK NUMBER FOR NEXT SEGMENT
TAD I [DLINK /DIRECTORY EXHAUSTED - ANY MORE?
SZA
JMP MRDREN
JMP I MDSRCH
BUMPXR, 0 /ROUTINE TO SKIP (DWASTE+AC) WORDS
TAD I [DWASTE
CIA /DWASTE IS NEGATIVE AND SO IS AC
TAD XR
DCA XR
JMP I BUMPXR
MWRCAT, 0
TAD [4210
DCA CATCTL
CIF 0
JMS I T9
CATCTL, 4210 /WRITE 2 RECORDS FROM FIELD 1
1400
MCATRC, 1
JMPME2, JMP I [MERROR+2 /CANNOT REWRITE CATALOG
JMP I MWRCAT
IFNZRO .-772 <REASSEMBLE CONFIG> /USED TO BE 766
SDVHND, ZBLOCK 17 /DEVICE HANDLER INFORMATION TABLE - SET BY CONFIG
IFZERO 1000&. <*1000>
/ENTER PROCESSOR FOR MONITOR
/FIND A HOLE IN THE DIRECTORY LARGE ENOUGH TO ACCOMODATE THE FILE
/AND STICK IT IN. MAKE A NOTE THAT WE DID SO FOR THE
/"CLOSE" PROCESSOR.
MENTER, DCA EPASS /SET UP FOR PASS 1
JMS I [MRDCAT /READ CATALOG AND SET UP NFILES AND XR
JMP I [ERETRN /NON-FILE-STRUCTURED DEVICE
JMS I [CONSOL
DCA T2 /INTIIALIZE STARTING BLOCK NUMBER COUNTER
TAD [DPROPR-1
DCA XR /RESTORE XR (CONSOLIDATOR DESTROYED IT)
TAD MACARG
CLL RTR
RTR
AND [377 /GET REQUESTED LENGTH FROM AC BITS 0-7
CIA
DCA T3 /T3=REQUESTED LENGTH. IF T3=0, MEANS RETURN
/LARGEST EMPTY SPACE ON TAPE. IF T3<>0, MEANS RETURN
/SMALLEST BLOCK OF LENGTH =>T3.
TAD I T8 /GET FCB ENTRY
AND [7
SZA CLA /ANY ACTIVE TENTATIVE FILES ON THIS DEVICE?
JMP I [MRTRN+1 /YES - TAKE ERROR RETURN
MELOOP, TAD I XR
SNA CLA
JMP MEMPTY /EMPTY SPACE - LOOK AT LENGTH
MTHREE /OCCUPIED - IGNORE
JMS I [BUMPXR
TAD I XR
MELEND, TAD T2
DCA T2 /UPDATE T2 TO STARTING BLOCK # OF NEXT ENTRY
ISZ NFILES
JMP MELOOP /GO TO NEXT ENTRY
/DIRECTORY BLOCK EXHAUSTED
TAD EPASS
SZA CLA /WHAT PASS ARE WE IN?
JMP EFINUP /SECOND PASS - THIS IS FOR KEEPS
TAD I [DLINK /FIRST PASS
SZA /ANY MORE SEGMENTS?
JMP I [MRDREN /YES - CONTINUE
/DONE - SEE IF OUR BEST IS GOOD ENOUGH.
TAD T4
JMS I [FGETW
SZA CLA /CHECK THAT FIRST WORD OF NAME IS NON-ZERO
TAD T6
SNA CLA /AND THAT WE FOUND WHAT WE WANTED
JMP I [MRTRN2 /OTHERWISE GIVE ERROR RETURN
TAD ASFLAG /GET NUMBER OF BEST SEGMENT
ISZ EPASS /AND RESTART THE ALGORITHM IN PASS 2
JMP I [MRDREN /(TAKES LESS SPACE THAN SAVING XR AND NAME)
/EVERYTHING IS SET UP - PERFORM THE ACTUAL ENTRY OPERATION
EFINUP, TAD XR
DCA T1
TAD [-4
JMS I [BUMPXR
TAD I [DWASTE
CIA
TAD XR /CATALOG MUST HAVE ROOM FOR ONE MORE FILE
TAD [-1772 /AFTER THIS FILE IS ENTERED
SMA CLA /WILL NEW ADDITION OVERFLOW CATALOG?
JMP I [EOVFLO /YUP - CALL OVERLAY TO EXTEND DIRECTORY
MELP2, TAD I T1 /MOVE REST OF CATALOG UP
DCA I XR /TO CREATE SPACE FOR NEW ENTRY
CLA CMA
TAD T1
DCA T1
CLA CMA CLL RAL
TAD XR
DCA XR
TAD T1
CIA CLL CML
TAD NAME
SZA CLA /HAVE WE PUSHED UP EVERYTHING?
JMP MELP2 /NO, KEEP PUSHING
TAD [-4
DCA T1 /NOW MOVE THE USERS FILE NAME
TAD NAME
DCA XR
TAD T4
JMS I [FGETW /[IN THE USERS FIELD, OF COURSE)
DCA I XR
ISZ T4
ISZ T1 /INTO THE EMPTY SPACE JUST CREATED
JMP .-5
TAD I [MDATE /PUT DATE OF CREATION INTO FILE NAME
DCA I XR /THIS WILL BE DESTROYED IF DWASTE=0
IAC /ADJUST XR BUMP BECAUSE OF DATE STORE
JMS I [BUMPXR
DCA I XR /GIVE THE NEWLY ENTERED FILE A LENGTH OF 0
TAD XR /PUT A POINTER TO THE LENGTH WORD OF THE
DCA I [DFLAG /NEW ENTRY INTO THE DIRECTORY HEADER
CLA CMA
TAD I [DCOUNT
DCA I [DCOUNT /INCREASE THE FILE COUNT BY 1
TAD I T8
TAD ASFLAG
DCA I T8 /SIGNAL AN OPEN OUTPUT FILE ON THIS DEVICE
JMS I [MWRCAT /WRITE THE ALTERED CATALOG BACK OUT
JMP I [LRETRN /STORE ARGS BACK JUST LIKE "LOOKUP"
MEMPTY, TAD I XR
CIA CLL
DCA T1 /SAVE LENGTH OF CURRENT ENTRY
TAD T3
TAD T6
CLA /LINK NOW EQUALS BEST LENGTH>=DESIRED LENGTH
TAD T3
SNA
CML /IF DESIRED LENGTH=0 WE ALWAYS WANT MAXIMUM
TAD T1
CLA CML /LINK IS NOW ON IF DESIRED LENGTH IS NOT IN BETWEEN
/BEST LENGTH AND CURRENT LENGTH
TAD T1
CIA
TAD T6
SZL SNA CLA /TAKE EITHER MIN OR MAX OF BEST AND CURRENT LENGTHS,
/DEPENDING ON WHETHER LINK IS ON OR OFF
JMP MNOCHG /MIN(MAX)=BEST - NOTHING TO DO
TAD T1
DCA T6 /MAKE CURRENT ENTRY NEW "BEST"
CLA CLL CMA RAL
TAD XR
DCA NAME /REMEMBER CATALOG LOCATION
TAD I [MCATRC
DCA ASFLAG /ALSO DIRECTORY SEGMENT NUMBER
TAD T2
DCA T5 /AND STARTING BLOCK NUMBER
MNOCHG, TAD T1
CIA
JMP MELEND /GO UPDATE THE BLOCK NUMBER
/CLOSE PROCESSOR - CLOSES AN OUTPUT FILE WHICH WAS OPENED
/BY THE "ENTER" CALL -- ARGUMENTS ARE THE DEVICE NUMBER AND THE
/CLOSING LENGTH OF THE FILE. PERFORMS A DIRECTORY CLEANUP AFTER
/CLOSING THE FILE. IF AN ENTRY ALREADY EXISTS WITH THE NEW FILE'S
/NAME IT IS DELETED. (CLOSE MAY BE USED AS A "DELETE" COMMAND
/ONLY IF NO OUTPUT FILE WAS ENTERED). AN ERROR RETURN IS
/GIVEN IF THE CLOSING LENGTH IS TOO BIG OR IF THERE WAS NEITHER
/AN ACTIVE TENTATIVE FILE OR AN OLD FILE TO DELETE.
MCLOSE, JMS I [MRDCAT /GET THE CATALOG. ALSO NOTE YOU JUST CROSSED A PAGE!
JMP CRETRN /NON-FILE STRUCTURED DEVICE - RETURN NORMALLY
CLA IAC /GET THE NEXT WORD IN THE CALLING SEQUENCE
JMS I [FGET
DCA T1 /GET CLOSING LENGTH AND STORE IT AWAY
JMS I [MDSRCH /SEARCH FOR THE OLD COPY
JMP NODLET /NO OLD COPY
MTHREE
TAD I [DWASTE
JMS SQUISH /SQUISH OUT 3+#WASTE WORDS OF THE OLD COPY
DCA I XR2 /AND MAKE THE OTHER TWO INTO AN EMPTY
TAD T6 /FILE ENTRY WITH THE SAME LENGTH
CIA
DCA I XR2 /AS THE OLD COPY
TAD I T8
AND [7
SNA /IS THERE AN OPEN OUTPUT FILE ON THIS DEVICE
JMP EOCLOS /NO - FINISH UP AND GET OUT
CIA /GET THE SEGMENT NUMBER WE WANT
TAD I [MCATRC
SNA CLA
JMP .+3
JMS CONSOL
JMS I [MWRCAT /NO - WRITE OUT THE ONE WE SQUISHED
TAD I [DFLAG /GET LOCATION OF TENTATIVE FILE
CIA CLL
TAD XR2
SZL CLA /IS THE ENTRY TO BE CLOSED ABOVE THE ONE
JMP .+3 /WE JUST DELETED?
MTHREE /YES - MOVE THE POINTER DOWN
TAD I [DWASTE /TO COMPENSATE FOR THE SQUISHING
TAD I [DFLAG /THE POINTER WILL NOW POINT
DCA I [DFLAG /TO THE LENGTH WORD.
/(THIS WAS WASTED WORK UNLESS THE CORRECT SEGMENT IS IN CORE)
NODLET, TAD I T8
AND [7
SNA /IS THERE AN OPEN OUTPUT FILE ON THIS DEVICE?
JMP I [MRTRN+1 /WHAT DID HE CALL US FOR? - ERROR
JMS I [MRDCAT /YES - READ IN THE CORRECT SEGMENT
TAD I [DFLAG
DCA T4 /T4 POINTS TO THE LENGTH OF THE TENTATIVE ENTRY
TAD T1
CIA /IF T1=0, NEW ENTRY WILL BE DELETED AUTOMATICALLY
DCA I T4 /DURING CONSOLIDATION
ISZ T4
ISZ T4
CLL CML
TAD T1
TAD I T4 /SUBTRACT CLOSING LENGTH FROM FREE BLOCK ADJACENT TO ENTRY
SNL SZA
JMP I [MERROR+3 /CLOSE ERROR
DCA I T4
EOCLOS, JMS CONSOL /CONSOLIDATE THE DIRECTORY
TAD [7770
AND I T8
DCA I T8
SKP
CRETRN, TAD [7600 /DO A WRITE OF 0 PAGES. (MAGTAPE)
JMS I [MWRCAT
ISZ I [MONITO
JMP I [MRTRN2
/CONSOLIDATOR - CHECKS FOR ENTRIES OF LENGTH 0 AND DELETES THEM.
/ALSO CHECKS FOR ADJACENT FREE AREAS AND COMBINES THEM.
CONSOL, 0
TAD [DPROPR-1
DCA XR
TAD I [DCOUNT
DCA T7 /T7 = FILE COUNT
CONLP, TAD I XR
SNA CLA /EMPTY FILE?
JMP CONMTF /YES - GO CHECK FOR NULL AND 2 IN A ROW
MTHREE
JMS I [BUMPXR /GET PAST THE GARBAGE WORDS
TAD I XR /GET COUNT
SZA CLA /WOULD THIS HAPPEN TO BE A NULL FILE?
JMP CONLPT /NAH, GO TO NEXT ONE
TAD [-5 /YEAH, REMOVE IT ENTIRELY
TAD I [DWASTE /INCLUDING THE WASTE WORDS
SQCOMN, JMS SQUISH
ISZ I [DCOUNT /BUMP DOWN FILE COUNT IN DIRECTORY
ISZ NFILES /AS WELL AS THE TEMPORARY ONE IN PAGE 0
NOP /V3 RL INSISTS
JMP CONSOL+1 /REPEAT ENTIRE CONSOLIDATION - THIS DELETION MAY
/HAVE BROUGHT TWO FREE ENTRIES TOGEHER
/ THE ABOVE NOP FIXES THE KILLER CLOSE BUG
CONLPT, ISZ T7
JMP CONLP /MORE FILES - KEEP PLUGGING
JMP I CONSOL /RETURN FROM CONSOLIDATOR
CONMTF, TAD I XR /IS THIS FREE ENTRY NULL?
SNA
JMP SQTRIV /YES - SQUASHITLIKEABUG
DCA T2 /NO - SAVE LENGTH
TAD XR
DCA SQUISH /SAVE POSITION OF LENGTH WORD
ISZ T7 /WAS IT THE LAST FILE?
SKP /NO, THEN THERE IS ONE AFTER IT(GOOD THINKING!)
JMP I CONSOL /YES - RETURN FROM CONSOLIDATOR
TAD I XR
SZA CLA /TWO EMPTIES IN A ROW?
JMP CONLP+3 /NO - SLIP BACK INTO LOOP
TAD I XR
TAD T2 /YES - COMBINE LENGTHS
DCA I SQUISH /STORE BACK IN FIRST LENGTH WORD AND SQUISH SECOND ENTRY
SQTRIV, CLA CMA CLL RAL
JMP SQCOMN /SQUISH OUT 2 WORDS
MRESET, TAD [-17
DCA T3
MRSETL, TAD T3
JMS I [MCKDEV
/LINK MUST BE ON AT THIS POINT
TAD [200
SZL CLA /ZERO ALL DEVICE HANDLER SLOTS THAT AREN'T RESIDENT
DCA I T1
JMS I [FGET
SZA CLA
TAD [7
CMA STL
AND I T8
DCA I T8 /DELETE THE "FILE CURRENTLY OPEN" FLAG IF ASKED
ISZ T3
JMP MRSETL
JMP I [MNEXT
/SUBR TO COLLAPSE DIRECTORY AFTER A POINT
SQUISH, 0
TAD XR
DCA XR1
CLA CLL CMA RAL
TAD XR1
DCA XR2 /SET UP XR2 FOR CHANGING SQUISHED ENTRY
SQLOOP, TAD I XR
DCA I XR1 /MOVE DOWN ONE WORD
TAD XR
TAD [-1777
SZA CLA /AT END YET?
JMP SQLOOP /NO, KEEP GOING
JMP I SQUISH
*1400
/INITIAL DIRECTORY FOR MONITOR
//USED BY BUILD AT WROS8 TO CREATE ABSLDR.SV FROM THE OS8 MONITOR
//SOURCE.
DCOUNT, -2 /TWO ENTRIES
DORG, MFREE /FILE STORAGE STARTS AT BLOCK "MFREE"
DLINK, 0 /THIS IS THE ONLY DIRECTORY RECORD
DFLAG, 0 /THERE ARE NO OPEN OUTPUT FILES ON THIS DEVICE
DWASTE, -1 /# OF WASTED WORDS PER ENTRY
DPROPR, 0102 /AB
2314 /SL
0422 /DR
2326 /.SV
VERDATE //"DATE WORD" FOR ABLSDR.
-6 /SIX BLOCKS LONG( 1 BLOCK = 256 WORDS)
//IF THIS IS CHANGED, CHANGE THE "TAD (6" IN BUILD AT WROS8.
0 /EMPTY SPACE
-1 /OVERLAYED BY DEVICE DEPENDENT PART WITH LENGTH
IFNZRO .-1415 <CNFER,QQQ>
*3400 /"ENTER" OVERLAY TO USR - RUNS IN 11000
JMP .+3
MSEGLM, -7 /# DIRECT. SEGS
NEWLEN, -10
MEOVLP, TAD I [DLINK
SNA CLA
JMP MELAST /LAST SEGMENT - MUST CREATE A NEW ONE
ISZ I [DCOUNT /BUMP ENTRY COUNT DOWN
JMS I [MWRCAT /WRITE OUT THIS SEGMENT
JMS MSKIPF /FIND END OF SHORTENED DIRECTORY
DCA MEFCNT /PREPARE TO TRANSFER LAST ENTRY
TAD (MEOVLS-1
DCA XR1 /INTO NEXT DIRECTORY SEGMENT
TAD I XR
DCA I XR1
ISZ MEFCNT /THROUGH A BUFFER AT LOC 11200
TAD XR
CIA
TAD T1 /T1 WAS SET UP BY "ENTER"
SZA CLA
JMP .-7
TAD I T1 /GET LENGTH OF MOVED ENTRY
DCA MEOCNT
TAD I [DLINK
JMS I [MRDCAT /READ NEXT SEGMENT
JMS I [CONSOL /MAKE SURE IT IS AT ITS SMALLEST
TAD I [DORG
TAD MEOCNT
DCA I [DORG /BUMP FILE ORIGIN DOWN
JMS MSKIPF /FIND LAST LOC IN NEW SEGMENT
MELP3, TAD XR
DCA METMP1
TAD XR
TAD MEFCNT
DCA METMP2 /PREPARE TO PUSH ALL ENTRIES UP
TAD I METMP1
DCA I METMP2 /DO THE PUSHING
STA
TAD XR
DCA XR
TAD XR
TAD (-DWASTE
SZA CLA /ARE WE THROUGH?
JMP MELP3 /NO
TAD (MEOVLS-1
DCA XR /PREPARE TO MOVE THE SAVED ENTRY INTO THE
CLA CMA /NEW SEGMENT
TAD I [DCOUNT
DCA I [DCOUNT /INCREASE ENTRY COUNT OF NEW SEGMENT
TAD MEFCNT
CIA
MECOMN, DCA MEFCNT /STORE NUMBER OF WORDS TO MOVE
TAD [DWASTE
DCA XR1
TAD I XR
DCA I XR1
ISZ MEFCNT
JMP .-3 /MOVE THE ENTRY IN
JMS MSKIPF
TAD XR
DCA T1 /T1=LAST LOC IN SEGMENT
TAD I [DWASTE
CIA
TAD XR
TAD [-1772
SMA CLA /HAVE WE MADE THIS SEGMENT TOO BIG?
JMP MEOVLP /YES - LOOP UNTIL WE GET IT RIGHT
JMS I [MWRCAT /WRITE OUT NEW SEGMENT
JMP MEOXIT /READ IN ENTER AND CONTINUE
MWRONG, IAC
MELAST, TAD NEWLEN
DCA METMP1 /LENGTH OF NEW SEGMENT
TAD METMP1
CIA
TAD I [DCOUNT
SMA /WERE THERE "NEWLEN+1"
JMP MWRONG /NO - SET OUR SIGHTS LOWER
DCA I [DCOUNT /ADJUST LENGTH OF OLD SEGMENT
JMS MSKIPF /FIND BOUNDARY LOC BETWEEN SEGMENTS
TAD I [MCATRC
IAC
DCA I [DLINK /LINK THE OLD LAST SEGMENT TO
TAD I [DLINK /THE NEWLY CREATED ONE
TAD MSEGLM
SMA CLA
JMP I (MEOERR /PROVIDED THAT THERE IS ROOM FOR ANOTHER
JMS I [MWRCAT /WRITE OUT THE NEXT-TO-LAST SEGMENT
ISZ I [MCATRC /BUMP RECORD NUMBER FOR NEXT WRITE
ISZ OLDT9 /LIKEWISE BUMP DIRECTORY KEY
TAD METMP1
DCA I [DCOUNT
TAD MEOCNT
CIA
TAD I [DORG
DCA I [DORG /SET UP PARAMETERS OF THE NEW SEGMENT
DCA I [DLINK /MARK IT AS THE NEW LAST SEGMENT
TAD XR
TAD [-1777 /SET UP COUNT OF WORDS TO SLIDE DOWN
JMP MECOMN /USE COMMON CODE TO SLIDE WORDS AND EXIT
MSKIPF, 0 /SUBR TO FIND LAST LOC USED IN A SEGMENT
/ALSO FINDS NUMBER OF BLOCKS USED BY SEGMENT
TAD I [DCOUNT
DCA MNOFIL
TAD [DWASTE
DCA XR
DCA MEOCNT /INITIALIZE POINTER(XR) AND COUNT(MEOCNT)
MSKPLP, TAD I XR
SNA CLA
JMP MEOMTY
MTHREE
TAD I [DWASTE /BUMP POINTER TO LENGTH WORD OF FILE ENTRY
CIA
TAD XR
DCA XR
MEOMTY, TAD I XR
TAD MEOCNT
DCA MEOCNT
ISZ MNOFIL
JMP MSKPLP
JMP I MSKIPF
MEOCNT, 0
MEFCNT, 0
METMP1, 0
METMP2, 0
MNOFIL, 0
PAGE
EJECT ABSLDR V4
/ABSOLUTE LOADER FOR OS/8 - VERSION 4A
*2000
MEOVLS=1200 /DESTROYS PART OF "CLOSE" OP FOR BUFFER
CTLBLK=3400
BUFFER=CTLBLK
RXM=6230 /KT8A INSTRUCTION
LXM=6200 /KT8A INSTRUCTION
XVALU=70 /XCODE
XFIELD=20
ORIGIN=21
B1=22
B2=23
B3=24
C1=25
C2=26
C3=27
WD=30
WD1=31
WD2=32
FILPTR=33
PG7400=34
LSTFLD=35
LOADXR=11
ABSLDR, JMS I (CTINIT
JMS I (CTINIT
JMP CALLCD
JMP NOCD
NEXTCD, JMS I (NEXFIL
CALLCD, JMS I [200
5 /COMMAND DECODE
0216 /ASSUMED EXTENSION IS .BN
NOCD, TAD [6001
CDF 0
DCA I [JSBITS /SET JSBITS TO SAVE CD AREA NEXT TIME
CDF 10
TAD I [MPARAM+1
AND [100
SZA CLA /IS /R SWITCH ON?
JMS I (CTINIT /YES - RE-INITIALIZE LOADER TABLES
LD7400, 7400
TAD (MIFILE
DCA FILPTR
JMS I (SETADR /GET THE STARTING ADDRESS IF IT APPEARS ON THE LINE
NEWFIL, TAD (7001
DCA HANDLR
TAD I FILPTR
AND [7760
SZA /LENGTH OF 256 BLOCKS IMPLIES AT LEAST 256
TAD [17
CLL CML RTR
RTR
DCA RCDCNT
TAD I FILPTR
ISZ FILPTR
SNA
JMP NEXTCD /FILE POINTER = 0 MEANS NO MORE INPUT FILES
JMS I [200
1 /ASSIGN
HANDLR, 7001 /LOAD INTO 7000 IF NOT ALREADY LOADED
JMP I (IOERR
TAD I FILPTR
DCA RECNO
ISZ FILPTR
CLA CMA
DCA CHCNT
DCA REOF
TAD I [MPARAM /TEST FOR /I
AND (10
SNA CLA
JMP I (LOADER /I IS NOT ON
ISZ OFLG /IS /I ALLOWED?
JMP I (OERR /NO!
JMP I (SLASHO
GETCH, 0 /GET-NEXT-INPUT-CHARACTER ROUTINE
TAD [200
KRS
TAD (-203
SNA CLA
KSF
SKP
JMP I (MGET
ISZ JMPGET
ISZ CHCNT
JMPX, JMP JMPGET
TAD REOF
SZA CLA
JMP I GETCH /EOF REACHED BEFORE LOGICAL END - ERROR
CIF 0
JMS I HANDLR
0210 /READ 2 RECORDS INTO FIELD 1
PBUFFR, BUFFER
RECNO, 0
JMP RERROR
ISZ RECNO
ISZ RCDCNT
SKP
ISZ REOF
TAD (-601
DCA CHCNT
TAD PBUFFR
DCA CHPTR
TAD JMPX
DCA JMPGET
JMP GETCH+1
JMPGET, JMP .
JMP CHAR1
JMP CHAR2
CHAR3, TAD JMPX
DCA JMPGET
TAD I CHPTR
AND LD7400
CLL RTR
RTR
TAD CHTMP
RTR
RTR
ISZ CHPTR
JMP GCHCOM
CHAR2, TAD I CHPTR
AND LD7400
DCA CHTMP
ISZ CHPTR
CHAR1, TAD I CHPTR
GCHCOM, AND (377
ISZ GETCH
JMP I GETCH
RERROR, SPA CLA
JMP I (IOERR /AN ACTUAL READ ERROR - AMAZING!
ISZ REOF
JMP RECNO+2
REOF, 0
CHCNT, 0
CHPTR, 0
CHTMP, 0
RCDCNT, 0
OFLG, -1 /SWITCH FOR /O OPTION
PAGE
*2200
PUTWD, 0160 /ABSLDR VERSION NUMBER (V4 IS NOW "A0")
CMA
AND I B2 /AND OUT THE PAGE SLOT IN THE PAGE TABLE
DCA I B2
TAD ORIGIN
DCA ORGX
TAD XVALU
CLL RAR
SZA CLA /TEST FOR FIELDS 0 OR 1
JMP PUTIT /NEITHER - STORE AS IS
SNL
JMP FLD0
TAD ORIGIN
SPA
TAD [-400
SPA CLA
JMP FLD1
CLA CLL CML RTR
TAD ORIGIN
SMA CLA
JMP .+3
ISZ I (OVLYFG /SET FLAG THAT LOADER IS BEING OVERLAYED
TAD (2400 /LOADER OVERLAYS GO IN MTEMP+11 - MTEMP+14
LCOMPR, TAD ORIGIN
RTL
RTL
RAL
AND [17
TAD (MTEMP
RLCOMN, DCA PGTMP
TAD BUFREC
CIA
TAD PGTMP
SNA CLA
JMP DONTWR
JMS WRBUF
WRIBUF, CLA /MODIFIED..IF NOT /O GETS SZA CLA
JMP DONTWR
CIF 0
JMS I [SHNDLR
0210
1400 /USE CATALOG SPACE
PGTMP, 0
JMP I (LIOERR
DONTWR, DCA OLDT9 /MARK THE CATALOG DESTROYED
TAD PGTMP
DCA BUFREC
TAD ORIGIN
AND [377
TAD PTRBFR
DCA ORGX
CDF 10
JMP PUTIT2
FLD1, CLL
TAD ORIGIN /IGNORE LOCATIONS ABOVE 17600
TAD [200
SZL CLA
JMP I PUTWD
PUTIT, TAD XFIELD
TAD (6201
DCA .+1
M7, -7
PUTIT2, TAD C3
DCA I ORGX
CDF10, CDF 10
JMP I PUTWD
FLD0, TAD ORIGIN /CHECK FOR STUFF IN PAGE 7000
TAD (1000
SNL CLA /IF NON ZERO,OVERLAY
JMP PUTIT
ISZ PG7400 /SET OVERLAY FLAG
JMP LCOMPR /FORM RECORD NO.
WRBUF, CALONC
TAD BUFREC
SNA
JMP I WRBUF
CIF 0
JMS I [SHNDLR
4210
PTRBFR, 1400
BUFREC, 0
JMP I (LIOERR
DCA BUFREC
/BAD I/O ON SYSTEM DEVICE
JMP I WRBUF
ORGX,
NEXFIL, ERTRN
JMS WRBUF /WRITE WHATEVER
TAD I [MPARAM-1
SPA CLA
JMP I (BUILD
TAD I [MPARAM
AND (40
SZA CLA
JMP I (BUILD
JMP I NEXFIL
CORTB, ZBLOCK 30 /ONCE-ONLY CODE INSERTED HERE LATER
ZBLOCK 2 /EXTRA NEEDED BY ONCE-ONLY CODE
/NOT USED BY CORE TABLE
PAGE
*2400
ITSOVR, JMS ASSEMB /END OF FILE
CIA
TAD LCKSUM
SZAIN, SZA CLA /TEST CHECKSUM
JMP I (BADCKS
TAD I [MPARAM+1 /TEST FOR S OPTION
AND L40
SNA CLA
JMP I (NEWFIL /TIME FOR ANOTHER FILE
LOADER, DCA LCKSUM /
DCA I (OFLG /CANCEL FURTHER /I'S
TAD SZAIN
DCA I (WRIBUF
JMS GETFLD /FIELD SETTING
/DCA XFIELD
TAD [200
DCA ORIGIN /ORIGIN SETTING
JMS I (GETCH
JMP I (NEWFIL
SNA /IGNORE ZEROES
JMP .-3
TAD [-200 /LOOKING FOR LEADER CODE
SZA CLA
JMP LOADER+1
LEADER, JMS I (GETCH
JMP I (NEWFIL
SNA
JMP LOADER+1
TAD [-200
SNA /IS IT LEADER CODE?
JMP LEADER
NEWWD, SMA /IS IT POSSIBLY AFIELD PSEUDO-OP?
JMP FIELDW
TAD [200 /IF NOT STORE FOR ASSEMBLING
DCA WD1
NEWD1, DCA I (HT
JMS I (GETCH
JMP I (BADINP
DCA WD2 /STORE SECOND WORD FOR ASSEMBLING
JMS I (GETCH
JMP I (BADINP
TAD [-200
SNA /TEST FOR TRAILER CODE
JMP ITSOVR
DCA WD /STORE THIRD WORD
JMS ASSEMB
SNL
JMP DATAWD
DCA ORIGIN
DCA I (LOADWD /ZERO 'DATA LOADED' FLAG V3
JMP GETNXT
DATAWD, JMS I (LOADWD
ISZ ORIGIN
L40, 40
GETNXT, TAD WD1
TAD WD2
TAD LCKSUM
DCA LCKSUM
TAD WD
JMP NEWWD
ASSEMB, 0 /ASSEMBLING WORDS...
TAD WD1
CLL RTL
RTL
RTL
TAD WD2
JMP I ASSEMB
FIELDW, TAD (-32 /TESTING TO ISOLATE FIELD PSEUDO-OP
SNA /IS IT A CONTROL/Z?
JMP CTLZ
TAD (-46
SPA /IS IT GREATER THAN 300?
JMP NOTXP
DCA WD1
TAD WD1
AND [7
SZA CLA
JMP NOTXP
TAD WD1
AND (70
ISZ I (HT /I.D. DISTINGUISHES BETWEEN GETFLD & FIELDW CALL
JMS I (XTEND /GO SEARCH FOR GREATER THAN 32K FIELD SETTING
/DCA XFIELD
JMS I (GETCH
JMP I (BADINP
TAD [-200
SZA
JMP NEWWD
NOTXP, CLA
TAD LCKSUM
SNA CLA
JMP LOADER
JMP I (BADINP
LCKSUM, 0
CTLZ, TAD LCKSUM
SZA CLA
JMP I (BADINP
JMP I (NEWFIL
GETFLD, 0 /TEST FOR SPECIFIED FIELD SETTING
DCA C1
DCA XVALU /INITIALIZE XVALU
DCA XFIELD //V4: ABLSDR /I PATCH FOR KT8A
TAD I (MPARAM+2 /COMMAND DECODER INPUT
AND (1774
SNA /WAS FIELD SPECIFIED?
JMP I GETFLD
RTL /IF SO, WHAT WAS IT?
RAL
ISZ C1
SNL
JMP .-3
CLA CMA
TAD C1 /FIELD...IS HERE
JMS I (XTEND /MAKE NECESSARY ADJUSTMENTS(KT8A)
JMP I GETFLD
PAGE
*2600
/BUILD CORE CONTROL BLOCK
/FIELDS AND PAGES TO BE SAVED HAVE BEEN ISOLATED
/BY LOADWD.SEE CORTAB FOR MORE INFO ON TABLE.
BUILD, TAD (CORTAB+135 /ROUTINE TO SEARCH SAVE TABLE
DCA B1
TAD I (CORTAB+3
CLL CMA
AND [7760
SNA CLA
CML
TAD I (CORTAB
CMA
AND [7760
SNA CLA
IAC
RTR
DCA I (CTLBLK+3
TAD (CTLBLK+3
DCA LOADXR
TAD [-40
DCA C1
TAD [70
CLA
TAD (37
DCA FIELDB
DCA I (CTLBLK
FLDLP, TAD FIELDB
TAD (-2
SMA CLA /IGNORE 07600 AND 17600 IN CCB /V3
CMA /IN THE CORE MAP
TAD [-37
DCA C2
DCA LOWERA
MTLOOP, JMS I (SHFT
SNL CLA
JMP INUSE
TAD LOWERA
MTRSME, TAD [200
DCA LOWERA
ISZ C2
JMP MTLOOP
JMP FLDOVR
INUSE, TAD LOWERA
TAD [200
DCA UPPERA
ISZ C2
SKP
JMP ENDRGN-2
JMS I (SHFT
SZL CLA
JMP ENDRGN
TAD UPPERA
JMP INUSE+1
CLA CMA
DCA C2
ENDRGN, TAD LOWERA
AND [7400
DCA I LOADXR
ISZ I (CTLBLK
TAD LOWERA
AND [7400
CIA
TAD UPPERA
CLL RAR
TAD XFB
DCA I LOADXR
TAD UPPERA
JMP MTRSME
XFB, 0
FLDOVR, JMS I (EXTST
TAD I [MPARAM+1 /CLOBBER BATCH?
AND [400
TAD I (MPARAM+2 /AH ED, BUG IF YOU SPEC /P/1 TO LOADER
AND (403
TAD I (CTLBLK+3
DCA I (CTLBLK+3
TAD LSTFLD
AND (37
JMS I (BANKSW /ADJUST FOR CDF
TAD [CDF CIF 0
DCA I (CTLBLK+1
SKP
ORG200, TAD [200
TAD LSTADR
SZA /V3
JMP NOORG /V3 ALLOW EXPLICIT START ADDR TO OVERRIDE DEFAULT
TAD I (LOADWD /V3 NO EXPLICIT START ADDR
CLA /REPLACE BY 'SZA CLA' TO ALLOW SELF-STARTING STUFF
/* SZA CLA /V3 IS IT SELF STARTING BIN FORMAT?
JMP ORG200 /V3 NO
TAD XFIELD /V3 YES
TAD [CIF CDF 0 /V3
DCA I (CTLBLK+1 /V3
TAD I (ORIGIN /V3
NOORG, DCA I (CTLBLK+2
JMP I (LGTOUT /WRITE CONTROL BLOCK AND EXIT
FIELDB, 0
UPPERA,
SETADR, 0
TAD I (MPARAM+3
SNA /IS THERE A STARTING ADDRESS SPECIFIED?
JMP I SETADR /NO
DCA LSTADR
TAD I [MPARAM-1
DCA LSTFLD
JMP I SETADR
LOWERA, 0
LSTADR, 0
PAGE
*3000
ZOFILE, MOFILE
ZOUCNT, -47
LGTOUT, TAD PG7400
SNA CLA
JMP .+7
CIF 0
JMS I [SHNDLR
0300
7000
MTEMP+16
JMP I (LIOERR
CIF 0
JMS I [SHNDLR
4210
CTLBLK-200
MTEMP+10
JMP I (LIOERR
TAD I (CTLBLK+2
DCA CTL2 /MOVE THINGS INTO THIS PAGE
TAD I (CTLBLK+3
DCA CTL3 /SO WE CAN REFERENCE THEM WITH DF=0
TAD I [MPARAM
AND (40
SNA CLA
JMP LNOGO
TAD CTL3
RAL
SPA CLA /ARE WE OVERLAYING THE I/O MONITOR?
JMP LKICKM /NO
CDF 0
DCA I [JSBITS /YES - SET JSBITS TO FORCE A READ
CDF 10
JMS I [200
13 /RESET I/O DEVICES AND FILES
LKICKM, JMS I [200
11 /KICK MONITOR OUT
/********************************************
/NO PAGE ZERO REFERENCES AFTER THIS POINT
/PAGE ZERO MAY CONTAIN USER CODE
/********************************************
DCA I ZOFILE /ZERO OUT COMMAND DECODER AREA
ISZ ZOFILE
ISZ ZOUCNT
JMP .-3
TAD I (CTLBLK+1
CDF 0
DCA I (MSTCDF
TAD CTL2
DCA I (MSTADR /SET UP STARTING ADDRESS IN FIELD 0
JMP LMOVRD
LNOGO, TAD CTL3 /ABOVE COMMENT DOESN'T APPLY TO NEXT 9 LINES
SPA CLA /ARE WE OVERLAYING THE KEYBOARD MONITOR?
TAD (5 /NO - RETURN TO NON-SAVING ENTRY
TAD [7600
CDF 0
DCA I (MSTADR
TAD ZCDIF0
DCA I (MSTCDF
CLA CMA
LMOVRD, CDF 10
DCA I (7700 /SET 7700 TO -1 IF NO GO
TAD I (CTLBLK+1
CDF 0
DCA I (JFIELD /SET UP PARAMETERS IN FIELD 0
TAD CTL2
DCA I (JSTART
TAD CTL3
DCA I (JSBITS
LMOVLP, TAD COMBO
DCA I COMBPT
ISZ LMOVLP
ISZ COMBPT
ISZ COMBCT
JMP LMOVLP /MOVE THE READ OF THE LOADER OVERLAY INTO FIELD 0
ZCDIF0, CDF CIF 0
TAD OVLYFG
SZA CLA
JMP I (MREAD /LOADER OVERLAYED - GO READ OVERLAY
JMP I (MSTCDF /LOADER NOT OVERLAYED - WHY READ?
COMBPT, MREAD-1
COMBCT, -7
COMBO, 7607
MREAD-1&177+4600 /JMS I .-1
1210
2000
MTEMP+11 /LOCATION OF SCRATCH BLOCKS FOR LOADER OVERLAY
HLT
MSTCDF&177+5200 /JMP MSTCDF
CTL2, 0
CTL3, 0
OVLYFG, 0
/LOADWD CALCULATES AN INDEX INTO CORTAB
/IT SETS APPROPRIATE BITS FOR IDENTIFYING MEMORY AREA
/TO BE SAVED BY CCB.SEE CORTAB FOR MORE INFO
LOADWD, 0 /ROUTINE TO IDENTIFY FIELDS AND PAGES
DCA C3 /TO BE SAVED.
TAD XVALU /FIELD VALUE-INDEX INTO CORTAB(SEE CORTAB)
CLL RAL
TAD XVALU
TAD (CORTAB-1
DCA B2
TAD ORIGIN
AND [7600
CLL RTL
RTL
RTL
ISZ B2
TAD (-14
SMA
JMP .-3
DCA CTL2
CLL CML
RAL
ISZ CTL2
JMP .-2
JMS I (PUTWD
JMP I LOADWD
PAGE
*3200
ERPCH, 0
AND (77 /GET LOW ORDER 6 BITS
SZA
JMP NZCHAR
JMS ERR
FILMSG, TEXT /, FILE 0/
NZCHAR, TAD (240
AND (77
TAD (240 /CONVERT TO ASCII
JMS LDRPCH /PRINT
JMP I ERPCH /AND RETURN
LDRPCH, 0
TLS
TSF
JMP .-1
CLA
JMP I LDRPCH
SHFT, 0
CLA CLL CMA RTL
DCA C3
CLA CLL CML RTL
TAD B1
SHFTLP, DCA B3
TAD I B3
RAL
DCA I B3
CLA CMA CML
TAD B3
ISZ C3
JMP SHFTLP
JMP I SHFT /NOTE: SHFT LEAVES AC NON-ZERO
ERR, ONCE /CAN'T USE PAGE 0 LITERALS--NOT THERE ANYMORE.
CLA
CDF 10
TAD I (FILPTR /ZERO CHAR GETS REPLACED BY "FILE #"
TAD (322 /MAGIC NUMBER
CLL CML RAR /AC NOW CONTAINS " #"
DCA FILMSG+3
ERRLUP, TAD I ERR
SNA
JMP EOMESG /MESSAGE MUST BE EVEN NUMBER OF CHARS LONG
RTR
RTR
RTR
JMS ERPCH
TAD I ERR
JMS ERPCH
ISZ ERR
JMP ERRLUP
EOMESG, TAD (215 /TERMINATE MESSAGE WITH CR-LF
JMS LDRPCH
TAD T212
JMS LDRPCH
ERTRN, JMP I (ABSLDR /RETURN TO LOADER STARTING ADDRESS
IOERR, JMS ERR
TEXT %I/O ERROR%
BADINP, JMS ERR
TEXT /BAD INPUT/
BADCKS, JMS ERR
TEXT / BAD CHECKSUM/
NULERR, JMS CTINIT
T212, 212
JMS ERR
TEXT /NO INPUT/
LIOERR, JMS ERR
TEXT /SYSTEM I-O ERROR/
OERR, JMS ERR
TEXT %NO /I!%
CTINIT, 0 /BEFORE ZAPPING TABLES, CALL ONCE-ONLY ROUTINE
CALONC, JMS I ERR /TO SEE IF THIS MONITOR KNOWS HOW TO HANDLE KT8A
/MEMORY. WILL NOT RETURN IF IT CAN'T.
TAD (-140
DCA C1
DCA XFIELD /INITIALIZE XFIELD
TAD (CORTAB-1
DCA LOADXR
CLA CMA
DCA I LOADXR
ISZ C1
JMP .-3
DCA LSTFLD
DCA I (LSTADR /V3 SET INITIAL STARTING ADDRESS TO 0
DCA I (OVLYFG
DCA PG7400
ISZ CTINIT
JMP I CTINIT
PAGE
*CTLBLK+200
/CODE FOR OVERLAY OPTION IS HERE.IF /I IS NOT
/USED IMMEDIATELY, THIS CODE WILL PROBABLY BE DESTROYED,
/AS THIS AREA IS USED FOR A BUFFER
SLASHO, CLA CMA
DCA I (OFLG /RE ENABLE /I
TAD I (HANDLR
DCA GLONK /ENTRY POINT TO HANDLER
TAD I (RECNO
DCA CCBLOK
CIF 0
JMS I GLONK /READ IN CORE CONTROL BLOCK
0110
CCBPTR, CTLBLK
CCBLOK, 0
JMP I (OERR /DATA FAILURE
TAD I CCBPTR /NO. SEGMENTS
CMA /TEST FOR BAD CORE IMAGE
AND L7740
SZA CLA
JMP I (BADINP /NOT CORE IMAGE
TAD I CCBPTR
DCA SEGCNT
TAD I SGSTAD /THIS CODE IS NEW FOR V3D
/ AND [70 /GET FIELD
CLL RTR
RAR
DCA I (LSTFLD
ISZ SGSTAD
TAD I SGSTAD
DCA I (LSTADR
ISZ SGSTAD
TAD I SGSTAD /GET JSW FROM SAVE FILE
AND [400
DCA TEMP /PRESERVE /P
TAD I [MPARAM+1
AND (7377
TAD TEMP
DCA I [MPARAM+1
TAD I SGSTAD
AND (3 /PRESERVE LAST 2 BITS
DCA TEMP
TAD I (MPARAM+2
AND [7774
TAD TEMP
DCA I (MPARAM+2
ISZ SGSTAD
NEWSEG, TAD I SGSTAD /SEGMENT START ADDRESS
DCA ORIGIN
TAD I SGFDLT /FIELD AND LENGTH
JMS I .+1 //V4: ABSLDR /I KT8A PATCH
KLUGEI //ADJUSTS XFIELD.
TAD I SGFDLT
AND [7700
SNA /V3C
STL CLA RAR /AC4000
DCA SEGLTH
TAD SEGLTH
TWOPG, TAD [7600
SMA CLA /NO.. IS TWO PAGE SEGMENT LEFT?
TAD [7600 /YES..-400 TO WORD COUNT
TAD [7600 /NO.. -200 TO WORD COUNT
DCA WDCT
TAD SEGLTH
TAD [7600 /BUMP DOWN LENGTH LEFT
DCA SEGLTH
ISZ CCBLOK /POINT TO NEXT DATA RECORD
TAD CCBLOK
DCA DATRC
DCA OLDT9 /MARK DIRECTORY DESTROYED
CIF 0
JMS I GLONK /READ THE DATA RECORD IN
0210
1400 /INTO 11400
TEMP,
DATRC, 0
JMP I (IOERR /DATA FAILURE
CLA CMA
TAD ORIGIN
AND [177
TAD (1200 /SET UP INPUT POINTER
CHARPT=10
DCA CHARPT
LOOPI, TAD I CHARPT
JMS I (LOADWD /MOST OF THE WORK
ISZ ORIGIN
L7400, 7400 /NOP
ISZ WDCT /FINISHED THIS BLOCK?
JMP LOOPI
JMS I (WRBUF /YES.. WRITE THE STUFF OUT
DCA I (BUFREC /SO THAT WRBUF DOESN'T SCREW US UP
TAD SEGLTH /V3C (REARRANGED)
SMA SZA /ALL PAGES DONE?
JMP TWOPG /NO, NEXT! (IF DONE, FALL INTO 'GTSEG')
ISZ SEGCNT /YES, ANY MORE SEGMENTS
SKP
JMP RENEW /RESET CCB POINTER FOR NEXT /I
CLA CLL CML RTL
TAD SGSTAD
DCA SGSTAD
CLA CLL CML RTL
TAD SGFDLT
DCA SGFDLT /POINT TO NEXT CCB ENTRIES
JMP NEWSEG
GLONK, 0 /HANDLER ENTRY POINT HERE
WDCT, 0
SEGCNT, 0
SEGLTH, 0
CTLBLK=3400
SGFDLT, CTLBLK+5 /FIELD AND LENGTH WORD
SGSTAD, CTLBLK+1 /SEGMENT START ADDRESS
L7740,
RENEW, 7740 /USED TO CLEAR AC
L77, 77 /MIGHT OR MIGHT NOT SKIP
TAD (CTLBLK+1
DCA SGSTAD
TAD (CTLBLK+5
DCA SGFDLT
JMP I (NEWFIL
PAGE
*4000
XTEND, 0 /CODE TO HANDLE EXTENDED MEMORY BANK MANIPULATIONS
DCA XVALU /STORE INFO TO BE PROCESSED
TAD HT /IS IT A GETFLD OR A FIELDW CALL?
SZA CLA /IF GETFLD CALL ALL WE WANT TO DO IS TRANSFORM
JMP XFLDT
XNDT, TAD XVALU / TRANSFORM FROM ABCDE TO ACDEB00
JMS BANKSW
DCA XFIELD
JMP I XTEND
XFLDT, JMS I (GETCH /FIELDW CODE TEST FOR SECOND FIELD WORD
JMP I (BADINP
TAD [-200
SNA
JMP I (NOTXP
SMA
JMP XTD
TAD [200 /REPEATED NEWWD CODE
DCA WD1 /REPEATED NEWWD CODE
TAD XVALU /IF NO SECOND FIELD WORD WE PROCEED AS NORMALLY
DCA XFIELD
TAD XVALU
CLL RTR
RAR
DCA XVALU
JMP I (NEWD1 /BY PASS NEWWD CODE -- ALREADY RAN IT
XTD, TAD (-32 /REPITITION OF FIELDW CODE
SNA /IS IT CONTROL/Z?
JMP I (CTLZ
TAD (-46
SPA /IS IT ABOVE 300?
JMP I (NOTXP
CLL RTR
RAR
AND [7
TAD WD1
DCA XVALU
JMS TST278 //V4: IF VT278 SYSTEM IGNORE LXM. ELSE CONTINUE.
TAD (7000
LXM
JMP XNDT
HT, 0
EXTST, 0 /BUILD CCB CODE TO HANDLE EXTENDED MEMORY
TAD I (FIELDB /PREVIOUSLY KNOWN AS FLDOVR CODE
TAD (-1 /TRANSFORM THE BITS FROM
DCA I (FIELDB /ABCDE FORM TO CDEBA FORM
TAD I (FIELDB
CLL RTR
RTR
SZL
TAD (400
CLL RAR
SZL
TAD (100
CLL RTR
RTR
RAR
DCA I (XFB
CLA CLL CMA RTL
TAD I (B1
DCA I (B1
ISZ I (C1
JMP I (FLDLP
TAD I (CTLBLK
SNA
JMP I (NULERR
CIA
DCA I (CTLBLK
JMS TST278 //V4: IF VT278 SYSTEM IGNORE RXM. ELSE CONTINUE.
RXM
SNA CLA
JMP I EXTST
JMS KLUGEI //V4: PATCH FOR ABLSDR /I
JMP I EXTST
BANKSW, 0
CLL RTR /ISOLATE BANK AND FIELD BITS
RTR
SZL /ADJUST FOR PROPER CDF CIF
TAD [400 /WAS THERE AN "A" BIT?
CLL RAR
SZL /WAS THERE A "B" BIT?
TAD (4000
CLL RTR
RTR
RAR
JMP I BANKSW
KLUGEI, 0 //V4: ABSLDR /I PATCH TO ADJUST KT8A
ISZ .-1 //FOR RETURN
AND (70
DCA XFIELD
TAD XFIELD
CLL RTR
RAR
DCA XVALU
JMP I KLUGEI
//CHECK FOR VT278 SYSTEM.
//IF VT278, KT8A INSTRUCTIONS FOR MEMORY ABOVE 32K ARE NOT SUPPORTED
//BECAUSE OF A CONFLICT WITH THE CONTROL PANEL MEMORY OF THE VT278.
TST278, 0
CDF 0
TAD I (OS78 /LOOK FOR 278 BIT
CDF 10
AND [4 /IF 278, BIT 9 IS SET.
SNA CLA
JMP I TST278 /NOT 278. CONTINUE.
ISZ TST278 /ADJUST RETURN
ISZ TST278 /TO IGNORE KT8A INSTRUCTION.
JMP I TST278
PAGE
*4200
/CORTAB IS A TABLE FOR STORING SAVE INFO
/FOR EACH OF THE 0-37 FIELDS, THERE ARE THREE
/IDENTIFYING WORDS...THE BITS IN THESE WORDS
/CORRESPOND TO PAGES IN THE RESPECTIVE FIELD
/E.G. CORTAB+130 REFERS TO 130%3=35TH FIELD
/--- FIRST WORD,I.E. PAGES 0-14...
/LOADWD BUILDS THE TABLE...
/BUILD REFERENCES IT FOR CONSTRUCTING THE CCB
CORTAB, ZBLOCK 140
PAGE
*CORTB /ONCE-ONLY CODE
ONCE, 0 /ONCE-ONLY CODE TO CHECK FOR CORRECT MONITOR
DCA I WRBUF /DON'T CALL AGAIN
TAD [400
TAD K7400
SZA CLA
JMP OLDMON
TAD [7
TAD M7
SNA CLA
JMP I ONCE /THEY AGREE
OLDMON, TAD KERR
DCA I NEXFIL
JMS I PERR /THEY DON'T
TEXT /INCOMPATIBLE/ /MESSAGE MUST BE AN EVEN # OF CHARS LONG
CIF CDF 0
JMP I K7605
K7400, 7400
PERR, ERR
K7605, 7605
KERR, ERR&177+5600
/PAGE 0 - TEMPORARIES AND LITERALS.
/LOCATIONS 0-3 ARE RESERVED FOR POINTERS TO KEY LOCATIONS
/IN THE MONITOR (SO THE CUSPS CAN GET AT THESE LOCATIONS)
/LOCATIONS 4-6 ARE RESERVED FOR SYSTEM ODT FIELD 1 BREAKPOINTS
*7
OLDT9, 0 /POINTER TO DEVICE HANDLER OF DIRECTORY IN CORE
*15
XR1, 0
XR2, 0
XR, 0
*20 /ENTRY TO MONITOR FROM A CALL TO 17700 -
/CAN BE DESTROYED AFTER IT IS EXECUTED
MSTART, TAD I T1
DCA MACARG
TAD I [7700
DCA I [MONITO
TAD I [SMCIF
DCA I T2 /FAKE A CALL TO "MONITO"
TAD I [MONITO
RAL
SNL SMA CLA
TAD I [SMCIF
TAD T3
SNA CLA /CHECK FOR A CALL FROM 10000-11777
JMP I [MERROR /YES - GIVE ERROR IMMEDIATELY
JMP I T4 /NO - SLIDE INTO MONITOR CODE
*36 /POINTERS TO INTERNAL MONITOR LOCATIONS FOR "BUILD"
SDNAME /SYSTEM DEVICE NAME TABLE (PERMANENT NAMES)
SDVHND /DEVICE HANDLER INFORMATION TABLE
*40 /LOCATIONS 20-37 RESERVED FOR CUSP SCRATCH SPACE
USERFG, 1 /MUST BE IN 40 - SEE CD LISTING
T1, MARG1 /MUST BE AT 41
T2, FGETX
T3, -6213
T4, MRENTR
T5, 0
T6, 0
T7, 0
T8, 0
T9, 0
NAME, 0
NFILES, 0
ASFLAG, 0
MACARG, 0
EPASS, 0
MERRNO, 4000
MEOXIT, CIF 0 /RETURN FROM ENTER OVERLAY
JMS I [SHNDLR
0210
1000
MONTOR+2 /RESTORE LOCS 1000-1377 OF USR
HLT /HELP!
JMP I .+1
MENTER /RESTART ENTER OPERATION COMPLETELY
$