/ ////////////////////////////////////////////////////////////////////// / Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. / / All Rights Reserved. / / Reference "/usr/src/COPYRIGHT" for applicable restrictions. / ////////////////////////////////////////////////////////////////////// / / ULTRIX-11 Block Zero Bootstrap for TMSCP Magtape / / SCCSID: @(#)tkboot.s 3.0 4/21/86 / / On entry boot leaves: / r0 = unit # / r1 = aip register address / / magtape boot program to load and transfer / to a unix entry / / Chung_wu Lee 2/8/85 / nop = 240 s1 = 4000 go = 1 core = 28. .. = [core*2048.]-512. / establish sp and check if running below / intended origin, if so, copy / program up to 'core' K words. start: nop / DEC boot block standard br 1f / " 1: mov $..,sp clr r4 mov sp,r5 cmp pc,r5 bhis 2f cmp (r4),$407 bne 1f mov $20,r4 1: mov (r4)+,(r5)+ cmp r5,$end blo 1b jmp (sp) / Clear core to make things clean, 2: clr (r4)+ cmp r4,sp blo 2b / TK initialization mov r0,bdunit / save unit # booted from mov r1,tkaip / save aip register address clr (r1)+ / start tk init sequence / move pointer to tksa register mov $s1,r5 / set tk state test bit to step 1 mov $1f,r4 / address of init seq table br 2f / branch around table 1: 100000 / TK_ERR, init step 1 ring / address of ringbase 0 / hi ringbase address go / TK go bit 2: tst (r1) / error ? bmi . / yes, hang - can't restart !!! bit r5,(r1) / current step done ? beq 2b / no mov (r4)+,(r1) / yes, load next step info from table asl r5 / change state test bit to next step bpl 2b / if all steps not done, go back / r5 now = 100000, TK_OWN bit mov $400,cmdhdr+2 / tape VCID = 1 mov $36.,cmdhdr / command packet length / don't set response packet length, / little shakey but it works. mov r0,tkcmd+4. / load unit number mov $11,tkcmd+8. / on-line command opcode mov $20000,tkcmd+10. / set clear serious exception mov $ring,r2 / initialize cmd/rsp ring mov $tkrsp,(r2)+ / address of response packet mov r5,(r2)+ / set TK owner mov $tkcmd,(r2)+ / address of command packet mov r5,(r2)+ / set TK owner mov -2(r1),r0 / start TK polling 3: tst ring+2 / wait for response, TK_OWN goes to zero bmi 3b tstb tkrsp+10. / does returned status = SUCCESS ? bne . / no, hang (try it again ???) / Pass boot device type ID and unit number to Boot: mov tkrsp+28.,bdmtil / media type ID lo mov tkrsp+30.,bdmtih / media type ID hi / rewind tape to BOT tstart: jsr pc,tkrew clr r1 mov $2,bc jsr pc,tkread /* skip the first two blocks clr r1 mov $1,bc jsr pc,tkread /* read the first block / Find out how big boot is mov *$2,r0 / text segment size add *$4,r0 / data segment size / sub $512.,r0 / They forgot to skip the a.out header! sub $496.,r0 add $511.,r0 / Convert size to block count clc / UNSIGNED! ror r0 ash $-8.,r0 beq 1f / In case boot size < 496 bytes (FAT CHANCE!) mov r0,bc jsr pc,tkread / read file into core / load boot device type info into r0 -> r4 / relocate core around / assembler header 1: jsr pc,tkrew mov bdunit,r0 / unit number mov $12.,r1 / boot device type code 12 = TK (TMSCP) mov bdmtil,r2 / media type ID mov bdmtih,r3 mov tkaip,r4 / TMSCP controller CSR address clr r5 1: mov 20(r5),(r5)+ cmp r5,sp blo 1b / enter program clr pc / TK driver rewind routine tkrew: / mov $24.,cmdhdr / length of command packet mov $45,tkcmd+8. / reposition opcode mov $0,tkcmd+12. / clear record/object count mov $0,tkcmd+16. / clear tape mark count mov $20002,tkcmd+10. / set rewind & clear serious exception mov $100000,ring+2 / set TK owner of response mov $100000,ring+6 / set TK owner of command mov *tkaip,r0 / start TK polling 1: tst ring+2 / wait for response bmi 1b tstb tkrsp+10. / does returned status = SUCCESS ? beq 1f / yes, return jmp tstart / no, error (try it again) 1: rts pc tkread: mov bc,r3 / mov $32.,cmdhdr / length of command packet mov $41,tkcmd+8. / read opcode mov $20000,tkcmd+10. / set clear serious exception mov $512.,tkcmd+12. / byte count mov $buf,tkcmd+16. / buffer descriptor 1: mov $100000,ring+2 / set TK owner of response mov $100000,ring+6 / set TK owner of command mov *tkaip,r0 / start TK polling 2: tst ring+2 / wait for response bmi 2b tstb tkrsp+10. / does returned status = SUCCESS ? beq 2f / yes jmp tstart / no, error (try it again) 2: mov $buf,r2 mov tkrsp+12.,r4 / byte count asr r4 / word count 3: dec r4 / decrement word count bmi 3f mov (r2)+,(r1)+ br 3b 3: sob r3,1b rts pc end: tkaip = ..-1024. cmdint = tkaip+2. rspint = cmdint+2. ring = rspint+2. rsphdr = ring+8. tkrsp = rsphdr+4. cmdhdr = tkrsp+48. tkcmd = cmdhdr+4. bdunit = tkcmd+48. bdmtil = bdunit+2. bdmtih = bdmtil+2. buf = bdmtih+2. bc = buf+512.