; BOOT BLOCK. ; ; THIS CODE IS IN THE PUBLIC DOMAIN. ; ; 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 OCTAL). WHEN THE LOADER ; EXECUTES IT READS IN THE REST OF THE BINARY IMAGE (STARTING AT ; 1000 OCTAL) 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. ; ; Some register definitions ; LDADDR=R0 ; Memory load start address SECTOR=R1 ; RX11 Sector Number RXCS=R4 ; RX11 Control and Status Register RXES=R4 ; RX11 Error and Status Register RXDB=R5 ; RX11 Data Buffer RXTA=R5 ; RX11 Track Address RXSA=R5 ; RX11 Sector Address ; .ASECT .=0 ORIGIN: NOP BR SETUP .=ORIGIN+4 .WORD ERROR ; TIME OUT / BUS ERROR VECTOR .WORD 343 ; FLAG (WHICH HALT) .=ORIGIN+10 .WORD ERROR ; RESERVED INSTRUCTION VECTOR .WORD 344 ; FLAG (WHICH HALT) .WORD DEBUG ; EXECUTE WAIT INSTRUCTION .WORD 340 ; SET PSW = PRIORITY 7 .=ORIGIN+20 .WORD WAIT ; IOT TRAP - USED FOR WAIT SUBROUTINE .WORD 340 ; SET PSW = PRIORITY 7 .WORD ERROR ; POWER FAILURE INTERRUPT VECTOR .WORD 345 ; FLAG (WHICH HALT) .=ORIGIN+30 DEBUG: WAIT ; EMT TRAP AREA, USED AS DEBUG VECTOR RTI .=ORIGIN+34 .WORD ERROR ; If TRAP, halt with PSW=000000 ERROR: HALT SETUP: MOV #17400,LDADDR ; 2-SECTOR LOADER WILL START AT 17400 MOV #1000,SP MOV #177170,RXCS IOT ; WAIT FOR DISK TO FINISH BR CONTIN ; SKIP OVER INTERRUPT VECTOR .=ORIGIN+60 .WORD ERROR ; HALT IF TERMINAL INPUT INTERRUPT .WORD 341 ; FLAG (WHICH HALT) .WORD ERROR ; HALT IF TERMINAL OUTPUT INTERRUPT .WORD 342 ; FLAG (WHICH HALT) ; IOT trap handler. Place at end of sector. .=ORIGIN+70 WAIT: TST (RXES) ; 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 KW11L CLOCK INTERRUPT, JUST RTI .WORD 340 .WORD RETURN ; IF KW11P CLOCK INTERRUPT, JUST RTI .WORD 340 ;CONTIN: MOV RXCS,RXDB ; PUT #177172 ; TST (RXDB)+ ; IN R5 CONTIN: MOV #177172,RXDB ; Data Buffer / RXTA / RXSA Address MOV #26,SECTOR ; READ SECTOR 26 FIRST RDLOOP: MOV #7,(RXCS) ; START THE READ OPERATION IOT ; WAIT (FOR TRANSFER FLAG) MOV SECTOR,(RXSA) ; MOVE SECTOR # TO CONTROL REGISTER IOT MOV #21,(RXTA) ; MOVE TRACK # IOT MOV #3,(RXCS) ; EMPTY BUFFER COMMAND IOT CHLOOP: MOVB (RXDB),(LDADDR)+ ; THIS LOOP MOVES 200 CHARACTERS IOT TSTB (RXES) ; TEST FOR TRANSFER FLAG BMI CHLOOP ; WHEN GET HERE, DONE TRANSMITTING ONE SECTOR'S CHARACTERS CMP #26,SECTOR ; GO AROUND AGAIN IF TRACK WAS 26 BEQ 1$ JMP ORIGIN+17400 ; ELSE JUMP TO THE LOADER AT 17400 1$: MOV #30,SECTOR ; SECOND (AND LAST) TIME, READ SECTOR 30 BR RDLOOP .END