mirror of
https://github.com/PDP-10/its.git
synced 2026-03-01 09:40:56 +00:00
371 lines
6.7 KiB
Plaintext
Executable File
371 lines
6.7 KiB
Plaintext
Executable File
TITLE 11BOOT - BOOT I/O 11 ON KL10
|
||
|
||
;LOADS DSK:KLRUG BIN AND DSK:IOELEV BIN, GIVES SYMBOLS TO RUG, AND
|
||
;MAKES DSK:@ BOOT11 WHICH IS TO BE PUT ON THE MAGDMP TAPE.
|
||
|
||
.MLLIT==1
|
||
|
||
A=1
|
||
B=2
|
||
C=3
|
||
D=4
|
||
E=5
|
||
T=6
|
||
TT=7
|
||
H=10
|
||
I=11
|
||
J=12
|
||
Q=13
|
||
W=14
|
||
P=17
|
||
|
||
DLB==60
|
||
DLC==64
|
||
PAG==10
|
||
SWPUA=701540,,
|
||
|
||
11CORL==16.*1024.
|
||
|
||
INCH==1
|
||
OUCH==2
|
||
|
||
OPENI: SETZ
|
||
SIXBIT/OPEN/
|
||
[.UII,,INCH]
|
||
[SIXBIT/DSK/]
|
||
[SIXBIT/IOELEV/]
|
||
SETZ [SIXBIT/BIN/]
|
||
|
||
OPENR: SETZ
|
||
SIXBIT/OPEN/
|
||
[.UII,,INCH]
|
||
[SIXBIT/DSK/]
|
||
[SIXBIT/KLRUG/]
|
||
SETZ [SIXBIT/BIN/]
|
||
|
||
OPENO: SETZ
|
||
SIXBIT/OPEN/
|
||
[.BIO,,OUCH]
|
||
[SIXBIT/DSK/]
|
||
[SIXBIT/@/]
|
||
SETZ [SIXBIT/BOOT11/]
|
||
|
||
LPDL==50
|
||
PDL: -LPDL,,.
|
||
BLOCK LPDL
|
||
|
||
RWORD: .IOT INCH,W
|
||
TDNE W,[-400]
|
||
.VALUE
|
||
.IOT INCH,A
|
||
TDNE A,[-400]
|
||
.VALUE
|
||
LSH A,8
|
||
IOR W,A
|
||
POPJ P,
|
||
|
||
GO: MOVE P,PDL
|
||
SETZM 11CORE
|
||
MOVE A,[11CORE,,11CORE+1]
|
||
BLT A,11CORE+11CORL-1
|
||
.CALL OPENR ;LOAD RUG
|
||
.VALUE
|
||
PUSHJ P,ALOAD
|
||
LSH W,-1 ;START ADDR OF RUG -> VECTOR OF MAGIC CRUFT
|
||
MOVE A,11CORE(W) ;FIRST WORD IS READ START ADDR (O.ODT)
|
||
MOVEM A,RUGSA
|
||
MOVEI A,11CORE+2(W) ;-> WORD TO CONTAIN LOWEST -11 ADDR OF SYMBOL TABLE
|
||
MOVEM A,O.SYME
|
||
MOVE A,11CORE+2(W) ;THIRD WORD IS POINTER TO LOWEST SYMBOL TABLE LOC
|
||
LSH A,-1
|
||
MOVEM A,RUGSYM
|
||
MOVE A,11CORE+1(W) ;SECOND WORD -> HIGH SYMBOL TABLE LOC
|
||
LSH A,-1
|
||
SUB A,RUGSYM ;A := # WORDS OF SYMBOL TABLE
|
||
IDIVI A,16.*3+2 ;A := # BLOCKS, B := # WORDS IN LAST BLOCK
|
||
JUMPE B,G0001
|
||
MOVE A,RUGSYM
|
||
ADD A,B ;A := WORD ADDR OF TOP OF BLOCK
|
||
SUBI A,2
|
||
MOVEM A,FLGPNT
|
||
SUBI B,2
|
||
IDIVI B,3 ;B := # SYMBOLS ALREADY USED IN BLOCK
|
||
SUBI B,16.
|
||
G0001: MOVNM B,SYMCNT ;SET # OF SYMBOLS YET TO GO
|
||
|
||
.CALL OPENI ;LOAD IOELEVEN
|
||
.VALUE
|
||
PUSHJ P,ALOAD
|
||
MOVEM W,SADR
|
||
PUSHJ P,SLOAD ;LOAD SYMBOLS INTO CORE IMAGE FOR RUG
|
||
JRST LDEND
|
||
|
||
ALOAD: .IOT INCH,A ;SEARCH FOR START OF BLOCK
|
||
JUMPE A,ALOAD ;SKIPPING "BLANK TAPE"
|
||
CAIE A,1
|
||
.VALUE ;UNKNOWN BLOCK TYPE
|
||
.IOT INCH,A ;SECOND BYTE OF HEADER ALWAYS 0
|
||
SKIPE A
|
||
.VALUE
|
||
PUSHJ P,RWORD ;BYTE COUNT + 6
|
||
HRREI Q,-6(W)
|
||
PUSHJ P,RWORD ;LOAD ADDRESS
|
||
JUMPLE Q,JBLK
|
||
LD1: .IOT INCH,A ;BYTE TO BE LOADED
|
||
TDNE A,[-400]
|
||
.VALUE
|
||
CAIL W,11CORL*2
|
||
.VALUE
|
||
MOVEI J,2*11CORE(W) ;FIGURE OUT WHERE IT GOES
|
||
ROT J,-1
|
||
SKIPL J
|
||
TLOA J,001000
|
||
HRLI J,101000
|
||
DPB A,J
|
||
ADDI W,1
|
||
SOJG Q,LD1
|
||
.IOT INCH,A ;IGNORE CHECKSUM
|
||
JRST ALOAD
|
||
|
||
JBLK: .IOT INCH,A ;GOBBLE CHECKSUM
|
||
SKIPE Q
|
||
.VALUE
|
||
POPJ P, ;RETURN FROM ALOAD WITH START ADDR IN W
|
||
|
||
SBTB: 440600,,A ;SIXBIT BYTE POINTER TO A
|
||
|
||
RAD50: MOVE Q,SBTB
|
||
PUSHJ P,LOOP50
|
||
HRRZM E,11CORE-3(B)
|
||
PUSHJ P,LOOP50
|
||
HRRZM E,11CORE-2(B)
|
||
POPJ P,
|
||
|
||
LOOP50: MOVEI E,0
|
||
MOVEI D,3
|
||
LOP50: ILDB C,Q
|
||
PUSHJ P,CNVT
|
||
IMULI E,50
|
||
ADD E,C
|
||
SOJG D,LOP50
|
||
POPJ P,
|
||
|
||
CNVT: CAIL C,41
|
||
CAILE C,72
|
||
JRST NOTLET
|
||
SUBI C,40
|
||
POPJ P,
|
||
|
||
NOTLET: CAIN C,4
|
||
JRST DOLR
|
||
CAIN C,5
|
||
JRST PRCNT
|
||
CAIN C,16
|
||
JRST PERD
|
||
CAIG C,31
|
||
CAIGE C,20
|
||
JRST NOTNUM
|
||
ADDI C,16
|
||
POPJ P,
|
||
|
||
NOTNUM: MOVEI C,0
|
||
POPJ P,
|
||
|
||
DOLR: MOVEI C,33
|
||
POPJ P,
|
||
|
||
PERD: MOVEI C,34
|
||
POPJ P,
|
||
|
||
PRCNT: MOVEI C,35
|
||
POPJ P,
|
||
|
||
SLOAD: .IOT INCH,A ;LOAD SYMBOLS
|
||
JUMPE A,SLOAD ;SKIP BLANK TAPE
|
||
CAIE A,2
|
||
.VALUE ;NOT SYMBOLS BLOCK
|
||
MOVE B,RUGSYM ;LOAD SYMBOLS AT -3(B),-2(B),-1(B)
|
||
MOVE H,SYMCNT ;# SYMBOLS YET TO GO IN THIS BLOCK
|
||
MOVE A,FLGPNT
|
||
HRLZ I,11CORE+1(A) ;PICK UP REGISTER FLAGS WORD
|
||
HRR I,11CORE(A) ;PICK UP HALF-KILL FLAGS WORD
|
||
JUMPN H,SLOAD1
|
||
SLOAD0: MOVEI H,16. ;NEW BLOCK
|
||
MOVE B,RUGSYM
|
||
SUBI B,2
|
||
MOVEM B,RUGSYM
|
||
MOVEM B,FLGPNT
|
||
SETZB I,11CORE(B)
|
||
SETZM 11CORE+1(B)
|
||
SLOAD1: .IOT INCH,A
|
||
JUMPE A,SLOADE
|
||
AOJE A,SLOADE
|
||
SOS A
|
||
PUSHJ P,RAD50 ;DEPOSIT 2 -11 WORDS OF RADIX 50 FOR THIS SIXBIT
|
||
.IOT INCH,A ;GET FLAGS AND VALUE
|
||
HRRZM A,11CORE-1(B) ;STORE VALUE
|
||
MOVEI D,100000
|
||
MOVNI E,-1(H) ;E IS 0 FOR LOWEST SYM IN BLOCK, -15. FOR HIGHEST
|
||
LSH D,(E) ;POINT TO RIGHT BIT IN FLAG
|
||
TLNE A,4000
|
||
TLO I,(D) ;2ND FLAG WORD
|
||
TLNE A,20000
|
||
TRO I,(D) ;1ST FLAG WORD
|
||
SUBI B,3
|
||
SOJG H,SLOAD1
|
||
MOVE A,FLGPNT ;BLOCK DONE, FILL OUT
|
||
HLRZM I,11CORE+1(A)
|
||
HRRZM I,11CORE(A)
|
||
MOVEM B,RUGSYM
|
||
JRST SLOAD0 ;START NEXT BLOCK
|
||
|
||
SLOADE: MOVE A,FLGPNT ;FINISH LAST BLOCK
|
||
HLRZM I,11CORE+1(A)
|
||
HRRZM I,11CORE(A)
|
||
MOVEM B,RUGSYM
|
||
LSH B,1
|
||
MOVEM B,@O.SYME ;TELL RUG WHERE SYMBOL TABLE ENDS
|
||
POPJ P,
|
||
|
||
RUGSYM: 0 ;WORD ADDR OF LOWEST LOC IN RUG SYMBOL TABLE
|
||
FLGPNT: 0 ;WORD ADDR OF FLAG PAIR FOR CURRENT SYM BLOCK
|
||
SYMCNT: 0 ;NUMBER OF SYMBOLS NOT YET GENERATED INTO CURRENT BLOCK
|
||
O.SYME: 0 ;-> WORD IN -11 CORE IMAGE WHICH CONTAINS LOWEST
|
||
;-11 ADDR USED BY SYMBOL TABLE
|
||
|
||
LDEND: .CLOSE INCH,
|
||
.VALUE [ASCIZ|RUGSA/P|]
|
||
.CALL OPENO
|
||
.VALUE
|
||
HRROI A,[JRST 1] ;WRITE SBLK FILE
|
||
.IOT OUCH,A
|
||
MOVEI H,BOOTST
|
||
DMPLP: CAIL H,BOOTEN ;FIND NON-ZERO
|
||
JRST DMPEN
|
||
SKIPN (H)
|
||
AOJA H,DMPLP
|
||
MOVE J,H ;FIND 2 CONSECUTIVE ZEROS
|
||
HRLI J,-200 ;WITHIN NEXT 200 WORDS
|
||
ZERLP: SKIPE (J)
|
||
AOBJN J,ZERLP
|
||
JUMPGE J,DMPBLK
|
||
AOBJP J,DMPBLK
|
||
SKIPE (J)
|
||
JRST ZERLP
|
||
|
||
DMPBLK: SUBM H,J ;RH(J) := - # BLOCKS
|
||
HRL H,J
|
||
PUSH P,[DMPLP]
|
||
HRROI A,H
|
||
.IOT OUCH,A ;HEADER
|
||
MOVE Q,H
|
||
MOVE J,H
|
||
.IOT OUCH,H ;DATA
|
||
CKSLP: ROT Q,1
|
||
ADD Q,(J)
|
||
AOBJN J,CKSLP
|
||
HRROI A,Q
|
||
.IOT OUCH,A ;CHECKSUM
|
||
POPJ P,
|
||
|
||
DMPEN: HRROI A,[JUMPA BOOTER] ;START ADDR
|
||
.IOT OUCH,A
|
||
MOVSI H,-LSYMT
|
||
HRROI A,H
|
||
.IOT OUCH,A ;HEADER
|
||
MOVE Q,H
|
||
HRRI H,SYMT
|
||
MOVE J,H
|
||
.IOT OUCH,H ;DATA
|
||
PUSHJ P,CKSLP
|
||
HRROI A,[JUMPA BOOTER] ;START ADDR AGAIN
|
||
.IOT OUCH,A
|
||
.CLOSE OUCH,
|
||
.BREAK 16,040000
|
||
|
||
CONSTANTS
|
||
|
||
SYMT: SQUOZE 0,GLOBAL
|
||
-LSYMT,,0
|
||
SQUOZE 4,RUG
|
||
GORUG
|
||
SQUOZE 4,GO
|
||
BOOTER
|
||
SQUOZE 4,11CORE
|
||
11CORE
|
||
SQUOZE 4,SADR
|
||
SADR
|
||
LSYMT==.-SYMT
|
||
|
||
;THE PROGRAM THAT GOES ON THE MAGDMP TAPE
|
||
|
||
LOC 4000
|
||
BOOTST::
|
||
GORUG: MOVE A,RUGSA ;ENTER HERE TO START 11 IN RUG
|
||
MOVEM A,SADR ;ENTER BELOW TO START 11 IN IOELEV
|
||
BOOTER: CONI PAG,A ;FLUSH CACHE
|
||
TRZN A,600000
|
||
JRST BOOTAA
|
||
SWPUA
|
||
CONSZ APR,200000
|
||
JRST .-1
|
||
CONO PAG,(A)
|
||
BOOTAA: CONO DLC,400000 ;RESET DL10
|
||
MOVEI A,5000
|
||
SOJG A,.
|
||
CONO DLB,DL10AR
|
||
DATAO DLC,[40] ;STOP PDP11
|
||
DATAI DLC,A
|
||
TRNE A,20
|
||
JRST .-2
|
||
MOVSI A,2
|
||
SOJG A,.
|
||
CONO DLC,100020 ;PORT ENB
|
||
DATAO DLC,[20] ;START PDP11
|
||
DATAI DLC,A
|
||
TRNN A,20
|
||
JRST .-2
|
||
;PDP11 IS NOW RUNNING OUT OF DL10 AREA
|
||
|
||
MOVSI Q,-11CORL
|
||
BOOTLP: MOVE A,11CORE(Q) ;TELL 11 BOOTSTRAP PROGRAM TO STORE ONE WORD
|
||
SKIPE FLAG
|
||
JRST .-1
|
||
MOVEM A,DAT
|
||
AOS FLAG
|
||
AOBJN Q,BOOTLP
|
||
SKIPE FLAG
|
||
JRST .-1
|
||
MOVEI A,000407 ;BR FROM 100004 TO 100024
|
||
MOVEM A,DL10AR+2
|
||
MOVEI A,25. ;ALLOW TIME FOR -11 TO GET STARTED
|
||
SOJG A,.
|
||
CONO DLC,400000 ;THEN, QUICK, TURN OFF PORT ENB WHILE IT'S IN INIT CODE
|
||
SKIPE -4000
|
||
JRST -4000 ;IF DDT IS PRESENT RETURN TO IT
|
||
JRST -400 ;ELSE RETURN TO MAGDMP
|
||
|
||
RUGSA: 0 ;PDP11 START ADDRESS OF RUG
|
||
CONSTANTS
|
||
|
||
LOC 5000
|
||
DL10AR: JRST 4,.
|
||
005001 ;100002/ CLR %1
|
||
005727 ;100004/ TST #0
|
||
FLAG: 0 ;100006/ 0 => 11 READY FOR WORD, NON-0 => WORD GIVEN
|
||
001775 ;100010/ BEQ 100004
|
||
012721 ;100012/ MOV #0,(1)+
|
||
DAT: 0 ;100014/ VALUE TO BE STORED
|
||
005037 ;100016/ CLR @#FLAG
|
||
100006 ;100020/
|
||
000770 ;100022/ BR 100004
|
||
000137 ;100024/ JMP @#1
|
||
SADR: 1 ;100026/ THE START ADDRESS
|
||
|
||
LOC 6000
|
||
11CORE: BLOCK 11CORL
|
||
|
||
BOOTEN: -1 ;MIDAS CORING BUG
|
||
|
||
END GO
|
||
|