INTRODUCTION
The following example is a simple program to read a file and print the contents to a standard printer. It gets the filename of the file to print from the DOS command prompt input line. The prompt input information is passed to the program in a buffer area of the Program Segment Prefix (PSP). The address of the Program Segment Prefix is passed to the program in the ES and DS registers when the program execution starts. This program checks the keyboard between every character printed for an escape key code to terminate execution of the program.
; This program prints a file defined on the command line
.MODEL small
;************* Stack Section *********************
.STACK 500
;************* Data Section **********************
.DATA
psp_seg dw 0
no_cl_mess db "This routine requires that a "
db "filename be on the command line for printing."
db 0dh,0ah,"Please try with a filename.",0dh,0ah,"$"
file_bad_open db "Bad file open",0dh,0ah,"$"
file_bad_read db "Bad file read",0dh,0ah,"$"
printer_bad_mess db "!! Printer Error !!!!",0dh,0ah,"$"
printing_mess db "A file is being printed,",0dh,0ah
db "To stop printing, Press ESC key",0dh,0ah,"$"
filename db 128 dup(0)
file_handle dw 0
file_count dw 0
file_pointer dw offset file_buffer
file_buffer db 1024 dup(0)
; ************* ----------- *********************
;************* Code Section *******************
.CODE
start proc near
;DS and ES are indexing PSP area
mov al,[DS:80H] ;load AL with size of data line
mov dx,@data ;get segment address of data area
mov ds,dx ;point DS to data area
mov psp_seg,ES ;save PSP address
cmp al,1 ;?? data in DOS command line ??
ja get_PSP_filename ;branch if data found
;if here, there is no data on command line
;display error message to user and terminate
lea dx,no_cl_mess
;-------------------------
terminate_display:
;display message indexed by DX then terminate
mov ah,09
int 21H ;DOS Call
;-------------------------
terminate_program:
;terminating the program
mov ah,4CH ;set AH for terminating function
mov al,00 ;set terminating code variable
int 21H ;call DOS to terminate
;------------------------------------------
; %%%%%%%%%%%%% ----------- %%%%%%%%%%%%%%%
get_PSP_filename:
;move PSP filename to filename buffer in our data area
mov ax,ds
mov es,ax ;point ES to data segment
mov ds,psp_seg
mov si,82H ;SI source is PSP data area
lea di,filename
cld ;make strings go forward
get_PSP_data_1:
lodsb ;load string data byte
;check for end of filename
cmp al,21H
;branch if end of string
jb got_PSP_filename
stosb ;store string data byte
jmp get_PSP_data_1
got_PSP_filename:
mov al,0
stosb ;make ASCIIZ string with zero end
push es
pop ds ;reset data segment pointer
;try to open file
mov ah,3dH
lea dx,filename
mov al,0 ;read access code
int 21H ;DOS Call
jnc file_open_ok
lea dx,file_bad_open
jmp terminate_display
;+++++++++++++++++++++++++++++++++++++++++++
;############### +++++++++++ ###############
file_open_ok:
;save file handle
mov file_handle,ax
lea dx,printing_mess ;display start message
mov ah,09
int 21H ;DOS Call
file_read:
;read in block of file data
mov ah,3fH
lea dx,file_buffer
mov cx,1024
mov bx,file_handle
int 21H ;DOS Call
jnc file_read_ok ;branch if good read
;else read file error occurred
;close file
mov ah,3eh
mov bx,file_handle
int 21H
;index exit error message
lea dx,file_bad_read
jmp terminate_display
file_read_ok:
;check to see if no more file data
cmp ax,0
je close_file ;branch if no data left
;else reset data block size and pointer
mov file_count,ax
lea bx,file_buffer
mov file_pointer,bx
;!!!!!!!!!!!!!!!!! ^^^^^^^^ !!!!!!!!!!!!!!!!!!!!
print_data_block:
;main loop to print block of file data
;scan keyboard to check for any keys
mov ah,1
int 16H
jz print_data_block_1 ;branch if no key
;get key code out of buffer
mov ah,0
int 16H ;call BIOS keyboard
cmp al,01BH ;check key code
je close_file ;branch if ESC
print_data_block_1:
mov si,file_pointer
mov al,[si]
mov ah,0
mov dx,0 ;select LPT1
int 17H ;BIOS Call
test ah,25H
jnz printer_error
inc si
mov file_pointer,si
dec file_count
jnz print_data_block ;loop if more data
;else go read in next block of file data
jmp file_read
;!!!!!!!!!!!!!!!! ^^^^^^^^ !!!!!!!!!!!!!!!!!!!!
close_file:
mov ah,3eh
mov bx,file_handle
int 21H ;DOS Call
jmp terminate_program
;-------------- ?????????? -------------------
printer_error:
;index exit error message
lea dx,printer_bad_mess
jmp terminate_display
;_______________________________________________
start endp ;end of start procedure
end start ;define start as beginning of program