OBJNAM AWTEST.PDV ; AlphaWRITE test printer driver by Irv Bromberg

       SEARCH  SYS
       SEARCH  SYSSYM
       COPY    PDVSYM

       OBJNAM  .PDV

       VMAJOR=1.
       VMINOR=3.
       VEDIT=4.

if eq,1
Edit history:
25-Jul-88 fix symbols to assemble under pre-2.0 assembler
17-Jun-88 1.3(4) add PD$FED flag; always output to .LST file without spooling
18-May-88 1.2(3) fix PDLF to show "linefeeds"

endc

Buffer=A2
DDB=A2
IMP=A3
Atemp=A6

Char=D1
CrtCmd=D1
Number=D1
Value=D2

Cmd=^H0FF00

PDV:    PHDR    -1,0,PH$REE!PH$REU
       ; flags: variable & proportional spacing, sheet feeder
       LWORD   PD$VAR!PD$PRO!PD$FED
       JMP     PDINI                   ; initialize printer
       JMP     PDCLS                   ; shut down printer
       JMP     PDCHR                   ; output a character in D1
       JMP     PDCTL                   ; output control string indexed by D1
       JMP     PDSPL                   ; output special string & character
       JMP     PDMNLN                  ; move to next line & start new line
       JMP     PDMTOF                  ; move to Top of Form & setup for new page
       JMP     PDPSON                  ; enable proportional
       JMP     PDSOF                   ; disable proportional
       JMP     PDUNDR                  ; toggle underscore
       JMP     PDBOLD                  ; toggle bold
       JMP     PDSTRK                  ; toggle strikeout
       JMP     PDBAR                   ; toggle over-bar
       JMP     PDSLPI                  ; set Lines Per Inch
       JMP     PDSHMI                  ; set Horizontal Motion Index
       JMP     PDSCPI                  ; set Characters Per Inch
       JMP     PDSTM                   ; set Top Margin
       JMP     PDMTM                   ; move to Top Margin
       JMP     PDSLPO                  ; set Left Paper Offset
       JMP     PDMLPO                  ; move to Left Paper Offset
       JMP     PDSLPP                  ; set Lines per Page
       JMP     PDSLSP                  ; set line spacing (in 1/2 lines)
       JMP     PDOVRP                  ; setup to overprint last char.
       JMP     PDLF                    ; output LFs per count in D2
       JMP     PDDBL                   ; toggle double underscore
       JMP     PDFONT                  ; select font # in D1
       JMP     Res1                    ; entries reserved for Alpha Micro
       JMP     Res2
       JMP     Res3
       JMP     Res4
       JMP     Res4
       JMP     Res5
       JMP     Res6
       JMP     Res7
       JMP     User1                   ; entries reserved for user definition
       JMP     User2
       JMP     User3
       JMP     User4
       JMP     User5
       JMP     User6
       JMP     User7
       JMP     User8

