From 7c323de83cbc7953e3efa30e77ed655d752bfd91 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 25 Jun 2018 12:39:57 +0200 Subject: [PATCH] IMPRNT - image mode printer. --- build/misc.tcl | 7 ++ doc/programs.md | 1 + src/syseng/imprnt.6 | 226 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 234 insertions(+) create mode 100755 src/syseng/imprnt.6 diff --git a/build/misc.tcl b/build/misc.tcl index 9051ef9f..b8ae6c8a 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -881,6 +881,13 @@ respond "*" ":midas sys1; ts imload_syseng; imload\r" expect ":KILL" respond "*" ":link sys1; ts imtran, sys1; ts imload\r" +# IMPRNT +respond "*" ":midas sys1; ts imprnt_syseng; imprnt\r" +expect ":KILL" +respond "*" ":link sys1; ts imprin, sys1; ts imprnt\r" +respond "*" ":link sys1; ts ardprn, sys1; ts imprnt\r" +respond "*" ":link sys1; ts tekprn, sys1; ts imprnt\r" + # TJ6 respond "*" ":midas sysbin;_tj6;tj6\r" expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index d0c4fa15..8e97a67c 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -95,6 +95,7 @@ - IDLE, list idle users. - IFILE, Chaosnet file service. - IMLOAD/IMTRAN, load or translate an Imlac program. +- IMPRNT, image mode printer. - INIT, a helper program for LOGIN, LOGOUT, and other script files. - INLINE, reads line from TTY and adds to JCL (for DDT init files). - INQUIR, user account database. diff --git a/src/syseng/imprnt.6 b/src/syseng/imprnt.6 new file mode 100755 index 00000000..7d473b44 --- /dev/null +++ b/src/syseng/imprnt.6 @@ -0,0 +1,226 @@ +TITLE IMPRNT -- IMAGE MODE PRINTER + +; buffers + PDLLEN==40. +PDL: BLOCK PDLLEN + + BUFLEN==40. +BUF: BLOCK BUFLEN +BUFFER: BLOCK 101 + +; channels + IN=1 + TOUT=2 + TIN=3 + TAOUT=4 + +; acs + A=1 + B=2 + C=3 + D=4 + E=5 + F=6 + +FILE=7 ; file to print + DEV=7 ; device + NM1=10 ; name1 + NM2=11 ; name2 + SNM=12 ; sname + + BPTR=13 ; byte pointer to command string + OBPTR=14 ; old byte pointer + CNT=15 ; count for printing pictures + + P=17 + + +START: .SUSET [.RXJNAM,,JNAME'] + .OPEN TOUT,[SIXBIT / ETTY/] + .VALUE + .OPEN TIN,[SIXBIT / TTY/] + .VALUE + .OPEN TAOUT,[SIXBIT / 1TTY/] + .VALUE + + MOVE P,[-PDLLEN,,PDL-1] ; set up PDL + +; MOVE F,JNAME +; CAME F,['TEKPRN] +; JRST START +; PUT IN IMLAC IN TEK MODE +; SEND OUT DIRECTLY ANYTHING FOLLOWING ALTMODE + + SETZM BUF + MOVE A,[BUF,,BUF+1] + BLT A,BUF+BUFLEN-1 ; zero command buffer + + .BREAK 12,[6,,FILE] ; read DDTs print defaults + HLRZS DEV ; set up device correctly + EXCH SNM,NM1 ; DDT uses funny order + EXCH NM1,NM2 + .BREAK 12,[5,,BUF] ; read JCL line + MOVE BPTR,[440700,,BUF] + +INIT: PUSHJ P,SCNAME ; parse names + + .SUSET [.SSNAME,,SNM] ; set sname +FDELE: HRLI DEV,'& ; image mode + .OPEN IN,FILE ; open + JRST FAIL ; open failed + +WIN: SETZM CNT + JRST GOPIC + +RCHR: JUMPN CNT,RCHR1 ; skip if buffer needs filling + +; fill input buffer + MOVE A,[-100,,BUFFER] + .IOT IN,A + MOVE B,[^C_29.] ; put ^C in last word -- never get + MOVEM B,(A) ; to it if file doesn't run out + MOVEI CNT,500 ; count of 500 characters + MOVE BPTR,[440700,,BUFFER] + +; output character +RCHR1: SOS CNT + ILDB A,BPTR ; get character + CAIN A,^C ; if ^C, done + JRST EXIT ; done + CAIN A,^L ; if ^L, new picture + JRST NEWPIC ; new picture + MOVE F,JNAME + CAME F,['ARDPRN] + JRST RCHR2 + CAIL A,40 + JRST RCHR2 + CAIL A,34 + IORI A,200 +RCHR2: .IOT TOUT,A ; output it + JRST RCHR ; loop + +; read a character to continue +; ^Q, ^S, and ^G all mean quit + +NEWPIC: .IOT TIN,A ; read from tty + CAIE A,^S + CAIN A,^Q ; means seen enough + JRST EXIT + CAIN A,^G + JRST EXIT + +; here to start printing a new picture + +GOPIC: .IOT TOUT,[^M] + .IOT TOUT,[^J] + .IOT TAOUT,[^P] + .IOT TAOUT,["C] + JRST RCHR ; read a character + +EXIT: MOVE A,JNAME + CAME A,['ARDPRN] + JRST EXIT0 + IRP X,,[235,177,"N,"t,"N,234] + MOVEI A,X + .IOT TOUT,A + TERMIN +EXIT0: IRP X,,[%TDMV0,0,0] + MOVEI A,X + .IOT TOUT,A + TERMIN + .CALL [SETZ ? SIXBIT /SCPOS/ ? 1000,,TOUT ? 1000,,0 ? SETZI 0] + JFCL + +; set DDT's print defaults +EXIT1: HRLZS DEV ; device is left justified + EXCH NM1,NM2 ; put names back in DDT order + EXCH NM1,SNM + .BREAK 12,[400006,,FILE] ; set DDT's print defaults +; close channels + .CLOSE TOUT, + .CLOSE TIN, + .CLOSE IN, +; exit + .VALUE [ASCIZ /:KILL +/] + +; open failed + +FAIL: MOVEI A,[ASCIZ /OPEN FAILED? +/] +EXITM: PUSHJ P,PMESS ; print message + JRST EXIT ; and exit + +; command line parser + +SCNAME: MOVE C,[-2,,NM1] +SCNGET: PUSHJ P,GETSYL ; return break in A, syl in B + JUMPE B,SCNX ; no syls + CAIN A,': ; device? + HLRM B,DEV + CAIN A,'; ; user? + MOVEM B,SNM + JUMPG A,SCNGET ; not space, get more syllable + MOVEM B,(C) + JUMPL A,SCNX ; control terminates + AOBJN C,SCNGET ; get more +SCNX: POPJ P, + +; get single syllable + +GETSYL: PUSH P,[0] ; initialize syllable on stack + MOVE B,[440600,,0(P)] ; initialize byte pointer to stack +GETSLP: MOVE OBPTR,BPTR ; save old byte pointer + ILDB A,BPTR + SKIPN A ; end of string? + JRST GETSX ; end + CAIN A,^X ; default first name? + JRST GET1 + CAIN A,^Y ; default second name? + JRST GET2 + CAIN A,^Q ; quote? + JRST GETQOT ; yes + SUBI A,40 ; not quote, make sixbit + JUMPL A,GETSX ; control=exit + JUMPE A,GETSP ; leading spaces flushed + CAIE A,': + CAIN A,'; + JRST GETSX ; ";" or ":" terminate +GETSPT: CAIL A,100 ; lc? + SUBI A,40 ; make upper case + TLNE B,770000 ; check fit + IDPB A,B ; store character + JRST GETSLP +; get quoted character +GETQOT: ILDB A,BPTR ; get char to quote + SKIPN A ; zero + JRST GETSX ; exit + SUBI A,40 ; 6bit + JUMPGE A,GETSPT ; can't ^Q a control + JRST GETSX + +GET1: MOVE B,NM1 + SKIPA +GET2: MOVE B,NM2 + SETZ A, ; make delimiter be space + SKIPE (P) + JRST XYTERM ; ^X or ^Y is also term + POP P,0 + POPJ P, +GETSP: TLNE B,400000 ; six chars? + JRST GETSLP ; no, loop +GETSX: POP P,B ; restore syl + POPJ P, +XYTERM: MOVE BPTR,OBPTR ; restore old bptr + JRST GETSX ; and do normal return + +PMESS: HRLI A,440700 + PUSH P,B +PMES1: ILDB B,A + JUMPE B,PMES2 + .IOT TOUT,B + JRST PMES1 +PMES2: POP P,B + POPJ P, + + END START