BOOT2 MACRO V04.00 00:01:08 PAGE 1 1 .TITLE BOOT2 2 ; 3 ; TWO-SECTOR RX01 BOOT LOADER, CREATED BY PAUL HARDY. 4 ; BASED UPON TWO-SECTOR BOOT LOADER IN FORTH.DAT BY JOHN S. JAMES. 5 ; 6 ; THIS CODE IS IN THE PUBLIC DOMAIN. 7 ; 8 ; BUILD AS: 9 ; 10 ; MACRO BOOT2 /LIST 11 ; LINK BOOT2 /LDA /TRANSFER:17400 12 ; 13 ; THIS CODE MIMICS THE FORTH CODE IN FORTH.DAT, SCREENS 36 AND 37. 14 ; THE CODE IN FORTH.DAT WRITES THE BOOT LOADER TO TWO ABSOLUTE SECTOR 15 ; NUMBERS ON AN RX01 FLOPPY DISK, WHICH THEREFORE REQUIRES THAT THE DISK 16 ; BE MOUNTED. THE CODE BELOW CREATES THE TWO-SECTOR BOOT LOADER AS A 17 ; MACRO-11 PROGRAM WITHOUT REQUIRING AN RX01 DISK TO BE MOUNTED, SO THAT 18 ; THE RX01 DISK IMAGE CAN BE CREATED WHEN CONVENIENT AFTER CODE COMPILATION. 19 ; 20 ; THIS IS LOADED BY THE INITIAL BOOT SECTOR IN TRACK 1, SECTOR 1 21 ; OF AN RX01 FLOPPY DISK, PROVIDED IN THE "BOOT.MAC" FILE. IT LOADS 22 ; THE FIG-FORTH IMAGE INTO MEMORY STARTING AT LOCATION 001000 OCTAL, 23 ; AND THEN JUMPS TO 001000 OCTAL TO RUN FORTH. 24 ; 25 ; FORTH.DAT SCREENS 36 AND 37 ARE LISTED BELOW FOR REFERENCE. 26 ; THE COMMENT IN SCREEN 36, LINE 0, "DOES NOT WRITE BOOT BLOCK", 27 ; REFERS TO THE BOOT BLOCK IN TRACK 1, SECTOR 1. THAT IS GIVEN 28 ; SEPARATELY IN THE FILE "BOOT.MAC". 29 ; 30 ; SCR # 36 31 ; 0 ( CREATE BOOT LOADER. NOTE - DOES NOT WRITE BOOT BLOCK) 32 ; 1 ASSEMBLER DEFINITIONS OCTAL 33 ; 2 : INIT, 1000 # R0 MOV, 00000 # R1 MOV, 34 ; 3 177170 # R4 MOV, 200 # R3 MOV, ; 35 ; 4 : ?TERM, R1 () TSTB, LE IF, 1000 @# JMP, ENDIF, ; 36 ; 5 : WAITT, BEGIN, R3 R4 () BIT, NE UNTIL, ; 37 ; 6 : WAITD, BEGIN, 40 # R4 () BIT, NE UNTIL, ; 38 ; 7 : ?ERR, R4 () TST, LE IF, HALT, ENDIF, ; 39 ; 8 : BLOOP, R3 R2 MOV, 40 ; 9 BEGIN, WAITT, 2 R4 I) R0 )+ MOVB, R2 DEC, EQ UNTIL, ; 41 ; 10 : NEXTTAB, 1 R1 I) R5 MOVB, R5 INC, R5 INC, 42 ; 11 R5 32 # CMP, GT IF, 32 # R5 SUB, THEN, 43 ; 12 R5 1 R1 I) MOVB, 1 R1 I) 2 R1 I) CMPB, 44 ; 13 EQ IF, 3 # R1 ADD, ENDIF, ; 45 ; 14 46 ; 15 DECIMAL 37 LOAD 47 ; 48 ; SCR # 37 49 ; 0 ( CREATE BOOT LOADER, CONT.) OCTAL 50 ; 1 : TRACK, R1 () R5 MOVB, R5 2 R4 I) MOV, ; 51 ; 2 : SECTOR, 1 R1 I) R5 MOVB, R5 2 R4 I) MOV, ; 52 ; 3 : MAINL, BEGIN, ?TERM, 7 # R4 () MOV, WAITT, SECTOR, WAITT, 53 ; 4 TRACK, WAITD, ?ERR, 3 # R4 () MOV, BLOOP, NEXTTAB, 54 ; 5 400 UNTIL, ; 55 ; 6 : 2, 400 * + , ; 56 ; 7 : TABLE, 17 27 2, 7 17 2, 10 10 2, 57 ; 8 20 15 2, 15 20 2, 16 16 2, BOOT2 MACRO V04.00 00:01:08 PAGE 1-1 58 ; 9 21 23 2, 23 21 2, 24 26 2, 0 0 2, ; 59 ; 10 60 ; 11 CODE BOOT 35000 JMP, C; 61 ; 12 : TASK ; 62 ; 13 35000 DP ! HERE 6 + INIT, WAITD, MAINL, HERE SWAP ! TABLE, 63 ; 14 FORGET TASK 64 ; 15 17572 35006 ! 35000 21 26 WTS 35200 21 30 WTS 65 ; BOOT2 MACRO V04.00 00:01:08 PAGE 2 1 ; ABSOLUTE CODE, STARTING AT MEMORY LOCATION 017400 OCTAL. 2 000000 .ASECT 3 017400 .=17400 4 5 ; FORTH WORD "INIT," DEFINED IN FORTH.DAT SCREEN 36. 6 017400 012700 001000 MOV #1000,R0 ; START OF MEMORY FOR LOADING FORTH IMAGE 7 017404 012701 017572 MOV #17572,R1 ; START OF "TABLE" ARRAY FOR SECTOR LIST 8 017410 012704 177170 MOV #177170,R4 ; RX11 CONTROL AND STATUS (RXCS) REGISTER 9 017414 012703 000200 MOV #200,R3 ; TR FLAG IN RXCS 10 ; 11 ; WAIT UNTIL DISK IS READY. 12 ; 13 ; FORTH WORD "WAITD" DEFINED IN FORTH.DAT SCREEN 36. 14 017420 032714 000040 SETUP: BIT #40,(R4) 15 017424 001775 BEQ SETUP 16 17 ; FORTH WORD "?TERM" DEFINED IN FORTH.DAT SCREEN 36. 18 017426 105711 DDONE: TSTB (R1) 19 017430 003002 BGT SREAD ; IF NOT AT END OF "TABLE" YET, SKIP JMP 20 017432 000137 001000 JMP @#1000 ; DONE LOADING -- RUN FORTH 21 ; 22 ; READ NEXT SECTOR 23 ; 24 017436 012714 000007 SREAD: MOV #7,(R4) ; START THE SECTOR READ OPERATION 25 26 ; FORTH WORD "WAITT" DEFINED IN FORTH.DAT SCREEN 36. 27 017442 030314 SWAIT: BIT R3,(R4) 28 017444 001776 BEQ SWAIT ; WAIT UNTIL SECTOR READ IS DONE 29 30 ; FORTH WORD "SECTOR" DEFINED IN FORTH.DAT SCREEN 37. 31 017446 116105 000001 MOVB 1(R1),R5 ; MOVE SECTOR NUMBER TO R5 32 017452 010564 000002 MOV R5,2(R4) ; WRITE R5 TO RXCS REGISTER ON RX11 33 34 ; FORTH WORD "WAITT" DEFINED IN FORTH.DAT SCREEN 36. 35 017456 030314 SDONE: BIT R3,(R4) 36 017460 001776 BEQ SDONE ; WAIT UNTIL DISK IS READY 37 38 ; FORTH WORD "TRACK" DEFINED IN FORTH.DAT SCREEN 37. 39 017462 111105 MOVB (R1),R5 40 017464 010564 000002 MOV R5,2(R4) ; WRITE R5 TO RX11 TRACK NUMBER REGISTER 41 42 ; FORTH WORD "WAITD" DEFINED IN FORTH.DAT SCREEN 36. 43 ; THIS IS ITS SECOND APPEARANCE IN THIS BOOT LOADER. 44 017470 032714 000040 TWAIT: BIT #40,(R4) 45 017474 001775 BEQ TWAIT ; WAIT UNTIL DISK IS READY 46 47 ; FORTH WORD "?ERR" DEFINED IN FORTH.DAT SCREEN 36. 48 017476 005714 TST (R4) 49 017500 003001 BGT CONT ; IF NO DISK ERROR, CONTINUE 50 017502 000000 HALT ; DISK ERROR, SO HALT 51 52 017504 012714 000003 CONT: MOV #3,(R4) ; RXCS READ COMMAND 53 54 ; FORTH WORD "BLOOP" DEFINED IN FORTH.DAT SCREEN 36. 55 ; THE SECOND AND THIRD INSTRUCTIONS ARE A COPY OF WAITT. 56 017510 010302 BLOOP: MOV R3,R2 ; WILL READ 200 BYTES FROM RX11 57 017512 030314 BWAIT: BIT R3,(R4) BOOT2 MACRO V04.00 00:01:08 PAGE 2-1 58 017514 001776 BEQ BWAIT ; WAIT UNTIL DISK IS READY 59 017516 116420 000002 MOVB 2(R4),(R0)+ ; TRANSFER 1 BYTE OF DISK DATA FROM RX11 60 017522 005302 DEC R2 ; DECREMENT NUMBER OF BYTES REMAINING 61 017524 001372 BNE BWAIT 62 63 64 ; 65 ; AFTER READING A SECTOR, SKIP ONE SECTOR FOR INTERLEAVING. 66 ; 67 ; FORTH WORD "NEXTTAB," DEFINED IN FORTH.DAT SCREEN 36. 68 017526 116105 000001 MOVB 1(R1),R5 ; SECTOR NUMBER TO READ 69 017532 005205 INC R5 70 017534 005205 INC R5 71 017536 020527 000032 CMP R5,#32 ; GOING PAST LAST SECTOR NUBMER ON TRACK? 72 017542 003402 BLE GETSEC ; SECTOR NUMBER IS VALID; READ IT 73 017544 162705 000032 SUB #32,R5 ; WRAP AROUND TO STARTING SECTORS ON TRACK 74 017550 110561 000001 GETSEC: MOVB R5,1(R1) 75 017554 126161 000001 000002 CMPB 1(R1),2(R1) 76 017562 001002 BNE SCONT 77 017564 062701 000003 ADD #3,R1 ; SKIP 2 SECTORS GOING BETWEEN ODD/EVEN #S 78 017570 000716 SCONT: BR DDONE 79 80 ; 81 ; FORTH WORD "TABLE," DEFINED IN FORTH.DAT SCREEN 37. 82 ; 83 ; DEFINE TABLE OF SECTOR NUMBERS TO READ. THE FORMAT OF EACH ROW IS: 84 ; 85 ; , , 86 ; 87 ; READING COMMENCES AT , . AFTER A SECTOR IS READ, 88 ; THE SECTOR NUMBER IS INCREMENTED BY 2 (FOR SECTOR INTERLEAVING IN A TRACK). 89 ; IF THE RESULT IS GREATER THAN 32 OCTAL (26.), SUBTRACK 32 OCTAL FROM THE 90 ; INCREMENTED SECTOR NUMBER AND CONTINUE. STOP WHEN THE NEW SECTOR NUMBER 91 ; EQUALS , WITHOUT READING . READING STOPS 92 ; WHEN THE NEXT IS 0. AT THAT POINT, THE PROGRAM COUNTER JUMPS 93 ; TO LOCATION 01000 TO START FORTH EXECUTION. 94 ; 95 017572 017 027 007 TABLE: .BYTE 17, 27, 7 ; TRACK 17, SECTOR 27; STOP AFTER SECTOR 5 96 017575 017 010 010 .BYTE 17, 10, 10 ; TRACK 17, SECTOR 10; STOP AFTER SECTOR 6 97 017600 020 015 015 .BYTE 20, 15, 15 ; TRACK 20, SECTOR 15; STOP AFTER SECTOR 13 98 017603 020 016 016 .BYTE 20, 16, 16 ; TRACK 20, SECTOR 16; STOP AFTER SECTOR 14 99 017606 021 023 023 .BYTE 21, 23, 23 ; TRACK 21, SECTOR 23; STOP AFTER SECTOR 21 100 017611 021 024 026 .BYTE 21, 24, 26 ; TRACK 21, SECTOR 24; STOP AFTER SECTOR 24 101 017614 000 .BYTE 0 102 .EVEN 103 104 000001 .END BOOT2 MACRO V04.00 00:01:08 PAGE 2-2 SYMBOL TABLE BLOOP 017510 DDONE 017426 SDONE 017456 SREAD 017436 TABLE 017572 BWAIT 017512 GETSEC 017550 SETUP 017420 SWAIT 017442 TWAIT 017470 CONT 017504 SCONT 017570 . ABS. 017616 000 000000 001 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 8192 WORDS ( 32 PAGES) DYNAMIC MEMORY AVAILABLE FOR 66 PAGES DK:BOOT2,DK:BOOT2=DK:BOOT2