home *** CD-ROM | disk | FTP | other *** search
- PAGE ,132
- TITLE VIDEO_IO - TURBO-CALLABLE DIRECT VIDEO-RAM ACCESS
- ;
- BIOSDATA SEGMENT AT 0
- ORG 463H ; IGNORED
- VIDEOPTR DW ? ; VIDEO PORTS BASE
- VIDEOMOD DB ? ; VIDEO MODE BYTE
- COL80 EQU 1 ; BIT FOR 80-COLUMN MODE
- GRAPH EQU 2 ; BIT FOR GRAPHICS MODE
- BIOSDATA ENDS
- ;
- CODE SEGMENT 'CODE'
- ASSUME CS:CODE,DS:NOTHING
- ;
- VIDEO_IO PROC NEAR
- ;
- ; JUMP TABLE
- JMP PUTSTR ; WRITE STRING/ATTR ROUTINE
- JMP SETATTR ; SET ATTRIBUTE ROUTINE
- PAGE
- ;
- ; MACROS
- ;
- ;
- ; STANDARD ENTRY-POINT CODE
- ;
- ENTRY MACRO EPNAME
- LOCAL OK
- EPNAME:
- PUSH BP ; SAVE BP
- MOV BP,SP ; HOLD SP VALUE ASIDE
- PUSH DS ; SAVE DS
- CALL SETVIDEO ; CALL VIDEO SET-UP SUBROUTINE
- OR CX,CX ; ZERO-LENGTH STRING?
- JNZ OK ; BRANCH IF NON-ZERO LENGTH
- JMP EXIT ; EXIT IF ZERO LENGTH
- OK:
- ENDM
- ;
- ; STANDARD VIDEO DISPLAY WAIT
- ;
- WAITVIDEO MACRO
- LOCAL WAIT1,WAIT2
- WAIT1:
- IN AL,DX ; GET STATUS BYTE
- TEST AL,1 ; HORIZONTAL RETRACE?
- JNZ WAIT1 ; YES - WAIT
- CLI ; TURN OFF INTERRUPTS
- WAIT2:
- IN AL,DX ; GET STATUS BYTE
- TEST AL,1 ; HORIZONTAL RETRACE?
- JZ WAIT2 ; NO - WAIT
- ENDM
- PAGE
- ; **********************************************************************
- ; PUTSTR SUBROUTINE --- WRITE STRING/ATTRIBUTE TO SCREEN
- ;
- ; DECLARED IN TURBO AS
- ;
- ; PROCEDURE VIDEO_PUTSTR(VAR ROW, COL: BYTE; VAR STR; VAR ATTR: BYTE);
- ; EXTERNAL('VIDEO_IO.BIN');
- ;
- ; NOTE THAT THE VARIABLE STR IS UNTYPED, ALTHOUGH A STRING.
- ;
- ; **********************************************************************
- ;
- ENTRY PUTSTR
- ;
- MOVELOOP:
- ;
- LODSB ; GET STRING CHRACTER
- MOV BL,AL ; AND SAVE IT IN BL
- ;
- WAITVIDEO ; WAIT FOR RIGHT TIME TO PROCEED
- ;
- MOV AX,BX ; GET CHARACTER/ATTRIBUTE
- STOSW ; AND STORE IT IN VIDEO RAM
- ;
- STI ; RE-ENABLE INTERRUPTS
- ;
- LOOP MOVELOOP ; LOOP FOR NEXT CHARACTER
- ;
- JMP EXIT
- PAGE
- ; **********************************************************************
- ; SETATTR SUBROUTINE --- WRITE STRING/ATTRIBUTE TO SCREEN
- ;
- ; DECLARED IN TURBO AS
- ;
- ; PROCEDURE VIDEO_SETATTR(VAR ROW, COL, LEN, ATTR: BYTE);
- ; EXTERNAL VIDEO_PUTSTR[3];
- ;
- ; **********************************************************************
- ;
- ENTRY SETATTR
- ;
- ATTRLOOP:
- ;
- INC DI ; POINT TO NEXT ATTRIBUTE BYTE
- ;
- WAITVIDEO ; WAIT FOR RIGHT TIME TO PROCEED
- ;
- MOV AL,BH ; GET ATTRIBUTE
- STOSB ; AND STORE IT IN VIDEO RAM
- ;
- STI ; RE-ENABLE INTERRUPTS
- ;
- LOOP ATTRLOOP ; LOOP FOR NEXT CHARACTER
- ;
- JMP EXIT
- PAGE
- ; **********************************************************************
- ; SETVIDEO SUBROUTINE
- ;
- ; ENTRY CONDITIONS:
- ; PARAMETER LIST IN STACK, CONTAINING DWORD ADDRESSES:
- ; [BP]+16 - BYTE ROW NUMBER
- ; [BP]+12 - BYTE STARTING COLUMN NUMBER
- ; [BP]+8 - STRING LENGTH/VALUE
- ; [BP]+4 - BYTE ATTRIBUTE VALUE
- ;
- ; EXIT CONDITIONS (PRIOR REGISTER VALUES DESTROYED)
- ; DX - VIDEO STATUS PORT ADDRESS
- ; DS - STRING VALUE SEGMENT
- ; SI - STRING VALUE OFFSET
- ; CX - STRING LENGTH (MAY BE TRUNCATED TO END-OF-ROW)
- ; ES - VIDEO RAM SEGMENT
- ; DI - VIDEO-RAM STARTING OFFSET
- ; BH - VIDEO ATTRIBUTE VALUE
- ;
- ; **********************************************************************
- ;
- MINROW EQU 1 ; MINIMUM ROW NUMBER
- MAXROW EQU 25 ; MAXIMUM ROW NUMBER
- MINCOL EQU 1 ; MINIMUM COL NUMBER
- COLOR EQU 0B800H ; COLOR RAM SEGMENT ADDRESS
- MONO EQU 0B000H ; MONO RAM SEGMENT ADDRESS
- COLORPTR EQU 3DAH ; COLOR VIDEO STATUS PORT
- VIDEOSTS EQU 6 ; VIDEO STATUS REGISTER INCR
- ;
- SETVIDEO PROC NEAR
- ;
- XOR AX,AX ; SET-UP BIOS SEGMENT ADDRESS
- MOV ES,AX ; AND PUT IT IN ES
- ASSUME ES:BIOSDATA ; LET ASSEMBLER KNOW ABOUT THIS
- ;
- TEST VIDEOMOD,GRAPH ; ARE WE IN GRAPHICS MODE?
- JZ MODEOK ; NO
- JMP VIDEOERR ; YES - SET ERROR INDICATION
- MODEOK:
- ;
- MOV DX,VIDEOPTR ; GET VIDEO PORT BASE
- ADD DX,VIDEOSTS ; SET VIDEO STATUS PORT ADDRESS
- PUSH DX ; AND SAVE IT FOR LATER
- ;
- MOV BX,80 ; SET 80-COLUMNS MAX
- TEST VIDEOMOD,COL80 ; BUT, ARE WE REALLY 80-COLUMN?
- JNZ WIDTH80 ; YES
- MOV BX,40 ; SET 40-COLUMNS MAX
- WIDTH80:
- ;
- MOV AX,COLOR ; SET COLOR VIDEO RAM SEGMENT
- CMP DX,COLORPTR ; BUT, ARE WE USING COLOR VIDEO?
- JE COLORVID ; YES
- MOV AX,MONO ; SET MONO VIDEO RAM SEGMENT
- COLORVID:
- ;
- PUSH AX ; SAVE VIDEO RAM SEGMENT REGISTER
- ;
- ASSUME ES:NOTHING ; TELL ASSEMBLER TO FORGET ES
- ;
- LDS SI,[BP]+16 ; GET ROW NUMBER ADDRESS
- MOV AL,BYTE PTR [SI] ; GET ROW NUMBER
- CBW ; CONVERT ROW NUMBER TO INTEGER
- ;
- CMP AX,MINROW ; IS ROW NUMBER TOO LOW?
- JL ROWBAD ; YES
- CMP AX,MAXROW ; IS ROW NUMBER TOO HIGH?
- JLE ROWOK ; NO
- ROWBAD:
- MOV AX,1 ; BAD ROW - DEFAULT TO 1
- ROWOK:
- ;
- DEC AX ; MAKE ROW NUMBER ZERO-RELATIVE
- ;
- MOV CX,BX ; GET VIDEO WIDTH
- SHL CX,1 ; DOUBLE IT FOR VIDEO CHAR/ATTR
- IMUL CX ; COMPUTE VIDEO-RAM ROW OFFSET
- ;
- MOV DI,AX ; SAVE VIDEO-RAM ROW OFFSET
- ;
- LDS SI,[BP]+12 ; GET COLUMN NUMBER ADDRESS
- MOV AL,BYTE PTR [SI] ; GET COLUMN NUMBER
- CBW ; CONVERT COLUMN NUMBER TO INTEGER
- ;
- CMP AX,MINCOL ; IS COLUMN NUMBER TOO LOW?
- JL COLBAD ; YES
- CMP AX,BX ; IS COLUMN NUMBER TOO HIGH?
- JLE COLOK ; NO
- COLBAD:
- MOV AX,1 ; BAD COLUMN - DEFAULT TO 1
- COLOK:
- ;
- DEC AX ; MAKE COLUMN NUMBER ZERO-RELATIVE
- ;
- ADD DI,AX ; ADD AX TWICE (FOR CHAR/ATTR)
- ADD DI,AX ; TO COMPUTE VIDEO-RAM START IN DI
-
- SUB BX,AX ; COMPUTE LIMIT ON STRING SIZE
-
- LDS SI,[BP]+8 ; GET STRING LENGTH/VALUE ADDRESS
- ;
- XOR CH,CH ; CLEAR CH
- MOV CL,BYTE PTR [SI] ; GET STRING LENGTH BYTE
- ;
- CMP CX,BX ; IS STRING TOO LONG?
- JBE LENGTHOK ; NO
- MOV CX,BX ; YES - LIMIT STRING LENGTH
- LENGTHOK:
- ;
- INC SI ; GET STRING VALUE OFFSET
- PUSH SI ; AND SAVE IT FOR LATER
- PUSH DS ; ALONG WITH SEGMENT ADDRESS
- ;
- LDS SI,[BP]+4 ; GET ATTRIBUTE ADDRESS
- MOV BH,BYTE PTR [SI] ; GET ATTRIBUTE
- ;
- POP DS ; RESTORE STRING VALUE SEGMENT
- POP SI ; RESTORE STRING VALUE OFFSET
- ;
- POP ES ; RESTORE VIDEO RAM SEGMENT ADDRESS
- ;
- POP DX ; RESTORE VIDEO STATUS PORT ADDR
- ;
- RET ; EXIT
- ;
- VIDEOERR:
- XOR CX,CX ; SET ZERO LENGTH TO BYPASS OUTPUT
- RET ; EXIT
- ;
- SETVIDEO ENDP
- PAGE
- ;
- ; STANDARD EXIT FROM ALL ROUTINES
- ;
- EXIT:
- POP DS ; RESTORE DS
- MOV SP,BP ; RESET ENTRY SP VALUE
- POP BP ; RESTORE BP
- RET 16 ; EXIT
- ;
- VIDEO_IO ENDP
- ;
- CODE ENDS
- ;
- END