ASMB,R,L,C HED D.00D 91703-16105 * (C) HEWLETT PACKARD CO. 1976 NAM D.00D 91703-16105 REV A 740509 SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 2 SPC 1 ****************************************** * *D.00D TELETYPE DRIVER FOR DS1-B * *SOURCE PART # 91703-18105 * *REL PART # 91703-16105 * *WRITTEN BY: JIM HARTSELL * *DATE WRITTEN* * *DATE MODIFIED: 5-9-74 * ********************************************* * * ***************************************** * D.00 CRT/TELEPRINTER DRIVER FOR * 9701 BCS TERMINALS. ***************************************** * ENT D.00,I.00 * EXT ATTEN EXT $BUSY EXT $ESC * TTY EQU 15B NOMINAL TTY CHANNEL * * THIS MODULE OF THE HP-2116 BASIC CONTROL SYSTEM * SOFTWARE IS DESIGNED TO OPERATE THE ASR-33/35 * TELE-TYPEWRITER. THE FUNCTION OF THIS DRIVER IS * TO INITIATE, CONTINUE AND COMPLETE A READ/WRITE * OPERATION REQUESTED THROUGH INPUT/OUTPUT CONTROL. * * THE DRIVER WILL REJECT A -FUNCTION SELECT- * REQUEST AS NONE OF THE DEFINED FUNCTIONS IS * APPLICABLE FOR THE ASR DEVICE. * * *** D.00 INITIATOR SECTION *** * SKP D.00 NOP D.00 NOP * ENTRY / EXIT * STA SAVA SAVE EQT ENTRY ADDRESS. STB RQA SAVE REQUEST ADDRESS LDA B,I GET WORD 2 OF REQUEST, ROTATE ALF REQUEST CODE TO LOW A AND O17 ISOLATE FUNCTION CODE LDB DFLG CHECK DRIVER FLAG - SZB DRIVER IDLE? SZA,RSS CLEAR? RSSI RSS YES. ACCEPT COMMAND. JMP REJB REJECT THIS REQUEST. ADA M3 SUBTRACT 3 FROM CODE SSA,RSS IF RESULT +, THEN ILLEGAL CODE, JMP RCER REJECT REQUEST. 1,2 LEGAL. * LDA SAVA,I GET WORD 1 OF EQT ENTRY. AND O77 GET I/O SLOT IOR LIAI STA I.6 LIA TTY (102500) ADA O100 STA I.10 OTA TTY (102600) ADA O1100 STA ISYN1 STC,C TTY (103700) XOR OTBM STA I.9 OTB TTY (106600) * ACC2 ISZ SAVA SET ADDRESS OF EQT ENTRY TO LDA SAVA GET EQT ADDRESS STA EQT2 POINTER TO STATUS INA STA EQT3 POINTER TO LOG LDA D.00 MOVE RETURN ADDRESS... STA I.00 TO "DISMISS INTERRUPT." STA DFLG SET DRIVER FLAG BUSY (NOT = 0). CLA STA CHC AND CHARACTER COUNTER STA SAVAX AND SET TO TELL IOC ALL OK. LDA RQA,I GET FUNCTION CODE ALF AND O17 SZA,RSS CHECK FUNCTION CODE: CLEAR? JMP CLEAR YES. SET STATUS AND EXIT. * LDA RQA,I GET FUNCTION CODE STA FUNC SAVE IT CLB,CLE CLEAR "B", CLEAR "E". ALF,ALF RAL,ELA PUT BINARY MODE BIT INTO ERB SIGN BIT OF B. LDA EQT2,I GET STATUS WORD IOR IBIT SET O-FIELD = 2 (BUSY) AND STA EQT2,I STORE. ISZ RQA ISZ RQA LDA RQA LDA A,I GET BUFFER ADDRESS. RAL,CLE,SLA,ERA IF INDIRECT, JMP *-2 GET DIRECT ADDRESS. STA BUF SAVE BUFFER ADDRESS. STA BUFS ISZ RQA LDA RQA,I GET BUFFER LENGTH. SSA INB,RSS NEGATIVE: FLAG CHARS IN LOG. ALS,SLA POSITIVE: DOUBLE FOR CHARS CMA,INA NEGATIVE: MAKE POSITIVE CHARS. STA IOSYZ SAVE POSITIVE CHAR COUNT STB EQT3,I STORE FLAG IN XMIT LOG LDB FUNC BLF,SLB INPUT OR OUTPUT? JMP INGO INPUT. JMP TTYO OUTPUT * RCER CLB,RSS ---REJECT SECTION R. C. ERROR (B=0). REJB LDB IBIT DEVICE/DRIVER NOT AVAILABLE CLA,INA SET (A) NON-ZERO AND JMP D.00,I EXIT TO IOC AND REJECT. * * *** CONTINUATOR SECTION *** * ENTERED AT I.00 BY TTY INTERRUPT. * ISYNC NOP I.10 OTA TTY OUTPUT CHAR OR INSTR LDA SAVEX CLO SLA,ELA STF 1 OVERFLOW ON LDB SAVBX STF 0 ISYN1 STC TTY,C START TTY CLOCK LDA OPINT SZA JMP ISYN2 LDA SAVAX JMP I.00,I DISMISS INTERRUPT ISYN2 CLA STA OPINT JMP ATTEN PROCESS OPERATOR ATTENTION. * I.00 NOP TTY INTERRUPT HERE STA SAVAX SAVE A, STB SAVBX B, ERB,BLS E, SFC 1 AND INB OVERFLOW STB SAVEX I.6 LIA TTY AND O177 REMOVE 8-LEVEL BIT JMP ISYNC,I RETURN TO CALLING ROUTINE. * SKP * * INPUT SECTION * RDCH NOP INPUT A CHARACTER LDB FUNC LDA DA READ AND ECHO INSTRUCTION BLF,BLF SLB,RSS TEST "P" (PRINT) LDA DB READ ONLY INSTRUCTION JSB ISYNC GET A CHARACTER. JSB TSTCH CHECK FOR CONTROL JMP RDCH,I * INGO LDA BUFS RESET STARTING BUFFER ADDRESS. STA BUF CLB JMP INA4 GO GET FIRST CHAR. * IASC2 JSB RDCH READ ASCII CHARACTER STA CH SAVE IT SZA,RSS NULL? JMP IASC2 YES. IGNORE CPA O12 LINE FEED? JMP IASC2 YES, IGNORE. CPA O15 CAR RETURN? JMP IRETN YES, END OF RECORD CPA RUBO RUBOUT? JMP RDEL DELETE RECORD CPA BAKSP BACKSPACE CHAR? JMP DELE DELETE PREVIOUS CHAR. CPA BKSPC BACKSPACE KEY? JMP DELE2 DELETE PREVIOUS CHARACTER. LDB CHC CPB IOSYZ BUFFER FULL (ASCII)? JMP IASC2 YES. LOOK FOR CAR RETURN. * * INSERT CHARACTER IN BUFFER * IBIN3 LDB CHC SLB,INB,RSS SKIP IF LOWER CHAR ALF,SLA,ALF UPPER. ALWAYS SKIP X.6 XOR BUF,I COMBINE LOWER WITH PRIOR XOR O40 INSERT/REMOVE BLANK STA BUF,I STORE IN BUFFER SLB,RSS IF LOWER CHAR, ISZ BUF ADD 1 TO BUFFER ADDRESS INA4 STB CHC CHARS IN BUFFER LDA EQT3,I GET MODE SSA,RSS JMP IASC2 ASCII. GO READ CHAR. CPB IOSYZ BUFFER FULL (BINARY)? JMP STAT YES, EXIT. JSB RDCH READ BINARY CHARACTER JMP IBIN3 GO STORE IT. * SKP DELE LDA O137 OUTPUT BACK-ARROW. JSB TYO DELE2 LDB CHC DELETE A CHARACTER. SZB,RSS JMP IASC2 BUFFER EMPTY: IGNORE CCA ADB A SLB,RSS IF LEFT CHAR DELETED, JMP INA4 DONE. ADA BUF STA BUF BACK UP POINTER LDA BUF,I AND O377 GET RIGHT HALF JMP X.6 GO PURGE IT. * RDEL JSB KILL CANCEL INPUT. JMP INGO * KILL NOP LDA O134 OUTPUT BACKSLASH. JSB TYO LDA O15 OUTPUT CARRIAGE RETURN. JSB TYO LDA O12 OUTPUT LINE FEED. JSB TYO JMP KILL,I * TSTCH NOP CHECK FOR CONTROL CHARACTER CPA O33 ESCAPE (OPERATOR BREAK)? JMP CC YES. GO PROCESS IT. CPA O176 JMP CC JMP TSTCH,I * CC LDA $BUSY REMOTE I/O BUSY? SZA,RSS JMP *+3 NO, ACCEPT THE INTERRUPT. STA $ESC YES, SET $ESC JMP TSTCH,I AND IGNORE INTERRUPT. CLA OPERATOR BREAK. STA CHC INA FLAG OPERATOR INPUT. STA OPINT JMP CLEAR CLEAR THE DRIVER. * * PROCESS CARRIAGE RETURN: END OF MESSAGE * IRETN LDA O12 ECHO LINEFEED JSB TYO LDB CHC THESE SIX INSTRUCTIONS ... SZB DEFAULT A NULL INPUT ... JMP STAT LDA LBLNK INTO A SINGLE BLANK. STA BUF,I ISZ CHC JMP STAT * * STATUS SECTION * CLEAR BSS 0 STAT LDA EQT2,I GET STATUS WORD AND MST (37400) PRUNE PRIOR STATUS STA EQT2,I STORE STATUS WORD LDB CHC LDA EQT3,I DOES USER WANT CHARS OR WORDS? SLA,ELA SKIP IF WORDS. BINARY FLAG TO E RBL,SLB CHARS. DOUBLE AND SKIP. INB WORDS. ROUND COUNT UP. ERB HALVE COUNT, COMBINE BINARY BIT STB EQT3,I STORE IN XMIT LOG. CLB CLEAR DRIVER-BUSY FLAG. STB DFLG * IDLE LDA DA ECHO INPUT JSB ISYNC IDLE LOOP JSB TSTCH CHECK FOR CONTROL CHARACTER JMP IDLE IGNORE INPUT * SKP * * OUTPUT SECTION * TTYO JSB OUTGO DUMP THE BUFFER JMP STAT ALL DONE. * OUTGO NOP SUBROUTINE TO DUMP BUFFER CMA STA CHX -CHAR COUNT-1 CLB STB CHC INITIALIZE OUTPUT COUNT OUTLP JSB GETCH GET CHAR FROM BUFFER SSB,RSS IF BINARY, OR SEZ IF HONESTY MODE, JMP OUTC GO OUTPUT CHAR. LDB CHX CPA O137 IS IT A LEFT ARROW? INB,SZB IS IT ALSO LAST CHARACTER? JMP OUTC NO. GO OUTPUT. JMP OUTGO,I SUPPRESS CR/LF. * OUTC JSB TYO JMP OUTLP * GETCH NOP GET CHAR FROM BUFFER LDA BUF,I GET WORD CONTAINING LDB CHC NEXT CHAR. SLB,RSS ALF,ALF MOVE TO RIGHT HALF AND O177 ISOLATE LOWER CHARACTER. SLB,INB IF CURRENT CHAR IS LOWER, ISZ BUF ADD 1 TO BUFFER ADDRESS STB CHC LDB FUNC BLF,ELB HONESTY TO E BLF BINARY TO SIGN ISZ CHX CHARS ALL GONE? JMP GETCH,I NO, RETURN. SSB,RSS BINARY, OR SEZ HONESTY MODE? JMP OUTGO,I YES. DONE. LDA O15 CAR RTN JSB TYO OUTPUT THE CHARACTER LDA O12 JSB TYO OUTPUT LINEFEED. JMP OUTGO,I ALL DONE. * SKP TYO NOP CHAR OUTPUT SUBROUTINE LDB LOUT PRINT COMMAND I.9 OTB TTY OUTPUT INSTRUCTION JSB ISYNC OUTPUT THE CHARACTER CPA O177 CHECK ECHO. BREAK? JMP TYO,I NO. EXIT. LDA LOUT INA,SZA WAIT FOR BREAK CHAR ... JMP *-1 TO FINISH COMING IN. LDA DB JSB ISYNC GET AN INPUT CHAR JSB TSTCH CHECK FOR CONTROL CPA O177 RUBOUT? RSS JMP TYO,I NO, RETURN. JSB KILL YES, OUTPUT /, CR, LF. JMP STAT FAKE COMPLETION. SKP * CONSTANT, FLAG, AND STORAGE SECTION * A EQU 0 B EQU 1 SUP * SAVAX NOP STORAGE AREA SAVBX NOP FOR SAVING REGISTERS SAVEX NOP WHILE PROCESSING INTERRUPT. * SAVA NOP EQT ADDRESS FUNC NOP REQUESTED FUNCTION RQA NOP REQUEST ADDRESS DFLG NOP DRIVER BUSY FLAG. =0, NOT BUSY * M3 OCT -3 O10 OCT 10 BACKSPACE CHAR(CONT. H) O12 OCT 12 O15 OCT 15 O17 OCT 17 O40 OCT 40 O77 OCT 77 O100 OCT 100 O134 OCT 134 O137 OCT 137 BAKSP EQU O10 BKSPC OCT 31 O33 OCT 33 ESCAPE KEY. O176 OCT 176 O177 OCT 177 RUBO EQU O177 O377 OCT 377 LBLNK OCT 20000 IBIT OCT 100000 MST OCT 37400 LIAI LIA 0 OTBM OCT 5100 O1100 OCT 1100 CH NOP * EQT2 NOP EQT3 NOP BUF NOP BUFS NOP IOSYZ NOP CHC NOP CHX NOP * * LOUT OCT 120000 PRINT OUTPUT DA OCT 160000 ECHO INPUT DB OCT 140000 NON-ECHO INPUT OPINT NOP * BSS 0 CHECK SIZE * END