; BOOT BLOCK. ; ; THIS CODE IS IN TRACK 1 SECTOR 1 OF THE DISK, FOR STAND-ALONE BOOT. ; ; THIS BOOT BLOCK READS A 2-SECTOR LOADER (256 BYTES) INTO THE LAST ; 256 BYTES OF THE FIRST 8K OF MEMORY. THIS LOADER IS ON DISK IN THE ; LAST TWO SECTORS OF SCREENS 40-47 OF THE 'FORTH.DAT' FILE ( THESE ; ARE SECTORS 26 AND 30 - OCTAL - OF TRACK 21). WHEN THE LOADER ; EXECUTES IT READS IN THE REST OF THE BINARY IMAGE (STARTING AT ; ZERO) AND BRANCHES TO ADDRESS 1000 TO START EXECUTION OF THE ; LOADED PROGRAM. THE LOADER, WHICH IS TABLE-DRIVEN, IS CREATED ; AND WRITTEN TO DISK BY FORTH SCREENS 36 AND 37. ; ORIGIN: NOP BR SETUP .=ORIGIN+20 .WORD 64 ; IOT TRAP - USED FOR WAIT SUBROUTINE .WORD 340 ; SET PRIORITY 7 .=ORIGIN+34 ERROR: HALT SETUP: MOV #17400,R0 ; 2-SECTOR LOADER WILL START AT 17400 MOV #1000,SP MOV #177170,R4 IOT ; WAIT FOR DISK TO FINISH BR CONTIN ; SKIP OVER INTERRUPT VECTOR .=ORIGIN+60 .WORD ERROR ; HALT IF TERMINAL INTERRUPT .WORD 341 ; FLAG (WHICH HALT) WAIT: TST (R4) ; THIS SUBROUTINE IS CALLED BY IOT BEQ WAIT ; WAIT FOR SOMETHING BMI ORIGIN ; IF ERROR, START OVER (BRANCH TO ZERO) RETURN: RTI .=ORIGIN+100 .WORD RETURN ; IF CLOCK INTERRUPT, JUST RTI .WORD 340 CONTIN: MOV R4,R5 ; PUT #177172 TST (R5)+ ; IN R5 MOV #26,R1 ; READ SECTOR 26 FIRST RDLOOP: MOV #7,(R4) ; START THE READ OPERATION IOT ; WAIT (FOR TRANSFER FLAG) MOV R1,(R5) ; MOVE SECTOR # TO CONTROL REGISTER IOT MOV #21,(R5) ; MOVE TRACK # IOT MOV #3,(R4) ; EMPTY BUFFER COMMAND IOT CHLOOP: MOVB (R5),(R0)+ ; THIS LOOP MOVES 200 CHARACTERS IOT TSTB (R4) ; TEST FOR TRANSFER FLAG BMI CHLOOP ; WHEN GET HERE, DONE TRANSMITTING ONE SECTOR'S CHARACTERS CMP #26,R1 ; GO AROUND AGAIN IF TRACK WAS 26 BEQ 1$ JMP ORIGIN+17400 ; ELSE JUMP TO THE LOADER AT 17400 1$: MOV #30,R1 ; SECOND (AND LAST) TIME, READ SECTOR 30 BR RDLOOP .END