--- /dev/null
+/2 TD8E INITIALIZER PROGRAM, V7A
+/
+/
+/
+/
+/
+/
+//
+/
+/
+/
+/
+/COPYRIGHT (C) 1975, 1977
+/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
+/
+/
+/
+/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
+/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
+/SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
+/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
+/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
+/AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
+/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
+/
+/
+/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
+/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
+/EQUIPMRNT COROPATION.
+/
+/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
+/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
+/
+/
+/
+/
+/
+/
+\f
+/DECEMBER 21, 1973 GB/RL/EF/SR
+
+/ABSTRACT--
+/ THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL
+/DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE
+/CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT
+/WHICH IS COMPATIBLE WITH OS/8 DEVICE HANDLER CALLING
+/SEQUENCES.
+
+/ EXPLANATION:
+
+/THIS IS A SAVE FILE, WHICH MUST BE PLACED AS FILE # 1
+/ON THE OS/8 BINARIES TAPE. (I.E. BLOCK 7)
+/FOLLOWING IT MUST BE THE FOLLOWING FILES, EACH 50 (DEC) BLKS LONG:
+/TDROM.SY
+/TD12K.SY
+/
+/TO CREATE SPECIAL BLOCK 0 FOR THAT TAPE, START THIS PROGRAM AT
+/LOCATION 200 AND FOLLOW INSTRUCTIONS.
+
+/TO THEN PERFORM THE INITIALIZATION FROM THE LIBRARY TAPES,
+/MERELY PLACE THE BINARY TAPE ON UNIT 0 AND BOOTSTRAP INTO IT.
+/THEN FOLLOW INSTRUCTIONS.
+
+/FILES TDROM.SY AND TD12K.SY ARE MERELY SYSTEM HEADS OF THE
+/APPROPRIATE SYSTEMS, THEY MAY CONTAIN ANY HANDLERS.
+
+/THE BLOCK 0 SPECIAL SECONDARY BOOTSTRAP READS IN THE FIRST
+/3 PAGES OF TDINIT (WORDS 200-777) AND BRANCHES TO 'STARTUP'.
+/THIS THEN READS IN THE REMAINDER OF TDINIT WITH ERROR CHECKING.
+
+/CODE LOC BLOCK ON BINARY TAPE
+
+/CCB 16,17 (THESE ARE DECTAPE BLOCK NUMBERS, NOT OS/8 RECORDS)
+/0 20 SKIPPED BY BLOCK 0
+/200 21
+/400 22
+/600 23
+/1000 24
+/1200 25
+/1400 26
+/1600 27
+/2000 30
+/2200 31 TDINIT MUST HAVE USEFUL PART END AT OS/8 RECORD 75
+/7400 32,33 RECORD 15 CONTAINS IMAGE OF BLOCK 0
+
+/FIXES SINCE FIELD-TEST RELEASE:
+
+/1. FIXED BUG RE CLA ON RETRY AFTER ERROR
+/2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE
+
+/OS/8 V3D CHANGES:
+
+/3. FIXED BUG RE TD8E BUILD (V6B PATCH)
+\f
+/THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
+/VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
+/CONTROL:
+/A) WHAT DRIVES (UNITS 0-7) WILL BE USED
+/B) THE ORIGIN OF THE TWO PAGE ROUTINE
+/C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN
+/D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN
+
+/FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
+/DEC VERSION OF THIS ROUTINE:
+
+ DRIVE=10 /UNITS 0 AND 1 SELECTED
+ ORIGIN=400 /ENTER AT ORIGIN, ORIGIN+4
+ AFIELD=0 /INITIAL FIELD SETTING
+ MFIELD=00 /AFIELD*10=MFIELD
+ WDSBLK=201 /129 WORDS PER BLOCK
+
+/THE USE OF THE PARAMETERS IS AS FOLLOWS:
+
+/ DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED
+/ DRIVE=10 IMPLIES UNITS 0 &1
+/ DRIVE=20 IMPLIES UNITS 2&3
+/ DRIVE=30 IMPLIES UNITS 4&5
+/ DRIVE=40 IMPLIES UNITS 6&7
+
+/ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT
+/ MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND
+/THAT THIS IS A TWO PAGE ROUTINE.
+
+/AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
+/ LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
+
+/MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION.
+/ THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES
+/ THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70.
+
+/WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE
+/ IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR
+/ 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN
+/ BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED
+/ FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS
+/ FORMATTED TO CONTAIN.
+
+/IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN
+/FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS
+/PER BLOCK, THE PARAMETERS WOULD BE:
+/ DRIVE=20
+/ ORIGIN=3000
+/ AFIELD=2
+/ MFIELD=20
+/ WDSBLK=400
+\f/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
+/CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS.
+/THE CALLING SEQUENCE IS:
+
+/ CDF CURRENT
+/ CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
+/ JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE
+ /AND ORIGIN+4 FOR ODD NUMBERED DRIVE.
+/ ARG1
+/ ARG2
+/ ARG3
+/ ERROR RETURN
+/ NORMAL RETURN
+
+/THE ARGUMENTS ARE:
+
+/ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE
+/ BITS 1-5: # BLOCKS IN OPERATION
+/ BITS 6-8: FIELD OF BUFFER AREA
+/ BIT 9: UNUSED
+/ BIT 10: # OF WORDS/BLOCK.
+/ 0= WDSBLK, 1=WDSBLK-1
+/ BIT 11: 1=START FORWARD, 0=REVERSE
+
+/ARG2: BUFFER ADDRESS FOR OPERATION
+/ARG3: STARTING BLOCK FOR OPERATION
+
+/ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS:
+/A) FATAL ERRORS- PARITY ERROR, TIMING ERROR,
+/ TOO GREAT A BLOCK NUMBER
+/ FATAL ERRORS TAKE ERROR RETURN WITH THE
+/ AC=4000.
+/B) NON-FATAL- SELECT ERROR.
+/ IF NO PROPER UNIT IS SELECTED, THE ERROR
+/ RETURN IS TAKEN WITH CLEAR AC.
+/FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN.
+/THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED
+/BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR.
+
+/THE TD8E IOT'S ARE:
+ SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG
+ SDST=7002-DRIVE /SKIP ON TIMING ERROR
+ SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG
+ SDLC=7004-DRIVE /LOAD COMMAND REGISTER
+ SDLD=7005-DRIVE /LOAD DATA REGISTER
+ SDRC=7006-DRIVE /READ COMMAND REGISTER
+ SDRD=7007-DRIVE /READ DATA REGISTER
+
+/THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
+/THE OTHERS CONTROL UNITS 2-7.
+\f INITLN=7 /LENGTH OF TDINIT INCLUDING BLOCK 0 IMAGE (IN BLOCKS)
+ CTRLO=20
+ INCHAR=21
+ TEMPA=22
+
+ST, CLA /IN CASE CHAINED TO
+ JMP I (CREATE /CREATE BLOCK 0 -IN HOUSE ONLY -
+STARTUP,JMS I (DTA0 /TD8E S.R. IS IN 200 NOW
+ 603 /READ 3 BLOCKS INTO 1000-2377
+ 1000
+ 24 /GET REST OF INIT
+ JMP FERR /REALLY BAD!
+ TAD (SKP CLA
+ DCA ST /ALLOWS HIM TO RESTART AT 200
+RE, JMS MSG
+ VNO
+ JMS I (CHKCOR /USE ROM OR 12K SYSTEM
+ JMS MSG
+ INIT
+ JMS I (MOVSYS
+ JMS MSG
+ SWTCH
+ JMS TTY /PAUSE
+ TAD INCHAR
+ TAD (-32
+ SNA CLA
+ JMP I (ZERO /HE TYPED ^Z
+CPY, JMS MSG
+ COPY
+ TAD (160
+ DCA B1
+ TAD (160
+ DCA B2
+RD, JMS I (DTA0
+ 3612
+ 0
+B1, 0
+ JMS I (ER1
+ JMS I (DTA1
+ 7612
+ 0
+B2, 0
+ JMS I (ER1
+ TAD B1
+ TAD (36
+ DCA B1
+ TAD B1
+ DCA B2
+ TAD B1 /COPY OVER ABOVE 2700
+ TAD (-2600 /***
+ SPA CLA
+ JMP RD /KEEP GOING
+ JMS I (DTA0 /COPY DIRECTORY
+ 1412
+ 0
+ 2
+ JMS I (ER1
+ JMS I (DTA1
+ 5412
+ 0
+ 2
+ JMS I (ER1
+RESTRT, JMS MSG
+ DISMNT /SETUP TAPES FOR INIT
+ JMS TTY
+ JMP I (BOOT
+\fTTY, 0
+ JMS MSG
+ STRIKE
+ KCC
+ KSF
+ JMP .-1
+ KRB
+ AND (177
+ DCA INCHAR
+ JMP I TTY
+
+MSG, 0 /MESSAGE TYPER
+ DCA CTRLO
+ JMS I (CRLF
+ TAD I MSG
+ DCA TEMPA
+ ISZ MSG
+WTMSG, TAD I TEMPA
+ CLL RTR;RTR;RTR
+ JMS PNCH
+ TAD I TEMPA
+ JMS PNCH
+ ISZ TEMPA
+ JMP WTMSG
+
+PNCH, 0
+ AND (77
+ SNA /IGNORE NULL. _ MEANS CR/LF
+ JMP I PNCH /? MEANS TERMINATE
+ TAD (-37 /IS IT _?
+ SNA
+ JMS I (CRLF /YES
+ TAD (-40 /MAYBE ?
+ SNA
+ JMP I MSG
+ TAD (40
+ SPA
+ TAD (100
+ TAD (237
+ JMS I (TTYOUT
+ JMP I PNCH
+\fFERR, HLT
+ CLA
+ JMP STARTUP
+ PAGE
+\f/ THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS !
+
+ *ORIGIN
+
+DTA0, 0 /ENTRY POINT FROM UNIT 0
+ CLA CLL /0 TO LINK
+ JMP DTA1X
+C1000, 1000
+BLOCK,
+DTA1, 0 /UNIT 2 ENTRY
+ CLA CLL CML /1 TO LINK
+ TAD DTA1
+ DCA DTA0 /PICK UP ARGS AT DTA0
+DTA1X, RAR
+ DCA UNIT /LINK TO UNIT POSITION
+ RDF
+ TAD C6203 /GET DATA FIELD AND SETUP RETURN
+ DCA LEAVE
+ TAD I DTA0 /GET FUNCTION WORD
+ SDLD /PUT FUNCTION INTO DATA REGISTER
+ CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
+ /BLOCK INTO LINK
+ SZL CLA /KNOCK ONE OFF WDSBLK?
+ IAC /YES
+ TAD MWORDS
+ DCA WCOUNT /STORE MASTER WORD COUNT
+ ISZ DTA0 /TO BUFFER
+ TAD I DTA0
+ DCA BUFF
+ ISZ DTA0 /TO BLOCK NUMBER
+ TAD I DTA0
+ DCA BLOCK
+ ISZ DTA0 /POINT TO ERROR EXIT
+ CIF CDF MFIELD /TO ROUTINES DATA FIELD
+ SDRD /GET FUNCTION INTO AC
+ CLL RAL
+ AND CM200 /GET # PAGES TO XFER
+ DCA PGCT
+ SDRD
+C374, AND C70 /GET FIELD FOR XFER
+ TAD C6203 /FORM CDF N
+ DCA XFIELD /IF=0 AND DF=N AT XFER.
+ CLA CLL CMA RTL
+ DCA TRYCNT /3 ERROR TRIES
+ TAD UNIT /TEST FOR SELECT ERROR
+ SDLC
+ SDRC
+ AND C100
+ SZA CLA
+ JMP FATAL-1
+ SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
+ DCA I CXFUN
+ TAD WCOUNT
+ DCA I CXWCT
+ SDRD /GET MOTION BIT TO LINK
+ CLL RAR
+ JMP GO /AND START THE MOTION.
+RWCOM, SDST /ANY CHECKSUM ERRORS?
+ SZA CLA /OR CHECKSUM ERRORS?
+ JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS
+ /SET AT RWCOM. GETCHK SETS IT.
+ TAD PGCT /NO ERROR..FINISHED XFER?
+ TAD CM200
+ SNA
+ JMP EXIT /ALL DONE. GET OUT
+ DCA PGCT /NEW PAGE COUNT
+ ISZ BLOCK /NEXT BLOCK TO XFER
+ TAD WCOUNT /FORM NEXT BUFFER ADDRESS
+ CIA
+ TAD BUFF
+ DCA BUFF
+ CLL CML /FORCES MOTION FORWARD
+GO, CLA CML RTR /LINK BECOMES MOTION BIT
+ TAD C1000
+ TAD UNIT /PUT IN 'GO' AND UNIT #
+ SDLC /LOOK FOR BLOCK NO.
+ JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
+ JMS I CRDQUD
+CM200, 7600 /COULD HAVE SAVED A LOC. HERE
+SRCH, SDSS
+ JMP .-1 /WAIT FOR SINGLE LINE FLAG
+ SDRC
+ CLL RTL /DIRECTION TO LINK. INFO BITS
+ /ARE SHIFTED.
+ AND C374 /ISOLATE MARK TRACK BITS
+ TAD M110 /IS IT END ZONE?
+ SNA /THE LINK STAYS SAME THRU THIS
+ JMP ENDZ
+ TAD M20 /CHECK FOR BLOCK MARK
+ SZA CLA
+ JMP SRCH
+ SDRD /GET THE BLOCK NUMBER
+ SZL /IF WE ARE IN REVERSE, LOOK FOR 3
+ /BLOCKS BEFORE TARGET BLOCK. THIS
+ /ALLOWS TURNAROUND AND UP TO SPEED.
+ TAD C3 /REVERSE
+ CMA
+ TAD BLOCK
+ CMA /IS IT RIGHT BLOCK?
+ SNA
+ JMP FOUND /YES..HOORAY!
+M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
+ /ABOVE SNA IS SUPERFLUOUS.
+ JMP SRCH /YES
+ENDZ, SDRC /WE ARE IN THE END ZONE
+ CLL RTL /DIRECTION TO LINK
+ CLA /ARE WE IN REVERSE?
+ JMP GO /YES..TURN US AROUND
+/IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR
+TRY3, CLA
+ ISZ TRYCNT
+ JMP GO /TRY 3 TIMES
+ JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
+EXIT, ISZ DTA0
+ CLL CML /AC=0 ON NORMAL RETURN
+FATAL, TAD UNIT
+ SDLC /STOP THE UNIT
+ CLA CML RAR
+LEAVE, HLT
+ JMP I DTA0
+
+\fC6203, 6203
+CRDQUD, RDQUAD
+WCOUNT, 0
+BUFF, 0
+MWORDS, -WDSBLK
+UNIT, 0
+CXFUN, XFUNCT
+M20, -20
+PGCT, 0
+CXWCT, XWCT
+C100, 100
+TRYCNT, -3
+
+
+ *ORIGIN+170
+FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
+ JMP GO /WRONG..TURN AROUND
+ TAD UNIT /PUT UNIT INTO LINK
+ CLL RAL /AC IS NOW 0
+C70, 70 /********DON'T MOVE THIS!!!!******
+C3, 3
+ TAD BUFF /GET BUFFER ADDRESS
+XFIELD, HLT /INTO NEXT PAGE
+\f *ORIGIN+200
+ CIF MFIELD
+ DCA XBUFF /SAVE ADDRESS
+ RAR /NOW GET UNIT #
+ DCA XUNIT
+ SDRC
+ SDLC
+REVGRD, SDSS
+ JMP .-1 /LOOK FOR REVERSE GUARD
+ SDRC
+ AND K77
+ TAD CM32 /IS IT REVERSE GUARD?
+ SZA CLA
+ JMP REVGRD /NO.KEEP LOOKING
+ TAD XWCT
+ DCA WORDS /WORD COUNTER
+ TAD XFUNCT /GET FUNCTION READ OR WRITE
+K7700, SMA CLA
+ JMP READ /NEG. IS WRITE
+WRITE, SDRC
+ AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
+ CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
+ SZA CLA
+ JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
+ JMS RDQUAD /NO ONE EVER USES THIS WORD!
+C7600, 7600
+ TAD C1400
+ TAD XUNIT /INITIATE WRITE MODE
+ SDLC
+ CLA CMA
+ JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
+ CLA CMA
+ DCA CHKSUM
+WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
+ JMS WRQUAD
+ ISZ XBUFF /BUMP CORE POINTER
+K77, 77 /ABOVE MAY SKIP
+ ISZ WORDS /DONE THIS BLOCK?
+ JMP WRLP /NOT YET..LOOP A WHILE
+ TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK?
+ CLL RTR /IF NO, WRITE A 0 WORD
+ SZL CLA
+ JMS WRQUAD /WRITE A WORD OF 0
+ JMS GETCHK /DO THE CHECK SUM
+ JMS WRQUAD /WRITE FORWARD CHECKSUM
+ JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN
+ JMP I CRWCOM
+\fREAD, JMS RDQUAD
+ JMS RDQUAD
+ JMS RDQUAD /SKIP CONTROL WORDS
+ AND K77
+ TAD K7700 /TACK 7700 ONTO CHECKSUM.
+ DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
+RDLP, JMS RDQUAD
+ JMS EQUFUN /COMPUT CHECKSUM AS WE GO
+ DCA I XBUFF /IT GETS CONDENSED LATER
+ ISZ XBUFF
+C300, 300 /PROTECTION
+ ISZ WORDS /DONE THIS OP?
+ JMP RDLP /NO SUCH LUCK
+ TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND
+ CLL RTR /CHECKSUM THE LAST TAPE WORD
+ SNL CLA
+ JMP RDLP2
+ JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
+ JMS EQUFUN /CHECKSUM IT
+RDLP2, JMS RDQUAD /READ CHECKSUM
+ AND K7700
+ JMS EQUFUN
+ JMS GETCHK /GET SIX BIT CHECKSUM
+ JMP I CRWCOM
+
+WRQUAD, 0 /WRITE OUT A 12 BIT WORD
+ JMS EQUFUN /ADD THIS TO CHECKSUM
+ SDSQ /SKIP ON QUADLINE FLAG
+ JMP .-1
+ SDLD /LOAD DATA ONTO BUS
+ CLA /SDLD DOESN'T CLEAR AC
+ JMP I WRQUAD
+
+RDQUAD, 0 /READ A 12 BIT WORD
+ SDSQ
+ JMP .-1
+ SDRD /READ DATA
+ JMP I RDQUAD
+
+\fXUNIT,
+EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
+ CMA
+ DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE
+ TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD
+ AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
+ CIA /IS ASSOCIATIVE, WE CAN DO IT 12
+ CLL RAL /BITS AT A TIME AND CONDENSE LATER.
+ TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES:
+ TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B)
+ DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
+ TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
+ CMA
+ JMP I EQUFUN
+
+GETCHK, 0 /FORM 6 BIT CHECKSUM
+ CLA
+ TAD CHKSUM
+ CMA
+ CLL RTL
+ RTL
+ RTL
+ JMS EQUFUN
+ CLA CLL CML /FORCES LINK ON AT RWCOM
+ TAD CHKSUM
+ AND K7700
+ JMP I GETCHK
+
+CFATAL, FATAL
+CRWCOM, RWCOM
+XFUNCT, 0
+CM32, -32
+C1400, 1400
+CHKSUM, 0
+WORDS, 0
+XBUFF, 0
+XWCT, 0
+EQUTMP, 0
+\fTBL, CPY
+ ZER
+ LVAL
+ PAGE
+\fCREATE, JMS I (MSG
+ WRITOUT
+ JMS I (TTY
+ JMS I (DTA1
+ 4202
+ 7400
+ 0
+ JMS ER1
+ JMS I (MSG
+ OK
+ HLT
+ JMP I (7605
+ ROMSW=17
+
+/THIS ROUTINE COPIES THE SYSTEM ONTO UNIT 1.
+/IT COPIES FROM A SYSTEM HEAD FILE ON TAPE ON UNIT 0.
+/UNIT 0 MUST BE THE OS/8 BINARIES TAPE
+/1ST FILE: TDINIT.PA
+/2ND FILE: TDROM.SY
+/3RD FILE: TD12K.SY
+
+MOVSYS, 0
+ JMS I (TTY
+ TAD ROMSW /GET ADDRESS OF START OF SYSTEM HEAD
+ SNA CLA
+ TAD (62^2 /12 K
+ TAD (7+INITLN^2 /ROM
+ DCA HEAD
+ JMS I (DTA0 /READ PAGE 0
+ 212
+ 0
+HEAD, HLT
+ JMS ER1
+ CDF 10
+ TAD I (200
+ CDF 0
+ TAD (-4207 /CHECK FOR GOOD SYSTEM HEAD
+ SZA CLA
+ JMP WRGSYS
+ JMS I (DTA1
+ 4212
+ 0
+ 0
+ JMS ER1
+ STL CLA RTL /2
+ TAD HEAD
+ DCA KBM
+ JMS I (DTA0
+ 0012 /READ 40 SYSTEM BLOCKS 7-26 (PAGES 16-55)
+ 0
+KBM, HLT
+ JMS ER1
+ JMS I (DTA1
+ 4012
+ 0
+ 7^2 /WRITE KBM ETC
+ JMS ER1
+ TAD HEAD
+ TAD (43^2
+ DCA CD
+ JMS I (DTA0
+ 3613 /READ 51-67 (PAGES 122-157)
+ 0
+CD, HLT
+ JMS ER1
+ JMS I (DTA1
+ 7613
+ 0
+ 43+6^2
+ JMS ER1
+ JMP I MOVSYS
+\fWRGSYS, JMS I (MSG
+ WRONG
+ JMS I (TTY
+ JMP I (CPY
+
+ER1, 0
+ CLA
+ JMS I (MSG
+ IOERR
+ JMS I (TTY
+ TAD I (INCHAR
+ TAD (-101
+ SNA CLA /A?
+ JMP I (RE /YES, ABORT
+ TAD ER1
+ TAD (-5
+ DCA ER1 /BACK UP, POINT TO CALL
+ JMP I ER1 /RETRY
+
+CRLF, 0
+ TAD (215
+ JMS TTYOUT
+ TAD (212
+ JMS TTYOUT
+ JMP I CRLF
+
+TTYOUT, 0
+ DCA TM
+ JMS I (TSTKBD
+ TAD CTRLO
+ SZA CLA
+ JMP I TTYOUT
+ TAD TM
+ TLS
+ TSF
+ JMP .-1
+ CLA
+ JMP I TTYOUT
+\fTM, 0
+ PAGE
+\fCHKCOR, 0 /DETERMINE CONFIGURATION
+ CDF 70 /CHECK FOR ROM
+ TAD I (7503
+ TAD (-SDSS
+ SZA CLA
+ JMP TRY12K
+ CDF 0
+ JMS I (MSG
+ ROM8K
+ CLA IAC
+ENTR12, DCA ROMSW /SET INDICATOR
+ CDF 0
+ JMP I CHKCOR
+TRY12K, CDF 20
+ TAD ENTR12
+ DCA I (7600
+ TAD I (7600
+ CIA
+ TAD ENTR12
+ CDF 0
+ SNA CLA
+ JMP OK12
+ JMS I (MSG
+ HRDWR /NO HARDWARE AROUND!
+ HLT
+ JMP .-1
+OK12, JMS I (MSG
+ TD8E12
+ JMP ENTR12
+\fIN, 0
+
+ZERO, JMS I (MSG
+ SPECIAL
+ JMS I (TTY
+ TAD INCHAR
+ TAD (-62
+ DCA IN
+ TAD IN
+ SPA
+ CIA
+ CLL RAR /ALLOW ONLY -1, 0, 1
+ SZA CLA
+ JMP ZERO+1
+ TAD IN
+ TAD (TBL+1
+ DCA IN
+ TAD I IN
+ DCA IN
+ JMP I IN /JUMP TO APPROPRIATE ROUTINE
+
+ZER, JMS I (MSG
+ ZERY
+ JMS I (DTA1
+ 4202
+ MTDIR
+ 2
+ JMS I (ER1
+ JMP I (RESTRT
+
+LVAL, JMS I (MSG
+ PRES
+ JMP I (RESTRT
+\fMTDIR, -1
+ 70 /SYSTEM TAPE
+ 0
+ 0
+ -1 /1 EMPTY FILE
+ 0
+ 6437+70 /-LENGTH OF DECTAPE
+
+BOOT, TAD ROMSW
+ SNA CLA
+ JMP TDBOOT
+ JMS I (DTA0 /ROM BOOT
+ 202
+ 7400
+ 0 /READ IN BLOCK 0
+ JMS I (ER1
+ TAD (CDF 10
+ JMS MOVE
+ 7400
+ JMP I (7605
+
+TDBOOT, JMS I (DTA0
+ 202
+ 7400
+ 0
+ JMS I (ER1
+ JMS I (DTA0
+ 202
+ 7000
+ 66^2
+ JMS I (ER1
+ TAD (CDF 10
+ JMS MOVE
+ 7000
+ TAD (CDF 20
+ JMS MOVE
+ 7200
+ JMP I (7605
+\f XRIN=11
+ XROUT=12
+
+MOVE, 0
+ DCA MOVCDF
+ STA
+ TAD I MOVE
+ DCA XRIN
+ TAD (-200 /MOVE 200 WORDS TO LOCATION 7600
+ DCA MVCNT
+ ISZ MOVE
+ TAD (7577
+ DCA XROUT
+MOVLUP, TAD I XRIN
+MOVCDF, HLT
+ DCA I XROUT
+ CDF 0
+ ISZ MVCNT
+ JMP MOVLUP
+ JMP I MOVE
+
+MVCNT, -200
+ PAGE
+\fVNO, TEXT /TD8E INITIALIZER PROGRAM VERSION 7A ?/
+INIT, TEXT /MOUNT A CERTIFIED DECTAPE ON UNIT 1 WRITE-ENABLED_/
+ TEXT /ALWAYS KEEP ORIGINAL SYSTEM DECTAPES WRITE-LOCKED?/
+STRIKE, TEXT /STRIKE A CHARACTER TO CONTINUE?/
+DISMNT, TEXT /REMOVE AND SAVE TAPE ON UNIT 0_/
+ TEXT /TAKE NEW TAPE (ON UNIT 1) WHICH WAS JUST CREATED_/
+ TEXT /AND PLACE IT ON UNIT 0_/
+ TEXT \IT IS YOUR NEW OS/8 SYSTEM TAPE?\
+SWTCH, TEXT /DISMOUNT SYSTEM TAPE #2 FROM UNIT 0 AND SAVE IT_/
+ TEXT /MOUNT ORIGINAL SYSTEM TAPE #1 ON UNIT 0_/
+ TEXT /PREPARE TO COPY FILES OVER?/
+OK, TEXT /OK?/
+WRITOUT,TEXT /READY TO CREATE BLOCK 0 OF UNIT 1?/
+COPY, TEXT /COPYING FILES FROM UNIT 0 TO UNIT 1?/
+ZERY, TEXT /ZEROING DIRECTORY ON TAPE UNIT 1?/
+PRES, TEXT /DIRECTORY ON UNIT 1 PRESERVED?/
+WRONG, TEXT /NOT ORIGINAL OS8 SYSTEM TAPE #2_/
+ TEXT /MOUNT CORRECT TAPE ON UNIT 0?/
+ROM8K, TEXT /8K ROM SYSTEM?/
+TD8E12, TEXT /12K SYSTEM?/
+HRDWR, TEXT /NEED ROM OR 12K?/
+IOERR, TEXT /FATAL IO ERR_/
+ TEXT /TYPE A TO ABORT AND START OVER AGAIN_/
+ TEXT \TYPE ANY OTHER CHARACTER TO RETRY THIS I/O OPERATION?\
+SPECIAL,TEXT /TYPE 1 TO COPY FILES FROM UNIT 0 TO UNIT 1_/
+ TEXT /TYPE 2 TO ZERO THE DIRECTORY OF UNIT 1_/
+ TEXT /TYPE 3 TO LEAVE THE DIRECTORY OF UNIT 1 ALONE?/
+\fTSTKBD, 0
+ KSF
+ JMP I TSTKBD
+ KRS
+ AND (177
+ TAD (-3
+ SNA
+ JMP I (RE /^C
+ TAD (3-17
+ SZA CLA
+ JMP NO
+ CLA IAC
+ DCA CTRLO
+NO, KCC
+ JMP I TSTKBD
+ PAGE
+\f/TD8E SYSTEM INITIALIZER
+/THIS CODE IS PLACED ON THE BINARY TAPE
+/IN RECORD 0. WHEN THE 7470 OR STANDARD TD8E BOOTSTRAP
+/IS EXECUTED, THIS PROGRAM READS THE REST OF THE INIT
+/SYSTEM FROM THE FIRST FILE ON THE TAPE, AND
+/STARTR EXECUTION OF IT. A SHORT PROGRAM IS HERE
+/INCLUDED TO WRITE RECORD 0 ON THE TAPE. THE START ADDRESS
+/OF THAT CODE IS 200.
+
+SDSS=6771
+SDST=6772
+SDSQ=6773
+SDLC=6774
+SDLD=6775
+SDRC=6776
+SDRD=6777
+ *7420
+ NOPUNCH
+ *7400
+ ENPUNCH
+ TAD K177 /INIT FOR TAPE READ
+ DCA 10
+NUBLK, TAD KM200 /SET BLOCK WORD COUNT
+ DCA WCNT
+NOT, JMS GET /GET BLOCK # FORWARD
+ -26
+ SDRD /THE RIGHT ONE?
+ AND KK77
+ TAD BLOCKK
+ SZA CLA
+ JMP NOT /I GUESS NOT
+ JMS GET /RIGHT. NOW GET REV. GUARD
+ -32
+ JMS RQD
+ JMS RQD
+ JMS RQD
+LP, JMS RQD
+ DCA I 10 /READ THE INIT PROGRAM
+ ISZ WCNT
+ JMP LP
+ ISZ BCNT /DONE ALL BLOCKS?
+ JMP CONT
+ SDLC
+ JMP I .+1
+ STARTUP
+CONT, CLA CMA /SET FOR NEXT BLOCK
+ TAD BLOCKK
+ DCA BLOCKK
+ JMP NUBLK
+
+RQD, 0
+ SDSQ
+ JMP .-1
+ SDRD
+ JMP I RQD
+\fGET, 0 /PICK UP A SPECIFIED TAPE FRAME
+ TAD I GET /HOLDS 6 BIT MARK TRACK I.D.
+ DCA RQD
+GTIT, SDSS
+ JMP .-1
+ SDRC /FLAG IS UP. READ MARK TRACK
+ AND KK77
+ TAD RQD /A MATCH?
+ SZA CLA
+ JMP GTIT
+ ISZ GET
+ JMP I GET
+
+KK77, 77
+KM200, -200
+BLOCKK, -21 /SKIP CORE CONTROL BLOCK AND PAGE 0
+WCNT, -200
+K177, 177
+BCNT, -3
+ *200
+ $