Write GETVMB which will read VMB from disk
GETVMB works in a similar fashion to the booting of a VAX 11/750.
The boot ROM in a 750 contains a skeleton device driver which
enables the boot block to be brought into memory and executed.
This program then locates VMB on disk from the data in the first 3
longwords of the boot block. GETVMB is a quick and dirty software
version of an RB80 boot ROM for the 730.
NOTE: GETVMB does not seem to work if you want to use it to
reboot immediately after a shutdown. Use DEFBOO.CMD for that.
.TITLE GETVMB
.IDENT /V01/
;
; BOOTSTRAP PROGRAM TO READ THE BOOT BLOCK (LBN0)
; ON THE RB80 DRIVE ON A VAX 11/730 AND THEN GRAB
; THE REST OF VMB.EXE OFF THE DISK.
;
; AUTHOR: ALEX WONG, TECHNICAL SPECIALIST
; AUTOMATED SYSTEMS LTD, SINGAPORE.
; DATE: 12-OCT-1984 VAX/VMS V3.6
;
MOVL #^XF26200,R7 ; R7=IDC CSR
MNEGL #1,^X1C(R7) ; INIT IDC
BSBW READY ; DRIVE ASLEEP ?
;
; READ BOOT BLOCK
;
MOVL #0,R0 ; LBN OF BOOTBLOCK
MOVL #^X400,R2 ; XFER ADDRESS
MOVL #12,R3 ; XFER SIZE IN BYTES
BSBB READ ; LET'S DO IT
;
; GET LBN OF VMB, XFER ADDRESS AND XFER SIZE.
;
ROTL #-16,@#^X404,R0 ; SWAP WORDS, R0=LBN
MOVL @#^X408,R2 ; XFER ADDRESS
MOVL R2,R9 ; SAVE UP XFER ADDR
MULL3 @#^X400,#512,R3 ; XFER SIZE IN BYTES
BSBB READ ; HIT IT
;
; VMB LOADED, NOW SET UP R0-R5 AS IN DEFBOO.CMD
;
MOVL #^X00A80003,R0
MOVL #3,R1
MOVL #^X3FB86,R2
MOVL #0,R3
MOVL #0,R4
MOVL #0,R5
JMP (R9) ; AWAY WE GO !
;
; CONVERT LBN TO DISK ADDRESS, SEEK TO CYLINDER
; AND THEN READ BLOCK OFF DISK INTO MEMORY.
; INPUT: R0 LBN
; R2 TRANSFER ADDRESS
; R3 TRANSFER SIZE IN BYTES
;
READ: CLRL R1 ; HI WORD OF DIVIDEND
CLRL R5 ; HI WORD OF DIVIDEND
EDIV #31*14,R0,R11,R4 ; R11=CYLINDER
EDIV #31,R4,R4,R6 ; R4=TRACK,R6=SECTOR
SUBL3 R6,#31,R5 ; R5=SECTORS LEFT
MULL #512,R5 ; R5=BYTES LEFT
CMPL R3,R5 ; MORE XFERS ?
BGTRU 20$ ; BRANCH IF YES
MOVL R3,R5 ; FINAL XFER COUNT
20$: INSV R11,#16,#16,R6 ; HI WORD=CYLINDER
INSV R4,#8,#8,R6 ; 2ND BYTE=TRACK
;
; "...SEEK AND YE SHALL FIND"
;
MOVL #^X86,(R7) ; LOAD FUNC, NO EXEC
MOVL R6,12(R7) ; LOAD DISK ADDR REG
MOVL #6,(R7) ; GO
BSBB READY ; SIT ON IT
;
; NOW SUCK THE BITS OFF THE MAGNET.
;
MOVL #^X8C,(R7) ; LOAD FUNC, NO EXEC
MNEGL R5,8(R7) ; NEG XFER BYTE COUNT
MOVL R2,4(R7) ; XFER ADDRESS (BAR)
MOVL R6,12(R7) ; DISK ADDRESS (DAR)
MOVL #12,(R7) ; TURN IT ON
BSBB READY ; COFFEE BREAK HERE
MOVL 4(R7),R2 ; UPDATE XFER ADDR
ADDL 8(R7),R5 ; GET ACTUAL BYTES XFER
SUBL R5,R3 ; GET BYTES LEFT TO XFER
ASHL #-9,R5,R10 ; CONVERT TO BLOCK COUNT
ADDL R10,R0 ; UPDATE LBN
TSTL R3 ; MORE TO XFER ?
BGTRU READ ; BRANCH IF YES
RSB
;
; WAIT FOR CONTROLLER AND DRIVE READY
;
READY: MOVL (R7),R10
BBC #7,R10,READY ; LOOP UNTIL CRDY
BBC #0,R10,READY ; LOOP UNTIL DRDY
RSB ; DONE, PHEW !
.END
Compile and link the above program as follows:
$ MACRO GETVMB
$ LINK/SYSTEM=0 GETVMB