home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / VIDEO_IO.ZIP / VIDEO_IO.ASM next >
Encoding:
Assembly Source File  |  1985-09-03  |  6.1 KB  |  257 lines

  1.     PAGE    ,132
  2.     TITLE    VIDEO_IO - TURBO-CALLABLE DIRECT VIDEO-RAM ACCESS
  3. ;
  4. BIOSDATA    SEGMENT AT 0
  5.     ORG    463H    ; IGNORED
  6. VIDEOPTR    DW    ?    ; VIDEO PORTS BASE
  7. VIDEOMOD    DB    ?    ; VIDEO MODE BYTE
  8. COL80    EQU    1    ;   BIT FOR 80-COLUMN MODE
  9. GRAPH    EQU    2    ;   BIT FOR GRAPHICS MODE
  10. BIOSDATA    ENDS
  11. ;
  12. CODE    SEGMENT 'CODE'
  13.     ASSUME CS:CODE,DS:NOTHING
  14. ;
  15. VIDEO_IO    PROC    NEAR
  16. ;
  17. ; JUMP TABLE
  18.     JMP    PUTSTR    ; WRITE STRING/ATTR ROUTINE
  19.     JMP    SETATTR    ; SET ATTRIBUTE ROUTINE
  20.     PAGE
  21. ;
  22. ; MACROS
  23. ;
  24. ;
  25. ; STANDARD ENTRY-POINT CODE
  26. ;
  27. ENTRY    MACRO    EPNAME
  28.     LOCAL    OK
  29. EPNAME:
  30.     PUSH    BP    ; SAVE BP
  31.     MOV    BP,SP    ; HOLD SP VALUE ASIDE
  32.     PUSH    DS    ; SAVE DS
  33.     CALL    SETVIDEO    ; CALL VIDEO SET-UP SUBROUTINE
  34.     OR    CX,CX    ; ZERO-LENGTH STRING?
  35.     JNZ    OK     ; BRANCH IF NON-ZERO LENGTH
  36.     JMP    EXIT    ; EXIT IF ZERO LENGTH
  37. OK:
  38.     ENDM
  39. ;
  40. ; STANDARD VIDEO DISPLAY WAIT
  41. ;
  42. WAITVIDEO MACRO
  43.     LOCAL    WAIT1,WAIT2
  44. WAIT1:
  45.     IN    AL,DX    ; GET STATUS BYTE
  46.     TEST    AL,1    ; HORIZONTAL RETRACE?
  47.     JNZ    WAIT1    ; YES - WAIT
  48.     CLI        ; TURN OFF INTERRUPTS
  49. WAIT2:
  50.     IN    AL,DX    ; GET STATUS BYTE
  51.     TEST    AL,1    ; HORIZONTAL RETRACE?
  52.     JZ    WAIT2    ; NO - WAIT
  53.     ENDM
  54.     PAGE
  55. ; **********************************************************************
  56. ; PUTSTR SUBROUTINE --- WRITE STRING/ATTRIBUTE TO SCREEN
  57. ;
  58. ; DECLARED IN TURBO AS
  59. ;
  60. ;   PROCEDURE VIDEO_PUTSTR(VAR ROW, COL: BYTE; VAR STR; VAR ATTR: BYTE);
  61. ;             EXTERNAL('VIDEO_IO.BIN');
  62. ;
  63. ; NOTE THAT THE VARIABLE STR IS UNTYPED, ALTHOUGH A STRING.
  64. ;
  65. ; **********************************************************************
  66. ;
  67.     ENTRY PUTSTR
  68. ;
  69. MOVELOOP:
  70. ;
  71.     LODSB        ; GET STRING CHRACTER
  72.     MOV    BL,AL    ;  AND SAVE IT IN BL
  73. ;
  74.     WAITVIDEO    ; WAIT FOR RIGHT TIME TO PROCEED
  75. ;
  76.     MOV    AX,BX    ; GET CHARACTER/ATTRIBUTE
  77.     STOSW        ;   AND STORE IT IN VIDEO RAM
  78. ;
  79.     STI        ; RE-ENABLE INTERRUPTS
  80. ;
  81.     LOOP    MOVELOOP    ; LOOP FOR NEXT CHARACTER
  82. ;
  83.     JMP    EXIT
  84.     PAGE
  85. ; **********************************************************************
  86. ; SETATTR SUBROUTINE --- WRITE STRING/ATTRIBUTE TO SCREEN
  87. ;
  88. ; DECLARED IN TURBO AS
  89. ;
  90. ;   PROCEDURE VIDEO_SETATTR(VAR ROW, COL, LEN, ATTR: BYTE);
  91. ;             EXTERNAL VIDEO_PUTSTR[3];
  92. ;
  93. ; **********************************************************************
  94. ;
  95.     ENTRY SETATTR
  96. ;
  97. ATTRLOOP:
  98. ;
  99.     INC    DI    ; POINT TO NEXT ATTRIBUTE BYTE
  100. ;
  101.     WAITVIDEO    ; WAIT FOR RIGHT TIME TO PROCEED
  102. ;
  103.     MOV    AL,BH    ; GET ATTRIBUTE
  104.     STOSB        ;   AND STORE IT IN VIDEO RAM
  105. ;
  106.     STI        ; RE-ENABLE INTERRUPTS
  107. ;
  108.     LOOP    ATTRLOOP    ; LOOP FOR NEXT CHARACTER
  109. ;
  110.     JMP    EXIT
  111.     PAGE
  112. ; **********************************************************************
  113. ; SETVIDEO SUBROUTINE
  114. ;
  115. ; ENTRY CONDITIONS:
  116. ;    PARAMETER LIST IN STACK, CONTAINING DWORD ADDRESSES:
  117. ;        [BP]+16 - BYTE ROW NUMBER
  118. ;        [BP]+12 - BYTE STARTING COLUMN NUMBER
  119. ;        [BP]+8  - STRING LENGTH/VALUE
  120. ;        [BP]+4  - BYTE ATTRIBUTE VALUE
  121. ;
  122. ; EXIT CONDITIONS (PRIOR REGISTER VALUES DESTROYED)
  123. ;    DX - VIDEO STATUS PORT ADDRESS
  124. ;    DS - STRING VALUE SEGMENT
  125. ;    SI - STRING VALUE OFFSET
  126. ;    CX - STRING LENGTH (MAY BE TRUNCATED TO END-OF-ROW)
  127. ;    ES - VIDEO RAM SEGMENT
  128. ;    DI - VIDEO-RAM STARTING OFFSET
  129. ;    BH - VIDEO ATTRIBUTE VALUE
  130. ;
  131. ; **********************************************************************
  132. ;
  133. MINROW    EQU    1    ; MINIMUM ROW NUMBER
  134. MAXROW    EQU    25    ; MAXIMUM ROW NUMBER
  135. MINCOL    EQU    1    ; MINIMUM COL NUMBER
  136. COLOR    EQU    0B800H    ; COLOR RAM SEGMENT ADDRESS
  137. MONO    EQU    0B000H    ; MONO RAM SEGMENT ADDRESS
  138. COLORPTR    EQU    3DAH    ; COLOR VIDEO STATUS PORT
  139. VIDEOSTS    EQU    6    ; VIDEO STATUS REGISTER INCR
  140. ;
  141. SETVIDEO    PROC    NEAR
  142. ;
  143.     XOR    AX,AX    ; SET-UP BIOS SEGMENT ADDRESS
  144.     MOV    ES,AX    ;   AND PUT IT IN ES
  145.     ASSUME ES:BIOSDATA    ; LET ASSEMBLER KNOW ABOUT THIS
  146. ;
  147.     TEST    VIDEOMOD,GRAPH    ; ARE WE IN GRAPHICS MODE?
  148.     JZ    MODEOK    ; NO
  149.     JMP    VIDEOERR    ; YES - SET ERROR INDICATION
  150. MODEOK:
  151. ;
  152.     MOV    DX,VIDEOPTR    ; GET VIDEO PORT BASE
  153.     ADD    DX,VIDEOSTS    ; SET VIDEO STATUS PORT ADDRESS
  154.     PUSH    DX    ;   AND SAVE IT FOR LATER
  155. ;
  156.     MOV    BX,80    ; SET 80-COLUMNS MAX
  157.     TEST    VIDEOMOD,COL80    ; BUT, ARE WE REALLY 80-COLUMN?
  158.     JNZ    WIDTH80    ; YES
  159.     MOV    BX,40    ; SET 40-COLUMNS MAX
  160. WIDTH80:
  161. ;
  162.     MOV    AX,COLOR    ; SET COLOR VIDEO RAM SEGMENT
  163.     CMP    DX,COLORPTR    ; BUT, ARE WE USING COLOR VIDEO?
  164.     JE     COLORVID         ; YES
  165.     MOV    AX,MONO    ; SET MONO VIDEO RAM SEGMENT
  166. COLORVID:
  167. ;
  168.     PUSH    AX    ; SAVE VIDEO RAM SEGMENT REGISTER
  169. ;
  170.     ASSUME ES:NOTHING    ; TELL ASSEMBLER TO FORGET ES
  171. ;
  172.     LDS    SI,[BP]+16    ; GET ROW NUMBER ADDRESS
  173.     MOV    AL,BYTE PTR [SI]    ; GET ROW NUMBER
  174.     CBW        ; CONVERT ROW NUMBER TO INTEGER
  175. ;
  176.     CMP    AX,MINROW    ; IS ROW NUMBER TOO LOW?
  177.     JL    ROWBAD    ; YES
  178.     CMP    AX,MAXROW    ; IS ROW NUMBER TOO HIGH?
  179.     JLE    ROWOK    ; NO
  180. ROWBAD:
  181.     MOV    AX,1    ; BAD ROW - DEFAULT TO 1
  182. ROWOK:
  183. ;
  184.     DEC    AX    ; MAKE ROW NUMBER ZERO-RELATIVE
  185. ;
  186.     MOV    CX,BX    ; GET VIDEO WIDTH
  187.     SHL    CX,1    ; DOUBLE IT FOR VIDEO CHAR/ATTR
  188.     IMUL    CX    ; COMPUTE VIDEO-RAM ROW OFFSET
  189. ;
  190.     MOV    DI,AX    ; SAVE VIDEO-RAM ROW OFFSET
  191. ;
  192.     LDS    SI,[BP]+12    ; GET COLUMN NUMBER ADDRESS
  193.     MOV    AL,BYTE PTR [SI]    ; GET COLUMN NUMBER
  194.     CBW        ; CONVERT COLUMN NUMBER TO INTEGER
  195. ;
  196.     CMP    AX,MINCOL    ; IS COLUMN NUMBER TOO LOW?
  197.     JL    COLBAD    ; YES
  198.     CMP    AX,BX    ; IS COLUMN NUMBER TOO HIGH?
  199.     JLE    COLOK    ; NO
  200. COLBAD:
  201.     MOV    AX,1    ; BAD COLUMN - DEFAULT TO 1
  202. COLOK:
  203. ;
  204.     DEC    AX    ; MAKE COLUMN NUMBER ZERO-RELATIVE
  205. ;
  206.     ADD    DI,AX    ; ADD AX TWICE (FOR CHAR/ATTR)
  207.     ADD    DI,AX    ;   TO COMPUTE VIDEO-RAM START IN DI
  208.  
  209.     SUB    BX,AX      ; COMPUTE LIMIT ON STRING SIZE
  210.  
  211.     LDS    SI,[BP]+8    ; GET STRING LENGTH/VALUE ADDRESS
  212. ;
  213.     XOR    CH,CH    ; CLEAR CH
  214.     MOV    CL,BYTE PTR [SI]          ; GET STRING LENGTH BYTE
  215. ;
  216.     CMP    CX,BX    ; IS STRING TOO LONG?
  217.     JBE    LENGTHOK    ; NO
  218.     MOV    CX,BX    ; YES - LIMIT STRING LENGTH
  219. LENGTHOK:
  220. ;
  221.     INC    SI    ; GET STRING VALUE OFFSET
  222.     PUSH    SI    ;   AND SAVE IT FOR LATER
  223.     PUSH    DS    ;   ALONG WITH SEGMENT ADDRESS
  224. ;
  225.     LDS    SI,[BP]+4    ; GET ATTRIBUTE ADDRESS
  226.     MOV    BH,BYTE PTR [SI]    ; GET ATTRIBUTE
  227. ;
  228.     POP    DS    ; RESTORE STRING VALUE SEGMENT
  229.     POP    SI    ; RESTORE STRING VALUE OFFSET
  230. ;
  231.     POP    ES    ; RESTORE VIDEO RAM SEGMENT ADDRESS
  232. ;
  233.     POP    DX    ; RESTORE VIDEO STATUS PORT ADDR
  234. ;
  235.     RET        ; EXIT
  236. ;
  237. VIDEOERR:
  238.     XOR    CX,CX    ; SET ZERO LENGTH TO BYPASS OUTPUT
  239.     RET        ; EXIT
  240. ;
  241. SETVIDEO    ENDP
  242.     PAGE
  243. ;
  244. ; STANDARD EXIT FROM ALL ROUTINES
  245. ;
  246. EXIT:
  247.     POP    DS    ; RESTORE DS
  248.     MOV    SP,BP    ; RESET ENTRY SP VALUE
  249.     POP    BP    ; RESTORE BP
  250.     RET    16    ; EXIT
  251. ;
  252. VIDEO_IO    ENDP
  253. ;
  254. CODE    ENDS
  255. ;
  256.     END
  257.