1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-01 09:40:56 +00:00
Files
PDP-10.its/src/syseng/11boot.23
2018-06-13 21:01:39 +02:00

371 lines
6.7 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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