ASMB,R,B,L,C HED *** DOS III DRIVER DVR00 FOR 2752, 2754, AND 2600 *** NAM DVR00,0,0 * *** REVISION DATE MARCH 1975 *** * * ENT I.00,C.00 * ****** PROGRAM DESCRIPTION ****** * * DRIVER 00 OPERATES UNDER THE CONTROL OF THE * I/O CONTROL MODULE OF THE D.O.S. EXECUTIVE * THIS DRIVER IS RESPONSIBLE FOR CONTROLLING DATA * TRANSMISSION WITH A TELETYPE ASR 33/35 WITH THE * 2116 PARALLEL INTERFACE. <00> IS THE EQUIPMENT * CODE ASSIGNED TO THIS TYPE OF DEVICE. I.00 IS * THE ENTRY POINT FOR THE *INITIATION* SECTION AND * C.00 FOR THE *COMPLETION* SECTION. * * - THE INITIATION SECTION IS CALLED FROM I/O * CONTROL TO INITIALIZE A DEVICE AND INITIATE * A DATA TRANSFER OR CONTROL FUNCTION. * * CALLING SEQUENCE: * * - ADDRESSES OF DEVICE EQT ENTRY * SET IN "EQT1-EQT17" - * * (A) = I/O ADDRESS OF DEVICE * * (P) JSB I.00 * (P+1) - RETURN - * * (A) = 0, OPERATION INITIATED, OR * (A) = REJECT CODE: * * 2, ILLEGAL CONTROL REQUEST, * OR CONTROL FUNCTION HAS * BEEN DONE (E.G., SET EOT * STATUS). * * * - THE COMPLETION SECTION IS CALLED BY CENTRAL * INTERRUPT CONTROL TO CONTINUE OR COMPLETE * AN OPERATION. * * CALLING SEQUENCE: * * - ADDRESSES OF DEVICE EQT ENTRY * SET IN "EQT1-EQT17" - * * (A) = I/O ADDRESS OF DEVICE * * (P) JSB C.00 * (P+1) -- COMPLETION RETURN -- * (P+2) -- CONTINUATION RETURN -- * * - COMPLETION RETURN: * (A) = 0, SUCCESSFUL COMPLETION WITH * (B) = # WORDS OR CHARS. TRANSFERRED * (A) = 2 IF SIMULATED EOT ENCOUNTERED, * (B) = 0 * * - CONTINUATION RETURN: REGISTERS * MEANINGLESS. * * * - RECORD FORMATS: * * ASCII (INPUT): A STRING OF CHARACTERS TERMIN- * ----- ATED BY A LINE-FEED. IF THE * REQUESTED LENGTH IS FULFILLED * BEFORE A LINE FEED, THE RE- * MAINING CHARACTERS ARE IGNORED * UNTIL A LINE-FEED IS INPUT. * THE 8-LEVEL BIT (BIT 07) IS * SET = 0 FOR 7-BIT ASCII CODE. * * SPECIAL CHARACTER PROCESSING: * * RETURN - ALWAYS IGNORED AND IS NOT * TRANSMITTED TO USER BUFFER * LINE-FEED - IGNORED IF INPUT BEFORE * THE FIRST VALID CHARACTER * OF A RECORD; RECORD TERMINATOR * AT THE END OF A RECORD AND IS * NOT TRANSMITTED TO BUFFER OR * COUNTED. * CONTROL/A - DELETES PREVIOUS CHARACTER * RUB-OUT - DELETES CURRENT RECORD; * AFTER LINE-FEED IS INPUT, * NEXT RECORD IS READ. * * ASCII (OUTPUT): A STRING OF CHARACTERS, THE * ----- NUMBER DESIGNATED BY THE * "BUFFER LENGTH" IN THE REQUEST, * TERMINATED BY A RETURN AND * LINE-FEED (SUPPLIED BY THE * DRIVER). * * SPECIAL CHARACTER PROCESSING: * * LEFT-ARROW: IF A LEFT-ARROW IS THE * LAST CHARACTER IN THE USER * BUFFER, THE RETURN/LINE-FEED * AND ARROW CODES ARE NOT OUTPUT. * * A ZERO BUFFER LENGTH CAUSES ONLY A * RETURN/LINE-FEED TO BE OUTPUT. * * * BINARY (INPUT): A STRING OF CHARACTERS * ------ SPECIFIED BY THE BUFFER * "LENGTH" IN THE REQUEST. * * "V-FORMAT": IF THE "V" FIELD * IN THE CONTROL WORD OF THE * REQUEST = 1, THE LENGTH OF * THE RECORD IS DESIGNATED (IN * WORDS) BY THE FIRST CHARACTER * OF THE RECORD. THE WORD COUNT * INCLUDES THE FIRST WORD. IF * THE WORD COUNT IS LARGER THAN * THE BUFFER LENGTH, THE BUFFER * LENGTH IS USED. * * * "ABSOLUTE FORMAT" : IF BIT 10 * IN THE CONTROL WORD = 1, AND * THE B AND V BITS ARE SET, THE * TAPE IS READ AS ABSOLUTE BINARY * - THE WORD COUNT ON THE TAPE * IS INCREMENTED BY 3 TO INCLUDE * THE ENTIRE RECORD. * * * BINARY (OUTPUT): A STRING OF CHARACTERS * ------ SPECIFIED BY THE BUFFER * "LENGTH" IN THE REQUEST. * * * - SIMULATED END-OF-TAPE: IF 30 FEED-FRAMES * ---------- --- -- ---- (ZEROS) ARE INPUT * BEFORE THE FIRST CHAR- * ACTER OF A RECORD, AN * EOT INDICATION IS * SET IN THE STATUS FIELD * (BIT 05 OF WORD 5) OF * THE EQT ENTRY AND THE * INPUT TERMINATED. IF * THE EOT BIT IS SET * WHEN THE CONDITION IS * ENCOUNTERED, THE EOT * IS IGNORED AND CHARS * ARE INPUT UNTIL A * RECORD IS STARTED (I.E, * LEADER IS AUTOMATICALLY * SKIPPED AFTER EOT). * * * - CONTROL FUNCTIONS ACCEPTED: * * 10 - TEN INCHES OF ZEROS (FEED-FRAMES) ARE * OUTPUT FOR LEADER/TRAILER. * * 11 - LINE SPACING: THE PARAMETER WORD OF THE * REQUEST DETERMINES THE NUMBER OF * LINE-FEEDS TO BE OUTPUT. * * 07 - THE EOT STATUS BIT IS SET TO ALLOW * "LEADER" TO BE SKIPPED ON THE NEXT * INPUT REQUEST. * * 00 - CLEAR REQUEST - EXECUTES SAME AS 07 * * * - SYSTEM TELETYPE PROCESSING: THE SYSTEM * TELETYPE IS ALWAYS LEFT IN THE * "INPUT STATE" WITH CONTROL SET/ * FLAG CLEARED TO LEAVE THE KEYBOARD * ACTIVE. IF A KEY IS STRUCK WITH * NO INPUT IN EFFECT, THE FLAG * "OPATN" IN BASE PAGE IS SET NON- * ZERO. IF A KEY IS STRUCK DURING * AN OUTPUT OPERATION TO THE SYSTEM * TTY, THE FLAG IS SET. * * * HED < DRIVER 00 *INITIATION* SECTION > * ********* INITIATION SECTION ********** * * I.00 NOP * JSB SETIO SET I/O INSTRUCTIONS FOR UNIT. * CCA,CCE SET COMPLETION SECTION ADA I.00 TO EXIT VIA STA C.00 INITIATION ENTRY * LDA EQT9,I GET CONTROL WORD OF REQUEST, AND ..+3 ISOLATE AND STA B SAVE REQUEST CODE. XOR EQT9,I ALF POSITION CONTROL ALF,RAL BITS FOR MODE, ETC. * * CONSTRUCT DEVICE PROGRAM CODE ACCORDING TO REQUEST * * RBR,SLB,RBL READ REQUEST? JMP D01 -NO * ADB DATAI SET BIT 14 FOR DATA IN RAR,SLA IF KEYBOARD MODE (K-BIT ON), ADB PRINT TURN ON PRINTER JMP D02 * D01 ADB PUNCH SLB JMP CONTL - CONTROL REQUEST - * SSA,RSS IF ASCII MODE, TURN ON PRINTER ADB PUNCH (PUNCH + PUNCH = PRINT) * D02 JSB BFSET * * SELECT DEVICE OPERATING CONDITIONS - DEVICE * NEEDS TO BE SELECTED ONLY ONCE FOR EACH * OPERATION. * D03 LDA B GET COMMAND WORD FOR THE BOARD AND MASK4 MASK OUT DATA BITS IOR BIT15 SET BIT 15 FOR CONTROL IO2 OTA 0 RBR,SLB IS IT READ JMP D20 -NO, GO EXECUTE CONTINUATOR * JSB EQT9X SET BIT 15 IN EQT9,I JMP CXT1 GO STC,C AND EXIT BIT15 OCT 100000 SKP * * * CONTROL REQUEST PROCESSING * CONTL RAL POSITION & ISOLATE FUNCTION AND MASK1 CPA .10B FIELD = <10> TO GENERATE JMP D05 LEADER (10 INCHES OF BLANK TAPE) CPA .11B FIELD = <11> FOR LINE JMP D06 SPACING * ISZ C.00 ADJUST RETURN SZA CLEAR REQUEST? JMP NOCLR NO. LDA ..+4 JMP D29 NOCLR CPA ..+7 SIMULATED EOT? JMP D28 GO SET EOT STATUS * LDA ..+2 SET ILLEGAL CNTRL REQ. JMP I.00,I * * LEADER/TRAILER GENERATOR * D05 LDA N100 SET INDEX COUNTER FOR FEED FRAMES STA EQT12,I = -100. PRINT OCT 020000 EQUIVALENT TO JMP D07 FEED FRAME. * * LINE SPACING * D06 LDA EQT10,I GET LINE COUNTER WORD. SSA,RSS INSURE VALUE CMA,INA IS NEGATIVE. SZA,RSS PROTECT AGAINST CCA A ZERO VALUE. STA EQT12,I SET INDEX. ADB PUNCH = PRINT LDA LINF (A) = LINE FEED CODE D07 STA EQT13,I SET ACTION CODE, JMP D03 RETURN TO START OUTPUT,(B)00 = 0 * * HED < MISCELLANEOUS SUBROUTINES > * * INITIALIZE FLAGS, EOT COUNTER, CURRENT * BUFFER ADDRESS AND LENGTH. * BFSET NOP LDA EQT10,I CONVERT BFR ADR TO EVEN CHAR ADR DATAI OCT 040000 ( EQUIVALENT TO ) STA EQT12,I SET CURRENT BFR. POINTER LDA EQT11,I GET BUFFER LENGTH. CMA,SSA,INA POSITIVE WORD COUNT REQUESTED? ALS,SLA -YES, CONVERT TO NEG. CHARS. CMA,INA -NO, RESET TO NEG. CHARS. SLB,RSS SKIP ZERO CHECK JMP *+3 IF WRITE. SZA,RSS IF CHAR, COUNT = ZERO, SET = -1 CCA FOR SYSTEM PROTECTION. STA EQT13,I SET CURRENT BUFFER LENGTH. * LDA EOTC FOR INPUT, SET EOT COUNTER STA EQT14,I WRITE. JMP BFSET,I * * * SUBROUTINE: * * PURPOSE: TO CONFIGURE THE I/O INSTRUCTIONS * IN THE DRIVER TO REFERENCE THE * SUBJECT TELETYPE. * * CALL: (A)05-00 CONTAINS I/O ADDRESS * (P) JSB SETIO * (P+1) -RETURN- (B) = EQT4,I * SETIO NOP IOR CLC COMBINE WITH I/O ADDRESS CPA IO5 ALREADY CONFIGURED? JMP SETIO,I -YES, EXIT STA IO5 * XOR B5200 CONSTRUCT INSTRUCTION STA IO3 * ADA .100B CONSTRUCT INSTRUCTION. STA IO2 STA IO6 STA IO9 * ADA .1100 CONSTRUCT INSTRUCTION STA IO4 STA IO7 * JMP SETIO,I HED < DRIVER 00 *COMPLETION* SECTION > * ********* COMPLETION SECTION ********** * * C.00 NOP * JSB SETIO SET I/O INSTRUCTIONS FOR UNIT. * LDB EQT4,I SSB,RSS JSB STEST CHECK IF SYSTEM TELETYPE JMP IO3 * ISZ OPATN OPERATOR ATTENTION FLAG JMP CXTZ * IO3 LIA 0 INPUT CHARACTER * D20 LDB EQT9,I GET REQUEST CONTROL WORD RBL BLF,BLF TO 0, TO 15 STB EQT6,I CLE,ELB ALSO PUT MODE IN E BLF,RBL SLB,RBL IF BIT 1 = 1, JMP D31 WRITE OR CONTROL REQUEST. * * INTERRUPT INPUT SECTION * SEZ,RSS ASCII MODE? AND MASK1 -YES, REMOVE 8-BIT * RBL,SLB IF VALID DATA RECEIVED, PROCESS. SZA IF NON-ZERO CHARACTER, JMP D21 PROCESS. * * CHECK FOR POSSIBLE EOT CONDITION * ISZ EQT14,I INDEX EOT COUNTER. JMP CXT1 -INDEX NOT ZERO, EXIT. LDA EQT4,I COUNT EXHAUSTED. IF LAST VALID AND .40 OPERATION CAUSED EOT, SZA THEN IGNORE LEADER UNTIL JMP CXT1 NON-ZERO DATA RECEIVED. CLB,CCE SET B = 0, E = 1 FOR EOT AND GO JMP D28 TO STATUS COMPLETION SECTION. * * PROCESS INPUT CHARACTER * D21 SEZ,CCE IF BINARY MODE, GO TO JMP D22 CHECK FOR VARIABLE FORMAT. * * ASCII INPUT PROCESSING * CPA MASK1 JMP D24 - RUBOUT - CPA RETN JMP CXT1 - RETURN - CPA LINF JMP D26 - LINE FEED - CPA ..+3 CHAR. JMP D26 SSB IF DRIVER IS WAITING FOR LINE JMP CXT1 FEED, EXIT. CPA ..+1 CCA,RSS -CONTROL/A JMP D23 VALID CHARACTER, STORE. * * * CONTROL/A PROCESSOR (CHARACTER DELETION) * JSB D2526 * ADB ..-1 SUBTRACT 1 FROM CURRENT STB EQT12,I BUFFER CHARACTER ADDRESS ADA EQT13,I SUBTRACT 1 FROM STA EQT13,I CHARACTER INDEX. JMP CXT1 - EXIT -. * * BINARY INPUT PROCESSING * D22 SLB CHECK IF FIRST CHAR. INPUT * * VARIABLE LENGTH CHECK AND PROCESSING * LDB EQT6,I CONTINUE IF SLB,RSS INPUT RECORD IS JMP D23 NOT VARIABLE LENGTH * LDB EQT9,I BLF,RBL SSB VARIABLE ABSOLUTE BINARY? ADA ..+3 -YES, BUMP RECORD LENGTH * STA B SAVE RECORD LENGTH (WORDS). BLS CONVERT TO # OF CHARS., ADB EQT13,I SUBTRACT REQUESTED LENGTH. SSB,RSS USE REQUESTED LENGTH IF SMALLER JMP D23 TO AVOID DESTROYING USER. STA B SET RECORD WORD COUNT ALS CONVERT COUNT TO CMA,INA A NEGATIVE CHARACTER COUNT STA EQT13,I AND SET IN EQT ENTRY. LDA EQT11,I GET REQUEST LENGTH CLE,ELA PUT SIGN BIT IN E LDA B RECORD LENGTH IN A SEZ SKIP-IF WORDS LDB EQT13,I SET NEG CHARS AS RECORD LENGTH STB EQT11,I AND RESTORE * * STORE CHARACTER IN USER BUFFER * D23 LDB EQT12,I GET CURRENT BUFFER ADDRESS. CLE,ERB CONVERT TO WORD ADDR., CHARACTER ISZ EQT12,I POSITION IN E, INDEX ADDRESS. SEZ,RSS SHIFT TO UPPER POSITION IF ALF,ALF EVEN ADDRESS. STA STEST -SAVE CHAR.- LDA MASK2 POSITION SEZ,CLE CHARACTER MASK (377) ALF,ALF TO PROPER POSITION AND B,I GET OPPOSITE CHAR. FROM BUFFER, IOR STEST INSERT NEW AND STA B,I REPLACE FULL WORD. * JSB EQT9X CLEAR BIT 14,15 IN EQT9 ISZ EQT13,I ADD 1 TO CHARACTER INDEX. JMP CXT1 -RECORD CONTINUED. * * CHARACTER COUNT EXHAUSTED * LDA EQT6,I IF BINARY MODE, SSA GO TO TERMINATE JMP D27 OPERATION. CXT0 LDA EQT9,I SET L-FEED FLAG BACK TO 1 TO IOR DATAI FORCE A LINE-FEED TO TERMINATE STA EQT9,I AN ASCII RECORD. * * CONTINUATION EXIT * IO4 STC 0 SET DEVICE TO INPUT NEXT CHAR. CXT1 EQU IO4 * CXTZ ISZ C.00 SET FOR (P+2) RETURN CLA SET A = 0 FOR INITIATOR JMP C.00,I -RETURN TO INTERRUPT CONTROL - * * * RUB-OUT CODE PROCESSOR (DELETION OF ASCII RECORD) * D24 CLB,INB JSB BFSET JMP CXT0 * * D2526 NOP LDB EQT10,I B5200 OCT 5200 CPB EQT12,I CURRENT BFR ADR = ORIGINAL? JMP CXT1 -YES, EXIT LDB EQT12,I JMP D2526,I * * * LINE-FEED PROCESSOR (RECORD TERMINATOR) * D26 JSB EQT9X SET BIT 15 IN EQT9 JSB D2526 CLE,ERB IF ODD # OF LDA B,I CHARACTERS AND MASK4 INPUT,SET IOR .40 LOWER CHARACTER SEZ OF LAST WORD STA B,I = TO BLANK (SPACE). * * STATUS AND TRANSMISSION COMPLETION SECTION * D27 LDA EQT13,I GET CHARACTER INDEX (NEG. OR 0) LDB EQT11,I AND ORIGINAL BUFFER LENGTH. INA SSB,RSS .1100 OCT 1100 SSB CMB ADB A CLE D28 LDA EQT4,I IF SIMULATED AND MASK4 EOT CONDITION SEZ DETECTED IOR .40 SET EOT BIT IN WORD 5. STA EQT4,I CLA,SEZ,CCE IF EOT DETECTED, SET LDA ..+2 RETURN STATUS = 2 FOR EOT. D29 STA EQT9X FOR RETURN TO I/O COMPLETION * * COMPLETION EXIT SECTION * IO5 CLC 0,C CLEAR DEVICE CONTROL JSB STEST DEVICE SYSTEM CONSOLE? JMP EZOUT P+1 = NOT SYS CONSOLE * ERA,ARS FORM CONSOLE CONTROL WORD IO6 OTA 0 OUTPUT IT IO7 STC 0,C EZOUT LDA EQT9X JMP C.00,I EXIT TO INTERRUPT CONTROL. * * * EQT9X NOP LDB EQT9,I BLR,ERB STB EQT9,I JMP EQT9X,I HED < OUTPUT COMPLETION SECTION > * * INTERRUPT OUTPUT SECTION * * D31 SSA,RSS CPA MASK2 IF = 377 (I.E, NO KEY STRUCK DUR- JMP D32 ING LAST OUTPUT), CONTINUE. * * JSB STEST RSS * * OPERATOR DESIRES SYSTEM ATTENTION AT SYSTEM TTY. * STA OPATN SET OP-ATTN FLAG NON-ZERO. * * WRITE RECORD REQUEST * D32 CLA IF CURRENT BUFFER ADDRESS CPA EQT12,I = ZERO, THEN JMP D27 OPERATION COMPLETED * SLB JMP D40 - CONTROL FUNCTION - * CPA EQT13,I IF CURRENT CHARACTER INDEX = JMP D33 0, THEN OUTPUT END OF RECORD. LDB EQT12,I GET CURRENT CHAR. BUFFER ADDRESS. ISZ EQT12,I INDEX FOR NEXT CHAR. CLE,ERB CONVERT TO WORD ADDR. LDA B,I GER WORD AND SEZ,RSS POSITION PROPER ALF,ALF CHARACTER IN A(07-00). AND MASK2 REMOVE UPPER POSITION DATA. * LDB EQT6,I PUT MODE IN B(15) ISZ EQT13,I INDEX CHARACTER COUNTER. JMP IO9 -NOT LAST CHARACTER- * SSB IF BINARY MODE, JMP IO9 WRITE LAST CHARACTER. * CPA ARROW IF CHAR = <_>, THEN OMIT IT JMP D27 AND CR/LF ON ASCII RECORD * * OUTPUT CHARACTER TO PRINTER/PUNCH UNIT * IO9 OTA 0 OUTPUT CHAR. TO INTERFACE BUFFER. * JMP CXT1 RETURN TO INTERRUPT CONTROL. SKP * * END-OF-RECORD PROCESSING * D33 LDA EQT6,I CHECK MODE SSA OF TRANSFER. JMP D27 -BINARY, GO COMPLETE * LDA RETN OUTPUT FIRST A CPA EQT14,I RETURN AND THEN LDA LINF A LINE-FEED STA EQT14,I SET FOR LINE-FEED CHECK * CLB CPA LINF LAST CHARACTER? STB EQT12,I -YES, SET BFR ADRS = 0 JMP IO9 * * CONTROL FUNCTION OUTPUT * D40 LDA EQT13,I (A) = LINE-FEED OR FEED FRAME ISZ EQT12,I INDEX OUTPUT COUNT FOR LEADER/ .40 OCT 40 JMP IO9 GO TO OUTPUT CHARACTER. * * * CONVERT LOGICAL UNIT TO EQT VALUE * STEST NOP CCA ADA LUTAB,I STA SETIO ALF ADA SETIO ADA EQTAB CPA EQT1 EQT1 = SYSTEM TTY? ISZ STEST -YES, EXIT (P+2) * JMP STEST,I THEN RETURN * HED CONSTANT STORAGE AND BASE PAGE * CLC CLC 0,C * PUNCH OCT 010000 BIT 12 * RETN OCT 15 < RETURN > ARROW OCT 137 < LEFT ARROW > * EOTC DEC -30 $ EOT COUNTER - 3 INCHES $ N100 DEC -100 * * A EQU 0 DEFINE SYMBOLIC REFERENCE FOR B EQU 1 A AND B REGISTERS. * * * *** SYSTEM BASE PAGE COMMUNICATION AREA *** * .. EQU 53B .10B EQU ..+8 .11B EQU ..+9 LINF EQU ..+10 OCT 12 .100B EQU ..+12 MASK1 EQU ..+16 OCT 177 MASK2 EQU ..+17 OCT 377 MASK4 EQU ..+18 OCT 177400 . EQU 100B ESTABLISH ORIGIN OF AREA * * * I/O MODULE/DRIVER COMMUNICATION * EQT1 EQU .+67 EQT4 EQU .+70 EQT5 EQU .+71 EQT6 EQU .+72 EQT9 EQU .+75 EQT10 EQU .+76 EQT11 EQU .+77 EQT12 EQU .+78 EQT13 EQU .+79 EQT14 EQU .+80 * * * SYSTEM MODULE COMMUNICATION FLAGS * * EQTAB EQU .+15 ADDRESS OF START OF EQPMT TABLE LUTAB EQU .+17 ADDRESS OF START OF L.U. TABLE OPATN EQU .+112 OPERATOR/KEYBOARD ATTENTION FLAG * * END