ASMB,L,C,R HED *** RTE-II 26XX LINE PRINTER DRIVER - DVA12 *** NAM DVA12 92001-16020 780511 REV 1826 ENT IA12,CA12 ************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * REPRODUCED, OR TRANSLATED INTO ANOTHER PROGRAM LANGUAGE * * WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD. * ************************************************************** SPC 2 * INITIATION SECTION SPC 2 IA12 NOP INITIATION ENTRY JSB SETIO CONFIGURE DVR FOR CURRENT CHAN LDA EQT6,I LOAD REQUEST CONTROL CODE AND M1777 MASK IN FUNC CODE & REQ CODE CPA D3 SKIP IF NOT CLEAR REQUEST JMP CLEAR CPA B603 SKIP IF NOT DYNAMIC STATUS REQ. JMP DYNAM JSB STAT CHECK AND UPDATE PRINTER STATUS JMP NREDI PRINTER NOT READY LDA EQT5,I RESET TOF AND EOT STATUS BITS AND M7637 STA EQT5,I LDA EQT11,I CLEAR TIMER AND SLEW BITS AND M7772 STA EQT11,I * LDA EQT6,I ISOLATE REQUEST CODE AND M0077 CPA D2 SKIP IF NOT A WRITE REQUEST JMP WRITE GO PROCESS WRITE REQUEST CPA D3 SKIP IF NOT A CONTROL REQUEST JMP CNTRL GO PROCESS CONTROL REQUEST CLA,INA REQ CODE ERR, SET A=1 AND RETURN JMP IA12,I REQUEST CODE ERROR EXIT * CLEAR CLC 0 CLEAR DEVICE DYNAM JSB VSTAT UPDATE PRINTER STATUS JMP EXIT4 * NREDI JSB VSTAT UPDATE PRINTER STATUS LDA D3 SET PRINTER NOT READY CODE IN A JMP IA12,I RETURN SKP * PROCESS CONTROL REQUEST SPC 2 CNTRL LDA EQT6,I FETCH CONTROL WORD AND M1770 ISOLATE FUNCTION CODE CPA FUN11 SKIP IF NOT VALID CONTROL FUNC RSS JMP EXIT2 BAD FUNCTION CODE; EXIT LDA EQT7,I LOAD CONTROL PARAMETER SZA,RSS SKIP IF PRAM.NE.0 JMP SETSP PRAM=0; GO SET SUPPRESS BIT CLB SET BUF. LEN. AND CHAR. COUNT STB EQT8,I TO 0 FOR CORRECT COMPLETION STB EQT9,I SECTION EXIT SSA TEST FOR PAGE EJECT (PRAM<0) JMP PEJCT EXECUTE PAGE EJECT ADA ND70 ADD -70 TO PRAM SSA,RSS SKIP IF PRAM VALID (<70) JMP EXIT2 BAD PARAMETER; RETURN ADA D4 ADD 4 TO PRAM; NET DIF IS -66 SSA,RSS SKIP IF NOT VFU CHANNEL 9 - 12 JMP V9.12 ADA D2 ADD 2 TO PRAM; NET DIF IS -64 SSA,RSS SKIP IF NOT PAGE EJ MODE CONTROL JMP PEJMC ADA D2 ADD 2 TO PRAM; NET DIFF IS -62 SSA,RSS SKIP IF NOT VFU CHANNEL 1-2 JMP V1.2 ADA D6 ADD 6 TO PRAM; NET DIFF IS -56 SSA,RSS SKIP IF NOT VFU CHANNEL 3-8 JMP V3.8 JSB SLEW MUST BE LINE SLEW CONTROL REQ. JMP EXIT0 * SETSP LDA EQT11,I LOAD DRIVER STATUS IOR BIT7 SET SPACE SUPPRESS BIT STA EQT11,I JMP EXIT4 IMMEDIATE COMPLETION RETURN * V1.2 XOR M0001 MAP VFU CHANS. 1-2 TO PROPER VAL SZA,RSS IF VFU CHAN 1 THEN JMP PEJCT GO SET PAGE EJECT JMP VOUT * V3.8 ADA D2 MAP VFU CHANS 3-8 TO PROPER VALUE JMP VOUT * V9.12 ADA D8 MAP VFU CHANS 9-12 TO PROPER VALUE VOUT IOR CVFU SET VFU AND PAPER COMMAND BITS JMP EXP0 GO OUTPUT VFU COMMAND * PEJMC ALS SHIFT PAGE EJ MODE BIT TO BIT1 STA B SAVE PAGE EJECT MODE BIT IN B LDA EQT11,I CLEAR PAGE EJECT MODE STATUS BIT AND M7775 IOR B SET NEW VALUE OF PAGE EJ. MODE STA EQT11,I EXIT4 LDA D4 SET IMMEDIATE COMPLETION CODE JMP IA12,I RETURN * EXIT2 LDA D2 CONTROL REQUEST ERROR JMP IA12,I RETURN SKP * PROCESS A PRINT REQUEST SPC 2 WRITE LDA EQT11,I ISOLATE SPACE SUPPRESS BIT AND BIT7 SZA,RSS SKIP IF SUPPRESS SPACE BIT SET JMP APEJM NO SUPPRESS; GO TEST AUTO PAGE XOR EQT11,I CLEAR SPACE SUPPRESS BIT STA EQT11,I LDA SUPLT SET LINE TERMINATOR TO SPACE SUPPRESS STA EQT10,I JMP TLLEN GO TEST LINE LENGTH APEJM LDA EQT11,I CHECK IF AUTO PAGE EJECT MODE AND BIT1 LDB SSLT READY SINGLE SPACE CODE SZA,RSS SKIP IF SINGLE SPACE DESIRED LDB SSAPE CHANGE TO SS WITH AUTO PAGE EJ. STB EQT10,I TLLEN LDA EQT8,I LOAD BUFFER LENGTH SSA SKIP IF BUF LEN POS (WORD COUNT) JMP CCSTR GO STORE CHARACTER COUNT ALS CONVERT POS WORD COUNT TO NEG. CMA,INA CHARACTER COUNT CCSTR STA EQT9,I STORE CHARACTER COUNT SZA,RSS SKIP IF NOT ZERO LINE LENGTH JMP LTERM GO PROCESS END OF LINE LDA EQT7,I CONVERT BUFFER ADDR RAL TO CHAR ADDR STA EQT7,I LDA EQT6,I LOADR CONTROL WORD AND BIT10 HONESTY MODE ? SZA JMP HNSTI YES - GO PROCESS REQUEST LDA EQT6,I ISOLATE CONTROL BIT 7 (SS=1) AND BIT7 SZA SKIP IF NOT SINGLE SPACE JMP EXL0 SINGLE SPACE NEXT LINE, NO CC ISZ EQT9,I INCREMENT CHARACTER COUNTER ISZ EQT7,I INCREMENT BUFFER CHAR. ADDRESS LDB EQT7,I LOAD BUFFER CHAR ADDRESS CLE,ERB CONVERT TO WORD ADDRESS LDA B,I GET 1ST CHAR IN BUFFER AND HIBYT MASK OUT LOWER BYTE CPA EJECT COMPARE TO PAGE EJECT (CC="1") JMP PEJCT CPA DOUBL COMPARE TO DOUBLE SPACE (CC="0") JMP LTERM GO OUTPUT EXTRA LINE TERMINATOR LDB SUPLT READY SPACE SUPPRESS LINE TERM. CPA STAR COMPARE CC TO SPACE SUPPRESS "*" STB EQT10,I STORE SPACE SUPPRESS LINE TERM. EXL0 JSB LOUT OUTPUT LINE JMP EXIT0 TAKE "OPERATION COMPLETE" RETURN * PEJCT LDA EQT5,I LOAD PRINTER STATUS IOR BIT6 SET TOF STATUS BIT STA EQT5,I LDA PEJEC EXECUTE PAGE EJECT JMP EXP0 * LTERM LDA EQT10,I READY LINE TERM. FOR OUTPUT EXP0 JSB POUT OUTPUT CONTENTS OF A REGISTER EXIT0 CLA SET OPERATION INITIATED CODE JMP IA12,I RETURN SKP * COMPLETION / CONTINUATION SECTION SPC 2 CA12 NOP COMPLETION/CONTINUATION ENTRY JSB SETIO CONFIGURE I/O INSTRUCTIONS LDA EQT1,I SPURIOUS INTERRUPT? SZA,RSS JMP EXITC YES, EXIT JSB STAT CHECK STATUS AND UPDATE JMP NREDC DEVICE NOT READY LDA EQT11,I SLA SKIP IF TIMER FLAG NOT SET JMP TFLAG GO PROCESS TIME-OUT CONTINUATION AND BIT2 ISOLATE SLEW BIT SZA,RSS SKIP IF SLEW BIT SET JMP DOUT GO CHECK LINE OUTPUT XOR EQT11,I CLEAR SLEW BIT STA EQT11,I JSB SLEW SLEW MORE LINES JMP EXITC TAKE CONTINUATION EXIT DOUT LDA EQT6,I LOAD CONTROL WORD AND BIT10 HONESTY MODE ? SZA JMP HNSTC HONESTY CONTINUATION SECTION LDA EQT9,I LOAD CHARACTER COUNT SZA SKIP IF NO MORE DATA JMP EXLC GO FINISH LINE OUTPUT DONE JSB VSTAT UPDATE PRINTER STATUS LDB EQT8,I SET B TO POSITIVE WORD OR SSB CHARACTER COUNT. CMB,INB CLC2 CLC 0 CLEAR DEVICE CONTROL CLA SET SUCCESSFUL COMPLETION CODE JMP CA12,I COMPLETION RETURN * NREDC JSB VSTAT UPDATE LINE PRINTER STATUS CLA,INA SET DEVICE NOT READY CODE JMP CA12,I RETURN * TFLAG AND M7776 CLEAR TIMER FLAG STA EQT11,I EXLC JSB LOUT FINISH LINE OUTPUT EXITC ISZ CA12 TAKE CONTINUATION EXIT JMP CA12,I RETURN SKP * CONFIGURATOR SUBROUTINE SPC 2 SETIO NOP CPA LP SKIP IF DVR NOT PROPERLY CONFIG. JMP SETIO,I RECONFIGURATION NOT NECESSARY STA LP SAVE NEW CHANNEL NUMBER IOR STF FORM STF INSTRUCTION STA LF1 STA HF1 ADA B100 FORM SFC INSTRUCTION STA TIM1 STA LOU1 STA HF2 ADA B100 FORM SFS INSTRUCTION ADA B200 FORM LIA INSTRUCTION STA VS1 STA S1 ADA B100 FORM OTA INSTRUCTION STA POUT+1 STA OUTCH STA OUTHC STA OTHC1 ADA B1100 FORM STC,C INSTRUCTION STA POUT+2 STA L2 STA HC1 STA HC2 ADA B3000 FORM CLC INSTRUCTION STA CLC2 STA CLEAR JMP SETIO,I SPC 2 STF STF 0 LP OCT 0 CHANNEL OF INTERRUPT SKP * SUBROUTINE TO OUTPUT A LINE SPC 2 LOUT NOP ROUTINE TO OUTPUT A LINE LDA EQT9,I PICK UP NUMBER OF CHARS SZA,RSS SKIP IF ANY LEFT JMP EOL NO, GO OUTPUT END-OF-LINE CHAR. LDB EQT7,I PICK UP ADDRESS OF CHAR CLE,ERB CONVERT TO WORD ADDRESS LF1 STF 0 SET FLAG FOR 1ST PASS THRU LOOP JMP LOAD NXTCH SEZ,CME INCREMENT WORD ADDRESS INB LOAD LDA B,I PICK UP WORD CONTAINING CHAR SEZ,RSS SKIP IF RIGHT CHAR ALF,ALF ROTATE AND M0177 MASK OFF ANY EXTRANEOUS BITS LOU1 SFC 0 SKIP IF PREV. CHAR WAS ACCEPTED JMP OUTCH JSB TIME NO, GO WAIT JMP TMOUT TIMED OUT GO PROCESS OUTCH OTA 0 OUTPUT CHARACTER IN A REG L2 STC 0,C ISZ EQT9,I SKIP IF NO MORE CHARS TO PRINT JMP NXTCH REPEAT FOR NEXT CHAR. JSB TIME GO WAIT FOR LAST CHAR ACCEPT JMP TMOUT TIMED OUT GO PROCESS EOL LDA EQT10,I GET LINE TERMINATOR JSB POUT OUTPUT LINE TERMINATOR JMP LOUT,I RETURN * TMOUT ELB SAVE CHARACTER POSITION ON TIME OUT STB EQT7,I NEXT TIME IN WE'LL NEED IT IOR EQT11,I SET TIME OUT BIT STA EQT11,I AND SAVE FOR CONTINUATION JMP LOUT,I GO AWAY SPC 3 * TIME-OUT COROUTINE SPC 2 TIME NOP ELB SAVE THE CHARACTER POSITION STA TCHAR 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 TIM3 TIME-OUT RETURN TIM2 LDA TCHAR RESTORE CHARACTER TO A REG. ISZ TIME BUMP FOR NO TIMEOUT TIM3 CLE,ERB RESTORE THE CHARACTER POSITION JMP TIME,I RETURN TO CALLING CODE TCHAR BSS 1 SKP * PRINTER STATUS CHECKING AND UPDATE SUBROUTINES SPC 2 STAT NOP CHECK FOR PRINTER READY S1 LIA 0 FETCH HARDWARE STATUS AND M1401 CLEAR ALL BITS EXCEPT 15,14,0 CPA M1001 SKIP IF STATUS NOT GOOD ISZ STAT SET GOOD STATUS RETURN JMP STAT,I STATUS RETURN SPC 2 VSTAT NOP ROUTINE TO UPDATE PRINTER STATUS LDA EQT5,I CLEAR LOWEST 5 BITS OF LP STATUS AND M7740 , SAVE IN B TEMPORARILY STA B VS1 LIA 0 FETCH HARDWARE STATUS ALF MOVE STATUS BITS TO A REG 4-0 AND M0037 CLEAR ALL OTHER BITS IOR B PUT NEW BITS INTO STATUS WORD STA EQT5,I JMP VSTAT,I SKP * HONESTY SECTION HNSTI EQU * HONESTY SECTION CLA STA EQA12,I ZERO OUTPUT COUNTER STA EQT13,I AND COMPL/CONT PNTR HNST LDB EQT7,I PICKUP BUF ADDR CLE,ERB CONVT TO CHAR ADDR HF1 STF 0 SET FLAG FOR 1ST PASS JMP HLDC GO LOAD CHAR HNXTC SEZ,CME INCR WORD ADDR INB HLDC LDA B,I LOAD WORD CONTAINING CHAR SEZ,RSS SKIP IF CHAR IN RIGHT HALF ALF,ALF ROTATE AND M0177 MASK OFF LEFT HALF CPA CR CARRIAGE RETURN ? JMP PRCR YES - GO PROCESS CPA LF LINE-FEED ? JMP PRLF YES - GO PROCESS CPA PE PAGE EJECT ? JMP PRPE YES - GO PROCESS HF2 SFC 0 LAST CHARACTER ACCEPTED ? JMP OUTHC JSB TIME NO - GO WAIT JMP CHTOT TIMED OUT GO SET BIT AND EXIT OUTHC OTA 0 OUTPUT THE CHARACTER HC1 STC 0,C ISZ EQA12,I BUMP OUTPUT COUNTER ISZ EQT9,I ANY LEFT ? JMP HNXTC YES CLA STA EQA12,I CLEAR OUTPUT COUNTER HDONE LDA EQT13,I LOAD FLAG TO CHOOSE EXIT SSA SET ? JMP CA12,I YES - RET THRU CONTINUATOR JMP EXIT0 NO - TAKE OPER INIT EXIT * PRCR CLA CAR. RETURN PROCESSING STA EQA12,I CLEAR OUTPUT COUNTER LDA CRCOD LOAD CR CODE JMP SETEO OUTPUT THE CR CODE, SAVE E * PRLF LDA SSLT LOAD LINE-FEED CODE JMP SETEO OUTPUT LF CODE, SAVE E * PRPE CLA PAGE EJECT PROCESSING STA EQA12,I CLEAR OUTPUT PROCESSING LDA EQT5,I LOAD PRINTER STATUS IOR BIT6 SET TOF STA EQT5,I LDA PEJEC LOAD PAGE EJECT CODE SKP SETEO JSB TIME WAIT FOR CHARACTER TO GO OUT JMP CHTOT TIME OUT GO EXIT ISZ EQT9,I BUMP COUNT NOP SEZ,CME CONVERT BUFF ADDR TO CHAR ADDR INB AND PRESERVE RH/LH KEY ELB STB EQT7,I AND SAVE FOR NEXT PASS JSB POUT OUTPUT DESIRED OUTPUT CODE JMP HDONE TAKE APPROPIATE EXIT * * HNSTC EQU * CONTINUATION SECTION LDA EQT13,I SET CONTINUATION FLAG IOR BIT15 SIGN IMPLIES CONTINUATION STA EQT13,I USED TO CHOOSE EXIT RETURN LDA EQT11,I DID UNIT TIME OUT AND D8 DURING CHARACTER TIME OUT ? SZA JMP GOON YES, GO BACK AND OUTPUT THE REST LDA EQA12,I LAST LINE ENDED BY CR ? SZA CHECK CHARACTER COUNT JSB BLOUT NO - OUTPUT BLANKS TO SET PNTR GOON LDA EQT11,I ZERO OUT THE TIME OUT FLAG AND M7767 AND SAVE STA EQT11,I FOR NEXT TIME LDA EQT9,I SZA,RSS MORE DATA TO OUTPUT? JMP DONE NO, EXIT - COMPLETE ISZ CA12 BUMP RETURN FOR CONTINUATION JMP HNST YES - GO START OVER * BLOUT NOP JSB CHK13 CHECK TO SEE IF BLANK COUNT IS KEPT LDB EQA12,I OUTPUT BLANKS TO PUT CHAR CMB,INB IN RIGHT PLACE FOR PRINTER STB BCNT SET UP OUTPUT COUNT LDBL LDA BLANK LOAD ASCII BLANK OTHC1 OTA 0 OUTPUT IT HC2 STC 0,C JSB TIME GO WAIT FOR CHAR JMP BLTOT TIMED OUT GO PROCESS ISZ BCNT BUMP COUNTER JMP LDBL DO ANOTHER LDA EQT13,I RESTORE BLANK COUNT AND M7777 STA EQA12,I LDA EQT13,I RESET EQT13 AND BIT15 STA EQT13,I JMP BLOUT,I RETURN CHK13 NOP CHECK FOR BLANK COUNT SAVED LDA EQT13,I AND M7777 SZA IS BLANK COUNT SAVED JMP CHK13,I YES, RETURN LDA EQA12,I NO, SAVE IT IOR EQT13,I STA EQT13,I JMP CHK13,I * BLTOT LDB BCNT SAVE BLANK COUNT CMB STB EQA12,I FOR CONTINUATION ISZ CA12 TAKE NORMAL EXIT JMP CA12,I BCNT NOP * CHTOT EQU * ELB SAVE CHARACTER POSITION STB EQT7,I FOR NEXT PASS LDA EQT11,I IOR D8 SET HNSTI CHAR TIMEOUT BIT STA EQT11,I AND SAVE JMP HDONE TAKE PROPER EXIT SKP * LINE SLEWING ROUTINE SPC 2 SLEW NOP LDB EQT7,I LOAD A & B WITH # OF LDA B LINES TO SLEW ADB ND16 SUB 16 TO SEE IF LINE COUNT SSB,INB IS GREATER THAN 15 JMP SLW1 LE 15 LINES, GO OUTPUT STB EQT7,I STORE # OF LINES LEFT TO SLEW LDA EQT11,I SET SLEW STATUS IOR BIT2 STA EQT11,I LDA D15 SLEW 15 LINES SLW1 IOR BIT15 SET PAPER COMMAND BIT JSB POUT OUTPUT SLEW CODE JMP SLEW,I SPC 10 * SUBROUTINE TO OUTPUT CONTENTS OF A REGISTER SPC 2 POUT NOP OTA 0 OUTPUT WORD IN A REG STC 0,C JMP POUT,I SKP * CONSTANTS SPC 2 M0001 OCT 1 M0037 OCT 37 M0077 OCT 77 M0177 OCT 177 M1001 OCT 100001 M1401 OCT 140001 M1770 OCT 17700 M1777 OCT 17777 M7637 OCT 177637 M7767 OCT 177767 M7740 OCT 177740 M7772 OCT 177772 M7775 OCT 177775 M7776 OCT 177776 M7777 OCT 77777 HIBYT OCT 177400 CR OCT 15 LF OCT 12 PE OCT 14 SPC 2 D2 DEC 2 D3 DEC 3 D4 DEC 4 D6 DEC 6 D8 DEC 8 D12 DEC 12 D15 DEC 15 ND16 DEC -16 ND70 DEC -70 ND100 DEC -100 B100 OCT 100 B200 OCT 200 B603 OCT 603 B1100 OCT 1100 B3000 OCT 3000 SPC 2 BIT1 OCT 2 BIT2 OCT 4 BIT6 EQU B100 BIT7 EQU B200 BIT10 OCT 2000 BIT15 OCT 100000 SPC 2 FUN11 EQU B1100 SSAPE OCT 100102 SSLT EQU M1001 CVFU OCT 100100 PEJEC EQU CVFU SUPLT EQU BIT15 CRCOD EQU BIT15 BLANK OCT 40 STAR OCT 25000 DOUBL OCT 30000 EJECT OCT 30400 SKP A EQU 0 B EQU 1 EQT1 EQU 1660B EQT5 EQU EQT1+4 EQT6 EQU EQT5+1 EQT7 EQU EQT6+1 EQT8 EQU EQT7+1 EQT9 EQU EQT8+1 EQT10 EQU EQT9+1 EQT11 EQU EQT10+1 EQA12 EQU 1771B EQT13 EQU EQA12+1 END