;************************************************ ; Program to print a message on an IBM PC * ; Accesses the LPT1 printer ports directly * ;************************************************ stk segment stack dw 16 dup (?) stk ends data segment num dw 42 msg db 'Hello world. I control the printer', 0dh, 0ah dataport dw ? statport dw ? strobport dw ? data ends code segment assume cs:code,ds:data main proc far push ds ;bookkeeping sub ax,ax push ax mov ax,data mov ds,ax mov ax,40h ;get the printer data port address mov es,ax mov bx,8 mov si,es:[bx] mov dataport,si ;save it inc si ;status port address mov statport,si inc si ;strobe port address mov strobport,si call prtmsg ;print out the msg string ret main endp prtmsg proc near ;sends characters of msg to printer mov cx,num ;length of output message mov bx,offset msg ;point to first character top: mov al,[bx] ;get next character call prtchr ;send to printer inc bx ;point to next character loop top ;do it again ret prtmsg endp ;**** prtchr--sends the character in al to the printer interface when ready prtchr proc near push dx push ax ;save character on stack mov dx,statport wait1: in al,dx ;input status byte--start of polling loop test al,10000000b ;test ready bit jz wait1 ;if not ready, do it again pop ax ;restore character mov dx,dataport ;output to data port out dx,al mov dx,strobport ;control port mov al,00001101b ;begin strobe pulse out dx,al mov al,00001100b ;end strobe pulse out dx,al pop dx ret prtchr endp code ends end main