PDSPL:  ; output control string (code# in D1) & then the byte in D2
       ; in the format:  <string=#>
       BCALL   PDCTL
       CLR     Number
       MOVB    Value,Number

NumOut: ; expects LWORD in Number=D1 to output in format: #>
       PUSH    DDB
       LEA     DDB,PTDDB(IMP)
       OCVT    0,OT$DDB                ; set desired RADIX at monitor level
       POP     DDB
       MOVB    #'>,Char
       FILOTB  PTDDB(IMP)
       JMP     DoCRLF

PDCTL:  ; output control string (code# in D1)
       LEA     Atemp,BadCode           ; default to bad code string
       CMPB    Number,#MAXCDE          ; valid special code ?
       BHIS    10$                     ;   no, ignore it                       [108]
       PUSHW   Number
       ADDW    Number,Number                   ; make index into word offset
       MOVW    CTLTBL[~Number],Number          ; get string offset
       LEA     Atemp,CTLTBL[~Number]
       POPW    Number
10$:    JMP     StrNum                  ; go output it

; Printer control string table
; CAUTION: Do Not Change the order of the string table.
;          If the string is not implemented put a length of zero at the label.
;
DEFINE  STRING  TAG
       WORD    TAG-CTLTBL
ENDM

CTLTBL: STRING  CHOME                   ; 00 return carriage home
       STRING  MOVAHT                  ; 01 move to absolute horizontal tab
       STRING  ROLUP                   ; 02 roll up a partial line
       STRING  ROLDWN                  ; 03 roll down a partial line
       STRING  NEGLF                   ; 04 output negative line feed
       STRING  SPLPT0                  ; 05 special print position 0
       STRING  SPLPT1                  ; 06 special print position 1
       STRING  RIBSC1                  ; 07 color 2=blue
       STRING  RIBSC2                  ; 08 color 3=red
       STRING  RIBSC3                  ; 09 color 4=yellow
       STRING  RIBPRM                  ; 10 color 1=black
       STRING  FEDTR1                  ; 11 select Feeder tray 1
       STRING  FEDTR2                  ; 12 select Feeder tray 2
       STRING  FEDTR3                  ; 13 select Feeder tray 3
       STRING  FEDTR4                  ; 14 select Feeder tray 4
       STRING  FEDTGL                  ; 15 select Feeder tray 1 & then tray 2
       STRING  FEDEJT                  ; 16 select Feeder eject
       STRING  USR1                    ; 17 user function 1
       STRING  USR2                    ; 18 user function 2
       STRING  USR3                    ; 19 user function 3
       STRING  USR4                    ; 20 user function 4
       STRING  ORANGE                  ; 21 color 5=orange
       STRING  VIOLET                  ; 22 color 6=violet
       STRING  GREEN                   ; 23 color 7=green
       STRING  BROWN                   ; 24 color 8=brown
TBLEND:                                 ; end of table

MAXCDE  =       <<TBLEND-CTLTBL>/2.>    ; maximum special code

PDCHR:  ; Output the character in D1
       FILOTB  PTDDB(IMP)
       RTN

StrNum: ; output string indexed by Atemp to DDB indexed by PTDDB(IMP)
       ; followed by a number in current radix in format: <string=#>
       ; Number=D1
       PUSH    Number
       BCALL   DoStr
       MOVB    #'=,Char
       FILOTB  PTDDB(IMP)
       POP     Number
       JMP     NumOut

StrOut: ; output string indexed by Atemp to DDB indexed by PTDDB(IMP)
       ; in the format: <string>.  Terminate on NULL.
       BCALL   DoStr
       MOVB    #'>,Char
       FILOTB  PTDDB(IMP)
       JMP     DoCRLF

DoStr:  PUSH    Buffer
       MOV     Atemp,Buffer
       MOVB    #'<,Char
       FILOTB  PTDDB(IMP)
10$:    MOVB    (Buffer)+,Char
       BEQ     20$
       FILOTB  PTDDB(IMP)
       BR      10$
20$:    POP     Buffer
       RTN

PDINI:  ; initialize the printer
       MOVW    #-1,HMISAV(IMP)         ; no HMI yet
       MOVW    #-1,LPISAV(IMP)         ; no LPI yet
       MOVW    #-1,CPISAV(IMP)         ; no CPI yet
       MOVW    #-1,TPMSAV(IMP)         ; no top margin yet
       MOVW    #-1,LPOSAV(IMP)         ; no left paper offset yet
       CLRW    CURCOL(IMP)             ; at column 0
       CLR     CURLIN(IMP)             ; at start of page
       CMPW    PTDDB+D.EXT(IMP),#[LST] ; already set for output to disk?
       BEQ     DoInit                  ; yes, skip warning & ext'n switch
       PUSHW   CrtCmd
       MOVW    #3_8.!1,CrtCmd          ; row 3, column 1
       TCRT
       POPW    CrtCmd
       TYPE    <%Warning - Test Printer Driver always outputs to .LST >
       TYPE    <file without spooling>
       MOVW    #[LST],PTDDB+D.EXT(IMP) ; change file extension to .LST
       LOOKUP  PTDDB(IMP)              ; is file already on disk?
       BNE     DoInit                  ; no, go ahead & create .LST file
       DSKDEL  PTDDB(IMP)              ; erase old .LST file
DoInit: LEA     Atemp,Initialize
       JMP     StrOut

PDCLS:  ; Shut down the printer
       LEA     Atemp,ShutDown
       JMP     StrOut

PDSTM:  ; Set Top Margin from value in D2
       ;  D2 contains the number of lines required in the Top Margin
       MOVW    Value,TPMSAV(IMP)       ; save top margin value
       LEA     Atemp,SetTopMargin
       CLR     Number
       MOVW    Value,Number
       JMP     StrNum

PDMTM:  ; Move to Top Margin
       LEA     Atemp,MvToTopMargin
       JMP     StrOut

PDLF:   ; Output Line feeds per count in D2
       LEA     Atemp,LineFeeds
       CLR     Number
       MOVW    Value,Number
       CALL    StrNum
       LSL     Number                  ; x2
       ADD     Number,CURLIN(IMP)
       RTN

PDSLPO: ; Set Left Paper Offset
       ;  D2 contains the number of 1/10 inch units required
       MOVW    Value,LPOSAV(IMP)               ; save left paper offset
       LEA     Atemp,SetLeftOffset
       CLR     Number
       MOVW    Value,Number
       JMP     StrNum

PDMLPO: ; Move to Left Paper Offset
       LEA     Atemp,MvToLeft
       JMP     StrOut

PDSLPP: ; Set lines per page
       ;  D2 contains the form length in number of lines
       MOVW    Value,LPPSAV(IMP)               ; save for later
       LEA     Atemp,SetLPP
       CLR     Number
       MOVW    Value,Number
       JMP     StrNum

PDSLSP: ; Set line spacing
       ;  D2 contains the number of 1/2 lines
       MOVW    Value,LSPSAV(IMP)               ; save for later
       LEA     Atemp,SetLSP
       CLR     Number
       MOVW    Value,Number
       JMP     StrNum

PDMNLN: ; Move to Next Line and setup for new line
       LEA     Atemp,NewLine
       CLRW    CURCOL(IMP)             ; back to column 0
       ADD     #2.,CURLIN(IMP)         ; bump current line number by full line
       JMP     StrOut

DoCRLF: MOVB    #$CR,Char               ; output a carriage return              [105]
       FILOTB  PTDDB(IMP)
       MOVB    #$LF,Char
       FILOTB  PTDDB(IMP)              ; output the LF
       RTN

PDMTOF: ; Move to Top of Form and setup for new page
       CLR     CURLIN(IMP)             ; at start of page
       LEA     Atemp,MoveTOF
       JMP     StrOut

PDPSON: ; enable proportional
       BSET    #FM%PRO,FM.FLG(IMP)
       LEA     Atemp,ProON
       JMP     StrOut
PDSOF:  ; disable proportional
       BCLR    #FM%PRO,FM.FLG(IMP)
       LEA     Atemp,ProOFF
       JMP     StrOut

PDUNDR: ; Toggle Underscore
       BCHG    #FM%UND,FM.FLG(IMP)     ; toggle underscore
       BNE     UNDOFF                  ;  and go do it if end of field
UNDON:  LEA     Atemp,ONunder
       JMP     StrOut
UNDOFF: LEA     Atemp,OFFunder
       JMP     StrOut

PDDBL:  ; Toggle Double Underscore
       BCHG    #FM%DBL,FM.FLG(IMP)     ; toggle double underscore
       BNE     DBLOFF                  ;  and go do it if end of field
DBLON:  LEA     Atemp,ONdouble
       JMP     StrOut
DBLOFF: LEA     Atemp,OFFdouble
       JMP     StrOut

PDBOLD: ; Toggle Bold
       BCHG    #FM%BLD,FM.FLG(IMP)     ; bold enabled ?
       BNE     10$                     ; yes, end of bold field
       LEA     Atemp,BoldON
       JMP     StrOut
10$:    LEA     Atemp,BoldOFF
       JMP     StrOut

PDSTRK: ; Toggle strikeout
       BCHG    #FM%STK,FM.FLG(IMP)     ; toggle strikeout flag
       BNE     STKOFF                  ;  and go do it if end of field
       MOVW    CURCOL(IMP),STKCOL(IMP) ;   or set field start
       MOVB    Char,STKCHR(IMP)        ; save strikeout character
       PUSHW   Char
       LEA     Atemp,ONstrike
       CALL    DoStr
       MOVB    #'=,Char
       FILOTB  PTDDB(IMP)
       POPW    Char
       FILOTB  PTDDB(IMP)
       MOVB    #'>,Char
       FILOTB  PTDDB(IMP)
       RTN

STKOFF: LEA     Atemp,OFFstrike
       JMP     StrOut

PDBAR:  ; toggle over-bar
       BCHG    #FM%BAR,FM.FLG(IMP)     ; overbar enabled ?
       BNE     10$
       LEA     Atemp,OverON
       JMP     StrOut
10$:    LEA     Atemp,OverOFF
       JMP     StrOut

PDFONT: ; set font, Number=D1 contains font code#
       LEA     Atemp,SetFont
       JMP     StrNum

PDSLPI: ; set lines per inch
       ; Value=D2 contains number of lines per inch required
       MOVW    Value,LPISAV(IMP)
       LEA     Atemp,SetLPI
PerInch:CLR     Number
       MOVW    Value,Number
       JMP     StrNum

PDSCPI: ; set characters per inch
       ; Value=D2 contains number of characters per inch required
       MOVW    Value,CPISAV(IMP)
       LEA     Atemp,SetCPI
       BR      PerInch

PDSHMI: ; set horizontal motion index
       ; Value=D2 contains number of characters per inch required
; Note:  AlphaWRITE calls PDSHMI very frequently, especially if variable
; spacing is requested.  For best efficiency this routine should output
; the real HMI control sequence only if the current HMI value is different
; from the last set value.  We don't do this here, so for testing purposes
; you can see when HMI is called.
       MOVW    Value,HMISAV(IMP)
       LEA     Atemp,SetHMI
       BR      PerInch

PDOVRP: ; Setup to overprint the last character
       LEA     Atemp,OverPrint
       JMP     StrOut

Res1:   MOVB    #1,D7
       BR      Reserved
Res2:   MOVB    #2,D7
       BR      Reserved
Res3:   MOVB    #3,D7
       BR      Reserved
Res4:   MOVB    #4,D7
       BR      Reserved
Res5:   MOVB    #5,D7
       BR      Reserved
Res6:   MOVB    #6,D7
       BR      Reserved
Res7:   MOVB    #7,D7
Reserved:
       LEA     Atemp,Alpha
Special:PUSH    Number
       CLR     Number
       MOVB    D7,Number
       CALL    StrNum
       POP     Number
       RTN

User1:  MOVB    #1,D7
       BR      UserDefined
User2:  MOVB    #2,D7
       BR      UserDefined
User3:  MOVB    #3,D7
       BR      UserDefined
User4:  MOVB    #4,D7
       BR      UserDefined
User5:  MOVB    #5,D7
       BR      UserDefined
User6:  MOVB    #6,D7
       BR      UserDefined
User7:  MOVB    #7,D7
       BR      UserDefined
User8:  MOVB    #8.,D7
UserDefined:LEA Atemp,UsrDef
       BR      Special

MOVAHT: asciz   "move abs horiz tab"
CHOME:  asciz   "carriage home"
ROLUP:  asciz   "roll up partial"
ROLDWN: asciz   "roll down partial"
NEGLF:  asciz   "neg LF"
SPLPT0: asciz   "spec pos 0"
SPLPT1: asciz   "spec pos 1"
RIBSC1: asciz   "blue"
RIBSC2: asciz   "red"
RIBSC3: asciz   "yellow"
RIBPRM: asciz   "black"
FEDTR1: asciz   "tray 1"
FEDTR2: asciz   "tray 2"
FEDTR3: asciz   "tray 3"
FEDTR4: asciz   "tray 4"
FEDTGL: asciz   "tray 1 then 2"
FEDEJT: asciz   "feeder eject"
USR1:   asciz   "user fn1"
USR2:   asciz   "user fn2"
USR3:   asciz   "user fn3"
USR4:   asciz   "user fn4"
ORANGE: asciz   "orange"
VIOLET: asciz   "violet"
GREEN:  asciz   "green"
BROWN:  asciz   "brown"

Initialize:     asciz   "initialize"
ShutDown:       asciz   "shut down"
SetTopMargin:   asciz   "set top margin"
MvToTopMargin:  asciz   "move to top margin"
SetLeftOffset:  asciz   "set left margin"
MvToLeft:       asciz   "move to left margin"
SetLPP:         asciz   "set lines per page"
SetLSP:         asciz   "set line spacing"
MoveTOF:        asciz   "new page"
LineFeeds:      asciz   "linefeeds"
NewLine:        asciz   "new line"
ONunder:        asciz   "under ON"
OFFunder:       asciz   "under OFF"
ONdouble:       asciz   "double under ON"
OFFdouble:      asciz   "double under OFF"
BoldON:         asciz   "bold ON"
BoldOFF:        asciz   "bold OFF"
ONstrike:       asciz   "strikeout ON"
OFFstrike:      asciz   "strikeout OFF"
OverPrint:      asciz   "overprint"
Alpha:          asciz   "reserved for Alpha Micro"
UsrDef:         asciz   "reserved for user definition"
ProON:          asciz   "proportional ON"
ProOFF:         asciz   "proportional OFF"
OverON:         asciz   "overbar ON"
OverOFF:        asciz   "overbar OFF"
SetCPI:         asciz   "set CPI"
SetLPI:         asciz   "set LPI"
SetHMI:         asciz   "set HMI"
BadCode:        asciz   "?Invalid special code"
SetFont:        asciz   "set font"

       EVEN                            ; module must end on word boundary

       END