* O$LA - O$LH - O$LE - FEB 4 2006 - VERSION 1-01 * * LINE PRINTER DRIVER, FOR A 120 CHAR WIDE LINEPRINTER WITH DEVICE ADDRESS 3. * LINE PRINTER IS DRIVEN BY THIS DRIVER WITH PROGRAMED IO. * THE LINE PRINTER IS SUPPOSED TO BE A DRUM PRINTER WITH A 60 CHARACTER * BUFFER. * FOR EACH CHARACTER ROW ON THE DRUM, A SCAN HAS TO BE MADE OVER THE * PRINT BUFFER. * WHEN THAT CYCLE IS COMPLETED, THE CARRIAGE IS SHUTTLED ONE CHARACTER * POSITION AND THEN THE OTHER 60 CHARS OF THE PRINT BUFFER CAN BE PRINTED, * DRUM-ROW BY DRUM-ROW. * WHEN THIS SECOND CYCLE IS COMPLETED, THE CARIAGE SHUTTLES 1 POSITION BACK * AGAIN, AND PRINTING OF THE LINEBUFFER IS COMPLETED. * * HONEYWELL X16 16 BIT COMPUTER SOFTWARE * * PROGRAM LENGTH: 201 WORDS (INCL. HEADING BUFFER) * * THIS SOURCE IS RECREATED FROM THE EXISTING SLST FILE: * - SLST-DAP-16.IMG (WHICH ORIGINATES FROM HONEYWELL) * * THE SOURCE IS RECREATED BY: THEO ENGEL (THEO.ENGEL@HETNET.NL) * * CALLING SEQUENCE * CALL O$LE EJECT PAGE AND PRINT HEADER * * CALL O$LH INITIATE PAGE HEADER (X NOT CHANGED) * DAC HBUF PROVIDE ADDRESS OF A 48-WORD('60-WORD) ASCII HEADER BUFFER * * CALL O$LA PRINT LINE (X NOT CHANGED) * DAC LBUF PROVIDE ADDRESS OF A 60-WORD('74-WORD) ASCII LINE BUFFER * SUBR O$LH SUBR O$LA SUBR O$LE REL * O$LH DAC ** INIT HEADER STX SVX SAVE X LDA* O$LH GET EXTERNAL HEADER ADDRESS (='60 WORDS LONG) IRS O$LH SET RETURN ADDRESS ADD IDX1 STA HPTR INDEXED POINTER TO BUFFER EXT HEADER BUFFER LDX MO60 ='-60 LDA* HPTR MOVE EXTERNAL HEADER TO INTERNAL HEADER BUFFER STA HBUF,1 IRS 0 JMP *-3 CRA STA PNUM PAGE NUMBER = 0 LDA PAGL ='44 PAGE LENGTH STA LNUM LINENUMBER = '44 LDX SVX RESTORE X JMP* O$LH * O$LA DAC ** PRINT LINE STX SVX SAVE X IRS LNUM LINENUMBER + 1 LDA PAGL END OF PAGE ? SUB LNUM SPL JST O$LE YES, EJECT LDA* O$LA A = BUFFER ADDRESS IRS O$LA SET RETURN ADDRESS JST PRT PRINT THE LINE LDX SVX RESTORE X JMP* O$LA AND RETURN * O$LE DAC ** EJECT, SKIP TO NEXT PAGE AND PRINT HEADER LDA CTAB STA T4 INIT T4 FOR PAGENUMBER CONVERSION IRS PNUM PAGENUMBER + 1 LDA PNUM A = PAGENUMBER TO PRINT IN HEADER STA T3 AND STORE IN TEMP T3 JST CDIG CONVERT DIGIT 4 (MOST SIGNIFICANT) JST CDIG CONVERT DIGIT 3 JST CDIG CONVERT DIGIT 2 JST CDIG CONVERT DIGIT 1 CRA STA HPTR PAGE NUMBER CONSISTS OF 2 WORDS AT IBUF EP1 LDX HPTR CHANGE LEADING 0 OF PAGENUMBER INTO SPACES IAB A=>B LDA IBUF,1 GET WORD LRL '10 A-RIGHT TO B-LEFT SUB N260 - CHAR 0 SZE JMP EP2 NOT AN ASCII 0, READY LDA BS1 ='10000 ERA IBUF,1 CHANGE 0 (LEFT BYTE) INTO SPACE STA IBUF,1 CRA LLR '10 A-RIGHT = B-LEFT SUB N260 - CHAR 0 SZE JMP EP2 NOT AN ASCII 0, READY LDA BS2 ='20 ERA IBUF,1 CHANGE 0 (RIGHT BYTE) INTO SPACE STA IBUF,1 LDA HPTR IRS HPTR POINT TO NEXT WORD, AND SNZ GO THROUGH SEQUENCE 2ND TIME JMP EP1 NOW WITH HPTR=1 EP2 JST PRRY PAGENUMBER READY, PRINT HEADER OCP '403 FORM FEED LDA HADR A = POINTER TO HEADER JST PRT PRINT LINE IN HEADER BUFFER JST PRRY OCP '203 ADVANCE ONE LINE JST PRRY OCP '203 ADVANCE ONE LINE JST PRRY OCP '203 ADVANCE ONE LINE CRA STA LNUM LNUM=0, RESET LINENUMBER JMP* O$LE RETURN * * CDIG CONVERTS A DECIMAL TO A PRINTABLE ASCII DIGIT * ENTERS WITH A/T3 AS PAGENUMBER OR ITS REMAINDER AFTER DIGIT CONVERSION CDIG DAC ** T4=PTR INTO CTAB LDX IDX3 X = 0, SUBTRACTION COUNTING START P3 SUB* T4 T4=CTAB+0=1000 CTAB+1=100 CTAB+2=10 CTAB+3=1 SPL JMP P2 STOP STA T3 STORE REMAINDER IRS 0 COUNT NUMBER OF SUBTRACTIONS WHILE POSITIVE JMP P3 P2 LDA T4 SUB CTAB A=INDEX INTO CTAB LGR 1 /2 IMA 0 A=COUNT X=INDEX INTO CTAB/2 IRS T4 POINT TO NEXT TABLE ENTRY ADD N260 CONVERT COUNT TO ASCII DIGIT LRL 8 TO B-LEFT LDA IBUF,1 AND INSERT IN IBUF LLL 8 STA IBUF,1 TO A-RIGTH LDA T3 REMAINING PAGENUMBER TO DETERMINE NEXT DIGIT JMP* CDIG * PRT DAC ** PRINT A LINE (A=BUFFERADDRESS) ADD IDX2 STA EBUF INDEXED PTR TO EXTERNAL BUFFER (60 WORDS LONG) JST PRRY OCP '203 ADV ONE LINE SCAN LDX MO74 =-60 OCP '703 START PROGRAMMED OUTPUT MODE P1 LDA* EBUF OTA 3 JMP *-1 IRS 0 JMP P1 SKS '1203 NOT SHUTTLING? JMP *-1 SKS '1103 LINE COMPLETE? JMP SCAN NOT COMPLETE, SO SCAN AGAIN JMP* PRT * PRRY DAC ** WAIT FOR PRINTER NOT BUSY SKS '203 ALARM ? HLT SKS '1703 BUSY ? JMP *-3 JMP* PRRY * * DATA / BUFFER EBUF OCT 0 INDEXED PTR TO EXTERNAL BUFFER SVX OCT 0 SAVED X HPTR OCT 0 INDEXED PTR TO HEADER BUFFER PNUM OCT 0 PAGE NUMBER LNUM OCT 0 LINE NUMBER T3 OCT 0 T4 OCT 0 CTAB DAC *+1 DECIMAL CONVERSION TABLE OCT 1750 =1000 OCT 144 =100 OCT 12 =10 OCT 1 =1 PAGL OCT 44 PAGE LENGTH HADR DAC *+1 POINTER TO INTERNAL HEADER BUFFER * INTERNAL HEADER BUFFER (48='60 WORDS LONG) * PAGENUMBER BUFFER (12 WORDS LONG), * MAKING WITH HEADER A 60 WORD PRINT BUFFER BCI 16, BCI 16, BCI 16, HBUF OCT 120320 P OCT 140707 AG OCT 142640 E IBUF OCT 130260 00 OCT 130260 00 OCT 120240 OCT 120240 OCT 120240 OCT 120240 OCT 120240 OCT 120240 OCT 120240 * MO74 OCT 177704 =-60 IDX2 OCT 040074 INDEXED, 60 WORDS LONG IDX3 OCT 0 BS2 OCT 000020 BS1 OCT 010000 N260 OCT 260 CHAR 0 (ASCII) MO60 OCT 177720 ='-60 48 WORDS LONG IDX1 OCT 040060 INDEXED, 48 WORDS LONG FIN END