home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / dpl.zip / VIDWRT.D < prev   
Text File  |  1988-07-11  |  8KB  |  306 lines

  1. ; Doug's Programming Language  -- DPL, Version 2.22
  2. ; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
  3. ;----------------------------------------
  4. ; V I D W R T  --  Write an ASCIIZ string to the video screen
  5. ;
  6. ; Entry Conditions:
  7. ;    AX holds the function # (see function table below)
  8. ;    BX holds the ASCIIZ string offset
  9. ;    CX possibly holds the video attribute (only if required)
  10. ;    DX possibly holds the starting cursor x,y position (only if required)
  11. ; Exit Conditions:
  12. ;    Assume AX,BX,CX,DX modified
  13. ;    STATUS = 0, good write
  14. ;    STATUS = 1, function request out of range
  15. ;
  16. SUBPGM    VIDWRT
  17. ;
  18. INTEGER    OLD_CURS    ; HOLDS THE CURSOR LOCATION BEFORE THE WRITE
  19. INTEGER    RET_ADDR    ; HOLDS A SUBROUTINE RETURN ADDRESS
  20. ;
  21.     PUBLIC    VIDFLAGS
  22. INTEGER VIDFLAGS    ; HOLDS CONTROL FLAGS FOR THE PROPER OUTPUT CONTROL
  23. _FCURS        EQU    0001B    ; MOVE THE CURSOR
  24. _FDX        EQU    0010B    ; USE DX AS CURSOR ADDR
  25. _FATRB        EQU    0100B    ; USE BL FOR ATTRIBUTE
  26. _FSNOW        EQU    1000B    ; PERFORM VIDEO HSYNC WAIT
  27. MAXFUNC        EQU    07    ; MAX FUNCTION AVAILABLE FOR CALLING PROGRAMS
  28. ;
  29. ; FUNCTIONS AVAILABLE FOR CALLING PROGRAMS
  30. ;
  31. ;    CURSOR    CURSOR    ATTRIB
  32. ;    MOVED    IN DX    IN BL
  33. ;   ----------------------------
  34. ;    0      N      N      N    ; CURSOR NOT MOVED, USE OLD ATTR
  35. ;    1    Y      N      N    ; CURSOR MOVED, USE OLD ATTR
  36. ;    2      N       Y       N    ; CURSOR NOT MOVED, DX HOLDS CURSOR, USE OLD ATTR
  37. ;    3      Y      Y      N    ; CURSOR MOVE, DX HOLDS CURSOR
  38. ;    4      N      N      Y    ; CURSOR NOT MOVED, USE NEW ATTR
  39. ;    5      Y      N      Y    ; CURSOR MOVED, USE NEW ATTR
  40. ;    6      N      Y      Y    ; CURSOR NOT MOVED, DX HOLDS CURSOR, USE NEW ATTR
  41. ;    7      Y      Y      Y    ; CURSOR MOVED, DX HOLDS CURSOR, USE NEW ATTR
  42. ;
  43. ; RESISTER OFFSETS IN THE STACK
  44. ;
  45. SBX    EQU    10
  46. SAX    EQU    8
  47. SDI    EQU    6
  48. SSI    EQU    4
  49. SBP    EQU    2
  50. SES    EQU    0
  51. ;
  52. ; VIDEO HORIZONTAL WAIT ROUTINE
  53. ;
  54. WAITSYNC MACRO    VOID
  55.     LOCAL    LAB1,LAB2
  56.     MOV    DX,03DAH        ; GET THE VIDEO PORT ADDRESS
  57.     MOV    BL,AL            ; WE MUST SAVE THE CHARACTER
  58.     CLI
  59. ;
  60. LAB1:
  61.     IN    AL,DX
  62.     SHR    AL,01            ; HSYNC IN PROGRESS?
  63.     JC    LAB1            ; YES, WAIT TILL STARTED...
  64. ;
  65. LAB2:
  66.     IN    AL,DX
  67.     SHR    AL,01            ; HSYNC IN PROGRESS?
  68.     JNC    LAB2            ; NO, WAIT TILL STARTED...
  69.     MOV    AL,BL            ; RESTORE THE CHARACTER QUICKLY...
  70.     ENDM
  71. ;
  72. ;-----------------------==============================-------------------------
  73. ;-----------------------====< START OF EXECUTION >====-------------------------
  74. ;-----------------------==============================-------------------------
  75. ;
  76. BEGIN    VIDWRT
  77.     MOV    [STATUS],0        ; CLEAR THE RETURN STATUS
  78.     XCHG    AX,BX            ; USE BX AS AN INDEX
  79.     CMP    BL,00            ; CHECK THE RANGE
  80.     JB    VDWT_BAD        ; OUT OF RANGE
  81.     CMP    BL,MAXFUNC        ; TOO HIGH?
  82.     JA    VDWT_BAD        ; YES, EXIT
  83.     CMP    [CRTFLAG],01        ; CGA CARD ATTACHED?
  84.     JNZ    VDWT_02            ; NO, CONTINUE ON
  85.     OR    BL,_FSNOW        ; YES, AVOID THE SNOW
  86. ;
  87. VDWT_02:
  88.     MOV    [VIDFLAGS],BX        ; SAVE THE CONTROL FLAGS
  89. ;
  90.     MOV    BX,CX            ; PLACE THE VIDEO ATTRIBUTE IN BL
  91.     CALL    SAVE_REG
  92. ;
  93.     MOV    BH,[VIDPAGE]        ; GET THE CURRENT VIDEO PAGE
  94. ;
  95.     TEST    [VIDFLAGS],_FDX        ; USE DX AS CURSOR POSITION?
  96.     JNZ    VDWT_05            ; YES, CONTINUE ON...
  97. ;
  98.     MOV    AH,03            ; NO, GET THE CURRRENT CURSOR LOCATION
  99.     INT    10H            ; FROM THE BIOS
  100. ;
  101. VDWT_05:
  102.     CALL    CALC_ABS        ; CALCULATE THE ABSOLUTE ADDRESS 
  103. ;
  104.     MOV    SI,[BP+SAX]        ; GET THE STRING OFFSET
  105. ;
  106.     TEST    [VIDFLAGS],_FATRB    ; SET ATTRIBUTES
  107.     JNZ    VDWT_10            ; YES, GO DO IT
  108.     CALL    WRTSA            ; PERFORM THE STRING WRITE
  109.     JMP    SHORT VDWT_15        ; SKIP NEXT
  110. ;
  111. VDWT_10:
  112.     MOV    BX,[BP+SBX]        ; GET THE ATTRIBUTE
  113.     CALL    WRTS            ; GO WRITE TEXT
  114. ;
  115. VDWT_15:
  116.     TEST    [VIDFLAGS],_FCURS    ; MOVE THE CURSOR?
  117.     JZ    VDWT_20            ; NO, EXIT HOME
  118.     CALL    MOVEC
  119. ;
  120. VDWT_20:
  121.     CALL    REST_REG        ; RESTORE THE REGISTERS
  122.     RETURN
  123. ;
  124. VDWT_BAD:
  125.     MOV    [STATUS],01        ; SEND AN ERROR MESSAGE BACK
  126.     RET
  127. ;
  128. ;
  129. ;=====================
  130. ;  ROUTINE SECTION
  131. ;    LEVEL 1
  132. ;=====================
  133. ;
  134. ;
  135. ; C A L C _ A B S  --  CALCULATE THE ABSOLUTE VIDEO RAM LOCATION
  136. ;
  137. ; Entry conditions:
  138. ;    DX hold the row (DH), & column (DL)
  139. ; Exit conditions:
  140. ;    ES holds the video segment
  141. ;    DI holds the video offset
  142. ;
  143. CALC_ABS PROC    NEAR
  144.     MOV    [OLD_CURS],DX        ; SAVE THE X,Y
  145.     SUB    AH,AH
  146.     MOV    AL,DH            ; AX HOLDS THE ROW #
  147.     MOV    BX,0080
  148.     MUL    BL            ; AX HOLDS THE MAX LINEAR LESS COLUMN
  149.     SUB    DH,DH
  150.     ADD    DX,AX            ; DX HOLDS ADDRESS WITHIN A PAGE
  151.     MOV    AX,800H            ; CALC THE PAGE OFFSET
  152.     MOV    BL,[VIDPAGE]
  153.     PUSH    DX            ; DO NOT DISTURB...
  154.     MUL    BX
  155.     POP    DX
  156.     ADD    DX,AX            ; DX HOLDS THE ABSOLUTE ADDRESS
  157.     MOV    DI,DX            ; MOVE TO DESTINATION REGISTER
  158.     SHL    DI,1            ; ADJUST FOR ATTRIBUTES
  159.     MOV    AX,0B000H        ; MONO SEGMENT
  160.     TEST    [CRTFLAG],01        ; MONOCHROME MONITOR?
  161.     JZ    CLCABS_05        ; YES, CONTINUE ON...
  162.     MOV    AX,0B800H        ; NO, SETUP FOR CGA
  163. ;
  164. CLCABS_05:
  165.     MOV    ES,AX
  166.     RETURN
  167.  
  168. CALC_ABS    ENDP
  169. ;
  170. ;
  171. ; M O V E C  -- MOVE THE CURSOR TO THE END OF THE LINE
  172. ;
  173. ; Entry conditions:
  174. ;    DI points to the absolute screen location
  175. ;    AX points to the head of the string
  176. ; Exit conditions:
  177. ;    Assume AX,BX,CX,DX modified
  178. ;
  179. MOVEC    PROC    NEAR
  180.     MOV    AX,1000H    ; GET THE PAGE SIZE
  181.     MOV    BL,[VIDPAGE]
  182.     MOV    CL,BL        ; SAVE TEMPORARILY
  183.     SUB    BH,BH
  184.     MUL    BX        ; AX=STARTING PAGE ADDRESS
  185.     SUB    DI,AX        ; DI=INTRA PAGE RAM PTR
  186.     MOV    AX,DI        ; AX=DOES NOW...
  187.     SHR    AX,1        ; ALLOW FOR ATTRIBUTES
  188.     MOV    BL,80        ; GET THE COLUMN SIZE
  189.     DIV    BL        ; AL=ROW,AH=COL
  190.     XCHG    AH,AL
  191.     MOV    DX,AX        ; DX HOLDS ROW(DH), & COL(DL)
  192.     MOV    AH,02H        ; GO MOVE THE CURSOR
  193.     MOV    BH,CL        ; GET THE VIDEO PAGE BACK
  194.     INT    10H
  195.     RETURN
  196.  
  197. MOVEC    ENDP
  198. ;
  199. ;
  200. ; REST_REG  -- RESTORE THE REGISTERS & STACK
  201. ;
  202. ; Entry conditions:
  203. ;    BP holds the stack frame
  204. ; Exit conditions:
  205. ;    Most registers restored
  206. ;
  207. REST_REG PROC    NEAR
  208.     POP    [RET_ADDR]
  209.     POP    ES
  210.     POP    BP
  211.     POP    SI
  212.     POP    DI
  213.     POP    AX
  214.     POP    BX
  215.     JMP    [RET_ADDR]
  216.  
  217. REST_REG ENDP
  218. ;
  219. ;
  220. ; SAVE_REG  -- SAVE SOME CRITICALS & THE NECESSARY DATA
  221. ;
  222. ; Entry conditions:
  223. ;    None
  224. ; Exit conditions:
  225. ;    Most registers saved in a stack frame
  226. ;
  227. SAVE_REG PROC    NEAR
  228.     POP    [RET_ADDR]
  229.     PUSH    BX        ; + 10
  230.     PUSH    AX        ; + 8
  231.     PUSH    DI        ; + 6
  232.     PUSH    SI        ; + 4
  233.     PUSH    BP        ; + 2
  234.     PUSH    ES        ; + 0
  235.     MOV    BP,SP        ; FRAME IT UP...
  236.     JMP    [RET_ADDR]    ; & RETURN
  237.  
  238. SAVE_REG ENDP
  239. ;
  240. ;
  241. ; W R T S  -- WRITE THE STRING & CHANGE ATTRIBUTES
  242. ;
  243. ; Entry conditions:
  244. ;    SI points to the string
  245. ;    BL holds the attribute
  246. ;    ES:DI point to the screen memory
  247. ; Exit Conditions:
  248. ;    Assume AX,BX,CX,DX modified
  249. ;
  250. WRTS    PROC    NEAR
  251.     MOV    AH,BL            ; AH HOLDS THE ATTRIBUTE
  252.     MOV    CX,[VIDFLAGS]        ; GET THE BIT FLAGS FOR SPEED
  253. ;
  254. WRT05:
  255.     LODSB                ; GET THE NEXT CHARACTER
  256.     OR    AL,AL            ; DONE?
  257.     JZ    WRTXIT            ; YES, EXIT HOME
  258.     TEST    CX,_FSNOW        ; CHECK FOR SNOW?
  259.     JZ    WRT10            ; NO, JUST WRITE THE DATA
  260. ;
  261.     WAITSYNC            ; BX & DX ARE MODIFIED HERE
  262. ;
  263. WRT10:
  264.     STOSW                ; DISPLAY THE BYTES
  265.     STI                ; START INTERRUPTS IF DISABLED ABOVE
  266.     JMP    SHORT WRT05        ; CONTINUE DISPLAYING
  267. ;
  268. WRTXIT:
  269.     RETURN
  270.  
  271. WRTS    ENDP
  272. ;
  273. ;
  274. ; W R T S A  -- WRITE THE STRING W/O CHANGING ATTRIBUTES
  275. ;
  276. ; Entry conditions:
  277. ;    SI points to the string
  278. ;    ES:DI point to the screen memory
  279. ; Exit Conditions:
  280. ;    Assume AX,BX,CX,DX modified
  281. ;
  282. WRTSA    PROC    NEAR
  283.     MOV    CX,[VIDFLAGS]        ; GET THE BIT FLAGS FOR SPEED
  284. ;
  285. WRTSA05:
  286.     LODSB                ; GET THE NEXT CHARACTER
  287.     OR    AL,AL            ; DONE?
  288.     JZ    WRTSAXIT        ; YES, EXIT HOME
  289.     TEST    CX,_FSNOW        ; CHECK FOR SNOW?
  290.     JZ    WRTSA10            ; NO, JUST WRITE THE DATA
  291. ;
  292.     WAITSYNC            ; BX & DX ARE MODIFIED HERE
  293. ;
  294. WRTSA10:
  295.     STOSB                ; DISPLAY THE TEXT BYTE
  296.     STI                ; START INTERRUPTS IF DISABLED ABOVE
  297.     INC    DI            ; MOVE PAST THE ATTRIBUTE
  298.     JMP    SHORT WRTSA05        ; CONTINUE DISPLAYING
  299. ;
  300. WRTSAXIT:
  301.     RETURN
  302.  
  303. WRTSA    ENDP
  304. ;
  305. ENDPGM    VIDWRT
  306. ;