HED PCOP,ERROR,B11CK,SWR,PRINT,PRNT1,FPRNT,CNVRT,TTYCK * PCOP NOP ROUTINE TO PRINT COPR LDA COPRN JMP PCOPI,I * * ERROR * REPORT ERROR MESSAGES * USES SIOLO,SWR,B11CK * THE RETURN ADDRESS IS USED TO LOOK UP THE ADDRESS,LENGTH AND * NUMBER OF THE ERROR MESSAGE * ERROR NOP CLF 0 DISABLE INTERRUPTS CCB ADB ERROR LDA EFER,I FIND ERROR NUMBER BASED ON RETRN ER2 EQU * CPB A,I ADDRESS AND TABLE JMP ER1 FOUND IT INA CPA ELER,I JMP 1777B PROGRAM ERROR,PAGE 0 MAY BE * WIPED OUT. JMP ER2 ER1 EQU * ADA EFERC,I ADA MM1 STA ELOC JSB FPRNT PRINT MESSAGE LDB ELOC ADB MM8 -8 SSB SKIP IF ERROR NUMBER GTR THAN 7 JSB ERHTI,I CHECK FOR HALT JMP ERROR,I * * B11CK * IF TTY SUPPRESSED,RETURN * IF TTY NOT SUPPRESSED,SKIP NEXT INSTRUCTION ON RETURN * USES SWR * B11CK NOP JSB SWR AND BIT11 SZA,RSS IS TTY SUPPRESSED? ISZ B11CK NO JMP B11CK,I * * SWR * INPUT SWITCH REGISTER TO A-REGISTER * SWR NOP LIA 1 IOR ISR CAPTURE ALL SWITCHES STA ISR WHICH ARE SET LIA 1 JMP SWR,I * * PRINT * A = ERROR NUMBER * PRINT NOP JSB PRNT1 GET ADDRESS AND LENGTH JMP PRINT,I TTY SUPPRESSED JSB SIOLO,I OUTPUT MESSAGE JMP PRINT,I * * PRNT1 * EXITS WITH B=MESSAGE ADDRESS * A=MESSAGE LENGTH * PRNT1 NOP STA PSAVE JSB B11CK JMP PRNT1,I ISZ PRNT1 LDB PSAVE ADB PFMI,I MESSAGE ADDRESS LDB B,I STB PSAVE SAVE ADDRESS CLA STA LOCAL LENGTH COUNTER * * SCAN MESSAGE UNTIL # * PLOOP EQU * LDA B,I NEXT TWO CHARACTERS CPA C1440 21440B = #,BLANK? JMP L1 YES AND B377 NO CPA B43 =#? JMP L2 YES ISZ LOCAL NO ISZ LOCAL ISZ B JMP PLOOP L2 EQU * ISZ LOCAL L1 EQU * LDB PSAVE ADDRESS LDA LOCAL LENGTH JMP PRNT1,I RETURN * * * FPRNT * OUTPUT TO FAST DEVICE IF CONFIGURED * FPRNT NOP LDB 113B IS FAST DEVICE SZB CONFIGURED? JMP FPR1 YES JSB PRINT OUTPUT TO SLOW DEVICE JMP FPRNT,I FPR1 EQU * JSB PRNT1 GET MESSAGE AND LENGTH JMP FPRNT,I TTY SUPPRESSED JSB SIOFO,I JMP FPRNT,I * * * CNVRT CLEARS E AND CALLS O2ASC * CNVRT NOP CLE JSB O2ASC,I JMP CNVRT,I * * TTYCK * RETURN IF TTY NOT AVAILABLE FOR NON-ERROR MESSAGES * INCREMENT RETURN ADDRESS IF PRINTOUT OK * TTYCK NOP JSB SWR LOAD SWITCH REGISTER AND B6000 SZA,RSS IS TTY AVAILABLE? ISZ TTYCK YES JMP TTYCK,I RETURN HED DECIN,DCIN1,DCIN2,SWR4 * * DECIN * CONVERTS DECIMAL INTEGERS TO ASCII * A=VALUE ON INPUT * CVT1 = MIDDLE TWO DIGITS ON EXIT * CVT2 = LAST TWO DIGITS ON EXIT * DECIN NOP CLE LDB CVT TEMPORARY STORAGE BUFFER JSB I2ASC,I JMP DECIN,I * * * DCIN1 * STORE ONE WORD OF CONVERTED A AT B * DCIN1 NOP STB LOCAL SAVE POINTER JSB DECIN CONVERT TO ASCII LDA CVT2 STORE STA LOCAL,I INTO MESSAGE JMP DCIN1,I * * DCIN2 * STORE TWO WORDS OF CONVERTED A STARTING AT B * DCIN2 NOP STB LOCAL SAVE POINTER JSB DECIN CONVERT TO ASCII LDA CVT1 STORE LDB LOCAL TWO STA B,I WORDS INB INTO LDA CVT2 MESSAGE STA B,I JMP DCIN2,I * * * SWR4 * INPUT SWITCH REGISTER IF SFLAG = 0 (S1,S2,S3) * USE STORED VERSION IF SFLAG = 1 (S4,S5) * SWR4 NOP LDA SFLAG IS FLAG = O? SZA JMP SWR4A NO JSB SWR YES,USE SWITCH REGISTER JMP SWR4,I SWR4A LDA S400 USE ADA UNIT STORED LDA A,I VALUE JMP SWR4,I HED DCHK,WCHK * * * THE DCHK ROUTINE IS CALLED AFTER A READ. * IT COMPARES THE READ AND WRITE BUFFERS. * * THE WCHK ROUTINE IS CALLED AFTER A WRITE. * IT CHECKS ONLY THE STATUS. * THE WRERX AND WRERZ ENTRIES ARE USED BY THE * OTHER ROUTINES TO DO THEIR STATUS CHECK. * * * THE PCHK ROUTINE IS CALLED AFTER A READ. * IT COMPARES THE READ BUFFER TO A PATTERN WORD. * * THE RCHK ROUTINE IS CALLED AFTER A READ. * IT CHECKS THE CHECKSUMMED SECTOR IN * THE READ BUFFER. * * THEY COMPARE THE CURRENT STATUS ( STAUS ) WITH THE * PREDICTED STATUS ( SHTAS ) BY CALLING THE ERRAN ROUTINE. * * * THE ROUTINES GIVE A NORMAL RETURN IF NO ERRORS ARE * DETECTED. IF AN ERROR OCCURS, THE ROUTINES GENERATE AN * ERROR MESSAGE AND CHECK FOR HALT OR CONTINUE. * * DCHK NOP TO CHECK FOR ERRORS IN * READ AND TO COMPARE READ * AND WRITE BUFFERS LDA DCHK LOAD RETURN ADDRESS STA WCHK SAVE FOR POSSIBLE CALL * * * COMPARES THE BUFAD AND BUFAE BUFFERS USING WCNT * FOR BUFFER LENGTH. * * LDA BUFAD LOAD FIRST BUFFER ADDRESS STA TEMP1 LDA BUFAE LOAD SECOND BUFFER ADDRESS STA TEMP2 LDA WCNT CMA,INA STA TEMP3 SET ISZ COUNTER DCM EQU * LDA TEMP1,I CPA TEMP2,I JMP DCL EQUAL COMPARE * LDA TEMP3 ADA WCNT GENERATE RELATIVE LOCATION EE101 LDB P047A LOAD POINTER JSB DCIN2 CALL CONVERT ROUTINE LDA TEMP1,I LOAD WHAT WORD SHOULD BE LDB P047C LOAD POINTER JSB CNVRT CALL CONVERT AND MOVE ROUTINE LDA TEMP2,I LOAD WHAT WORD ACTUALLY WAS LDB P047B LOAD POINTER JSB CNVRT CONVERT TO ASCII LDA NUMP DECREMENT ADA MM1 PRINTOUT COUNT SZA,RSS JMP DCLA IF 1 LEAVE AT 1 AND EXIT STA NUMP E47 JSB ERROR DATA WORD XXXX IS YYYYYY SHOULD * BE ZZZZZZ JMP DCL DCLA EQU * LDB B47 DATA WORD XXXX IS YYYYYY SHOULD * BE ZZZZZZ STB ELOC SAVE FOR ERHLT STB STRF JMP WRERZ GO ANALYZE ERRORS * * DCL EQU * ISZ TEMP1 COUNT UP BUFFER ISZ TEMP2 ADDRESSES AND ISZ TEMP3 CHECK FOR COMPLETION JMP DCM JMP WRERX BUFFERS OKAY, NORMAL STATUS CHECK SKP * * WCHK NOP TO CHECK FOR ERRORS ON * NON-READ OPERATIONS WRERX EQU * JSB ERRAN CALL ERROR COMPARITOR SZA SKIP IF NO ERROR JMP WRERZ REPORT ERROR LDA DMRF CHECK FOR DMA NOT FINISHED SZA,RSS SKIP IF ERROR JMP WOUT RETURN IF NO TROUBLE JSB PCOP PRINT CURRENT OPERATION MESSAGE JSB DMERQ PRINT DMA ERROR MESSAGE WROUT JSB ADDOI,I WOUT JMP WCHK,I RETURN * * WRERZ EQU * JSB PCOP PRINT CURRENT OPERATION MESSAGE JSB DMERQ CHECK FOR DMA ERROR JSB ERRAN CHECK FOR STATUS ERRORS SZA SKIP IF STATUS OKAY JSB FPRNT PRINT OUT ERROR MESSAGE LDA STRF CHECK FOR BUFFER ERRORS SZA SKIP IF NO SUCH ERRORS JSB FPRNT PRINT OUT ERROR MESSAGE CLB STB STRF CLEAR OUT POINTER WORD JMP WROUT HED ERRAN ERRAN NOP ROUTINE TO PERFORM ERROR ANAL. LDA STAUS XOR SHTAS IS ALL AS SHOULD BE SZA,RSS JMP ERRAN,I EVERYTHING IS FINE LDA STAUS LOAD CURRENT STATUS LDB P064A AND ADDRESS FOR ASCII JSB CNVRT CONVERT TO OCTAL AND MOVE LDA SHTAS LOAD WHAT STATUS SHOULD BE LDB P064B AND ADDRESS FOR ASCII JSB CNVRT CONVERT TO OCTAL AND MOVE E64 LDA B64 STATUS IS XXXXXX SHOULD BE XXXXXX STA ELOC SAVE FOR ERHLT * A MUST BE NON-ZERO AT THIS POINT JMP ERRAN,I RETURN HED DGEN,RFNE,CYCK,DMRFC,ENDST * DGEN * THIS ROUTINE FILLS UP THE BUFFER WITH RAW RANDOM DATA * USES WCNT AS A LENGTH * USES BUFAD FOR ADDRESS * * DGEN NOP LDA WCNT CMA,INA STA TEMP1 NEGATIVE WORD COUNT LDA BUFAD STA TEMP2 DGL EQU * JSB RAND GET RANDOM NUMBER STA TEMP2,I ISZ TEMP2 COUNT UP ADDRESS ISZ TEMP1 COUNT JMP DGL JMP DGEN,I * * RFNE * ISSUE REFINE COMMAND * RFNE NOP LDB B60 SET UP CURRENT OPERATION LDA RFINE REFINE COMMAND JSB COMMD ISSUE COMMAND JSB WAITS WAIT FOR COMPLETION JMP RFNE,I RETURN * * CYCK * ISSUE CYCLIC CHECK COMMAND * CYCK NOP LDB B22 SET UP CURRENT OPERATION JSB DADO A = NUMBER OF SECTORS ON ENTRY LDA CYCHK CYCLIC CHECK COMMAND JSB COMMD ISSUE COMMAND JSB WAITS WAIT FOR COMPLETION JMP CYCK,I RETURN * * DMRFC * REMOVE BIT 15 FROM DMRF * DMRFC NOP LDA DMRF AND H7777 =77777B STA DMRF JMP DMRFC,I * * ENDST * END OF STEP ROUTINE * ENDST NOP JSB SWR GET SWITCH REGISTER SSA HLT 4 HALT IF BIT 15 SET JSB SWR GET FRESH COPY OF SWITCH REG. AND BIT1 SZA JMP END1 SKIP JSB SWR AND BIT13 SZA,RSS JMP ENDST,I JMP COPR,I LOOP IF BIT 13 SET END1 EQU * LDA STEPN INCREMENT CPA D51 S4BUG RSS FOR STEPS CPA D52 51 AND ISZ S4BUG 52 JMP SKIPI,I HED DMR,DMW,DMALL * * * THESE ROUTINES SET UP DMA AND START THE DATA CHANNEL. * * THE DMR ROUTINE SETS UP A READ INTO THE INPUT * BUFFER ( ADDRESS IN BUFAE, COUNT IN WCNT ) * * THE DMW ROUTINE SETS UP A WRITE FROM THE OUTPUT * BUFFER ( ADDRESS IN BUFAD, COUNT IN WCNT ) * * DMR NOP SET UP DMA READ OPERATION JMP DMRI,I DMRI DEF DMRR * * DMW NOP JMP DMWI,I DMWI DEF DMWW * DMALL NOP (A = MEMORY ADDRESS) LDB DMACW LOAD DMA COMMAND WORD DM6A OTB DMAD SEND TO DATA CHANNEL DM2A CLC DMAC PREPARE TO LOAD ADDRESS DM2B OTA DMAC OUTPUT MEMORY ADDRESS DM2C STC DMAC PREPARE TO LOAD COUNT LDA WCNT AND CMA,INA OUTPUT TWOS COMPLEMENT OF DM2D OTA DMAC WORD COUNT JMP DMALL,I HED READ,WRITE * * * READ AND WRITE * * THESE ROUTINES ARE CALLED TO INITIALIZE ALL * DMA TRANSFERS TO AND FROM THE DISK. * * THEY ASSUME THAT * THE WORD COUNT IS IN WCNT * READ ASSUMES BUFFER ADDRESS IN BUFAE * WRITE ASSUMES BUFFER ADDRESS IN BUFAD * * READ NOP JSB DMR SET UP DMA READ OPERATION LDB B46 SET UP CURRENT OPERATION LDA READC LOAD READ COMMAND JSB COMMD OUTPUT COMMAND JSB DMAT JSB STAT GET STATUS JMP READ,I RETURN * * * WRITE NOP JSB DMW SET UP DMA WRITE OPERATION LDB B45 SET UP CURRENT OPERATION LDA WRITC LOAD WRITE COMMAND JSB COMMD OUTPUT COMMAND JSB DMAT JSB STAT GET STATUS JMP WRITE,I HED DMAT * * * * THIS SECTION SHOULD BE CALLED FOR EACH TRANSFER USING THE * DMA. IT CONTINUOUSLY CHECKS FOR THE FLAG TO BE SET ON THE * COMMAND CHANNEL WHILE MONITORING THE DATA TRANSFER AND * CHECKING FOR OVERTIME. * * * DMAT NOP LDA MM650 ALLOW 650 MSEC WORST CASE STA LCNT SET EXTRA CLOCK LDA DMSP WILL THIS DMA TRANSFER SZA,RSS BE INTERRUPTED? JMP DMSL NO DM2I LIA DMAC LOAD CURRENT WORD COUNT STA TEMP1 AND SAVE IT FOR COMPARISON LDB BIT15 ALLOWS LOTS OF TIME DMBL EQU * INB SZB,RSS WAITED LONG ENOUGH? JMP DMSP YES DM2J LIA DMAC LOAD CURRENT WORD COUNT CPA TEMP1 CHECK FOR START OF OPERATION JMP DMBL IF OPERATION HAS NOT STARTED DATA * * THIS LOCATION IS USED BY ROUTINES THAT * MUST INTERRUPT THE DMA TRANSFER. DMSP NOP *** * DMSL EQU * RUNS AROUND CHECKING FOR END * OF OPERATION FLAG. * TIMES OUT WHEN LCNT GOES POSITIVE CLA,INA JSB TMR,I DELAY FOR ONE MSEC ISZ LCNT CLA,RSS JMP TOUT TIME OUT CC04 SFS CC JMP DMSL NO FLAG YET. DM6G SFC DMAD SKIP IF DMA NOT DONE JMP DMAT,I EVERYTHING IS ALRIGHT JMP FTCX CALL WORD COUNT CONVERTER * TOUT EQU * CLA,INA DM6H SFS DMAD CHECK FOR FLAG ON DMA CHANNEL FTCX EQU * IOR BIT15 TRANSFER NOT COMPLETE BIT STA DMRF SAVE FOR LATER CHECK JSB MC TROUBLE. BOMB OUT CARDS DM2K LIA DMAC LOAD CURRENT WORD COUNT SZA,RSS RESIDUE = 0? JMP DMATA YES-DISABLE E13,CHECK FOR E43 ADA WCNT MAKE INTO POSITIVE WORD COUNT AND B7777 MASK OFF UPPER THREE BITS LDB P013A LOAD POINTER FOR ASCII STORE JSB DCIN2 CALL CONVERT ROUTINE JMP DMAT,I RETURN AND WAIT FOR VERDICT DMATA EQU * LDA DMRF SSA XOR PALT =130000B - BIT 15 OFF,BIT 13 ON STA DMRF JMP DMAT,I * * MC NOP MASTER CLEAR DM6E CLC DMAD DM6F STF DMAD KILL DMA TRANSFER CC06 CLC CC DC11 CLC DC DC22 STF DC JMP MC,I * * DMERQ NOP LDB DMRF CHECK FOR ACTUAL ERROR SZB,RSS SKIP IF ERROR CONDITION EXISTS JMP DMERQ,I EXIT IF NO ERROR SLB SKIP IF NOT TIME OUT E14 JSB ERROR NO COMMAND FLAG ON DMA OPERATION LDB DMRF RBL,RBL SSB SKIP IF BIT 13 = 0 E43 JSB ERROR DMA MISSING LDB DMRF CLA STA DMRF CLEAR ERROR INDICATOR SSB,RSS SKIP IF DMA FLAG WAS NOT SET JMP DMERQ,I RETURN * LDA WCNT LOAD THE EXPECTED WORD COUNT LDB P013B LOAD POINTER FOR ASCII STORE JSB DCIN2 CALL CONVERT ROUTINE E13 JSB ERROR XXXX WORDS TRANSFERRED YYYY * EXPECTED JMP DMERQ,I RETURN HED CHAR,DCHAR,OCHAR,HIN,H31 * * * CHAR * GET NEXT NON-BLANK CHARACTER * WONT SKIP IF BUFFER EMPTY * CHAR NOP CHAR1 ISZ CCNT DONE? PPT3 RSS NO JMP CHAR,I YES LDA BPTRA,I TTY WORD ISZ IFRST JMP SEC ALF,ALF USE LEFT HALF JMP COUT SEC CCB USE RIGHT HALF STB IFRST ISZ BPTRA BUMP WORD POINTER COUT AND B377 STA CCHAR SAVE IT XOR B40 IS IT BLANK SZA,RSS SKIP IF NO JMP CHAR1 IGNORE BLANKS LDA CCHAR ISZ CHAR JMP CHAR,I * * * DCHAR * GET DECIMAL VALUE * SKIPS ON EXIT IF NOT DONE * DCHAR NOP LDA MM58 UPPER LIMIT LDB VAL POINTS TO VALUE DCHR1 STA VAL2 STB VAL1 LDA MM1 STA DFLT DFLT = -1 CLA INITIALIZE TO ZERO DCHR2 STA VALUE STORE VALUE JSB CHAR GET NEXT CHARACTER JMP DOUT2 DONE XOR B54 IS CHARACTER SZA,RSS A COMMA JMP DOUT1 YES,DONE LDA VAL2 CHECK ADA CCHAR VALIDITY SSA OF JMP *+3 CHARACTER CCERR JSB H31 BAD INPUT JMP DOUT2 LDA CCHAR ADA MM48 LOWER LIMIT SSA JMP CCERR STA DFLT DFLT # -1 LDB VALUE OK,BUILD BLF,RBR UP ADB VAL1,I VALUE ADB VAL1,I ADA B JMP DCHR2 CONTINUE DOUT1 ISZ DCHAR NORMAL EXIT DOUT2 LDA VALUE ERROR OR END OF READ BUFFER JMP DCHAR,I * * * OCHAR * GET OCTAL VALUE * SKIPS ON EXIT IF NOT DONE * OCHAR NOP LDA OCHAR STA DCHAR SET RETURN LDA MM56 UPPER LIMIT LDB DDD POINTS TO D0 JMP DCHR1 * * * HIN * INPUT FROM TTY * HIN NOP LDA D72 CHARACTER COUNT LDB BINA BUFFER ADDRESS JSB 104B,I TTY INPUT DRIVER SZA,RSS WERE ZERO WORDS INPUT? JMP HIN+1 YES,TRY AGAIN CMA STA CCNT SAVE CHARACTER COUNT CCA STA IFRST FLAG = -1 LDA BINA STA BPTRA SET POINTER JMP HIN,I BINA DEF BUFB * * H31 NOP LDA B31 BAD INPUT JSB PRINT JMP H31,I * HED OVJ,ASK OVIJS JMP OVJ OVJ EQU * LDA C0001 OVBIT+AEBIT 020001 STA SHTAS WHAT STATUS SHOULD BE CLA STA DMSP SET BACK TO NO-OP LDA M256 ALLOW A SHORT WAIT FOR THE FLAG OVJR EQU * SSA,INA,RSS DON'T HANG FOREVER JMP OVJX PRETEND FLAG SET DM6I SFS DMAD SKIP WHEN DMA DONE JMP OVJR BACK IF NOT DONE JSB DADO OUTPUT ONE EXTRA WORD . . . LATE OVJX EQU * JMP DMSL * * ASK * ASK OPERATOR IF HE WISHES TO CHANGE TABLE * ASK NOP H25 LDA B25 DO YOU WISH TO CHANGE TABLE? JSB PRINT JSB HIN INPUT FROM KEYBOARD LDA BINA,I INPUT BUFFER AND P7400 XOR NN =47000B IS FIRST CHARACTER N? SZA,RSS SKIP IF NO JMP ASK,I XOR YY =13400B IS FIRST CHARACTER Y? SZA JMP H25 TRY AGAIN ISZ ASK JMP ASK,I ORG 1777B DONE NOP ALLOW JUMP FROM ANY PAGE