Interdata_v6/usr/source/boot/tpboot.s
*
* Unix bootstrap loader
* - load from 'tp' tape
*
* N.B. Must be assembled with SQUEZ to make it relocatable
*
* Format of 'tp' block
tapea equ 44
size1 equ 38
dirsiz equ 64
MDIR equ 62
bootaddr equ y'20000' must be >top of loaded program
*
t.addr equ x'78' 85 tape address
i.addr equ x'7e' 10 console input address
i.cmd2 equ x'7f' a3 console init cmd
*
MAGIC equ x'107' a.out magic number
EOL equ x'0d' carriage return
PROMPT equ c'?'
PAUSE equ c'-' flag to go into wait state after loading
WAITPSW equ x'8000' wait-state psw
*
ret equ 15
ret1 equ 14
work equ 13
tape equ 12
count equ 11
bno equ 10
dir equ 09
char equ 08
dev equ 05
core equ 01
*
low equ *
org low+x'60'
b start(0,0)
org low+x'80'
*
start equ *
li 1,bootaddr relocation address
lis 2,0 start at low core
rloop lm 8,0(2) move 8 words
stm 8,0(1,2)
ahi 2,8*adc increment core address
cli 2,high all moved?
bl rloop no - continue
b go-low(1) execute relocated code
*
go equ *
lm 14,t.addr save lowcore data
stm 14,lowsave
lb tape,t.addr
*
restart equ *
bal ret1,rewind rewind tape
lhi char,PROMPT ask user for filename
bal ret1,putc
lis count,0
nxtchr1 bal ret,getc read a character from console
bz nxtchr2 returns 0 at end of line
chi char,PAUSE flag to pause after loading?
bne nopause no - continue
li work,WAITPSW set wait bit
st work,ps.start in start psw
b nxtchr1
nopause equ *
stb char,names(count) store in filename
ais count,1
b nxtchr1 note no test for overflow
nxtchr2 lis char,0 delimit end of filename
stb char,names(count)
*
lookup equ *
bal ret1,skip skip boot block
find equ *
ci bno,MDIR all directory read?
be restart yes - start again
la core,dirbuf set to read into directory block
bal ret1,rtape read next block
la dir,dirbuf-dirsiz
find.1 ai dir,dirsiz next dir entry
la work,dirbuf+512 last entry?
cr dir,work
be find yes - read next dir block
lis count,0
find.2 lb char,0(dir,count) next char
clb char,names(count) match?
bne find.1 no - next dir entry
ais count,1
lr char,char end of filename?
bne find.2 no - next char
lhl count,tapea(dir) file address
exbr count,count pdp11 swapped bytes
pos cr bno,count right block?
be pos.1 yes - got it
bal ret1,skip skip forward block
b pos
pos.1 equ *
lhl count,size1(dir) size of file
exbr count,count pdp11 swapped bytes
lis core,0 start reading into low core
load bal ret1,rtape read next block
shi count,512 decrement size
bp load more - read next block
reloc equ *
l char,x'0' check first word
clhi char,MAGIC a.out file?
bne finish no - done
lis count,0 yes - relocate to get rid of header
mvsys l char,32(count)
st char,0(count)
ais count,4
cr count,core
bl mvsys
finish equ *
lm 14,lowsave restore lowcore data
stm 14,t.addr
lh work,i.addr console addr & cmd 2
sth work,t.addr put where unix wants them
lpsw ps.start go to start address in loaded file
*
* Console read and write routines
*
getc equ *
lb dev,i.addr console input address
oc dev,i.cmd2 initialize
oc dev,i.read start terminal read
getwait ssr dev,work wait for busy == 0
bc getwait
rdr dev,char read char from terminal buffer
nhi char,x'7f' clear parity bit
clhi char,c'A' check for alpha
bl notran
clhi char,c'Z'
bp notran
ohi char,x'20' alpha - translate to lowercase
notran bal ret1,putc echo character back
clhi char,EOL end of line?
bner ret no - return (cond. code nonzero)
lr ret1,ret
lis char,x'0a' echo extra linefeed
*
putc equ *
lb dev,i.addr console output address
ais dev,1
oc dev,i.write start terminal writing
wdr dev,char write the character
putwait ssr dev,work wait for busy == 0
bc putwait
br ret1
*
* Magtape I/O Routines
*
rewind equ * rewind tape
bal ret,nmtn
oc tape,t.clear clear controller
oc tape,t.rew rewind
lis bno,0 reset block address
br ret1
skip equ * skip forward block
bal ret,nmtn
oc tape,t.read start reading
skip.1 ssr tape,work tape status
bfc T.EOM,skip.1 wait for EOM = 1
ais bno,1 increment block addr
br ret1
rtape equ * read tape block into *(core)
bal ret,nmtn
lr ret,core save core address for retry
oc tape,t.read start reading
rtape.1 ssr tape,work tape status
btc T.BSY,rtape.1 wait for BSY = 0
btc T.EOM,rtape.2 EOM - end of block
rdr tape,char read byte
stb char,0(core) store in memory
ais core,1 increment memory ptr
b rtape.1 next char
rtape.2 equ * end of block
ais bno,1 increment block addr
thi work,T.ERR error ?
bzr ret1 no - return
lr core,ret restore core addr
bal ret,nmtn
oc tape,t.bsp backspace tape
sis bno,1 decrement block addr
b rtape retry
nmtn equ * wait for end of motion
ssr tape,work tape status
thi work,T.NMTN no motion?
bz nmtn no - wait
br ret
T.ERR equ x'80'
T.NMTN equ x'10'
T.BSY equ x'08'
T.EOM equ x'02'
align 8
ps.start dc 0,y'60' psw to start loaded program
i.write db x'a3'
i.read db x'a1'
t.clear db x'e0'
t.rew db x'f8'
t.read db x'e1'
t.bsp db x'd1'
align adc
high equ * highest location for relocate
*
lowsave equ *
dirbuf equ 8+lowsave
names equ 512+dirbuf
end