FMTNU STA BUF2A SAVE OCT OR INT FLAG LDA B CHANGE HANDS LDB FMTCH GET LAST CHARACTER? CPB NUMB IS IT A NUMBER OUTPUT? RSS JMP FMTR,I NO RETURN TO CALLER LDB FMTBF YES GET LOCATION FOR NUMBER CLE POSITION FOR UPPER BYTE ISZ BUF2A IS IT OCTAL OR INTEGER JMP *+3 OCTAL JSB O2ASC OCTAL CONVERSION RSS JSB D2ASC INTEGER CONVERSION LDB FMTBF POINT TO NUMBERS JMP FMTR0 OUTPUT THEM * SLASH OCT 57 LAROW OCT 137 NUMB OCT 43 FMTPS NOP FMTCH NOP FMTBF DEF *+1 OCT 0,0,0 SKP * OCTAL TO ASCII CONVERSION * CALL: * * CLE = UPPER OR CCE = LOWER * LDA * LDB * JSB O2AS,I * * * O2ASC NOP ENTER ELB SET-UP BUFFER POINTER STB BUFFR SAVE IT LDB %M6 NUMBER OF ASCII CHARACTERS STB CCNT SAVE COUNT CLB,INB SET MASK FOR FIRST CHARACTER RAL ROTATE IT IN STA D2ASC SAVE RESULT AND B MASK UNWANTED BITS O2AS1 AND %B7 MASK OFF UPPER BITS ADA %B60 ADD ASCII NUMBER JSB A2BUF PUT IT IN THE BUFFER JMP O2ASC,I RETURN IF ALL DONE LDA D2ASC RETRIEVE NUMBER RAL,RAL ROTATE FOR NEXT CHARACTER RAL STA D2ASC JMP O2AS1 AND DO IT * * * THE ABOVE ROUTINE DOES NOT ELIMINATE LEFT ZEROS SKP * DECIMAL TO ASCII CONVERSION * * CALL: * * CLE = UPPER OR CCE = LOWER * LDA * LDB * JSB D2AS,I * * * D2ASC NOP ELB SET-UP BUFFER POINTER STB BUFFR SAVE IT LDB %M6 SET CHR COUNT STB CCNT SAVE IT LDB A SAVE NUMBER SSA IS IT NEGATIVE? CMA,INA YES - MAKE IT POSITIVE STA ASC2N SAVE FOR STORAGE LDA %B40 GET SPACE IF POSITIVE SSB WAS IT? LDA %B55 NO GET MINUS SIGN JSB A2BUF ADD IT TO BUFFER NOP JSB DIV CONVERT NUMBER DEC -10000 OUTPUT 10000 CHARACTER DEC -1000 OUTPUT 1000 CHARACTER %NE2 DEC -100 OUTPUT 100 CHARACTER DEC -10 OUTPUT 10 CHARACTER %M1 DEC -1 OUTPUT 1 CHARACTER * * DIV NOP ENTER LDA ASC2N GET NUMBER CLB ZERO COUNT DIV0 ADA DIV,I SUBTRACT DIVISOR SSA WAS IT LESS THAN DIVISOR? JMP DIV1 YES - THEN OUTPUT IT INB NO - INCREMENT THE COUNT STA ASC2N AND SAVE RESULTS JMP DIV0 DO IT AGAIN DIV1 LDA B ADA %B60 MAKE IT ASCII JSB A2BUF ADD IT TO BUFFER JMP D2ASC,I RETURN IF ALL NUMBERS DONE ISZ DIV MOVE TO NEXT NUMBER JMP DIV+1 DO IT * * THE ABOVE ROUTINE DOES NOT ELIMINATE LEFT ZEROS SKP * ASCII CONVERSION * * CALL: * CLA <=INTEGER CCA=OCTAL * LDB * CLE * JSB AS2N,I * 7 SSA,RSS ? JMP ASC1 YES ADA %B10 NO - RESTORE NUMBER RBL,RBL MOVE NUMBER UP RBL JMP ASC2 * INTCV BLS FORM ADA B BINARY BLS,BLS EQUIVALENT ASC2 ADB A ADD NEW NUMBER JMP ASC0 DO NEXT CHARACTER * ASC1 LDA D2ASC GET NUMBER CCB MOVE BUFFER POINTER BACK 1 ADB BUFFR CHARACTER CLE,ERB SET UPPER OR LOWER JMP ASC2N,I RETURN TO CALLER SKP * SWITCH REGISTER CHECK * SWR NOP ENTER SWITCH REG CHECK LIA SWREG GET EXTERNAL REGISTER AND B MASK OUT UNWANTED BITS SZA,RSS ANY BITS UP ISZ SWR YES RETURN P+2 JMP SWR,I RETURN TO CALLER * * * 1 MILLSEC. TIMER * TMR NOP ENTRY 1 MILLSEC CLOCK CMA,INA NEGATE TIME WANTED LDB TMC GET TIME COUNT INB,SZB IS TIME UP? TMI JMP *-1 NO TRY AGAIN INA,SZA YES IS THERE MORE TIME? JMP *-4 YES DO LOOP GAIN JMP TMR,I RETURN TO CALLER * TMC DEC -252 1 MILSEC. TIME OUT COUNT * * * DEVICE DRIVER ROUTINES * SETUP NOP CMA NEGATE COUNT STA CCNT SAVE FOR USE AS COUNTER RBL MAKE POINTER IN TO BYTE STB BUFFR KEEP IT LDB JBF2A GET STANDARD OUT PUT FRAM BUFFER SSA,RSS IS IT FORMAT STRING? LDB JFM2A YES GET CHR FROM FORMAT ROUTINE STB SLO1 LDA SETUP,I GET OTA FOR CONTROL WORDS ISZ SETUP STA SETOT PUT IT IN PLACE STA SETIN FOR OUTPUT AND INPUT LDA SETUP,I GET LOCATION OF I/O ROUTINE ADA SETUP ISZ SETUP STA AIO JMP SETUP,I AND RETURN * JFM2A JMP FMTC AIO NOP SKP * INPUT TO BUFFER AS REQUIRED * IN NOP LDA IN,I OUTPUT CONTROL WORDS ISZ IN SZA,RSS ANY TO OUTPUT? JMP *+3 NO SETIN NOP YES OUTPUT IT JMP *-5 ISZ CCNT CHECK IF INPUT REQ. WAS ZERO? RSS JMP IN,I YES - EXIT ISZ IN SKIP INTERRUPT INSTRUCTION IN1 JSB AIO,I GET A CHARACTER AND %B177 NO MASK OFF BIT 7 CPA %B177 IS IT A RUBOUT? JMP RBOUT YES CPA %B15 IS IT A CARRIAGE RETURN? JMP IN2 YES JSB A2BUF NO - ADD CHARACTER TO BUFFER RSS RSS BUFFER FULL JMP IN1 LDA COUNT GET INPUT COUNT JMP IN,I RETURN TO CALLER * RBOUT JSB ICRLF DO A RETUEN LINE FEED LDA COUNT RESTORE LDB BUFFA COUNT AND BUFFER JMP CNSLI+1 NOW TRY AGAIN * IN2 LDA CCNT DETERMINE COUNT ADA COUNT JSB ICRLF DO RETURN LINE FEED JMP IN,I RETURN TO CALLER * ICRLF NOP STA SWR SAVE A REG CLA JSB CNSLO LDA SWR RESTORE A REG JMP ICRLF,I SKP * OUT BUFFER TO DEVICE * OUT NOP LDA OUT,I GET CONTROL WORD ISZ OUT SZA,RSS ANY? JMP *+3 NO SETOT NOP YES OUTPUT IT JMP *-5 DO NEXT ONE SLO1 NOP GET A CHATACTER FROM BUFFER OR FMTR JMP SLO2 END OF BUFFER DO CR/LF AND %B177 CPA %B177 WAS IT A RUBOUT? JMP SLO2+1 YES CPA %B15 IS IT A CARRIAGE RETURN? JMP SLO1 YES IGNORE IT CPA %B12 IS IT A LINE FEED? RSS JMP *+3 NO JSB OCRLF YES DO IT JMP SLO1 JSB AIO,I OUTPUT CHARACTER JMP SLO1 NO DO NEXT CHARACTER SLO2 JSB OCRLF NOW OUTPUT CR/LF CLA ISZ OUT JMP OUT,I RETURN TO CALLER * * OUTPUT CARRIAGE RETURN + LINE FEED * OCRLF NOP LDA %B15 GET CARRIAGE RETURN LDB OUT,I CHECK IF STANDARD LF CPB %B12 ? JSB AIO,I OUTPUT IT LDA OUT,I GET LINE FEED COMMAND JSB AIO,I OUTPUT IT LDA %B377 GET RESPONSE TIME JSB TMR GO TO 1 MILLSEC TIMER JMP OCRLF,I RETURN SKP * GET A CHARACTER FROM THE BUFFER INTO A REG. * CALL: * * JSB BUF2A * * * BUF2A NOP LDB BUFFR GET NEXT CHARACTER ADDRESS JSB GETFC GET CHARACTER ISZ BUFFR MOVE BUFFER TO NEXT CHARACTER ISZ CCNT NO COUNT THIS CHARACTER ISZ BUF2A SET GOOD RETURN JMP BUF2A,I * * PUT A CHARACTER IN A REG. INTO BUFFER * CALL: * * LDA * JSB A2BUF * * * A2BUF NOP LDB BUFFR GET BUFFER POINTER JSB PCIB PUT CHARACTER IN BUFFER ISZ BUFFR MOVE TO NEXT CHARACTER ISZ CCNT IS THAT ALL ISZ A2BUF NO JMP A2BUF,I RETURN TO CALLER * * GET A CHARACTER FROM FORMAT STRING * GETFC NOP CLE,ERB ADJUST UPPER/LOWER LDA B,I GET 2 CHARACTERS SEZ,RSS IS IT UPPER OR LOWER ALF,ALF IT'S UPPER AND %B377 MASK UNWANTED BITS JMP GETFC,I RETURN * * PUT A REG. INTO BUFFER * PCIB NOP STA BUF2A SAVE THE CHARACTER SLB,INB GET OPPSITE CHARACTER ADB %M2 JSB GETFC ALF,ALF MOVE INTO UPPER IOR BUF2A ADD NEW CHARACTER SEZ SHOULD IT BE SWAPPED? ALF,ALF YES STA B,I STORE IT JMP PCIB,I RETURN TO CALLER SKP * CONSTANTS AND STORAGE * %B2 OCT 2 %B7 OCT 7 %B10 OCT 10 %B12 OCT 12 %B15 OCT 15 %B40 OCT 40 %B55 OCT 55 %B60 OCT 60 %B121 OCT 121 %B126 OCT 126 %B177 OCT 177 %B377 OCT 377 %M2 OCT -2 %M6 OCT -6 %M10 OCT -10 %M60 OCT -60 %M72 OCT -72 %BT15 OCT 100000 * H77LD LDA 120B REPLACE HLT 77B WITH JSB * LDSN NOP LDSNX NOP LDBP NOP LDBPS NOP * COUNT NOP INITIAL BUFFER COUNT CCNT NOP WORKING BUFFER COUNT BUFFA NOP INITIAL BUFFER ADDRESS BUFFR NOP WORKING ADDRESS POINTER SKP * PROGRAM LOADER SECTION * * INITIAL START IS FROM 120B * A-REG = SERIAL NUMBER DESIRED * = 0 = LOAD NEXT CONSECUTIVE PROGRAM * * B-REG = BIT PATTERN FOR SERIAL EXECUTION (SET =RUN IT) * * AT COMPLETION OF THE LOAD * THE A-REG. IS SET TO THE CURRENT DSN. * IF RUN IS PRESSED THE PROGRAM DOES A JMP 100B. * LOAD NOP ENTRY FOR START OR CONTINUATION CLC INTP,C TURN ALL OFF STA CCNT SAVE A-REG LDA LOAD CPA %B121 IS THIS A RESTART JMP LOADP YES * LOADS LDB LDBP NO - ANY MORE SZB FOR SERIAL EXECUTION JMP LOADX LDB LDBPS GET ORIGINAL SELECTION STB LDBP LDA LDSN GET SERIAL NUMBER SZA,RSS JMP HLT77-1 DONT LOOP JMP LODRW REWIND DEVICE LOADX CLA READ NEXT CONSECUTIVE PROGRAM LDB H77LD REPLACE HLT 77B INSTRUCTION JSB LOADB OTA SWREG CLEAR S-REG. LDB LDBP CHECK TO EXECUTE IT CLE,ERB STB LDBP SEZ ?? JMP 100B EXECUTE THE PROGRAM JMP LOADS NO MOVE TO NEXT ONE * LOADP LDA CCNT RESTORE A-REG STA LDSN SAVE IT STB LDBPS SAVE BIT PATTERN STB LDBP LODRW CCB GET REWIND (SKIP 1 FILE) SZA REWIND? JSB DRI,I YES LDA LDSN RESTORE SERIAL NUMBER LDB LDBPS SERIAL EXECUTION? SZB ? JMP LOADX+1 YES DO IT JSB LOADB LOAD AN ABS FILE OTA SWREG CLEAR S-REG. LDA DSN GET CURRENT SERIAL NUMBER HLT77 HLT 77B LOAD OK JMP 100B YES START EXECUTION SKP LOADB NOP STA LDSNX SAVE REQUEST STB LDRXX SET INSTRUCTION FOR HLT 77B CLB,INB,RSS DON'T CHECK FOR EOT LDRR LDB %B2 LOOK FOR END OF TAPE JSB LDVR READ FIRST RECORD SZA,RSS EOF? JMP LOADB,I YES NORMAL RETURN SSA,RSS EOT? JMP *+5 LDA LDSN RESTORE ORIGINAL A AND B REG. LDB LDBPS OCT 106070 WAIT FOR OPERATOR JMP 120B START ALL OVER ALF,ALF RETURN IS A = COUNT CMA,INA MAKE IT NEGATIVE STA CCNT SAVE COUNT CLB JSB LDVR READ ADDRESS STA BUFFA THIS WORD IS THE STORE ADDRESS STA COUNT INITIALIZE CHECKSUM LDRL CLB JSB LDVR READ A WORD STA BUFFR SAVE WORD ADA COUNT ADD WORD STA COUNT TO CHECKSUM LDA BUFFA GET CURRENT ADDRESS LDB LDSNX GET SERIAL NUMBER SZB,RSS JMP *+7 NO DSN SKIP CHECK CPA %B126 IS THIS ADDRESS 126B CPB BUFFR YES IS IT THIS DSN? JMP *+4 YES LDRFF LDB %M2 NO GET FILE FORWARD JSB LDVR JMP LDRR-1 START READING AGAIN CMA,INA IS THE ADDRESS IN THE ADA LDMXA PROTECTED AREA SSA,RSS ? JMP *+3 HLT 55B JMP LDRFF YES - TRY NEXT FILE LDA BUFFR GET CONTENTS FOR MEMORY CPA HLT77 CHECK FOR HLT LDRXX NOP YES REPLACE WITH LDA JSB 107B,I INST STA BUFFA,I PUT IT IN MEMORY ISZ BUFFA MOVE TO NEXT LOCATION ISZ CCNT IS THAT ALL? JMP LDRL NO CLB JSB LDVR READ CHECKSUM FROM FILE CPA COUNT DOES CHECKSUM AGREE? JMP LDRR READ NEXT RECORD HLT 11B TELL OPERATOR OF CHECKSUM ERROR JMP LDRR READ NEXT RECORD SKP * CONSOLE OUTPUT AND INPUT AND LINE PRINTER OUTPUT * CNSLO NOP OCT 0,0,0,0,0,0,0,0,0,0 OCT 0,0,0,0,0,0,0,0,0,0 CNSLI NOP OCT 0,0,0,0,0,0,0,0,0,0,0 OCT 0,0,0,0,0,0,0,0,0,0,0,0 LNPTR NOP OCT 0,0,0,0,0,0,0,0,0,0 OCT 0,0,0,0,0,0,0,0,0,0 * * LOADER DRIVER (DIAGNOSTIC INPUT DEVICE * * B = +1 READ TO FIRST RECORD * A = 0 NEXT FILE * A = # SERIAL NUMBER OF FILE * B = +2 READ NEXT RECORD * B = 0 READ A WORD OF THE RECORD * B = -1 REWIND AND FILE FORWARD * B = -2 REWIND ONLY * B = -3 FILE FORWARD ONLY * LDVR NOP * * RETURN * A = 0 END OF FILE * A = -1 END OF TAPE (FILES) * A = +# RECORD COUNT * * REP 246B OCT 106075 MEMORY HALT SKP BFR EQU BUFFR-6000B BFA EQU BUFFA-6000B CNT EQU CCNT-6000B COT EQU COUNT-6000B ISZ EQU 36000B LDA EQU 62000B LDB EQU 66000B ADA EQU 42000B ADB EQU 46000B STA EQU 72000B STB EQU 76000B AND EQU 12000B IOR EQU 32000B XOR EQU 22000B CPA EQU 52000B CPB EQU 56000B JSB EQU 16000B JMP EQU 26000B SETP EQU SETUP-6000B .IN EQU IN-6000B .OUT EQU OUT-6000B CSLI EQU CNSLI-6000B CSLO EQU CNSLO-6000B LPTR EQU LNPTR-6000B LD EQU LDVR-6000B PTMA EQU 7677B-LDVR-PTDMA-1 IF ANY OF THESE GO MGMA EQU 7677B-LDVR-MGBF-60 NEGATIVE -THE ALLOWED DSMA EQU 7677B-LDVR-DSDMC AREA HAS BEEN EXCEEDED DFMA EQU 7677B-LDVR-DFDMC AND MUST BE CORRECTED CTMA EQU 7677B-LDVR-CTCW3 * END