/ LOAD2.PA - CHD - 2 JUNE 2006 / COMPILE WITH: / PAL LOAD2.BN,LOAD2.LS,LOAD2.TM IFNDEF DEBUG *200 /ORIGIN ORG, JMP BOOT0 /SELECTOR MENU JMP BOOT1 /TD8E BOOTSTRAP JMP BOOT2 /RX01 BOOTSTRAP JMP BOOT3 /RX02 BOOTSTRAP / LOADER / COPY FROM THE LOADED FIELD TO FIELD 0 WHEN RUNNING IN FIELD 0 / THIS IS AN IMAGE TO BE ASSEMBLED IN ANY FIELD AND THEN TRANSFERED TO FIELD 0 SRC=0010 /AUTO INDEX REGISTER FOR SRC POINTER DST=0011 /AUTO INDEX REGISTER FOR DST POINTER SRCADR, 0 /FIELD 7 SOURCE IS HERE DSTADR, 0 /FIELD 0 DESTINATION IS HERE COUNT, 0 /SIZE OF THE BOOTSTRAP IS HERE STRADR, 0 /FIELD 0 BOOTSTRAP START IS HERE ENTRY, TAD SRCADR DCA SRC TAD DSTADR DCA DST LOOP, CDF 00 /REPLACE WITH CDF TO THE SOURCE FIELD TAD I SRC /AUTO INDEX CDF 00 DCA I DST /AUTO INDEX ISZ COUNT JMP LOOP STOP /HALT HERE WHEN DEBUGGING JMP I STRADR / BOOTSTRAP 0 -- BOOT SELECTOR MENU / / COPY FROM FIELD 7 TO FIELD 0 WHEN RUNNING IN FIELD 7 / AND FIELD 7 IS READ ONLY BOOT0, CDF 00 /FIELD 0 TAD (BT0SRC /START OF BOOT IMAGE DCA I (SRCADR /BOOT LOAD SOURCE TAD (BT0DST /LOAD ADDRESS FOR BOOT 0 IMAGE DCA I (DSTADR /BOOT LOAD DESTINATION TAD (BT0LEN /IMAGE SIZE DCA I (COUNT /BOOT LOAD SIZE TAD (BT0STR /START ADDRESS FOR BOOT 0 IMAGE DCA I (STRADR /START ADDRESS DESTINATION JMP CPLDR /XFER LOADER / BOOTSTRAP 1 -- TD8/E / / COPY FROM FIELD 7 TO FIELD 0 WHEN RUNNING IN FIELD 7 / AND FIELD 7 IS READ ONLY BOOT1, CDF 00 /FIELD 0 TAD (BT1SRC /START OF BOOT IMAGE DCA I (SRCADR /BOOT LOAD SOURCE TAD (BT1DST /LOAD ADDRESS FOR BOOT 1 IMAGE DCA I (DSTADR /BOOT LOAD DESTINATION TAD (BT1LEN /IMAGE SIZE DCA I (COUNT /BOOT LOAD SIZE TAD (BT1STR /START ADDRESS FOR BOOT 1 IMAGE DCA I (STRADR /START ADDRESS DESTINATION JMP CPLDR /XFER LOADER / BOOTSTRAP 2 -- RX01 / / COPY FROM FIELD 7 TO FIELD 0 WHEN RUNNING IN FIELD 7 / AND FIELD 7 IS READ ONLY BOOT2, CDF 00 /FIELD 0 TAD (BT2SRC /START OF BOOT IMAGE DCA I (SRCADR /BOOT LOAD SOURCE TAD (BT2DST /LOAD ADDRESS FOR BOOT IMAGE DCA I (DSTADR /BOOT LOAD DESTINATION TAD (BT2LEN /IMAGE SIZE DCA I (COUNT /BOOT LOAD SIZE TAD (BT2STR /START ADDRESS FOR BOOT IMAGE DCA I (STRADR /START ADDRESS DESTINATION JMP CPLDR /XFER LOADER / BOOTSTRAP 3 -- RX02 / / COPY FROM FIELD 7 TO FIELD 0 WHEN RUNNING IN FIELD 7 / AND FIELD 7 IS READ ONLY BOOT3, CDF 00 /FIELD 0 TAD (BT3SRC /START OF BOOT IMAGE DCA I (SRCADR /BOOT LOAD SOURCE TAD (BT3DST /LOAD ADDRESS FOR BOOT IMAGE DCA I (DSTADR /BOOT LOAD DESTINATION TAD (BT3LEN /IMAGE SIZE DCA I (COUNT /BOOT LOAD SIZE TAD (BT3STR /START ADDRESS FOR BOOT IMAGE DCA I (STRADR /START ADDRESS DESTINATION JMP CPLDR /XFER LOADER / COPY LOADER FROM FIELD 7 TO FIELD 0 WHEN RUNNING FIELD 7 / AND FIELD 7 IS READ ONLY CPLDR, TAD ENTRY DCA I (ENTRY TAD ENTRY+1 DCA I (ENTRY+1 TAD ENTRY+2 DCA I (ENTRY+2 TAD ENTRY+3 DCA I (ENTRY+3 TAD ENTRY+4 DCA I (ENTRY+4 TAD ENTRY+5 DCA I (ENTRY+5 TAD ENTRY+6 DCA I (ENTRY+6 TAD ENTRY+7 DCA I (ENTRY+7 TAD ENTRY+10 DCA I (ENTRY+10 TAD ENTRY+11 DCA I (ENTRY+11 TAD ENTRY+12 DCA I (ENTRY+12 TAD ENTRY+13 DCA I (ENTRY+13 RIF /GET CURRENT INSTRUCTION FIELD TAD LOOP /CREATE CDF TO THAT FIELD DCA I (LOOP /SAVE CDF INSTRUCTION IN FIELD 0 STOP /HALT HERE WHEN DEBUGGING OTHERWISE NOP CIF 00 /HERE WE GO JMP I (ENTRY PAGE /ADVANCE TO NEXT PAGE / BOOTSTRAP 0 IMAGE -- BOOT SELECTOR MENU BT0SRC=.-1 /START OF THE IMAGE FOR THE COPY (-1 FOR INDX) BT0DST=.-1 /FIELD 0 LOCATION (-1 FOR INDX) B0S, / LOCAL STORAGE SELCHR, 0 /SELECTION CHARACTER TYPED BT0STR, /START ADDRESS TFL /SET THE PRINTER FLAG JMS I (SCRIBE /PRINT STRING MENU /MENU TO PRINT JMS I (CONGET /GET A CHARACTER AND (0177 /STRIP PARITY DCA SELCHR /SAVE IT TAD SELCHR /GET TYPED CHARACTER JMS I (CONPUT /PRINT IT TAD SELCHR /GET IT BACK TAD (-"0!200 /CHECK FOR < 0 SPA /SKIP IF STILL IN RANGE JMP SELBAD /BAD SELECTION TAD (-4 /CHECK FOR < 3 SMA CLA /SKIP IF STILL IN RANGE JMP SELBAD TAD SELCHR /GET TYPED CHARACTER TAD (-"0!200 /SELECTION NUMBER TAD (MSGBTT /START OF MESSAGE TABLE DCA BT0MSG /SAVE PTR TO MESSAGE PTR TAD I BT0MSG /GET MESSAGE PTR DCA BT0MSG /SAVE INLINE PTR JMS I (SCRIBE /PRINT BOOT MESSAGE BT0MSG, 0 TAD SELCHR /GET TYPED CHARACTER TAD (-"0!200 /SELECTION NUMBER TAD (ORG /ADD IN START OF BOOT TABLE DCA BT0TGT /SAVE BOOT 0 TARGET TAD I (LOOP /GET CDF TO READ-ONLY FIELD AND (0070 /MASK FIELD TAD BT0CIF /MAKE CIF DCA BT0CIF /SAVE IT BT0CIF, CIF 0 /SET THE NEXT INSTRUCTION FIELD JMP I BT0TGT BT0TGT, HLT SELBAD, CLA JMS I (SCRIBE /PRINT ERROR MESSAGE MSGBAD JMP BT0STR /START OVER PAGE /TEXT TO BE USED WITH SCRIBE SHOULD BE EVEN LENGTH /FOR CONTINUATION AND ODD LENGTH TO TERMINATE MENU, TEXT "^PDP-8 BOOT LOADER^% %" TEXT "0 - ^P^RINT THIS MENU%" TEXT "1 - ^TD8/^E ^S^IMPLE ^DEC^TAPE %" TEXT "2 - ^RX8E RX01 F^LOPPY DISK %" TEXT "3 - ^RX28 RX02 F^LOPPY DISK %" TEXT "%0, 1, 2, OR 3? " MSGBAD, TEXT "%%^B^AD SELECTION %%" MSGCRLF,TEXT "%" MSGBT0, TEXT "%" MSGBT1, TEXT "%%^TD8/^E ^B^OOTING...%" MSGBT2, TEXT "%%^RX8E B^OOTING... %" MSGBT3, TEXT "%%^RX28 B^OOTING... %" MSGBTT, MSGBT0 MSGBT1 MSGBT2 MSGBT3 PAGE /CONSOLE I/O CONTMP, 0 /LOCAL TEMPORARY STORAGE CONPTR, 0 /LOCAL BUFFER STRING BUFFER POINTER /CONSTR / POINTER TO STRING IN AC / ONE CHARACTER PER WORD, ZERO TERMINATED CONSTR, 0 DCA CONPTR /SAVE THE STRING POINTER CONST2, TAD I CONPTR /GET THE CHARACTER SNA /CHECK FOR END FLAG JMP I CONSTR /ALL DONE JMS CONPUT /PRINT IT ISZ CONPTR /BUMP POINTER TO NEXT CHARACTER JMP CONST2 /CONTXT / POINTER TO STRING IN AC / TWO CHARACTERS PER WORD, ZERO CHARACTER TERMINATED CONTXT, 0 DCA CONPTR /SAVE THE TEXT POINTER CONTX2, TAD I CONPTR /GET TWO CHARACTERS BSW /GET FIRST CHARACTER IN LOWER BITS AND (0077 /MASK THE CHARACTER SNA /ZERO MARKS THE END JMP I CONTXT /ALL DONE JMS CONPUT /PRINT IT TAD I CONPTR /GET TWO CHARACTERS AGAIN AND (0077 /MASK THE SECOND CHARACTER SNA /ZERO MARKS THE END JMP I CONTXT /ALL DONE JMS CONPUT /PRINT IT ISZ CONPTR /BUMP POINTER TO THE NEXT TWO CHARACTERS JMP CONTX2 /CONPUT / CHARACTER IS IN AC CONPUT, 0 TSF /TEST TTY FLAG JMP .-1 /LOOP UNTIL SET TLS /PRINT IT CLA /TLS DOES NOT CLEAR AC JMP I CONPUT /CONGET / RETURN CHARACTER IN AC CONGET, 0 JMS CONKCK /GET A CHARACTER IF AVAILABLE JMP .-1 /LOOP UNTIL WE GET ONE JMP I CONGET /CONKCK / RETURN A CHARACTER IF ONE IS AVAILABLE / NO-CHAR RETURN IS . / CHAR RETURN IS .+1 CONKCK, 0 KSF JMP I CONKCK /RETURN WITHOUT A CHARACTER KRB /GET THE CHARACTER ISZ CONKCK /BUMP THE RETURN POINTER JMP I CONKCK PAGE /THIS WAS STOLEN FROM K12MIT.PAL / CONSOLE I/O ROUTINES, ETC. / CONSOLE MESSAGE PRINT ROUTINE. / CALLING SEQUENCE: / JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE / MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE / AC CAN BE DIRTY ON CALL. / RETURNS WITH CLEAR AC. / MESSAGE FORMAT: / ALL UPPER-CASE CHARACTERS ARE ALLOWED TO EXIST IN THE MESSAGE EXCEPT '%' AND / '^' WHICH ARE RESERVED. A ZERO HALF-WORD TERMINATES THE MESSAGE STRING. IF / '%' IS DETECTED, A AND WILL BE OUTPUT. IF '^' IS DETECTED, THE / PREVAILING CASE WILL BE REVERSED. INITIAL CASE IS LOWER-CASE. IF 'UPONLY' IS / SET TO 7740, ALL CASE CHANGES ARE IGNORED AND THE OUTPUT IS FORCED TO / UPPER-CASE ONLY. THE MESSAGE ADDRESS MUST BE IN FIELD ONE AND MUST NOT / OVERLAP AREAS RESERVED FOR OTHER PURPOSES (OS/8 RESIDENT AT 17600-17777, USR / LOCATIONS 10000-11777, ETC.). SCRPTR, 0 SCRCASE,0 SCRCHAR,0 SCRIBE, .-. /CONSOLE MESSAGE PRINT ROUTINE CLA /CLEAN UP RSCRENT,TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT DCA SCRPTR /STASH THE POINTER ISZ SCRIBE /BUMP PAST ARGUMENT TAD (140) /LOWER-CASE VALUE DCA SCRCASE /STORE INITIAL CASE VALUE SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE AND (77) /JUST SIX BITS SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD (-"^+100+"%) /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND (40) /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER SCRPRLF,JMS CONPUT /PRINT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,TAD (0015) /GET A JMS CONPUT /PRINT IT TAD (0012) /GET A JMP SCRPRLF /CONTINUE THERE SCRFLIP,CLA TAD SCRCASE /GET CURRENT CASE CIA /100 => -100, 140 => -140 TAD (140+100) /-100 => 140, -140 => 100 DCA SCRCASE /STORE NEW INVERTED CASE JMP I SCRPRNT /RETURN PAGE /BUMP TO THE NEXT PAGE TO FLUSH THE LITERALS B0E, BT0LEN=B0S-B0E /IMAGE LENGTH PAGE /ADVANCE TO THE NEXT PAGE / BOOTSTRAP 1 IMAGE -- TD8/E BT1SRC=.-1 /START OF THE IMAGE FOR THE COPY (-1 FOR INDX) BT1DST=7300-1 /FIELD 0 LOCATION (-1 FOR INDX) BT1STR=7300 /START ADDRESS B1S, 1312 4312 4312 6773 5303 6777 3726 2326 5303 5732 2000 1300 6774 6771 5315 6776 0331 1327 7640 5315 2321 5712 7354 7756 7747 0077 7400 B1E, BT1LEN=B1S-B1E /IMAGE LENGTH / BOOTSTRAP 2 IMAGE -- RX01 BT2SRC=.-1 /START OF THE IMAGE FOR THE COPY (-1 FOR INDX) BT2DST=0024-1 /FIELD 0 LOCATION (-1 FOR INDX) BT2STR=0033 /START ADDRESS B2S, 7126 1060 6751 7201 4053 4053 7104 6755 5054 6754 7450 7610 5046 1060 7041 1061 3060 5024 6751 4053 3002 2050 5047 0000 6753 5033 6752 5453 7024 6030 B2E, BT2LEN=B2S-B2E /IMAGE LENGTH / BOOTSTRAP 3 IMAGE -- RX02 BT3SRC=.-1 /START OF THE IMAGE FOR THE COPY (-1 FOR INDX) BT3DST=0020-1 /FIELD 0 LOCATION (-1 FOR INDX) BT3STR=0033 /START ADDRESS B3S, 1061 1046 0060 3061 7327 1061 6751 7301 4053 4053 7004 6755 5054 6754 7450 5020 1061 6751 1061 0046 1032 3060 0360 4053 3002 2050 5047 0000 6753 5033 6752 5453 0420 0030 B3E, BT3LEN=B3S-B3E /IMAGE LENGTH $