#TITLE "TURBODOS OPERATING SYSTEM ETX/ACK PRINTER DRIVER" #SUBTTL "COPYRIGHT 1984 BY SOFTWARE 2000, INC." ; ; COPYRIGHT 1984 BY SOFTWARE 2000, INC. ; ; VERSION: 01/03/84 ; MODULE "LSTETX" ;MODULE NAME ; #INCLUDE "DREQUATE" ;DRIVER SYMBOLIC EQUIVALENCES ; LOC Data# ;LOCATE IN DATA SEGMENT ; ETXBR:: BYTE 7 ;BAUD RATE CODE (1200 BAUD) ETXLEN::BYTE 140 ;CHARACTER COUNT BETWEEN ETX'S ETXSEQ::BYTE 3 ;MAX ESCAPE SEQUENCE LENGTH ETXFF:: BYTE AFF ;FORM FEED CHARACTER CHRCNT: RES 16 ;CHARACTER COUNT SEQCNT: RES 16 ;SEQUENCE COUNT INITC: RES 16 ;INITIALIZATION COMPLETE FLAGS ; LOC Code# ;LOCATE IN CODE SEGMENT ; LSTDR_::MOV BX,&INITC ;GET INIT COMPLETE FLAGS CALL INDEX ;INDEX INTO FLAGS TABLE MOV AL,[BX] ;GET INITIALIZATION COMPLETE FLAG TEST AL,AL ;INITIALIZATION COMPLETE FLAG SET? JNZ __LDRV ;IF SO, CONTINUE DEC BYTE [BX] ;SET INIT COMPLETE FLAG PUSH DX ;SAVE FUNCTION NUMBER PUSH CX ;SAVE CHANNEL NUMBER/CHARACTER MOV CL,ETXBR ;GET BAUD RATE CODE MOV DL,=3 ;SET FUNCTION NUMBER=3 CALL SERIAL# ;SET CHANNEL BUAD RATE POP CX ;RESTORE CHANNEL NUMBER/CHARACTER POP DX ;RESTORE FUNCTION NUMBER __LDRV: MOV AL,DL ;GET FUNCTION NUMBER CMP AL,=2 ;FUNCTION NUMBER=2? JZ LSTOUT ;IF SO, CONTINUE CMP AL,=7 ;FUNCTION NUMBER=7? JZ LSTWSR ;IF SO, CONTINUE RET ;ELSE, DONE ; LSTWSR: MOV CL,ETXFF ;GET FORM FEED CHARACTER MOV DL,=2 ;SET FUNCTION NUMBER=2 ; LSTOUT: CALL __GCCA ;GET CHARACTER COUNT ADDRESS MOV AL,[BX] ;GET CHARACTER COUNT CMP AL,ETXLEN ;MAX CHARACTER COUNT OUTSTANDING? JC __OUT ;IF NOT, CONTINUE CALL __GSCA ;ELSE, GET SEQUENCE COUNT ADDRESS MOV AL,[BX] ;GET SEQUENCE COUNT TEST AL,AL ;IN ESCAPE SEQUENCE? JNZ __OUT ;IF SO, CONTINUE PUSH CX ;ELSE, SAVE OUTPUT CHARACTER MOV CL,=AETX ;GET ETX CHARACTER CALL __SOUT ;OUTPUT ETX CHARACTER __WAIT: CALL __SIN ;ELSE, GET SERIAL INPUT AND AL,=0x7F ;STRIP SIGN BIT SUB AL,=AACK ;CHARACTER=ACK? JNZ __WAIT ;IF NOT, WAIT CALL __GCCA ;ELSE, GET CHARACTER COUNT ADDRESS MOV [BX],AL ;RESET CHARACTER COUNT POP CX ;RESTORE OUTPUT CHARACTER __OUT: MOV AL,CL ;GET OUTPUT CHARACTER AND AL,=0x7F ;STRIP SIGN BIT CMP AL,=AESC ;CHARACTER=ESCAPE? JNZ __NESC ;IF NOT, CONTINUE CALL __GSCA ;ELSE, GET SEQUENCE COUNT ADDRESS MOV AL,ETXSEQ ;GET MAX ESCAPE SEQUENCE LENGTH MOV [BX],AL ;SET SEQUENCE COUNT __NESC: CALL __SOUT ;OUTPUT CHARACTER CALL __GCCA ;GET CHARACTER COUNT ADDRESS INC BYTE [BX] ;INCREMENT CHARACTER COUNT CALL __GSCA ;GET SEQUENCE COUNT ADDRESS DEC BYTE [BX] ;DECREMENT SEQUENCE COUNT JNS __X ;IF POSITIVE, DONE INC BYTE [BX] ;ELSE, RESTORE COUNT TO 0 __X: RET ;DONE __SIN: PUSH CX ;SAVE CHANNEL NUMBER/CHARACTER PUSH DX ;SAVE FUNCTION NUMBER MOV DL,=1 ;SET FUNCTION NUMBER=1 CALL SERIAL# ;GET SERIAL INPUT JMPS __SIOC ;CONTINUE __SOUT: PUSH CX ;SAVE CHANNEL NUMBER/CHARACTER PUSH DX ;SAVE FUNCTION NUMBER CALL SERIAL# ;OUTPUT CHARACTER __SIOC: POP DX ;RESTORE FUNCTION NUMBER POP CX ;RESTORE CHANNEL NUMBER/CHARACTER RET ;DONE __GCCA: MOV BX,&CHRCNT ;GET CHARACTER COUNT TABLE JMPS INDEX ;CONTINUE __GSCA: MOV BX,&SEQCNT ;GET SEQUENCE COUNT TABLE ; INDEX: PUSH AX ;SAVE AX-REG MOV AL,CH ;CHANNEL NUMBER TO AX-REG MOV AH,=0 ;DOUBLE LENGTH ADD BX,AX ;INDEX INTO TABLE POP AX ;RESTORE AX-REG RET ;DONE ; END