PDP-11 Bootstrap Loaders

(from http://www.psych.su.oz.au/pdp-11/bootstraps.html)

All these bootstraps (except paper tape) are designed to read in 512 bytes into locations 0-776, and then start program execution at 0. If you are having system problems, then it pays to have the bootstrap halt, so that you can check for error conditions in device registers. Also, check location 0, which is normally 240 for DEC bootstraps and 407 or 411 (separate I/D space) for Unix (unless it's a tight load, and the a.out header has been removed). Some DEC bootstraps refuse to load boot blocks that don't begin with 240. If you have doubts, load location 0 with 777 before you start the bootstrap.

Toggle in these programs starting at location 1000. To be safe, load a trap catcher into the following locations, and if you get a halt at 6 or 12, check the program or missing device. If it halts at 26, then you have power supply problems. If the CPU loops on location 0 (can show as location 2 on CPUs with data displays) then the bootblock wasn't loaded.

    	Location	Contents	Comment
    	=======================================
    	000000		000777		Loop at location zero if
    	000002		000000		secondary bootstrap isn't loaded
    	000004		000006		Bus error
    	000006		000000
    	000010		000012		Reserved instruction
    	000012		000000
    	000024		000026		Power failure
    	000026		000000

- Paper Tape Loader
- RK02/03/05
- RK06
- RK07
- RL01/02
- RP03
- DECtape
- TU10 Magnetic Tape

## PC Paper Tape or Teletype

The paper tape bootstrap is a two stage process. First the bootstrap loader must be toggled in at the appropriate location (set table for xx). A special bootstrap tape (Absolute Loader) must be in the reader with the leader (punch 351) in the read frame. The program is then started at location xx7744. The program is self-modifying, so if you read the wrong tape, or position it incorrectly, it will corrupt itself. The program will halt when the last frame of the loader is read. Put in the tape you want loaded (on blank leader) and press continue or start at xx7500

    	Loc.	Cont.	Label	Instruction	Comment
    	================================================
    	xx7744	016701		mov device,r1	get csr address
    	xx7746	000026
    	xx7750	012702	loop:	mov #offset,r2	get offset
    	xx7752	000352  offset:
    	xx7754	005211		inc (r1)	read frame
    	xx7756	105711	wait:	tstb (r1)	wait for ready
    	xx7760	100376		bpl wait
    	xx7762	116162		movb (r1),bnk(r2) store data
    	xx7764	000002
    	xx7766	xx7400
    	xx7770	005267		inc offset	bump address
    	xx7772	177756
    	xx7774	000765		br loop
    	xx7776	177550	device:			HSR csr, or 177560 for teletype

    Where

    	xx		Memory Size
    	===========================
    	017744		4k
    	037744		8K
    	057744		12K
    	077744		16k
    	117744		20k
    	137744  	24k
    	157744		28k

## RK02/03/05 Disk Unit 0

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012700	mov #rkwc, r0	controller address
    	001002	177406
    	001004	012710	mov #-256,(r0)	set the word count
    	001006	177400
    	001010	012740	mov #5,-(r0)	read command
    	001012	000005
    	001014	105710	tstb (r0)	wait for ready
    	001016	100376  bpl .-2
    	001020	000000	halt		(or 005007 to auto start)

## RK02/03/05 Disk Unit x

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012737	mov #unit,rkda	set the unit address
    	001002	000000			unit 0
    		020000			unit 1
    		040000			unit 2
    		060000			unit 3
    	001004	177412
    	001006	012700	mov #rkwc, r0	controller address
    	001010	177406
    	001012	012710	mov #-256,(r0)	set the word count
    	001014	177400
    	001016	012740	mov #5,-(r0)	read command
    	001020	000005
    	001022	105710	tstb (r0)	wait for ready
    	001024	100376  bpl .-2
    	001026	000000	halt		(or 005007 to auto start)

## RK06 Disk

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012700	mov #rkcs1,r0	controller register
    	001002	177440
    	001004	012710	mov #cmd,(r0)
    	001006	000003
    	001010	032710	bit #flags,(r0)	wait for ready or error
    	001012	100200
    	001014	001775	beq .-4
    	001016	012760	mov #-256,2(r0)	set the word count
    	001020	177400
    	001022	000002
    	001024	012710	mov #cmd,(r0)	read block
    	001026	000021
    	001030	032710	bit #flags,(r0)	wait for ready or error
    	001032	100200
    	001034	001775	beq .-4
    	001036	000000	halt		(or 5007 for auto start)

## RK07 Disk

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012700	mov #rkcs1,r0	controller register
    	001002	177440
    	001004	012710	mov #cmd,(r0)
    	001006	002003
    	001010	032710	bit #flags,(r0)	wait for ready or error
    	001012	100200
    	001014	001775	beq .-4
    	001016	012760	mov #-256,2(r0)	set the word count
    	001020	177400
    	001022	000002
    	001024	012710	mov #cmd,(r0)	read block
    	001026	000021
    	001030	032710	bit #flags,(r0)	wait for ready or error
    	001032	100200
    	001034	001775	beq .-4
    	001036	000000	halt		(or 5007 for auto start)

## RL01/02 Disk

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012700	mov #rlcs,r0	controller address
    	001002	174400
    	001004	012760	mov #cmd,4(r0)	seek command data
    	001006	000013
    	001010	000004
    	001012	012710	mov #cmd,(r0)	get status
    	001014	000004
    	001016	105710	tstb (r0)	wait ready
    	001020	100376	bpl .-2
    	001022	005060	clr 2(r0)	zero bus address
    	001024	000002
    	001026	005060	clr 4(r0)	zero disk address
    	001030	000004
    	001032	012760	mov #-256,6(r0)	set the byte count
    	001034	177400
    	001036	000006
    	001040	012710	mov #cmd,(r0)	read block
    	001042	000014
    	001044	105710	tstb (r0)	wait ready
    	001046	100376	bpl .-2
    	001050	000000	halt		(or 5007 to auto start)

## RP03 Disk

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012700	mov #rpwc, r0	controller address
    	001002	176726
    	001004	005040	clr -(r0)	clear disk address
    	001006	005040	clr -(r0)	clear cylinder address
    	001010	005040	clr -(r0)	clear bus address
    	001012	012740	mov #-256,-(r0)	set work count for 512 bytes
    	001014	177400
    	001016	012740	mov #cmd,-(r0)	read block
    	001020	000005
    	001022	105710	tstb (r0)	wait ready
    	001024	100376	bpl .-2
    	001026	00000	halt		(or 5007 for auto start)

## TC-11 DECtape

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	001000	012700	mov #tcwc	control register address
    	001002	177344
    	001004	012710	mov #-256,(r0)	set word count for 512 bytes
    	001006	177400
    	001010	012740	mov #4002,-(r0)	find position
    	001012	004002
    	001014	005710	tst (r0)	wait for ready
    	001016	100376	br .-2
    	001020	012710	mov #3,(r0)	read block 0
    	001022	000003
    	001024	105710	tstb (r0)	wait for ready
    	001026	100376	bpl .-2
    	001030	012710	mov #5,(r0)	stop tape
    	001032	000005
    	001034	105710	tstb (r0)	wait for ready
    	001036	100376	bpl .-2
    	001040	000000	halt		(or 5007 to auto start)

## TM-11 Magnetic Tape Please note that this bootstrap starts at 010000 instead of 01000 to allow for large boot blocks. If the bootstrap loops at location 10034 then there was an error reading the tape.

    	Loc.	Cont.	Instruction	Comment
    	=======================================
    	010000	012700	mov #mtbrc,r0	controller address
    	010002	172524
    	010004	005310	dec (r0)	set to -1
    	010006	012740	mov #cmd,-(r0)	high density, skip block
    	010010	060011
    	010012	105710	tstb (r0)	wait ready
    	010014	100376	bpl .-2
    	010016	005710	tst (r0)	test for error
    	010020	100767	bpl start	try again on error
    	010022	012710	mov #cmd,(r0)	read block
    	010024	060003
    	010026	105710	tstb (r0)	wait ready
    	010030	100376	bpl .-2
    	010032	005710	tst (r0)	test for error
    	010034	100777	bpl .		loop for ever on error
    	010036	000000	halt		(or 5007 to auto start)