PAGE 58,132
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
; Drive Hitachi display on LPT1. Data lines straight, STRB (1) --> E (6)
; SLCT_IN (17) --> R/W (5), AUTO_FD_XT (14) --> R/S (4)
; Ignore BSY signal (o/p only port), just delay after every operation.
; Phil_G Apr 96
;
PORTA EQU 378h
PORTC EQU 37Ah
;
ORG 100H ; a .COM file
BEGIN: MOV DX,PORTA ; Init port to zeroes
MOV AL,0
OUT DX,AL
MOV DX,PORTC
MOV AL,PORTCM
OUT DX,AL
CALL DELAY
CALL DELAY
;
MOV SI,OFFSET ITABLE ; set-up command string
MOV CL,ILEN ; length
MOV CH,0
IPRINT: CALL DELAY
LODSB
MOV DX,PORTA
OUT DX,AL ; OUT ASCII DATA
CALL STROBE
LOOP IPRINT
CALL SETTXT ; set text i/p mode
MOV SI,82H ; to string parameter
MOV CL,byte ptr cs:[80h]; length
cmp cl,0 ; nowt there?
jz done
dec cl ; less initial space
MOV CH,0
MPRINT: CALL DELAY
LODSB ; print message
MOV DX,PORTA
OUT DX,AL ; OUT ASCII DATA
CALL STROBE
LOOP MPRINT
DONE: MOV AX,4C00h ; all done
INT 21h
ITABLE: DB 30h,30h,30h,38h,08h,01h,06h,0Eh,06h
;ITABLE: DB 38h,38h,06h,0Ch,01h
ILEN DB ILEN-ITABLE
PORTCM DB 00001011b ; map of control port C
STROBE: MOV DX,PORTC ; pulse E hi then lo
MOV AL,PORTCM ; note LPT inverts it
OR AL,1
MOV PORTCM,AL
OUT DX,AL
AND AL,0FEh
MOV PORTCM,AL
OUT DX,AL
RET
;
SETTXT: CALL DELAY ; set text mode by
MOV AL,PORTCM ; setting RS bit...
AND AL,0FDh ; note LPT inverts it
MOV DX,PORTC
OUT DX,AL
MOV PORTCM,AL
RET
SETCMD: CALL DELAY ; set command mode by
MOV AL,PORTCM ; resetting RS bit...
OR AL,02h ; note LPT inverts it
MOV DX,PORTC
OUT DX,AL
MOV PORTCM,AL
RET
DELAY: PUSH CX ; a few MS delay
MOV CX,8000h ; guess value?
DEL1: LOOP DEL1
POP CX
RET
CODE ENDS
END BEGIN