#TITLE "TURBODOS PRINTER DRIVER FOR IBM PC (VIA PARALLEL PRINTER ADAPTER)" #SUBTTL "COPYRIGHT 1984, SOFTWARE 2000, INC." ; ; COPYRIGHT 1984, SOFTWARE 2000, INC. ; ; VERSION: 01/04/84 ; MODULE "LSTPPA" ;MODULE NAME ; #INCLUDE "DREQUATE" ;DRIVER SYMBOLIC EQUIVALENCES ; LOC Data# ;LOCATE IN DATA SEGMENT ; PPACH:: BYTE 0 ;PARALLEL PRINTER CHANNEL NUMBER INITC: BYTE 0 ;INITIALIZATION COMPLETE FLAG COLCNT: BYTE 0 ;COLUMN COUNTER SPCNT: BYTE 0 ;SPACE COUNTER LNCNT: BYTE 0 ;LINE COUNTER ; LOSPH: ;LIST OUTPUT SEMAPHORE WORD 0 ;SEMAPHORE COUNT __LOHD: WORD __LOHD ;SEMAPHORE LIST HEAD WORD __LOHD ; LOC Code# ;LOCATE IN DATA SEGMENT ; LSTDR_::MOV AL,INITC ;GET INITIALIZATION COMPLETE FLAG TEST AL,AL ;INITIALIZATION COMPLETE FLAG SET? JNZ __LDRV ;IF SO, CONTINUE MOV INITC,=0xFF ;ELSE, SET INIT COMPLETE FLAG PUSH DX ;SAVE FUNCTION NUMBER MOV DL,PPACH ;GET PRINTER CHANNEL NUMBER MOV DH,=0 ;DOUBLE LENGTH MOV AH,=1 ;SET FUNCTION NUMBER=1 INT 0x17 ;INITIALIZE PRINTER PORT POP DX ;RESTORE FUNCTION NUMBER __LDRV: CMP DL,=2 ;FUNCTION NUMBER=2? JZ LSTOUT ;IF SO, CONTINUE CMP DL,=7 ;FUNCTION NUMBER=7? JZ LSTWSR ;IF SO, CONTINUE RET ;ELSE, DONE ; LSTWSR: MOV AL,COLCNT ;GET COLUMN COUNT PUSH AX ;SAVE COLUMN COUNT MOV CL,=ACR ;GET CARRIAGE RETURN CALL LSTOUT ;OUTPUT CARRIAGE RETURN POP AX ;RESTORE COLUMN COUNT TEST AL,AL ;COLUMN COUNT=0? JNZ __FF ;IF NOT, CONTINUE MOV AL,LNCNT ;ELSE, GET LINE COUNTER TEST AL,AL ;LINE COUNT=0? JNZ __FF ;IF NOT, CONTINUE RET ;ELSE, DONE __FF: MOV CL,=AFF ;GET FORM FEED ; LSTOUT: MOV AL,CL ;GET OUTPUT CHARACTER AND AL,=0x7F ;STRIP PARITY JZ __X ;IF CHARACTER=NULL, DONE MOV CL,AL ;ELSE, CHARACTER TO C-REG CMP AL,=ASP ;GRAPHIC CHARACTER? JNC __GR ;IF SO, PROCESS CMP AL,=ACR ;CARRIAGE RETURN? JZ __CR ;IF SO, PROCESS CMP AL,=AFF ;FORM FEED? JZ __FF ;IF SO, PROCESS CMP AL,=ALF ;LINE FEED? JZ __LF ;IF SO, PROCESS CMP AL,=AHT ;HORIZONTAL TAB? JZ __HT ;IF SO, PROCESS CMP AL,=ABS ;BACKSPACE? JZ __BS ;IF SO, CONTINUE CMP AL,=ABEL ;BELL? JNZ __X ;IF NOT, CONTINUE JMP LSTCOM ;ELSE, CONTINUE RET ;DONE __CR: CALL LSTCOM ;OUTPUT CARRIAGE RETURN XOR AL,AL MOV COLCNT,AL ;SET COLUMN COUNT=0 MOV SPCNT,AL ;SET SPACE COUNT=0 RET ;DONE __FF: MOV CL,=ALF ;GET LINE FEED CHARACTER CALL __LF ;OUTPUT LINE FEED MOV AL,LNCNT ;GET LINE COUNTER TEST AL,AL ;AT TOP OF FORM YET? JZ __X ;IF SO, DONE JMPS __FF ;ELSE, CONTINUE __LF: CALL LSTCOM ;OUTPUT LINE FEED MOV AL,LNCNT ;GET LINE COUNTER INC AL ;INCREMENT IT CMP AL,=66 ;AT TOP OF FORM YET? JC __ULC ;IF NOT, UDATE LINE COUNT XOR AL,AL ;ELSE ,RESET LINE COUNTER __ULC: MOV LNCNT,AL ;UPDATE LINE COUNTER __X: RET ;DONE __HT: MOV AL,COLCNT ;GET COLUMN COUNTER MOV DH,AL ;TO DH-REG AND AL,=~7 ;CALC NEXT TAB STOP ADD AL,=8 SUB AL,DH ;CALC NUMBER OF SPACES REQUIRED MOV DH,AL ;SPACE COUNT TO DH-REG __HTL: MOV CL,=ASP ;GET ASCII SPACE MOV AL,CL ;ASCII SPACE TO A-REG CALL __GR ;OUTPUT SPACES DEC DH ;TO NEXT TAB STOP JNZ __HTL RET ;DONE __BS: CALL LSTCOM ;OUTPUT BACKSPACE DEC COLCNT ;DECREMENT COLUMN COUNT RET ;DONE __GR: INC COLCNT ;INCREMENT COLUMN COUNT CMP AL,=ASP ;CHARACTER=SPACE? JZ __SP ;IF SO, CONTINUE MOV AL,SPCNT ;ELSE, GET SPACE COUNT TEST AL,AL ;SPACE COUNT=0? JZ LSTCOM ;IF SO, CONTINUE MOV DH,AL ;ELSE, SPACE COUNT TO DH-REG PUSH CX ;SAVE OUTPUT CHARACTER __SPL: MOV CL,=ASP ;GET ASCII SPACE CALL LSTCOM ;OUTPUT SPACES DEC DH JNZ __SPL POP CX ;RESTORE OUTPUT CHARACTER XOR AL,AL MOV SPCNT,AL ;SET SPACE COUNT=0 JMPS LSTCOM ;CONTINUE __SP: INC SPCNT ;INCREMENT SPACE COUNT RET ;DONE ; LSTCOM: PUSH DX ;SAVE DX-REG PUSH CX ;SAVE CX-REG MOV DX,&__LOPR ;GET LIST OUTPUT POLL ROUTINE CALL LNKPOL# ;LINK POLL ROUTINE ON POLL LIST CALL __LOPC ;EXECUTE POLL ROUTINE CODE MOV BX,&LOSPH ;GET SEMAPHORE ADDRESS CALL WAIT# ;DISPATCH, IF NECESSARY POP CX ;RESTORE CX-REG MOV DL,PPACH ;GET PRINTER CHANNEL NUMBER MOV DH,=0 ;DOUBLE LENGTH MOV AL,CL ;GET OUTPUT CHARACTER MOV AH,=0 ;SET FUNCTION NUMBER=0 INT 0x17 ;OUTPUT CHARACTER POP DX ;RESTORE DX-REG RET ;DONE __LOPR: WORD 0 ;SUCCESSOR LINK POINTER WORD 0 ;PREDECESSOR LINK POINTER __LOPC: MOV DL,PPACH ;GET PRINTER CHANNEL NUMBER MOV DH,=0 ;DOUBLE LENGTH MOV AH,=2 ;SET FUNCTION NUMBER=2 INT 0x17 ;GET PRINTER PORT STATUS TEST AH,=1<<7 ;PRINTER NOT BUSY BIT SET? JZ __LOPX ;IF NOT, CONTINUE MOV BX,&__LOPR ;GET LIST OUTPUT POLL ROUTINE CALL UNLINK# ;UNLINK POLL ROUTINE FROM POLL LIST MOV BX,&LOSPH ;GET SEMAPHORE ADDRESS CALL SIGNAL# ;SIGNAL PROCESS AS READY __LOPX: RET ;DONE ; END