TE Comp Sem-I MMC Prac 5 (Printer)

.MODEL SMALL
.CODE
                   ;"DEVICE HEADER"
LINK DD -1                         ;LINK FIELD
     DW 0C000H                     ;ATTRIBUTE WORD

     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