* *** PUT ENTRY IN TABLE * STA XCODE,I STORE ACCOUNT #/LENGTH WORD ISZ XCODE SET TO NEXT WORD ISZ XLNTH INDEX LENGTH ISZ XNTRY INDEX # OF ENTRIES LDA ZSVA RELOAD CHARS INPUT COUNT CLE,SLA,INA SET E=0 FOR FLAG CCE SET E=1 FOR ODD # CHARS ARS SHIFT AS WORD COUNTER STA ZSVA SAVE AS COUNTER CLA,INA STA ZWCNT WORD COUNTER = + 1 LDA XBUF STA ZBF ZLOP5 LDB ZWCNT CPB ZSVA LAST CHAR? JMP ZLAST YES-PROCESS IT ISZ ZWCNT INDEX COUNTER LDA ZBF,I LOAD WORD FROM INPUT BUFFER STA XCODE,I PUT IN CODE WORD TABLE ISZ XCODE INDEX TO NEXT ADR ISZ XLNTH INDEX CODE TABLE LENGTH ISZ ZBF JMP ZLOP5 ZLAST LDA ZBF,I LOAD LAST WORD ISZ XLNTH INDEX CODE TABLE LENGTH SEZ ODD/EVEN? IOR .32 ADD IN SPACE IF ODD STA XCODE,I PUT IN CODE WORD TABLE ISZ XCODE INDEX STORE ADR JMP ZLOP3 GET NEXT ACCOUNT * ZEND LDB XNTRY LOAD CODE WORD TABLE LENGTH CMB,INB,SZB,RSS NULL CODE TABLE? JMP ZLOP3-5 YES-ASK FOR CODE TABLE INPUT STB ?TBL,I SET # ENTRIES IN CODE TABLE LDB XCODE SET NEW FIRST WORD STB FWFC,I AVAILABLE MEMORY JMP CDTBL,I * * *** PREPARE ABSOLUTE TAPE OF SYSTEM * ZABST JSB CRLF,I LDA X20 OUTPUT MESSAGE: LDB ZAG30 PUNCH ABSOLUTE TAPE? JSB ZCLOT,I LDA M11 OUTPUT MESSAGE: LDB ZX9 YES OR NO: JSB ZCLOT,I LDA .2 RESPONSE LDB ZRPLY JSB ZCLIN,I SZA,RSS NULL INPUT? JMP ZABST YES-TRY AGAIN LDA ZRPLY,I GET FIRST TWO CHARS INPUT CPA XNO = NO ? JMP 3B,I YES - SKIP TAPE OUTPUT CPA XYES = YES ? RSS REQUEST PUNCH DEVICE JMP ZABST NO VALID INPUT ZABSD JSB CRLF,I LDA M33 OUTPUT MESSAGE: LDB ZAG27 SYSTEM PUNCH JSB ZCLOT,I LDA .4 GET LDB ZRPLY TTY JSB ZCLIN,I RESPONSE SZA,RSS NULL INPUT? JMP STTYI SET TTY AS PUNCH DEVICE CPA .2 TWO CHARS INPUT? JMP *+6 YES-CHECK FOR VALID I/O * ZER6 JSB CRLF,I OUTPUT CR-LF LDA X20 OUTPUT MESSAGE: LDB XZG2 INVALID I/O ADDRESS JSB ZCLOT,I JMP ZABSD TRY INPUT AGAIN * LDA ZRPLY,I LOAD 1ST CHARS INPUT ALF,ALF POSITION JSB XNBER,I CHECK FOR OCTAL JMP ZER6 NOT OCTAL-ERROR SZA,RSS ZERO AS 1ST CHAR? JMP ZER6 YES-ERROR ALF,RAR POSITION STA XI/O,I SAVE 1ST CHAR LDA ZRPLY,I RELOAD CHARS INPUT JSB XNBER,I CHECK FOR OCTAL JMP ZER6 NOT OCTAL IOR XI/O,I STA XI/O,I SAVE I/O CHANNEL LDA M4 4-ADR TO SET LDB ZLST9 SET I/O JSB XSETI,I INSTRUCTIONS * *** PUNCH ELEMENTS OF SYSTEM PREPARED * COPY JSB LTG GENERATE LEADER LDA .2 CCB PUNCH FROM 2 ADB FWFC,I TO FWAM-1 JSB PNCHA * LDA $SEX$ PUNCH INA BASIC INITIALIZATION LDB OINK SECTION JSB PNCHA LDA LWFC,I INA LWAM+1 TO LDB LWM LAST WORD OF JSB PNCHA MEMORY (37677B) JSB LTG PUNCH TRAILER HLT 77B END OF DUMP ROUTINE LIA 1 LOAD (A)=SWITCH REG CPA M15 SIGN BIT SET? JMP COPY GO MAKE ANOTHER COPY JSB CRLF,I LDA .4 OUTPUT MESSAGE LDB ZAG28 *END JSB ZCLOT,I HLT 76B FINISHED HALT JMP 3B,I STTYI LDB XLCHN,I LOAD SYSTEM I/O ADDRESS STB XI/O,I SET FOR XSETI LDA M5 5-ADR TO BE SET LDB ZLST9 SET I/O JSB XSETI,I INSTRUCTIONS JSB CRLF,I LDA .34 OUTPUT MESSAGE: LDB ZAG29 TURN ON TTY TAPE JSB ZCLOT,I HLT 11B "READY" TO PUNCH HALT LDB HEWPY SET TO OUTPUT &T1 OTB 0 MODE JMP COPY PUNCH SYSTEM * * SUBROUTINE TO PUNCH ABSOLUTE BLOCK * * CALLING SEQUENCE: * (A)=FWA OF BLOCK * (B)=LWA OF BLOCK * (P)= JSB PNCH.,I (PNCH. DEF PNCHA) * (P+1) (RETURN) * PNCHA NOP INB STA T1 SAVE FIRST AND LAST STB T2 WORD ADDRESSES P1 LDA M27 SET T3= -27 AS INDEX STA T3 FOR FILLING BUFFER LDA T1 SET BUF+1 FOR LOAD ADR STA BUF1,I OF CURRENT BLOCK STA CKSUM INITIALIZE CHECKSUM WORD. CLA SET WORD COUNTER STA BUF,I TO ZERO. LDA BUF SET T4 TO ADDRESS ADA .2 OF WORD 3 OF BUFFER STA T4 FOR STORING WORDS P2 LDA T1,I STORE CURRENT WORD FROM STA T4,I MEMORY IN PUNCH BLOCK ISZ T1 INDEX TO NEXT LOAD AND ISZ T4 STORE ADDRESSES ADA CKSUM ADD WORD TO CUMULATED STA CKSUM CHECKSUM ISZ BUF,I COUNT WORD STORED IN BUFFER LDA T1 CHECK FOR END OF BLOCK CPA T2 JMP P3 YES, FWA=LWA ISZ T3 INDEX BUFFER COUNTER JMP P2 BUFFER NOT YET FILLED * P3 LDA CKSUM BUFFER FILLED. SET CHECKSUM STA T4,I IN LAST WORD IN BUFFER LDA BUF,I POSITION ALF,ALF WORD COUNT TO UPPER STA BUF,I CHARACTER WORD ALF,ALF REPOSITION, ADD 3 FOR ADA .3 TOTAL RECORD LENGTH, SET CMA,INA NEGATIVE FOR OUTPUT. LDB BUF (B)=ADDR OF BUFFER JSB PUNCH PUNCH RECORD * LDA T1 FINISHED CPA T2 * PUNCHING JMP PNCHA,I YES-EXIT JMP P1 NO-SET NEXT RECORD * * SUBROUTINE: LTG (LEADER/TRAILER GENERATOR) * * CALL: * (P) JSB LTG * (P+1) -RETURN- * * LTG PRODUCES APPROXIMATELY 10-INCHES * OF BLANK TAPE (FEED/FRAMES) * LTG NOP CLA JSB PUNCH JMP LTG,I * *** PUNCH BUFFER * *** SUBROUTINE TO PUNCH BINARY TAPE * * * CALLING SEQUENCE: * (A)=LENGTH (AND MODE) OF RECORD TO BE OUTPUT * (B)=STARTING ADDRESS OF DATA BUFFER * * PUNCH NOP STB BUFF SAVE BUFFER START ADDRESS SZA CHECK FOR FEED-FRAMES ONLY JMP *+3 NOT FEED FRAME MODE LDA .200 JMP PP03+1 DO FEED FRAMES ONLY * ALS CONVERT COUNT TO CHARACTERS (X2) STA CHC1 AS COUNTER FOR OUTPUT SECTION LDB UL52 SET UPPER/LOWER CHAR INDICATOR * * CHARACTER OUTPUT SECTION * PP02 LDA BUFF,I GET WORD CONTAINING CHARACTER SSB,RSS IF UPPER/LOWER FLAG SAYS UPPER ALF,ALF (SIGN=0) ROTATE TO LOWER AND M377 REMOVE UPPER CHAR JSB PNCH& OUTPUT CHAR SSB INDEX BUFFER WORD? ISZ BUFF YES RBL INDEX U/L FLAG ISZ CHC1 INDEX COUNTER JMP PP02 CONTINUE PUNCHING * * COMPLETION SECION * PP03 LDA M4 OUTPUT STA BUFF FOUR CLA FEED JSB PNCH& OUTPUT CHAR ISZ BUFF AT END JMP *-3 OF RECORD * TOUT3 CLC 0 JMP PUNCH,I * *** PUNCH SINGLE CHAR * PNCH& NOP OTA 0 OUTPUT A STC 0,C SINGLE CHAR SFS 0 ON PUNCH OUTPUT JMP *-1 DEVICE JMP PNCH&,I * HEWPY OCT 110000 .34 DEC 34 M33 DEC -33 OINK DEF LEPIG LWM DEF LWAMS $SEX$ DEF [SEX[ XLCHN DEF ZLCHN XSETI DEF ZSETI XNBER DEF ZNBER XI/O DEF ZI/O ZLST9 DEF ZDLS9 ZAG27 DEF ZZG27 ZAG28 DEF ZZG28 ZAG29 DEF ZZG29 ZAG30 DEF ZZG30 DVRT DEF DVERT ZFWTB DEF * DEF FWAM1 DEF FWAM2 DEF FWAM3 DEF FWAM4 ZLWTB DEF * DEF LWAM1 DEF LWAM2 DEF LWAM3 DEF LWAM4 LWFC DEF LWAFC FWFC DEF FWAFC CRLF DEF CRLND ZCLOT DEF ZLOT &#USR DEF &USR X20 DEC 20 X22 DEC 22 Z39 DEC 39 ZX9 DEF ZZG9 XLNTH NOP XCODE NOP ZCLIN DEF ZLIN XYES ASC 1,YE XNO ASC 1,NO XZG2 DEF ZZG2 ZAG15 DEF ZZG15 ZAG16 DEF ZZG16 ZG.15 DEF ZZG15+14 ZG.16 DEF ZZG16+14 XFWC NOP XLWC NOP ZCCT NOP XFCR NOP ZCHNX NOP X21 DEC 21 Z30 DEC 30 ZAG17 DEF ZZG17 ZONE BSS 1 TEMP STORAGE ZX BSS 1 AMT STND FR CORE ZANS NOP ZRPLY DEF *+1 STORAGE FOR BSS 3 OCTAL NUM * BUF DEF BUFFR BUF1 DEF BUFFR+1 * BUFFR BSS 30 BUFF NOP T1 NOP T2 NOP T3 NOP T4 NOP CKSUM NOP CHC1 NOP M27 DEC -27 .200 DEC -200 UL52 OCT 52525 ZSVA NOP Z14 DEC 14 ZM64 DEC -64 ZBF NOP ZACNT NOP ZWCNT NOP ?TBL DEF TBL ?ACCT DEF ACCT# XNTRY NOP XA1 NOP XCHN% NOP X/E ASC 1,/E XBUF DEF ZBUF+1 XVERT DEF DVERT ORG 30000B SKP * PTSBS CLC 0 TURN OFF ALL DEVICES LIA 1 LOAD I/O ADDRESS OF TTY AND .63 MASK TO LOWER 6-BITS STA B PUT ADDRESS IN B-REGISTER ARS,ARS SHIFT TO BITS (5-3) ARS SZA I/O ADDRESS >7? JMP ZGO YES-INITIALIZE PREPARE BASIC TTY * HLT 55B INVALID I/O ADDRESS HALT JMP PTSBS TRY AGAIN * ZGO STB ZI/O SAVE PREPARE TSB STB ZLCHN TTY CHANNEL LDA M9 9 INSTRUCTIONS TO BE MODIFIED LDB ZLST1 START ADR OF INST LIST JSB ZSETI SET I/O CHANNEL INST. * *** CALL FOR CLOCK I/O ADDRESS * JSB CRLND OUTPUT CR-LF LDA M19 OUTPUT MESSAGE: LDB ZA7 "CLOCK I/O ADDRESS?" JSB ZLOT JSB ZGADR GET ADDRESS FROM TTY STB ZI/O SAVE I/O ADDRESS LDA ZINS1 SET INTERRUPT CELL STA B,I INSTRUCTION IN CLOCK CELL. LDA M5 5-ADDRESSES TO BE MODIFIED LDB ZLST3 SET I/O INSTRUCTIONS JSB ZSETI FOR CLOCK. * *** CALL FOR LOG TTY I/O ADDRESS * JSB CRLND JSB CRLND OUTPUT RETURN LDA ZM22 OUTPUT MESSAGE: LDB ZAG1 "LOG TTY I/O JSB ZLOT ADDRESS?" JSB ZGADR INPUT LOG-TTY ADDRESS STB ZI/O SAVE I/O ADDRESS LDA ZI/O6 SET INTERRUPT CELL STA B,I LINKAGE INSTRUCTION LDA ZM12 12-ADDRESSES TO BE MODIFIED LDB ZLST2 INSTRUCTIONS ADDRESS LIST JSB ZSETI SET I/O CHANNEL-LOG TTY * LDA ZLST2 LOAD TABLE BASE ADR ADA Z5 INDEX BY 11 LDA A,I GET (OTB) INST ADR LDA A,I GET INSTRUCTION STA ZTTYB,I SET IN INITIALIZATION SECTION STA ZTTY[,I * LDA ZLST2 LOAD TABLE BASE ADR ADA .11 INDEX BY 11 LDA A,I LOAD INST ADR LDA A,I LOAD (CLC) INST STA ZTTYC,I STORE IN INIT SECTION * *** GET NUMBER OF USERS (1-4) * JSB CRLND ZGNU JSB CRLND OUTPUT CR-LF LDA ZM20 OUTPUT MESSAGE: LDB ZAG3 "NUMBER OF CHANNELS?" JSB ZLOT LDA Z20 GET LDB ZBUF RESPONSE JSB ZLIN FROM TTY CPA .1 1 CHAR INPUT? JMP ZPRCS OK- PROCESS IT ZER2 JSB CRLND OUTPUT CR-LF LDA Z13 OUTPUT MESSAGE: LDB ZAG4 "INVALID INPUT" JSB ZLOT JMP ZGNU TRY AGAIN * ZPRCS LDB ZBUF CONVERT TO BINARY JSB DVERT JMP ZER2 NOT VALID INPUT STA ZPNU SAVE + # USERS CMA,INA,SZA,RSS MAKE COUNT NEGATIVE JMP ZER2 AND PRINT ERROR IF 0 STA ZNUSR SAVE -# USERS ADA .4 INDEX BY 4 SSA USER #>4? JMP ZER2 YES-ERROR LDB ZNUSR LOAD (B)= - # USERS STB Z#USR,I SET -USERS COUNT FOR CLOCK STB Z&USR,I SET -USERS COUNT FOR MONITOR * *** SET CHANNEL I/O ADDRESSES * JSB CRLND CLA,INA SET = USER # 1 STA ZCHN# * ZLOP2 JSB CRLND OUTPUT CR-LF LDA ZCHN# LOAD CHANNEL # IOR .48 ADD ON ASCII # BITS ALF,ALF POSITION TO UPPER WORD IOR .32 ADD ON BLANK STA ZA6,I PUT IN PRINT BUFFER LDA ZM27 OUTPUT MESSAGE: LDB ZA5 "CHANNEL N TTY I/O JSB ZLOT ADDRESS?" JSB ZGADR GET ADDRESS STB ZI/O AND SAVE * *** SET CHANNEL NUMBER INTO INTERRUPT TABLE * LDA CTBL$ ADA ZCHN# STB A,I * LDA ZBTB1 LOAD INTERRUPT TABLE BASE ADA ZCHN# ADDRESS & INDEX BY CHAN #. LDA A,I LOAD INTERRUPT INSTRUCTION STA B,I AND STORE IN INTERRUPT CELL * *** SET NEW FIRST WORD AVAILABLE FREE CORE * LDA ZZFWA LOAD TABLE BASE ADDRESS ADA ZCHN# INDEX BY USER # LDA A,I LOAD FWAM FROM TABLE STA FWAFC STORE AS FWAM * *** CONFIGURE I/O INSTRUCTIONS * LDB ZBTB2 LOAD INST. TABLE BASE ADR ADB ZCHN# INDEX BY CHANNEL # LDB B,I LOAD LIST ADDRESS STB ZCODE SAVE LIST ADDRESS LDA M7 7 INSTRUCTIONS TO BE MODIFIED JSB ZSETI MODIFY I/O INSTRUCTIONS * *** SET POWER FAIL INSTRUCTIONS * LDA ZCODE LOAD TABLE BASE ADR ADA .2 INDEX BY USER # LDA A,I LOAD INST ADR LDA A,I LOAD INST. LDB ZBTB4 LOAD TABLE BASE ADR ADB ZCHN# INDEX BY USER # LDB B,I LOAD DESTINATION ADR STA B,I STORE INSTRUCTION * 22255-80002 D