ASMB,Q,N,C,L * * NAME: DVB12 * SOURCE: 92002-18004 * RELOC: 92002-16004 * PGMR: G.G.(BOISE) * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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. * * *************************************************************** * NAM DVB12,0 92062-16004 REV.2013 800117 2:30PM ENT IB12,CB12,.BLAB EXT $UPIO,.LBT * EXT $DDT ************************************************************ * THE ASMB STATEMENT NEED ONLY CHANGE TO THE "Z" OPTION TO * SUPPORT THE OPTIONAL IFORM PARAMETER * * * 2608 DRIVER DVB12 BY G C GAPP * MODIFIED FOR HONISTY MODE BY C G GREGG 790326 * EXPECTED DATE CODE 1926 * * 16 JAN 1980 * MODIFIED BY GCG FOR 2 BUGS * 1. CLEAR EQT15 ON SPUR. INT TO GET RID * OF "ILL INT" MESSAGE * 2. PROTECT AGAINST NONSUPPORTED READS * * * IB12 NOP INITIATION ENTRY JSB SETIO CONFIGURE WITH CURRENT CHAN. # JSB TMOUT SET TIMEOUT VALUE LDA EQT11,I FORCE BIT15 = 0 SSA SET? XOR M100K YES - SO CLEAR IT STA EQT11,I CLA,INA JSB STAT CHECK PRINTER STATUS JMP NREDI NOT READY--GO REPORT IT * LDA EQT4,I EXTRACT THE SUBCHANNEL NUM AND M3700 CPA M300 DOES SUBCHANNEL = 3? RSS YES - CONTINUE FOR CHAR READ ON SC3 JMP RCODX NO - GO LOOK AT REQ CODE LDA EQT6,I NOW LOOK FOR CHAR SET READ AND M3777 CPA D1 READ CHAR SET? JMP CBSC3 YES - CHAR RD + SC3 IS OK CPA M201 NO - THEN IS IT READ STATUS? JMP PSTAT YES - RD STAT + SC3 IS OK JMP EXREJ ALLOW ONLY RD STAT & RD CHAR ON SC3 RCODX CCB SETUP TO CLEAR TOF BIT6 IN STATUS LDA EQT6,I GET FUNCTION AND REQUEST CODE AND M77 SAVE REQUEST CODE CPA D1 IS IT A READ REQUEST? JMP CBACK READ - GO GET CHARACTER SET CPA D2 WRITE REQUEST? JMP WRITE YES--GO PROCESS CPA D3 CONTROL REQUEST? JMP CNTRL YES--GO PROCESS EXREJ LDA D1 ILLEGAL REQUEST CODE, SET A=1 JMP IB12,I EXIT * CLRB8 ISZ EQT8,I TLOG = 1 FOR CHAR READ OF 0 CLRBX CLA XLOG OF XERO STA EQT8,I CLRBF LDA CLBUF BUFFER CLEAR COMMAND LDB DCLR RETURN ADDRESS JMP EXITI DCLR DEF EXIT5 * NREDI JSB VSTAT UPDATE PRINTER STATUS LDA D3 SET NOT READY RETURN JMP IB12,I EXIT SKP * * READ IN CHAR SET CBACK LDA EQT6,I GET CWD AND M3400 ISOLATE NON USED BITS 8,9,10 SZA ANY OF THEM SET? JMP EXREJ YES - EXIT WITH ILL REQUEST LDA EQT6,I NO - PROCEED WITH OK READ ALF,ALF GET PING/PONG TO BIT15 RAL AND ST RD/CHAR RD TO BIT0 SSA PING/PONG? JMP PINPO YES - DO P/P SLA NO - THEN IS IT A STAT READ? JMP PSTAT YES - DO STATUS READ CBSC3 LDA EQT6,I IOR M100 FORCE BIT6 SET FOR PACKED FLAG LDB EQT8,I BUFFER LENGTH SZB,RSS BUF LENGTH = 0? ISZ EQT8,I YES - SET LENGTH 0 = 1 SSB,RSS PACKED OR UPPACKED REQUEST? JMP CBA UNPACKED - CLEAR BIT6 & BUFL IS OK CMB,INB PACKED -BIT6 OK BUT NEED POS BUFL STB EQT8,I EQT8 IS FOR XLOG(MAYBE) RSS BYPASS CLEAR OF BIT6 CBA XOR M100 FORCE BIT6 CLEAR FOR UNPACKED STA EQT6,I LDA EQT9,I IPRAM ALF MOVE CHAR SET CODE TO BITS0-3 AND M17 EXTRACT THEM XOR CHARB MERGE IN THE READBACK CONTROL WORD LDB CBI A=CMND B=RET ADDRESS JMP EXITI CBI DEF CBR CBR LDA M1153 MAX EVER OF # OF BYTES AVAILABLE STA EQT13,I JSB INTOA READ THE ACTUAL CHAR SET CODE ALF,ALF CHAR SET CODE TO BOTTOM LDB EQT7,I BUFFER ADDRESS STA B,I 1ST WORD RIGHT JUSTIFIED IN BUFF ISZ EQT7,I ADJUST ADDRESS FOR 1ST DOT DATA LDB EQT8,I USE B INSTEAD OF EQT8 TO SAVE SZB,RSS BUFF LENGTH = ZERO? JMP CLRB8 YES - GO SET TLOG =1 FOR ZERO ADB ND1 DECREASE BY ONE SZB,RSS BUFF LENGTH = ONE? JMP CLRBF YES - DO CLEAR BUFFER & EXIT LDA EQT9,I EXTRACT 1ST REQED CHAR CODE AND M177 RANGE IS 0 THRU 177B SZA,RSS WAS A CODE SUPPLIED? JMP CBX NO - READ STARTING WITH FIRST CMA,INA YES - MAKE CODE FOR 1ST CHAR NEG STA EQT12,I CB1 LDB ND9 9 BYTES PER CHAR CB2 JSB INTOA GET A BYTE ISZ EQT13,I LAST POSSIBLE BYTE? RSS NO - CONTINUE JMP CLRBX YES - EJECT ISZ B 9TH BYTE? JMP CB2 NO - GET NEXT ISZ EQT12,I YES - DONE WITH DUMP? JMP CB1 NO - LOOP FOR 9 MORE BYTES * IF NECESSARY - ADJUST USER BYTE COUNT TO REMAIN BYTES CBX LDA EQT13,I # OF BYTES YET POSSIBLE(NEG) LDB EQT8,I # OF BYTES REQUESTED (POS) ADB A CMA,INA MAKE BYTES LEFT POS IN CASE SKIP SSB,RSS ADJUST EQT13 IF REM CNT > REQUEST JMP CBX1 NOT NECESSARY LDA EQT8,I NEGATE USER COUNT CMA,INA STA EQT13,I USE AS REMAINING COUNT RSS CBX1 STA EQT8,I WILL BE XLOG * * CBCON LDA EQT11,I IOR M4 SET CHAR READBACK FLAG IN EQT11 STA EQT11,I LDB EQT13,I ANY READBACK LEFT? SZB,RSS JMP EXIT5 NO - EXIT CLE TOP OF WORD CB4 LDA EQT7,I SET UP USER BUFFER ADDRESS STA EQT10,I LDA ND9 GET DOT ROWS/CHAR COUNTER STA EQT12,I SAVE IT CB5 JSB INTOA READ FROM THE PRINTER LDB EQT6,I LOOK AT BIT6 OF EQT6 FOR BLF,BLF UNPACKED/PACKED FLAG(0/1) RBL BIT6 TO SIGN SSB IS IT PACKED? JMP PDATA YES - PROCESS PACKED DATA ALF,ALF NO - MOVE TO BOTTOM OF WORD CCE SET E FOR EXIT LDB EQT10,I B = BUFFER ADDRESS JMP UNPAK UNPACKED READ * * PDATA LDB LOBYT A=CHAR IN TOP - B=MASK IN BOTTOM SEZ,RSS TOP OF WORD? JMP PD1 YES - THEN A & B OK! ALF,ALF NO - MOVE CHAR TO BOTTOM BLF,BLF & MASK TO TOP PD1 STA STAT CHARACTER STB BUFL MASK LDB EQT10,I BUFFER ADDRESS LDA B,I GET ITS CONTENTS AND BUFL SAVE OLD DATA IOR STAT MERGE IN NEW DATA * UNPAK STA B,I RESTORE IN USERS BUFFER ISZ EQT13,I ANY CHARS LEFT? RSS YES JMP CLRBF NO - EXIT READBACK ISZ EQT10,I UPDATE BUFFER INDEX ISZ EQT12,I DONE WITH 9 DATA BYTES? JMP CB5 NO - GET NEXT DATA BYTE SEZ,CME,RSS CHECK IF STILL NEED BOTTOM OF PACKED DATA JMP CB4 YES- GET 9 MORE BYTES INB NO - UPDATE USER BUFF POINTER FOR STB EQT7,I NEXT CHARACTER(IF ANY) JMP EXIT1 RETURN TO SYS * PSTAT LDA EQT8,I # OF BYTES OF STATUS REQED SSA DID IT COME AS POS COUNT? JMP EXREJ NO - REJECT IT! SZA,RSS LENGTH = ZERO? INA YES - CONVERT TO 1 STA EQT8,I SAVE FOR XLOG LDB D127 CMA,INA MAKE COUNT NEGATIVE ADA D127 ADD 127 SSA IS USER COUNT>127 STB EQT8,I YES-RESET WITH MAX LDA EQT8,I GET DESIRED # OF STATUS WORDS IOR STATR BUILD STAT RDBK CNWD LDB SRBKI A=CNWD B=RET ADD JMP EXITI SRBKI DEF SRBKR SRBKR LDB EQT8,I # OF BYTES TO RETURN CMB,INB USE AS BYTE COUNT YET TO GO STB EQT9,I LDB EQT7,I BUFFER ADDRESS RSTA2 JSB INTOA GET A BYTE OF THE ROCK ALF,ALF TO THE BOTTOM STA B,I PUT IN USERS BUFFER ISZ B UPDATE ADDRESS ISZ EQT9,I DONE? JMP RSTA2 NO - GO BACK JMP EXIT5 YES - EXIT * * PINPO LDA EQT8,I GET USERS BUFFER LENGTH CPA D1 BUFFER LENGTH = 1 ? JMP P1 YES-CONTINUE CPA M401 BUFFER LENGTH = 257 ? RSS YES-CONTINUE JMP EXREJ NO-REJECT REQUEST P1 LDA PING "PING" CONTROL WORD LDB PIADD A=CWD B=RET ADDRESS JMP EXITI PIADD DEF PIRET PIRET CLA INITIALIZE CHARACTER COUNT OUTCH JSB OUTA OUTPUT CHARACTER TO PRINTER INA INCREMENT CHARACTER COUNT CPA M400 A = 256 ? JMP PON YES-PING DONE, NOW PONG JMP OUTCH NO-OUTPUT ANOTHER CHARACTER PON LDA PONG "PONG" CONTROL WORD LDB POADD A=CWD B=RET ADDRESS JMP EXITI POADD DEF PORET PORET CLA STA EQT12,I INITIALIZE PASS/FAIL CODE WORD STA EQT13,I INITIALIZE CHARACTER COUNTER LDA EQT7,I GET USERS BUFFER ADDRESS STA SETIO STORE TEMPORARILY INCH JSB INTOA INPUT CHARACTER FROM PRINTER ALF,ALF CHARACTER TO BOTTOM AND LOBYT SAVE LOWER BYTE LDB EQT8,I GET USERS BUFFER LENGTH CPB D1 BUFFER LENGTH = 1 ? JMP P2 YES-DONT SAVE CHARACTER ISZ SETIO NO-PUT CHARACTER IN USERS BUFFER STA SETIO,I P2 CPA EQT13,I IS RETURNED CHARACTER CORRECT ? RSS YES-CONTINUE ISZ EQT12,I NO-INCREMENT ERROR COUNT LDA EQT13,I GET CHARACTER COUNTER CPA LOBYT = 255 ? JMP EXIT6 YES-PONG DONE,FINISH UP ISZ EQT13,I NO-INCREMENT CHARACTER COUNTER JMP INCH GO INPUT ANOTHER CHARACTER EXIT6 LDA EQT12,I GET PASS/FAIL CODE WORD SZA DID PONG FAIL ? IOR M100K YES-TURN ON BIT 15 LDB EQT7,I GET USERS BUFFER ADDRESS STA B,I PUT CODE WD IN 1ST WORD OF BUFFER JMP CLRBF CLEAR BUFFER AND EXIT * * ************************************************************ * * WRITE PROCESSOR * * WRITE LDA EQT6,I GET ICNWD AND B1000 EXTRACT VFC DEFINE BIT9 DEF BITS SZA VFC DEFINE? JMP VDEF YES - PROCESS IT! JSB TOFB6 CLEAR TOF STATUS (B=-) JSB BUFL CONVERT IBUFL TO CHARACTER COUNT LDA EQT11,I SEE IF MODE = GRAPHICS ALF,ALF AND M17 EXTRACT MODE CPA M2 GRAPHICS? RSS YES - THEN PROCESS IFORM JMP WRITR NO * IFZ LDA EQT9,I AND LOBYT EXTRACT BITS 0 THRU 7 OF IFORM SZA,RSS ANYTHING SUPPLIED? CLA,INA NO - DEFAULT IS SLEW 1 DOT ROW IOR CALPH CONTROL WORD FOR GRAPHICS PRINT XIF * IFN LDA M1001 GRAPHICS DEFAULT = 1DOT ROW SLEW XIF * JMP WRIT3 WRITR LDB CALPH SLEW 0 COMMAND LDA EQT11,I AND M200 ISOLATE SUPPRESS SPACE BIT SZA,RSS IS IT REQUESTED? JMP WRITT NO - GO CHECK FOR AUTO EJECT XOR EQT11,I YES - CLEAR THE FLAG STA EQT11,I JMP WRITU WRITT ADB M202 BUILD VFC CH3 CMND LDA EQT11,I BIT1 OF EQT11 IS AUTO EJECT FLAG RAR,SLA IS IT ON(=0) OR OFF(=1) LDB M1001 OFF - USE SLEW 1 FLAG WRITU STB EQT10,I SPC 1 ******************************************************* * * NEXT FOUR INST. ADDED FOR HONISTY MODE * LDA EQT6,I GET ICNWD AND B2000 LOOK AT BIT 10 SZA IF SET JMP WRIT5 GO DO HONISTY MODE * ****************************************************** SPC 1 IFZ LDA EQT9,I GET IFORM SZA,RSS DID USER SUPPLY IFORM? JMP WRITW NO AND LOBYT ISOLATE LOW 8 BITS IOR CALPH ADD BIT15 TO FORM CMND JMP WRIT3 BYPASS FURTHER CHECKS XIF * WRITW LDA EQT6,I GET ICNWD ALF,ALF MOVE V-BIT TO HIGH BIT .BLAB SSA SKIP IF NOT SET JMP WRIT5 GO PROCESS REQULAR PRINT * * LDA EQT13,I SZA,RSS ARE THERE ANY CHARACTERS? JMP WRIT5 NO - GO PRINT LDB EQT7,I GET FIRST WORD LDA B,I AND HIBYT SAVE FIRST BYTE CPA EJCT JMP FF GO DO FORM FEED (CC=1) CPA DSPAC JMP DBLE GO DO DOUBLE SPACE (CC=0) CPA ASTR JMP SUP GO DO SUPPRESS SPACE (CC=*) JMP VB2 DEFAULT TO BLANK OR ANY OTHER CHAR FF LDA TOF GET VFC CH3 CMND LDB EQT13,I LOAD CHARACTER COUNT INB AND INCREMENT SZB WAS THERE ONLY ONE CHARACTER JMP DBLE+1 NO - CONTINUE STB EQT13,I YES - UPDATE CHARACTER COUNT JSB TOFB6 SET TOF ON LAST CMND STATUS(B=+) JMP EXOTA AND GO DUMP COMMAND DBLE LDA EQT10,I VFC CH3 OR SLEW 1(AUTO EJECT?) LDB DVBIT RETURN ADDRESS JMP EXITI DVBIT DEF VB2 SUP LDA M100K SLEW 0 CMND STA EQT10,I VB2 ISZ EQT13,I BUMP CHAR. CNTR. RSS SKIP IF NOT ZERO JMP WRIT5 ONLY ONE CHAR. LDA B,I GET FIRST WORD OF USER'S DATA AND LOBYT SAVE SECOND WORD JSB OUTA GIVE IT TO PRINTER INB BUMP ADDRESS STB EQT7,I RETURN IT ISZ EQT13,I BUMP CHAR COUNT NOP JMP WRIT5 SKP * * * * ROUTINE TO DUMP VFC DEF. DATA TO PRINTER * * VDEF LDA EQT8,I GET IBUFR AND LOBYT STA B STORE TEMPORARILY AND M177 SAVE LOWER 7 BITS STA EQT8,I USE AS FORMS LENGTH SZA,RSS FORMS LENGTH = 0? JMP EXREJ YES - REJECT THE REQUEST JSB BUFL SET EQT13 TO # 0F BYTES LDA B RELOAD ORIGINAL IBUFL IOR VFCRS MERGE IN COMMAND BYTE LDB VD1AD CMND IN A - RTN ADD IN B JMP EXITI VD1AD DEF VD1 VD1 JSB BUFL CONVERT # OF LINES TO # OF WORDS LDA CLBUF SET UP TERMINATION COMMAND JMP WRIT3 WRAP IT UP * * * WRIT5 LDA EQT10,I GET COMPUTED COMMAND WRIT3 STA EQT9,I SAVE RESULT IN EQT9 LDB EQT7,I GET USER BUFFER ADDR. JMP PRNT GO DUMP LINE EXIT0 LDA EQT9,I GET COMMAND BYTE JSB OUTA DUMP IT EXIT1 LDA EQT11,I GET PROG STATUS EXIT3 SSA CHECK FOR CONTINUATION EXIT JMP EXITC GO TO CONTINUATION EXIT CLA CLEAR A FOR INITIATION RETURN JMP IB12,I * * EX5AD DEF EXIT5 COMMAND COMPLETE RETURN EXOTA LDB EX5AD RET ADD EXITI STB EQT12,I SAVE TIME OUT RTN ADD LDB EQT11,I SET FLAG FOR OUTPUT OF COMMAND SLB,RSS INB STB EQT11,I JSB OUTA JMP EXIT1 MAKE APPROP RETURN * * SKP **************************************************************** * * * ROUTINE TO PROCESS CONTROL REQUEST * * CNTRL LDA EQT6,I GET ICNWD AND M3700 EXTRACT FUNCTION CODE * SZA,RSS CLEAR REQUEST? JMP CLR YES - PROCESS IT! * CPA B600 DYNAMIC STATUS JMP DYNAM YES * CPA B1100 VFC FORMS REQUEST? JMP VCNTR YES * CPA B1500 CHARACTER SET CHANGE? JMP XCHAR YES * CPA B1600 VFC RESET? JMP VFCR YES * * CPA B2000 SELF TEST? JMP STEST YES * CPA B2100 DEFINE COLUMN 1? JMP PCOL1 YES * CPA B3000 PRINT MODE CHANGE? JMP CPMOD YES - PROCESS IT! * * CPA B1000 START DEBUG? * JMP DEBUG YES GO DO IT * * EXIT2 LDA D2 ERROR - ILLEGAL FUNCTION CODE JMP IB12,I * *EBUG JSB $DDT * NOP * JMP EXIT4 * * FORCE 2608A UNBUFFERED TO INSURE DYN STATUS * DYNAM LDA ND1 NEG OF # OF BYTES TO READ IN A JSB RSTAT ON RETURN BYTE IS IN TOP OF A JMP EXIT5 COMPLETION EXIT(NOT IMMED FOR 2608) * VCNTR LDA CALPH STA EQT10,I STORE ALPHA PRINT TO GO WITH FORMS CONTROL JSB TOFB6 CLEAR TOF STATUS (B=-) CLB SET B=+ IN CASE TOF REQUESTED LDA EQT7,I GET IPRAM SZA SUPPRESS SPACE ON NEXT OP? JMP VCNTX NO LDA EQT11,I YES - SET BIT7 OF EQT11 IOR M200 STA EQT11,I JMP EXIT4 DO IMMEDIATE EXIT! VCNTX SSA IS IT NEGATIVE? LDA D63 SET UP FOR PAGE EJECT (VFC CHAN 1) ADA ND74 ADD -74 * SSA,RSS LEGAL CODE? JMP EXIT2 NO-- ERROR RETURN * ADA D8 CHECK FOR CHANNELS 9-16(66-73) SSA,RSS JMP VFC PROCESS CHAN 9-16 REQUEST * ADA D2 CHECK FOR AUTO PAGE CHANGE(64-65) SSA,RSS JMP AUTO PROCESS AUTO EJECT ON OFF * ADA D2 CHECK FOR CHANNELS 1-2 SSA SKIP IF IT IS CHANNEL 1 OR 2 JMP VFC2 GO CHECK CHANNELS 3-8 * XOR D1 63TO0(TOF) 62TO1(BOF) SZA,RSS TOF COMMAND? JSB TOFB6 YES - SET TOF BIT IN STATUS WD(B=+) JMP VFC1 GO TO EXECUTE CHANNEL * VFC2 ADA D6 CHECK FOR CHANNELS 3-8 SSA JMP SLEW NOPE--MUST BE SLEW * ADA D2 INCREMENT 2 TO GET CHAN. # * JMP VFC1 VFC CPA D3 CHAN 12? JSB TOFB6 YES - SET TOF IN STATUS (B=+) ADA D8 ADD 8 TO GET CHANNELS 9-16 VFC1 XOR M200 REVERSE BIT 7 RSS SLEW ADA D56 ADD 56 TO GET # LINES TO SLEW * IOR EQT10,I MERGE COMMAND BYTE JMP EXOTA GO DUMP IT AND CONTINUE * AUTO STA B LDA EQT11,I IOR M2 FORCE BIT1 SET(ASSUME P EJ OFF) SZB,RSS AUTO EJECT ON OR OFF? XOR M2 ON - CLEAR BIT1 STA EQT11,I * EXIT4 LDA D4 IMMEDIATE COMPLETION CODE IN REG.A JMP IB12,I EXIT * XCHAR LDA ND16 NEG OF # OF BYTE REQUESTED JSB RSTAT ON RETURN THE BYTE IS IN TOP OF A STA B LDA EQT7,I GET PRIM/SEC LANG CODE(S) AND LOBYT INSURANCE IOR B MERGE: TOP=F. PANEL BOTTOM= REQ STA EQX2,I SAVE FOR POWER FAIL/RESET AND LOBYT GET USER REQUEST BACK IOR CCHAR BUILD PRIM/SEC MODIFY CNWD STA B LDA EQX3,I SET "CHANGED PRIM/SEC" FLAG IOR M100K STA EQX3,I LDA B JMP EXOTA SEND CONTROL WORD * PCOL1 LDA EQT7,I REQED NUMBER OF SHIFTS AND M17 INSURE ONLY 4 BITS STA B LDA EQX1,I CLEAR STAT AND NOT15 BUT NOT BIT 15 XOR EQX1,I IOR B SAVE PROG COL 1 STAT STA EQX1,I AND M3777 IOR CLBUF MERGE INTO BUFFER CLEAR COMMAND JMP EXOTA SEND IT THEN EXIT * VFCR LDA VFCRS RESET VFC LDB EQT7,I 0 FOR 6LPI 1 FOR 8LPI RESET SZB 6LPI? ADA M200 NO - SET BIT7 FOR 8LPI RESET JMP EXOTA * CLR LDA EQT11,I CLEAR MODE BITS 8 THRU 11 AND CMODX AND TRANSPARITY(BIT12) STA EQT11,I AND PAGE EJECT(BIT 1) CLA STA EQX1,I CLEAR PROG COL 1 STATUS STA EQX3,I CLEAR "PRIM/SEC MODIFIED" FLAG LDA TOF DO A TOP OF FORM LDB TOFAD RET ADDRESS JMP EXITI TOFAD DEF TOFRT TOFRT CLB STB EQT13,I CLEAR CHARACTER OUTPUT COUNTER JSB TOFB6 SET TOF IN STATUS (B=+) LDA MCLR THEN DO A MASTER CLEAR JMP EXOTA * CPMOD LDA EQT7,I GET IPRAM AND M37 MODE=BITS0-3: TRANSPARITY=BIT4 STA B STA TOFB6 LDA EQT11,I UPDATE MODE AND T IN EQT11 AND CMODE EXCLUDE BITS 8 THRU 12 BLF,BLF MOVE REQUEST TO BITS 8 THRU 12 ADA B MERGE OLD FLAGS AND NEW MODE + T STA EQT11,I SAVE FOR RESTORE IF POWER FAIL LDA TOFB6 LOOKING FOR MODE AND T BIT IOR CSTND INCLUDE CONTROL WORD BITS LDB UPADD A=CWD B=RET ADDRESS JMP EXITI UPADD DEF EXIT5 EXIT * STEST LDA M3200 RESET TIMEOUT VALUE FOR SELFTEST STA EQT15,I LDA SLFTS SELF TEST CONTROL WORD LDB EQT7,I 0/1 = PRINT/NO PRINT FLAG SLB PRINT? INA NO PRINT SELECTED! JMP EXOTA * SKP *************************************************************** * * CONTINUATION/COMPLETION SECTION * ON ENTRY A=PRINTER SUBCHANNEL * * CB12 NOP JSB SETIO CONFIGURE FOR CURRENT SC LDA EQT1,I SPURIOUS INTERRUPT? SZA,RSS JMP AUTUP YES SCRAM JSB TMOUT SET TIMEOUT VALUE LDA EQT11,I GET DRIVER STATUS WORD IOR M100K TURN ON BIT15 STA EQT11,I REPLACE SLA,RSS COMMAND WORD OUTPUT? JMP XCONT NO - CHECK FOR CONTINUATION RETURN XOR D1 YES - CLEAR FLAG AND RESTORE STA EQT11,I LDA EQT12,I RESUME PROCESS LDB EQT7,I BUFFER ADD IF COMMAND OUTPUT JMP A,I XCONT RAR,RAR CHECK FOR CLE,SLA CHAR READBACK CONT JMP CBCON LDB EQT13,I ANY CHARACTERS LEFT TO DUMP? SZB,RSS JMP EXIT5 NO -- SCRAM LDB EQT7,I GET BUFFER ADDR. JMP PRNT CONTINUE DUMPING LINE EXIT5 LDA EQT11,I AND CONTU TURN OFF ALL CONTINUATION BITS STA EQT11,I REPLACE WORD JSB VSTAT UPDATE PRINTER STATUS LDB EQT8,I GET IBUFL * SSB SKIP IF POSS. WORD COUNT CMB,INB CLF2 CLF 0 CLEAR FLAG CLA JMP CB12,I COMPLETION RETURN * * EXITC ISZ CB12 CONTINUATION EXIT JMP CB12,I * * * * AUTUP JSB STAT CHECK STATUS JMP NREDC NOT READY- NO AUTO UP SPCLF CLF 0 CLEAR FLAG FOR SPURIOUS INT CLB RESET TIME OUT TO 0 STB EQT15,I JMP $UPIO * * ROUTINE TO ADJUST USER BUFFER LENGTH TO NEG. CHAR. COUNT * BUFL NOP LDA EQT8,I GET IBUFL SSA SKIP IF POS. WRD CNT JMP BUFX ALS CONVERT WORD COUNT TO CMA,INA NEGATIVE CHAR. COUNT BUFX STA EQT13,I RESTORE JMP BUFL,I RETURN * * * ON ENTRY B = NEG = CLEAR BIT6 * = POS = SET BIT6 * TOFB6 NOP STA BUFL TEMP SAVE OF A REG LDA EQT5,I IOR M100 FORCE BIT6 SET SSB SET OR CLEAR BIT6? XOR M100 CLEAR IT! STA EQT5,I LDA BUFL RESTORE A REG JMP TOFB6,I * * ******************************************************************** * * ROUTINE TO DUMP USER BUFFER TO LINE PRINTER * ON ENTRY "B" IS BUFFER ADDRESS * * * PRNT LDA EQT13,I CHECK FOR ANY CHAR. SZA,RSS YES--CONTINUE JMP EXIT0 NO--RETURN LDA ND40 SET UP MAX CHAR. DUMP CNT. STA EQT12,I FOR 80 BYTES CLE,ELB SET TO BYTE ADDRESS PRTA JSB .LBT GET BYTE JSB HMODE WRITE TO THE PRINTER JSB .LBT GET BYTE JSB HMODE WRITE TO THEPRINTER ISZ EQT12,I CHECK FOR LAST CHAR. PER PASS JMP PRTA RBR CHANGE TO WORD ADDR. STB EQT7,I SAVE BUFF. ADDR. JMP EXIT1 GO TO NEXT BLOCK SKP * ************************************************************** * * ROUTINES TO DETECT HONISTY MODE AND EXECUTE * CONTROL CHARACTERS CR LF FF * * HMODE NOP CPA .LF JMP ..LF DO A LINE FEED CPA .CR JMP ..CR DO A RETURN CPA .FF JMP ..FF DO A FORM FEED STB EQT7,I SAVE B COUNT LDB EQX1,I LOOK TO SEE IF THIS IS A NEW LINE SSB,RSS IF NOT JMP HMOD0 CONTINUE AS ALWAYS LDB EQT7,I RESTORE B JSB HMOD2 CHECK FOR HONESTY, RTN IF YES LDA EQX1,I CLEAR NEW LINE FLAG AND M100K XOR EQX1,I STA EQX1,I LDB EQX3,I GET NUM OF CHAR OUTPUT ON PREV LINE ELB,BRS SAVE SIGN BIT FOR FLAG CMB,INB MAKE TWOS COMP SZB,RSS IF THERE ARE NO BLANKS JMP HMOD0 THEN OUTPUT NOTHING LDA M40 FILL IN LINE WITH SPACES LF4 JSB OUTA UP TO LINE FEED INB,SZB JMP LF4 LDA TEMP1 HMOD0 LDB EQT7,I RESTOR LINE COUNT HMOD5 JSB OUTA WRITE IT TO PRINTER ISZ EQX3,I COUNT CHAR ON LINE SO FAR HMOD1 ISZ EQT13,I BUMP CHAR COUNT JMP HMODE,I CONTINUE IF NOT DONE LDA EQT6,I CHECK FOR HONESTY MODE AND B2000 SZA JMP EXIT1 THEN TAKE THE HNSTY EXIT LDA EQX3,I CLEAR CHAR COUNT IF NOT HNSTY MODE AND NOT15 XOR EQX3,I STA EQX3,I JMP EXIT0 EXIT * HMOD2 NOP STA TEMP1 SAVE A STB EQT7,I SAVE B LDA EQT6,I CHECK FOR HONESTY MODE AND B2000 SZA JMP HMOD3 LDA TEMP1 JMP HMOD0 NOT HNSTY, OUTPUT HMOD3 LDA HMODE STA EQT10,I SAVE RETURN JMP HMOD2,I * ..LF JSB HMOD2 RTN IF NOT HNSY MODE LDA EQX1,I SET NEW LINE FLAG IOR M100K STA EQX1,I LDA EQT9,I GET THE SET PRINT COMMAND LDB LF3 RETURN TO THIS ADDRS JMP EXITI WHEN DONE--- LF3 DEF CR3 * ..CR JSB HMOD2 IF HNSY MODE LDA EQX1,I LOOK TO SEE IF THIS IS A NEW LINE SSA IF SO JMP CR2+1 A NULL FIRST LINE IS NOT ALLOWED LDA M100K DO A PRINT AN SLEW 0 LDB CR2 RETURN TO ADDRS IN B REG JMP EXITI CR2 DEF *+1 LDA EQX3,I RESET CHAR COUNT AND NOT15 XOR EQX3,I STA EQX3,I CR3 LDA EQT10,I GET RTN ADDR STA HMODE LDB EQT7,I RESTORE B JMP HMOD1 * ..FF JSB HMOD2 IF IN HNSY MODE LDA EQX1,I SET NEW LINE FLAG IOR M100K STA EQX1,I LDA TOF GO TO TOP OF FORM LDB CR2 RETURN TO THIS ADRS IN B JMP EXITI WHILE WAITTING FOR COMP. SKP * * * ROUTINE TO CHECK PRINTER STATUS * IF A = 0 THEN ENTRY FROM SPURIOUS INTERRUPT * IF A NOT 0 THEN INITIATOR/CONTINUATOR ENTRY * P+1=BAD STATUS * P+2=GOOD STATUS * * STAT NOP CHECK FOR ON LINE/READY STA B SAVE INTERRUPT TYPE FLAG S1 LIA 0 GET STATUS FROM PRINTER STA VSTAT TEMP SAVE OF STATUS ALF,ALF POWER FAIL STATUS TO BIT0 SLA,RSS POWER FAIL SET? JMP S2 NO - GO CHECK IF SPUR. INT. ENTRY SZB,RSS SPURIOUS INTERRUPT? JMP S4 YES - RET VIA $UPIO TO SEE IF SCHED LDA ON.OF INA "ON LINE" CONTROL WORD LDB S4ADD A = CWD B = RET ADDRESS JMP EXITI S4ADD DEF S4RET S4RET LDA MCLR THEN DO A "MASTER CLEAR" LDB MCADD A = CWD B = RET ADDRESS JMP EXITI MCADD DEF MCRET MCRET LDA EQT11,I THEN RESTORE MODE AS PER EQT11 ALF,ALF AND M37 EXTRACT MODE AND TRANSPARITY BITS IOR CSTND CONTROL WORD LDB MODAD A = CWD B = RET ADDRESS JMP EXITI MODAD DEF MODRT MODRT LDA EQX1,I GET PROG COL 1 STATUS AND M17 IOR CLBUF ADD CLEAR BUFFER CNWD LDB CL1AD A = CWD B = RET ADD JMP EXITI CL1AD DEF CL1RT CL1RT LDB EQX3,I GET "MODIFIED P/S" FLAG SSB,RSS WAS IT MODIFIED? JMP SCHN1 NO - THEN LOCAL FRONT PANEL OK LDA ND16 YES - NEG OF # OF REQ'ED BYTE JSB RSTAT ON RET TOP OF A IS FRONT PANEL STA TOFB6 TEMP SAVE LDA EQX2,I GET LAST VALUE AND HIBYT IN TOP OF WORD CPA TOFB6 EQUAL? JMP GETPS YES - INSTALL LAST REQ'ED VALUE LDA EQX3,I NO - LET CURRENT DEFINITION STAND AND M100K XOR EQX3,I STA EQX3,I CLEAR "PRIM/SEC MODIFIED" FLAG JMP SCHN1 GETPS LDA EQX2,I AND LOBYT GET LAST REQ'ED PRIM/SEC VALUE IOR CCHAR LDB PSADD A = CNWD B = RET ADD JMP EXITI PSADD DEF SCHN1 * SCHN1 LDA EQT4,I FINALLY LOOK AT SUBCHANNEL AND M3700 MASK=3700B CPA M100 SC = 1? RSS YES - RETURN WITH NOT READY JMP S1 NO - IGNORE THE POWER FAIL LDA ON.OF NOT READY SO GO OFFLINE LDB OFADD A=CWD B=RET ADDRESS JMP EXITI OFADD DEF S3 * S2 SZB,RSS SPURIOUS INTERRUPT? JMP S4 YES - ENTRY FROM "ON LINE" INT! LDA VSTAT NO - ENTRY FROM INITIATOR! AND M1401 SAVE BITS 15,14,0 CPA M1001 SKIP IF STATUS NOT GOOD JMP S4 GOOD STATUS S3 CLF 0 CLEAR FLAG JMP STAT,I AND GIVE P+1 RETURN S4 ISZ STAT P+2 FOR GOOD STATUS JMP STAT,I RETURN * * * * ROUTINE TO RETURN DYNAMIC STATUS * * VSTAT NOP LDA EQT5,I GET OLD STATUS WORD AND HIBX1 DUMP OLD STATUS WORD STA B SAVE VS1 LIA 0 GET NEW STATUS ALF TOP 4 BITS TO BOTTOM STA STAT TEMP SAVE AND M17 SAVE ONLY LOW 4 BITS(WERE TOP 4) IOR B APPEND TO EQT5 REMNENT LDB STAT RECALL OLD STATUS SSB VFC INITILIZED? IOR M20 YES - SET BIT4 IN EQT5 RBL 6/8LPI TO SIGN SSB 8LPI? IOR M40 YES - SET BIT5 IN EQT5 LDB STAT FOR THE LAST TIME BLF POWER FAIL TO BIT0 SLB DID POWER FAIL? IOR M200 YES - SET BIT7 IN EQT5 STA EQT5,I FINALLY SAVE THE UPDATED STATUS JMP VSTAT,I EXIT * * * ROUTINE TO OUTPUT CONTENTS OF REG. A * OUTA NOP O0 SFS 0 SKIP IF FLAG SET JSB TIME CHECK FOR TIME OUT O1 OTA 0 DUMP WORD O2 STC 0,C JMP OUTA,I RETURN * * * ROUTINE TO INPUT DATA FROM THE PRINTER INTO * TOP 8 BITS OF A REGISTER * * INTOA NOP INA1 SFS 0 JSB TIME CHECK FOR TIME OUT! INA2 LIA 0 READ DATA BYTE AND HIBYT CLEAR DEMAND BIT INA3 STC 0,C GET READY FOR NEXT DATA JMP INTOA,I RETURN * * TIME NOP STA VSTAT SAVE CHARACTER TEMPORARILY LDA ND100 PICK UP LOOP COUNTER TIM1 SFC 0 SKIP IF CHAR NOT ACCEPTED JMP TIM2 SSA,INA SKIP IF DELAY TIME EXCEEDED JMP TIM1 JMP EXIT1 TIME-OUT RETURN THROUGH IB12 OR CB12 TIM2 LDA VSTAT RESTORE CHARACTER TO A REG. JMP TIME,I RETURN TO CALLING CODE * * DETERMINE TIMEOUT DELAY FOR DRIVER. THIS OVERRIDES EITHER THE * TO VALUE AT GEN TIME OR AN OPERATOR SUPPLIED VALUE. * TMOUT NOP LDB DM250 2SEC DELAY EXCEPT FOR 2X & SELFTEST LDA EQT11,I ALF,ALF CURRENT PRINT MODE TO BITS 0 THRU 3 AND M17 EXTRACT THEM CPA D1 IN DOUBLE SIZE? BLS YES - DOUBLE THE DELAY (5 SEC) STB EQT15,I TIMEOUT FOR DVB12(UNLESS SELT TEST) JMP TMOUT,I EXIT * * THIS SUBROUTINE WILL RETURN A SPECIFIC STATUS BYTE * AS REQUESTED BY THE A REGISTER. PROVIDE THE COMPLEMENT * TO THE REQUESTED VALUE. VALUE IS IN TOP OF A REG. * RSTAT NOP STA TOFB6 NEG OF # OF BYTES TO READ CMA,INA MAKE IT POSITIVE IOR STATR MERGE IN CNWD LDB STATA A = CNWD B = RET ADD JMP EXITI STATA DEF STATX STATX JSB INTOA GET A BYTE JSB TIME WAIT FOR FLAG TO SET ISZ TOFB6 DONE? JMP STATX NO - KEEP TRYING JMP RSTAT,I YES - EXIT WITH BYTE IN TOP OF A SKP ************************************************************ SETIO NOP IOR STF BUILD & EXECUTE STF CH INST STA *+1 NOP AND M77 RETAIN JUST SC CPA SC SKIP IF DVR NOT PROPERLY CONFIG. JMP SETIO,I RECONFIGURATION NOT NECESSARY STA SC SAVE NEW CHANNEL NUMBER IOR SFC FORM SFC INSTRUCTION STA TIM1 ADA M100 FORM SFS INSTRUCTION STA INA1 STA O0 ADA M200 FORM LIA INSTRUCTION STA VS1 STA INA2 STA S1 ADA M100 FORM OTA INSTRUCTION STA O1 ADA M300 FORM CLF INSTRUCTION STA S3 STA CLF2 STA SPCLF ADA B600 FORM STC,C INSTRUCTION STA INA3 STA O2 * SETUP POINTERS FOR ACCESS TO VALUES IN EXT'ED EQT LDA EQA13,I ADDRESS OF EXTENDED EQT STA EQT12 INA STA EQT13 INA STA EQX1 INA STA EQX2 INA STA EQX3 JMP SETIO,I SPC 2 NREDC JSB VSTAT UPDATE STATUS CLA,INA SET REG A TO 1 JMP CB12,I RETURN * * * *********************************************************** * * DATA BASES * STF STF 0 SFC SFC 0 SC OCT 0 * * MASK VALUES * M2 OCT 2 M3 OCT 3 M4 OCT 4 M10 OCT 10 M17 OCT 17 M20 OCT 20 M37 OCT 37 M40 OCT 40 M77 OCT 77 M100 OCT 100 M177 OCT 177 M200 OCT 200 M201 OCT 201 M202 OCT 202 M300 OCT 300 M400 OCT 400 M401 OCT 401 LOBYT OCT 377 M3400 OCT 3400 M3700 OCT 3700 M3777 OCT 3777 NOT15 OCT 77777 CONTU OCT 17602 M100K OCT 100000 M1001 OCT 100001 M1401 OCT 140001 CMODE OCT 160377 CMODX OCT 160375 HIBYT OCT 177400 HIBX1 OCT 177500 * * CONSTANTS * * D1 DEC 1 D2 EQU M2 D3 EQU M3 D4 EQU M4 D6 DEC 6 D8 EQU M10 D56 DEC 56 D63 EQU M77 D127 EQU M177 B600 OCT 600 B1000 OCT 1000 B1100 OCT 1100 B1500 OCT 1500 B1600 OCT 1600 B2000 OCT 2000 B2100 OCT 2100 B3000 OCT 3000 ND1 OCT -1 ND9 DEC -9 ND16 DEC -16 ND40 DEC -40 ND74 DEC -74 ND100 DEC -100 DM250 DEC -250 M3200 DEC -3200 M1153 DEC -1153 * * * * * VFC/SLEW CONSTANTS * TOF OCT 100200 * * * COMMAND BYTE VALUES * * CALPH EQU M100K ALPHA PRINT CSTND OCT 130000 STANDARD PRINT MODE CHARB OCT 120200 CHARACTER READ-BACK COMMAND CLBUF OCT 70000 CLEAR INPUT BUFFER COMMAND MCLR OCT 50000 MASTER CLEAR SLFTS OCT 40000 CCHAR OCT 10000 CHANGE CHAR. SET VFCRS OCT 20000 VFC RE-SET ON.OF OCT 30000 ON/OFF LINE STATR OCT 120000 STATUS READ REQUEST PING OCT 60000 PING COMMAND PONG OCT 60001 PONG COMMAND * * * * ASCII CONSTANTS * * ASTR OCT 25000 HIGH BYTE "*" DSPAC EQU ON.OF HIGH BYTE "0" (OCT 30000) EJCT OCT 30400 HIGH BYTE "1" .LF OCT 12 .CR OCT 15 .FF OCT 14 TEMP1 NOP EQT12 NOP EQT13 NOP EQX1 NOP EQX2 NOP EQX3 NOP * * * A EQU 0 B EQU 1 EQT1 EQU 1660B EQUIPMENT TABLE ADDRESSES EQT4 EQU 1663B EQT5 EQU 1664B EQT6 EQU 1665B EQT7 EQU 1666B EQT8 EQU 1667B EQT9 EQU 1670B EQT10 EQU 1671B EQT11 EQU 1672B EQA12 EQU 1771B EQA13 EQU 1772B EQT15 EQU 1774B END