STA ?DBUF,I * *** GET TIME * ?I5 JSB CRLND LDA ZTI4 OUTPUT MESSAGE: LDB ZTA4 "TIME?" JSB ZLOT LDA .6 INPUT RESPONSE LDB PTBA? AND STORE IN JSB ZLIN TIME BUFFER CPA .4 4 CHARS INPUT? RSS YES - INPUT O.K. JMP ?I5 NO - TRY AGAIN LDA .2 CONVERT LDB PTBA? TO JSB DVERT BINARY JMP ?I5 INVALID INPUT STA HR?,I SAVE HOURS COUNT ADA M25 SSA,RSS HOURS>24? JMP ?I5 YES-REJECT LDA .2 CONVERT LDB PTBA? INPUT INB TO JSB DVERT BINARY JMP ?I5 INVALID INPUT STA MNTS?,I STORE MINUTES ADA ZM61 MINUTES >60? SSA,RSS JMP ?I5 YES-REJECT JSB CRLND * *** TIME SHARE BASIC INITIALIZATION SECTION * LDB &&USR,I GET -# USERS STB ?CT,I SAVE AS COUNTER CLB,INB SET TEMPS STB USN TO FIRST STB ?USNT,I USER * ?LP1 LDA ?ON LOAD LINK TO -ON- ROUTINE LDB BSTK5 LOAD LINKAGE TABLE BASE ADDRESS ADB USN INDEX BY USER # LDB B,I LOAD DESTINATION ADDRESS STA B,I STORE LINK IN WRITE RETURN * LDA M15 SET DATA FLAG LDB BSTK4 LOAD DATA FLAG TABLE BASE ADR ADB USN INDEX BY USER # LDB B,I LOAD DATA FLAG ADR IN (B) STA B,I SET DATA FLAG * *** INITIALIZE USER STACKS * LDA BSTK6 LOAD STACK NAME BASE ADDRESS ADA USN INDEX BY USER # LDA A,I LOAD USER STACK NAME LDA A,I LDB ASTK LOAD ADDR OF ACTIVE STACK JSB ?MOVE,I MOVE 5 ELEMENTS STACK OCT 5 * LDA LWAM ADA M72 STA .BUFA STA SYMTA ADA D97 STA SBUFA ADA M1 STA LWAM LDA FWAM LOAD FIRST WORD STA PBUFF INITIALIZE PROGRAM BUFFR STA PBPTR INITIALIZE PROG POINTR LDA .32 LOAD OCT 40 STA BLANK INITIALIZE BLANK CHARACTER CLA STA .LNUM SET LINE NUMBER =0 LDB BSTK6 LOAD STACK NAME BASE ADDRESS ADB USN INDEX BY USER NAME LDB B,I LOAD USER STACK NAME LDB B,I JSB ?MOUT,I MOVE ACTIVATED STACK OUT * * * ISZ USN INDEX TO NEXT ISZ ?USNT,I USER. ISZ ?CT,I LAST USER? JMP ?LP1 NO-PROCESS NEXT USER * * *** SET RUBOUTS INTO TTYS AND CLC * CLC 0 CLEAR PREPARE SYSTEM TTY SRITB LDB RBOUT LOAD RUBOUT CHAR NOP (OTB LOG TTY) NOP (OTB USER # 1) NOP (OTB USER # 2) NOP (OTB USER # 3) NOP (OTB USER # 4) CLA SET SECONDS ELAPSED STA SEKS?,I TIME TO ZERO CCA SET FLAG1 TO -1 STA ?FL1,I LDA &&USR,I SET LAST ACTIVATED USER # IN USN CMA,INA STA USN ZCLCZ NOP (CLC LOG TTY) NOP (CLC USER # 1) NOP (CLC USER # 2) NOP (CLC USER # 3) NOP (CLC USER # 4) LDA .4 CL1 OTA 0 INITIATE TIME-BASE STC PFL INITIATE POWER FAIL CL2 STC 0,C GENERATOR STF 0 TURN ON INTERRUPT JMP ?ON,I GO TO LOG-ON SECTION * *** SUBROUTINE TO CONVERT ASCII NUMBERS TO DECIMAL * * *** NON-INTERRUPT TTY DRIVER FOR PREPARE TIME-SHARE * ZLOT NOP SUBROUTINE TO OUTPUT A RECORD STA ZL1 SAVE LENGTH STB ZA1 SAVE ADDRESS LDB OT.FL LOAD OUTPUT COMMAND ZX1 OTB 0 SET TTY TO OUTPUT MODE SZA,RSS ZERO CHAR? JMP CR.LF YES-GIVE CARRIAGE RETURN-LF SSA,RSS CHECK IF COUNT NEGATIVE CMA,INA NO-MAKE IT NEGATIVE STA ZCT1 STORE NEGATIVE COUNT LDB ZULFL LOAD UPPER / LOWER FLAG * C..C LDA ZA1,I GET WORD FROM BUFFER RBL ROTATE AND SLB TEST FLAG ISZ ZA1 INDEX TO NEXT WORD SLB,RSS LOAD CORRECT CHARACTER ALF,ALF UPPER / ROTATE TO LOWER AND M177 GET SINGLE CHAR IOR M200 ADD PARITY BIT JSB ZXLOT ISZ ZCT1 LAST CHARACTER? JMP C..C NO-GET NEXT TO OUTPUT * *** CHECK IF CR-LF * LDA ZL1 CHECK ORIGINAL COUNTER SSA JMP ZLOT,I NEGATIVE - RETURN CR.LF LDA ZCRET POSITIVE - CR-LF JSB ZXLOT LDA ZLNFD LOAD LF JSB ZXLOT JMP ZLOT,I RETURN * *** SUBROUTINE TO INPUT A RECORD * ZLIN NOP CMA,INA MAKE COUNT NEGATIVE STA ZCT1 SAVE COUNTER STA ZCT2 SAVE FOR RESET STB ZA1 SAVE ADDRESS STB ZA2 SAVE FOR RESET * CLB CLEAR TRUE COUNTER STB ZL2 * ZNXTC JSB ZXLIN SZA,RSS SKIP IF NOT NULL CHAR JMP ZNXTC CPA ZLNFD JMP ZNXTC CPA ZCRET CR? JMP ZZDNE YES - GO TO END SECTION CPA ZESCP ESC CHAR? JMP ZDEL YES-DELETE LINE CPA ZMODE ALT MODE ? JMP ZDEL YES - DELETE LINE LDB ZCT1 LOAD NEGATIVE COUNT INB,SZB SKIP IF B IS POSITIVE SSB CHAR IS NEG OR ZERO -OK RSS IGNORE AND GO FOR NEXT CHAR JMP ZNXTC STB ZCT1 RESTORE COUNT LDB ZL2 LOAD POSITIVE COUNT SLB,INB,RSS TEST AND INCREMENT ALF,SLA,ALF UPPER CHAR-POSITION IT IOR ZA1,I LOWER CHAR-MERGE CHAR STA ZA1,I STORE WORD. SLB,RSS NEW WORD? ISZ ZA1 YES STB ZL2 STORE POSITIVE COUNTER JMP ZNXTC GET NEXT CHARACTER * ZZDNE LDA ZL2 LOAD LENGTH JMP ZLIN,I RETURN ZDEL CLA OUTPUT A JSB ZLOT CR-LF LDA ZCT2 LOAD LENGTH STA ZCT1 RESET IN CALL PARAMETER LDA ZA2 LOAD ADDRESS STA ZA1 RESET IN CALL PARAMETER JMP ZNXTC-2 SET UP NEW INPUT * *** SINGLE CHARACTER DRIVERS * ZXLOT NOP ZX2 OTA 0 STC 0,C SFS 0 JMP *-1 JMP ZXLOT,I * ZXLIN NOP LDB IN.FL OTB 0 STC 0,C SFS 0 JMP *-1 LIA 0 AND M177 MASK TO LOWER 7-BITS JMP ZXLIN,I * *** SUBROUTINE TO OUTPUT A CR-LF. * CRLND NOP CLA SET UP AND EXECUTE A JSB ZLOT CALL TO OUTPUT DRIVER JMP CRLND,I TO OUTPUT A CR-LF * DVERT NOP ENTRY/EXIT POINT CMA,INA,SZA,RSS TEST FOR ZERO RCRD LNTH JMP XRETX STB ZL1 SAVE BUFFER START ADR STA ZA1 SAVE CHAR COUNTER CLA SET A=0 STA ZA2 SET NUMBER COUNT TO ZERO STA ZL2 SET ODD/EVEN FLAG TO ZERO LDB ZL2 LOAD ODD/EVEN FLAG P1.. LDA ZL1,I FETCH CONTENTS OF BUFFER SLB,RSS SKIP IF EVEN ALF,ALF POSITION BYTES CORRECTLY AND M177 MASK TO LOWEST BYTE CPA .32 TEST FOR SPACE JMP .NEXT IS A SPACE, THROW IT OUT SZA,RSS TEST FOR A NULL CHARACTER JMP .NEXT IS A NULL, THROW IT OUT STA XTMP SAVE CHARACTER ADA OCT60 SUBTRACT OCTAL 60 SSA TEST IF BELOW NUMBER RANGE JMP .NEXT NOT A NUMBER, IGNORE ADA M10 SUBTRACT DEC 10 SSA,RSS TEST IF GREATER THAN OCT 71 JMP .NEXT NOT A NUMBER, IGNORE LDA XTMP RESTORE CHARACTER AND .15 MASK TO NUMBER PART LDB ZA2 LOAD PARTIAL NUMBER INTO B CLO CLEAR OVERFLOW FLAG BLS,BLS MULTIPLY BY TEN ADB ZA2 ADD ON ONES BLS ADB A THEN- STB ZA2 STORE RESULT SOC TEST FOR OVERFLOW JMP OVFLW GO TO OVERFLOW RETURN .NEXT ISZ ZL2 INDEX ODD/EVEN FLAG LDB ZL2 LOAD ODD/EVEN FLAG SLB,RSS TEST STATUS ISZ ZL1 SET TO NEXT WORD IN BUFFER ISZ ZA1 TEST IF ALL NUMBERS PROCESSED JMP P1.. NOT FINISHED, COMTINUE LDA ZA2 FETCH COMPLETE CONVERTED # XRETX ISZ DVERT OVFLW JMP DVERT,I RETURN WITH RESULT IN A * *** LINKS TO OTHER PLACES AND THINGS * D97 DEC -97 M72 DEC -72 ?FL1 DEF FLAG1 ?USNT DEF USNT CLTMA DEF CLTM ?ON DEF LOGON ?CT DEF CT ?MOUT DEF MVUOT ?MOVE DEF MVSTK ?MON DEF MONIT MNTS? DEF MINTS HR? DEF HOUR PTBA? DEF PTBUF DATE? DEF DATE SEKS? DEF SEKS MBUF DEF LGOM4+9 ?DBUF DEF LGOM4+11 YBUF DEF LGOM4+13 ZL1 NOP ZA1 NOP OT.FL OCT 120000 IN.FL OCT 160000 ZCT1 NOP ZULFL OCT 52525 ZCRET OCT 15 ZLNFD OCT 12 ZCT2 NOP ZA2 NOP ZL2 NOP ZMODE OCT 33 ZESCP OCT 176 ZCTE NOP BSTK4 DEF * DEF DATA1 DEF DATA2 DEF DATA3 DEF DATA4 BSTK5 DEF * DEF WRIT1 DEF WRIT2 DEF WRIT3 DEF WRIT4 BSTK6 DEF * DEF BSK1 DEF BSK2 DEF BSK3 DEF BSK4 &&USR DEF &USR XTMP NOP OCT60 OCT -60 ZM13 DEC -13 ZM61 DEC -61 ZTI1 DEC -6 ZTA1 DEF *+1 ASC 3,YEAR? ZTI2 DEC -7 ZTA2 DEF *+1 ASC 4,MONTH? ZTI3 DEC -5 ZTA3 DEF *+1 ASC 3,DAY? ZTI4 DEC -6 ZTA4 DEF *+1 ASC 3,TIME? LEPIG EQU * SKP ORG 33710B [A] LWTSB EQU * ETBL ASC 10, 1234567890*;#$@ UX. ASC 10,)-^>:%'TWZ(+/<"?&SVY OTBL ASC 10, 1234567890CFILORUX. ASC 10,,BEHKNQTWZ=ADGJMPSVY OCT 6414 =DEC 13,12, OCT 15,14 OCT 10421 =DEC 17,17, OCT 21,21 OCT 13027 =DEC 22,23, OCT 26,27 OCT 15432 =DEC 27,26, OCT 33,32 OCT 17437 =DEC 31,31, OCT 37,37 OCT 21443 =DEC 35,35, OCT 43,43 OCT 23451 =DEC 39,41, OCT 47,51 OCT 27056 =DEC 46,46, OCT 56,56 OCT 31066 =DEC 50,54, OCT 62,66 OTBLZ OCT 4406 =DEC 09,09, OCT 11,06 [A] OCT 401 =DEC 01,01, OCT 01,01 ORG 34000B * * * ****************************************************************** * * CARD READER MODIFICATIONS TO THE BASIC INTERPRETER * * * ****************************************************************** * * RUN WHEN IN CARD MODE * Y1 LDA TFLAG LOAD PTAPE & CARD FLAG SZA,RSS 0? JMP RUNA,I GO TO RUN LDA CCONT OUTPUT RUNCARD CONTENTS LDB .BUFA JSB WRITE,I CLA STA CCONT RESET CCNT=0 FOR ERROR JMP RUNA,I GO TO RUN * * SCRATCH * Y2 LDA TFLAG ARE WE IN CARD OR PTAPE MODE? SZA,RSS JMP X3,I NOT CARD, GO TO FLUSH LDA M6 LOAD -6 LDB PAGE LOAD PAGE BUF JSB WRITE,I LDA CCONT LOAD COUNT LDB .BUFA LOAD BUFFER ADDRESS JSB WRITE,I OUTPUT SCR COMMAND LDA FWAM STA PBUFF STA PBPTR LDA .32 STA BLNK CLA STA LNUM Y5 STA DRQST,I CLEAR DATA REQUEST FLAG JMP PEXMA,I * * ERROR * Y3 LDA ERROR SAVE RETURN ADDRESS STA STK19 LDA TFLAG CARD OR PTAPE? SZA,RSS JMP *+8 LDA CCONT LOAD CARD COUNT SZA,RSS ZERO? JMP *+5 YES: RUN TIME ERROR CPA M1 -1? LDA .72 YES, TOO MANY CHAR LDB .BUFA LOAD BUFFER ADDRESS JSB WRITE,I OUTPUT INCORRECT LINE JMP ERROR+3 PAGE DEF *+1 OCT 5012,5012,5012 Y6 LDA TFLAG CHECK IF IN CARD OR PTAPE MODE SZA,RSS ZERO? JMP RDYDA,I YES - TTY MODE CLA NO - CARD OR PTAPE JSB SEXUA,I SET EXECUTION FLAG JMP Y5 ******************************************* *** *** *** TIME-SHARE BASIC CARD READER DRIVER *** *** *** ******************************************* * * CALL FROM BASIC: * LDB * LDA * JSB .CARD,I * * RETURN * CARDS NOP INITIATOR FOR CARD READER STB CBUFD SAVE BUFFER ADDRESS STA COUNX SAVE INPUT COUNT [A] CLA STA CCONT SET CHARZCTER COUNT CLEAR STA COLC CLEAR COLUMN COUNTER STA CONDT SET CONDITION INDICATOR LDA &MON& LOAD ADDRESS OF MONITOR STA CRINT STORE IT IN INT. NOP FOR RETURN LDA CRUSN SET TEMP CARD STA CRUST INDICATOR IN CASE OF STOP JSB XINTA,I SET TTY INT. TO EXECUTION JMP RCOL START CARD FEED * * *** CARD READER INTERRUPT PROCESSOR * CRINT NOP CARD READER INTERRUPT PROCESSOR STA CSAVA SAVE A REGISTER STB CSAVB SAVE B REGISTER CLA SAVE E & O REGISTER SOC IS OVERFLOW CLEAR INA YES INCREMENT A ERA SAVE E STA CSAVE CLF 0 TURN OFF INTERRUPT SYSTEM [A] * CRDR1 LIA 0,C LOAD IN CHARACTER LDB CONDT LOAD CONDITIONS SZB,RSS IS IT TRYING TO FEED A CARD? JMP RCOLI YES, SEE IF SUCCESS SSB NO, SEE IF WAITING FOR END OF CARD JMP CKCN1 YES, CHECK FOR END ISZ COLC GET NEXT COLUMN LDB COLC CHECK IF 37 (CONTINUE COLUMN) CPB .37 JMP CKCON YES - CONTINUE? AND B7777 GET RID OF STATUS SZA,RSS NO - NULL? JMP RRET YES - WAIT FOR NEXT COLUMN CCB SET B=-1 STB TOPFL INITIALIZE TOP STB BTMFL AND BOTTOM FLAGS LDB M9 INITIALIZE ROW COUNTER STB RCTRX CLB CLEAR B FOR CODE ACCUMULATION SLA CHECK ROW 12 JMP SET12 R1 RAR,SLA CHECK ROW 11 JMP SET11 RAR,SLA CHECK ROW 10 JMP SET10 ALF,RAL POSITION BITS R2 RAL SSA CHECK 1-9 JMP SET19 ISZ RCTRX CHECK IF MORE ROWS JMP R2 YES 22255-80004 D