DW STRAT ;OFFSET STRATEGY ROUTINE
DW INTRR ;OFFSET INTERRUPT ROUTINE
DB 'PRINTER1' ;DEVICE DRIVER NAME
MSG DB 10,13,"PRINTER INITIALISED$"
RH_OFF DW ? ;TEMPORARY VARIABLES
RH_SEG DW ?
STRAT: ;STRATEGY ROUTINE
MOV CS:RH_OFF,BX ;STORING REQUEST HEADER ADDRESS
MOV DX,ES ;IN TEMPORARY VARIABLES
MOV CS:RH_SEG,DX
RETF
;THIS IS THE THIRD SECTION CALLED "INTERRUPT ROUTINE"
INTRR:
PUSHF ;PUSH RELEVANT REGISTERS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH ES
PUSH DS
MOV DX,CS:RH_SEG ;GETTING REQUEST HEADER ADDRESS
MOV ES,DX ;IN ES:BX
MOV BX,CS:RH_OFF
CMP BYTE PTR ES:[BX+2],0 ;INSPECT BYTE 2 FOR COMMAND CODE
JE INIT ;IF COMMAND= 0,INITIALISE
CMP BYTE PTR ES:[BX+2],8 ;IF COMMAND= 8,WRITE TO PRINTER
JE WRITE1
JMP EXIT ;ELSE EXIT
INIT:
PUSH CS
POP DS
MOV AH,09h
LEA DX,MSG ;yaani printer chaalu aahe
INT 21H ;DISPLAY MESSAGE
MOV AH,08h ;getch //(02h was without echo)
INT 21H
MOV AH,01h ;FUNCTION to initialise
MOV DX,0h ;LPT1
INT 17H ;INITIALISE PRINTER
MOV WORD PTR ES:[BX+14],OFFSET DUMMY
MOV WORD PTR ES:[BX+16],CS ;LOADING NEXT FREE MEMORY
JMP EXIT ;AVAILABLE IN DX
;FOR DOS TO LOAD OTHER DD
WRITE1: ;WRITE TO PRINTER
MOV CX,WORD PTR ES:[BX+18] ;COUNT
MOV SI,WORD PTR ES:[BX+14] ;OFFSET
MOV DS,WORD PTR ES:[BX+16] ;SEGMENT
A1: ;label for loop to come here
MOV AL,BYTE PTR DS:[SI] ;CHARACTER TO PRINTER
MOV AH,0 ;FUNCTION
MOV DX,0 ;LPT1
INT 17H
INC SI
LOOP A1 ;type until cx is zero
EXIT:
OR WORD PTR ES:[BX+3],0100H ;SETTING DONE BIT
POP DS ;POPPING REGISTERS
POP ES
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
RETF
DUMMY:
END
No comments:
Post a Comment