home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / dpl.zip / SHADE.D < prev    next >
Text File  |  1988-07-11  |  13KB  |  539 lines

  1. ; Doug's Programming Language  -- DPL, Version 2.22
  2. ; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
  3. ;-----------------------------------------
  4. ; S H A D E  -- Open a shade on the screen
  5. ;
  6. ; Entry Conditions:
  7. ;    AX points to the control block
  8. ;
  9. ; Exit Conditions:
  10. ;    AL contains the choosen option number
  11. ;    AH contains the last key typed
  12. ;    Assume all working registers modified
  13. ;
  14. ; Screen Control Block:
  15. ;        DW    Starting row
  16. ;        DW    Starting column
  17. ;        DW    Ending column
  18. ;        DW    Number of entries in the table
  19. ;        DW    Video buffer backup buffer
  20. ;        DW    Border display attribute
  21. ;        DW    Box display Attribute
  22. ;        DW    Last option choosen
  23. ;        DW    Shade is opened
  24. ;        DW    1st string
  25. ;        :
  26. ;        DW    Xth string
  27. ;
  28. SUBPGM    SHADE
  29. ;
  30. ; SHADE CONTROL BLOCK OFFSETS
  31. ;
  32. SROW        EQU    0    ; STARTING ROW
  33. SCOL        EQU    2    ; STARTING COLUMN
  34. ECOL        EQU    4    ; ENDING COLUMN
  35. NUMENT        EQU    6    ; NUMBER OF ENTRIES IN STRING LIST
  36. VBOFF        EQU    8    ; VIDEO BUFFER OFFSET
  37. BDATT        EQU    10    ; VIDEO BOARDER ATTRIBUTE
  38. BXATT        EQU    12    ; VIDEO BOX ATTRIBUTE
  39. LSTOP        EQU    14    ; LAST OPTION CHOOSEN BY OPERATOR
  40. SHDFLG        EQU    16    ; SHADE-IS-OPENED FLAG (0FFH=YES,00=NO)
  41. STROFF        EQU    18    ; START OF STRING LIST
  42. ;
  43. ; BOARDER CHARACTERS
  44. ;
  45. LTC        EQU    218    ; LEFT TOP CORNER
  46. TPL        EQU    196    ; TOP LINE
  47. RTC        EQU    183    ; RIGHT TOP CORNER
  48. LVB        EQU    179    ; LEFT VERTICAL BAR
  49. RVB        EQU    186    ; RIGHT VERITCAL BAR
  50. LBC        EQU    212    ; LEFT BOTTOM CORNER
  51. BTL        EQU    205    ; BOTTOM LINE
  52. RBC        EQU    188    ; RIGHT BOTTOM CORNER
  53. ;
  54. ; KEYBOARD SCAN CODES & MAIN KEY CODES
  55. ;
  56. KEY_U        EQU    048H    ; UPWARD ARROW KEY
  57. KEY_L        EQU    04BH    ; LEFT ARROW KEY
  58. KEY_R        EQU    04DH    ; RIGHT ARROW KEY
  59. KEY_D        EQU    050H    ; DOWNWARD ARROW KEY
  60. KEY_ESC        EQU    01BH    ; ESCAPE KEY
  61. KEY_SP        EQU    020H    ; SPACE KEY
  62. KEY_CR        EQU    00DH    ; CARRIAGE RETURN
  63. ;
  64. ;-----------------------------====< EXECUTION >====----------------------------
  65. ;
  66. BEGIN    SHADE
  67.     PUBLIC    SHADE, OPSHD, CLSHD
  68.     EXTRN    VIDOFF:NEAR, VIDON:NEAR
  69. ;
  70.     PUSH    DS            ; SAVE THE CRITICALS
  71.     PUSH    ES
  72.     PUSH    SI
  73.     PUSH    DI
  74. ;
  75.     CALL    OPSHD            ; OPEN THE SHADE ON THE SCREEN
  76. ;
  77.     PUSH    AX
  78.     CALL    SHDREG
  79. ;
  80.     PUSH    ES            ; SWAP SEGMENTS & POINTERS
  81.     PUSH    DS
  82.     POP    ES
  83.     POP    DS
  84.     XCHG    SI,DI            ; ES:DI POINTS TO THE VIDEO BUFFER
  85. ;
  86.     MOV    SI,AX            ; SI POINTS TO THE CONTROL BLOCK
  87.     ADD    DI,2            ; MOVE PAST THE BOARDER
  88.     SUB    CX,2            ; DO NOT COUNT THE BOARDERS
  89.     SUB    DX,2            ; DITTO, SO...
  90.     ADD    BX,4            ; WE MUST ADJUST THE DISTANCE COUNT
  91.     PUSH    DI            ; BP+10 SAVE THE STARTING ADDRESS
  92.     PUSH    CX            ; BP+8  SAVE COLUMN WIDTH
  93.     PUSH    DX            ; BP+6  SAVE LINE COUNT
  94.     PUSH    BX            ; BP+4  SAVE DISTANCE TO NEXT LINE
  95.     XOR    AX,AX
  96.     PUSH    AX            ; BP+2  SAVE CURRENT LINE #
  97.     PUSH    BP            ;   +0
  98.     MOV    BP,SP
  99. ;
  100. SHD_05:
  101.     INKEY    ,WAIT            ; WAIT FOR TO CLOSE
  102.     OR    AL,AL            ; IS IT JUST A SCAN CODE?
  103.     JNZ    SHD_06            ; NO, USE THE MAIN BYTE
  104.     MOV    AL,AH            ; YES, SO WE WILL CHECK THE SCAN AS WELL
  105. ;
  106. SHD_06:
  107.     CMP    AL,KEY_SP        ; SPACE BAR?
  108.     JZ    SHD_15            ; YES, ADVANCE THE PROMPT BAR
  109.     CMP    AL,KEY_D        ; DOWNWARD ARROW?
  110.     JZ    SHD_15            ; YES, ADVANCE THE PROMPT BAR
  111.     CMP    AL,KEY_CR        ; CARRIAGE RETURN?
  112.     JZ    SHD_10            ; NO, GO RE-ENTER THE KEY
  113.     CMP    AL,KEY_U        ; UPWARD ARROW KEY?
  114.     JZ    SHD_20            ; YES, MOVE THE BAR UPWARD
  115.     CMP    AL,KEY_ESC        ; ESCAPE?
  116.     JZ    SHD_07            ; YES, EXIT
  117.     CMP    AL,KEY_L        ; LEFT ARROW KEY?
  118.     JZ    SHD_07            ; YES, EXIT
  119.     CMP    AL,KEY_R        ; RIGHT ARROW KEY?
  120.     JNZ    SHD_05            ; NO, GO RE-ENTER THE KEY
  121. ;
  122. SHD_07:
  123.     MOV    WORD PTR [BP+2],00    ; FLUSH THE LINE #
  124. ;
  125. SHD_10:
  126.     MOV    CX,[BP+2]        ; GET THE LINE SELECTED
  127.     POP    BP            ; RESTORE THE CRITICAL
  128.     ADD    SP,10            ; TOSS OUT THE VARIABLES ON THE STACK
  129. ;
  130.     POP    BX            ; GET THE CONTROL BLOCK
  131. ;
  132.     PUSH    AX            ; SAVE THE LAST KEY
  133.     MOV    [BX+LSTOP],CX        ; SAVE IT
  134.     MOV    AX,BX            ; CLOSE THE SHADE NOW
  135.     CALL    CLSHD
  136.     POP    AX            ; GET THE LAST KEY TYPED
  137. ;
  138.     POP    DI
  139.     POP    SI
  140.     POP    ES
  141.     POP    DS
  142.     RETURN
  143. ;
  144. SHD_15:
  145.     CALL    REST_BAR        ; REMOVE THE CURRENT BAR
  146.     CALL    DOWN_BAR        ; CREATE THE NEW BAR
  147.     JMP    SHORT SHD_05        ; & CONTINUE THE SELECTION
  148. ;
  149. SHD_20:
  150.     CALL    REST_BAR        ; REMOVE THE CURRENT BAR
  151.     CALL    UP_BAR            ; MOVE THE BAR UPWARD
  152.     JMP    SHORT SHD_05        ; & CONTINUE WITH THE SELECTION
  153. ;
  154. ;
  155. ;=====================
  156. ;   ROUTINE SECTION
  157. ;    LEVEL 1
  158. ;=====================
  159. ;
  160. ;
  161. ;----------------------------------------
  162. ; C L S H D  --  Close the shade
  163. ;
  164. ; ENTRY CONDITIONS:
  165. ;    BP POINTS TO THE SCREEN CONTROL BLOCK IN THE STACK SEGMENT
  166. ;    EXTERNAL DS:CRTFLAG:BYTE
  167. ;        0 = MONOCHROME DISPLAY ADAPTER
  168. ;        1 = COLOR GRAPHICS ADAPTER
  169. ;
  170. ; EXIT CONDITIONS:
  171. ;    ES,DS,BP INDEX REGISTER UNMODIFIED
  172. ;    ASSUME ALL WORK REGISTERS MODIFIED
  173. ;
  174.     PUBLIC    CLSHD
  175. CLSHD    PROC
  176.     PUSH    SI
  177.     PUSH    DI
  178.     PUSH    DS
  179.     PUSH    ES
  180.     PUSH    AX
  181. ;
  182. ; SETUP THE REGISTERS
  183. ;
  184.     CALL    SHDREG
  185.     PUSH    DS            ; SWAP SEGMENTS
  186.     PUSH    ES
  187.     POP    DS
  188.     POP    ES
  189.     XCHG    SI,DI            ; SWAP THE OFFSETS
  190. ;
  191. ; TURN OFF THE VIDEO
  192. ;
  193.     CALL    VIDOFF
  194. ;
  195. CLSHD_05:
  196.     PUSH    CX            ; SAVE THE COLUMN WIDTH
  197.     REP    MOVSW            ; MOVE ONE LINE
  198.     ADD    DI,BX            ; MOVE TO THE NEXT VIDEO RAM LOCATION
  199.     POP    CX 
  200.     DEC    DX            ; HAVE WE MOVED IT ALL?
  201.     JNZ    CLSHD_05        ; NOT YET...
  202. ;
  203. ; TURN ON THE VIDEO
  204. ;
  205.     CALL    VIDON
  206. ;
  207. ; RESTORE & EXIT
  208. ;
  209.     POP    AX
  210.     POP    ES
  211.     POP    DS
  212. ;
  213. ; CLEAR THE OPENED FLAG
  214. ;
  215.     MOV    SI,AX
  216.     MOV    BYTE PTR [SI+SHDFLG],00    ; CLEAR THE FLAG...
  217. ;
  218.     POP    DI
  219.     POP    SI
  220.     RETURN
  221.  
  222. CLSHD ENDP
  223. ;
  224. ;
  225. ;----------------------------------------
  226. ; O P S H D  --  Open the video shade
  227. ;
  228. ; Entry conditions:
  229. ;    AX holds the control block offset
  230. ;
  231. ; Exit conditions:
  232. ;    ES,DS,BP,SI,DI registers unchanged
  233. ;    Assume all other registers trashed
  234. ;
  235.     PUBLIC    OPSHD
  236. OPSHD    PROC    NEAR
  237.     PUSH    BP            ; DO NOT DISTURB THE CRITICALS
  238.     PUSH    SI
  239.     PUSH    DI
  240. ;
  241.     PUSH    DS
  242.     PUSH    ES
  243. ;
  244.     PUSH    AX            ; + 16 SAVE THE BLOCK ADDRESS
  245. ;
  246. ; SETUP THE VIDEO-TO-BUFFER REGISTERS
  247. ;
  248.     CALL    SHDREG            ; SETUP THE REGISTERS
  249. ;
  250.     PUSH    ES            ; + 14 SAVE THE DATA SEGMENT
  251.     PUSH    DS            ; + 12  SAVE THE VIDEO SEGMENT
  252.     PUSH    SI            ; + 10  SAVE THE VIDEO RAM POINTER
  253.     PUSH    DI            ; + 8  SAVE THE VIDEO BACKUP BUFFER
  254.     PUSH    BX            ; + 6  SAVE THE DISTANCE COUNT
  255.     PUSH    CX            ; + 4  SAVE THE COLUMN COUNT
  256.     PUSH    DX            ; + 2  SAVE THE LINE COUNT
  257.     PUSH    BP            ; + 0  SAVE BP...
  258.     MOV    BP,SP
  259. ;
  260. ; TURN OFF THE VIDEO
  261. ;
  262.     CALL    VIDOFF            ; NO REGISTERS ARE DISTURBED
  263. ;
  264. OPSHD_05:
  265.     REP    MOVSW            ; MOVE THE ENTIRE LINE TO THE BUFFER
  266.     MOV    CX,[BP+4]        ; GET THE COLUMN COUNT
  267.     ADD    SI,BX            ; MOVE TO THE NEXT VIDEO POSITION
  268.     DEC    DX            ; ARE WE DONE?
  269.     JNZ    OPSHD_05        ; NO, CONTINUE THE BLOCK MOVE
  270. ;
  271.     MOV    DI,[BP+10]        ; POINT TO THE VIDEO BUFFER
  272.     MOV    ES,[BP+12]        ; & VIDEO SEGMENT
  273.     MOV    DS,[BP+14]        ; RESTORE THE DATA SEGMENT
  274.     MOV    BX,[BP+16]        ; GET THE CONTROL BLOCK ADDRESS
  275. ;
  276.     MOV    DH,[BX+BDATT]        ; FETCH THE BOARDER ATTRIBUTE (& CHEAT)
  277.     MOV    AH,DH            ; DH WILL HOLD THE BOARDER ATTRIBUTE
  278.     MOV    AL,LTC            ; LEFT TOP CORNER
  279.     STOSW                ; SAVE IT IN RAM
  280.     SUB    WORD PTR [BP+4],2    ; WE DON'T NEED THE BOARDER COUNT
  281.     MOV    CX,[BP+4]        ; GET THE COLUMN WIDTH
  282.     JCXZ    OPSHD_10
  283.     MOV    AL,TPL
  284.     REP    STOSW            ; GIVE THE ENTIRE LINE
  285. ;
  286. OPSHD_10:
  287.     MOV    AL,RTC
  288.     STOSW                ; STORE RIGHT TOP CORNER
  289. ;
  290.     SUB    WORD PTR [BP+2],2    ; WE DON'T NEED TO KNOW ABOUT THE BOARDER
  291.     MOV    DL,[BX+BXATT]        ; DL HOLDS THE BOX ATTRIBUTE (& CHEAT)
  292.     ADD    BX,STROFF        ; POINT TO THE STRING LIST
  293. ;
  294.     CMP    WORD PTR [BP+2],00    ; ANY LINES FOR THE BOX?
  295.     JZ    OPSHD_32        ; NO, GO CLOSE THE BOX
  296. ;
  297. OPSHD_15:
  298.     ADD    DI,[BP+6]        ; MOVE TO THE NEXT LINE
  299.     MOV    AH,DH            ; FETCH THE BOARDER ATTRIBUTE
  300.     MOV    AL,LVB
  301.     STOSW                ; PLACE THE VERTICAL BAR
  302.     MOV    SI,[BX]            ; GET THE NEXT LINE ADDRESS
  303.     ADD    BX,2            ; ADVANCE THE BLOCK POINTER
  304.     MOV    AH,DL            ; GET THE BOX ATTRIBUTE
  305.     MOV    CX,[BP+4]        ; FETCH THE COLUMN WIDTH
  306.     JCXZ    OPSHD_30        ; DON'T DO NULL WIDTH
  307.     TEST    BYTE PTR [SI],80H    ; IS IT 8 BIT ASCII?
  308.     JZ    OPSHD_20        ; NO, SKIP IT
  309.     LODSB                ; FETCH THE CHARACTER AS THE ATTRIBUTE
  310.     MOV    AH,7FH            ; TRIM THE 8TH BIT
  311.     AND    AH,AL
  312. ;
  313. OPSHD_20:
  314.     LODSB                ; FETCH THE NEXT CHARACTER
  315.     OR    AL,AL            ; END OF STRING?
  316.     JZ    OPSHD_25        ; YES, CONTINUE ON...
  317.     STOSW                ; NO, SAVE THE CHAR & ATTR
  318.     LOOP    OPSHD_20        ; DO UNTIL STRING IS DONE
  319.     JMP    SHORT OPSHD_30        ; GO DO THE NEXT STRING
  320. ;
  321. OPSHD_25:
  322.     REP    STOSW            ; DO THE REST OF THE STRING
  323. ;
  324. OPSHD_30:
  325.     MOV    AH,DH            ; FETCH THE BOARDER ATTRIBUTE
  326.     MOV    AL,RVB            ; RIGHT VERTICAL BAR
  327.     STOSW                ; PLACE THE VERTICAL BAR
  328. ;
  329.     DEC    WORD PTR [BP+2]        ; DECREMENT THE LINE COUNT
  330.     JNZ    OPSHD_15        ; DO THE REST OF THE STRINGS
  331. ;
  332. OPSHD_32:
  333.     ADD    DI,[BP+6]        ; MOVE TO THE LAST LINE
  334.     MOV    AH,DH            ; FETCH THE BOARDER ATTRIBUTE
  335.     MOV    AL,LBC            ; LEFT BOTTOM CORNER
  336.     STOSW                ; SAVE IT IN RAM
  337.     MOV    CX,[BP+4]        ; GET THE COLUMN WIDTH
  338.     JCXZ    OPSHD_35
  339.     MOV    AL,BTL            ; BOTTOM LINE
  340.     REP    STOSW            ; GIVE THE ENTIRE LINE
  341. ;
  342. OPSHD_35:
  343.     MOV    AL,RBC            ; RIGHT BOTTOM CORNER
  344.     STOSW                ; WRITE    THE LAST CHARACTER
  345. ;
  346. ; TURN ON THE VIDEO
  347. ;
  348.     CALL    VIDON 
  349. ;
  350. ; RETURN TO CALLING PROGRAM
  351. ;
  352.     ADD    SP,16            ; DEFRAME THE STACK
  353.  
  354.     POP    AX            ; SAVE THE CONTROL BLOCK POINTER
  355.     POP    ES
  356.     POP    DS
  357. ;
  358. ; SET THE OPENED FLAG
  359. ;
  360.     MOV    SI,AX
  361.     MOV    BYTE PTR [SI+SHDFLG],0FFH    ; SET THE FLAG...
  362. ;
  363.     POP    DI
  364.     POP    SI
  365.     POP    BP
  366.     RET
  367.  
  368. OPSHD    ENDP
  369. ;
  370. ;
  371. ;----------------------------------------
  372. ; DOWN_BAR  --  MOVE THE OPTION BAR DOWNWARD
  373. ;
  374. DOWN_BAR PROC    NEAR
  375.     INC    WORD PTR [BP+2]        ; INCREMENT THE CURRENT LINE #
  376.     MOV    AX,[BP+2]        ; GET THE CURRENT LINE
  377.     MOV    CX,[BP+8]        ; GET THE COLUMN COUNT
  378.     ADD    DI,CX            ; MOVE TO THE END OF THE LINE
  379.     ADD    DI,CX            ; (ACCOUNT FOR ATTRIBUTES)
  380.     ADD    DI,[BP+4]        ; MOVE TO THE NEXT LINE DOWN
  381.     CMP    AX,[BP+6]        ; ARE WE AT THE END?
  382.     JLE    DNBR_05            ; NO, CONTINUE ON...
  383.     MOV    WORD PTR [BP+2],00    ; YES, CLEAR OUT THE CURRENT LINE
  384.     MOV    DI,[BP+10]        ; AND POINT TO THE START...
  385.     RETURN
  386. ;
  387. DNBR_05:
  388.     CMP    BYTE PTR ES:[DI],00    ; IS THE 1ST CHARACTER A NULL?
  389.     JZ    DOWN_BAR        ; YES, SKIP THIS LINE...
  390.     MOV    AL,[SI+BXATT]        ; GET THE BOX ATTRIBUTE
  391.     CMP    ES:[DI+1],AL        ; IS THE ATTRIBUTE THE SAME?
  392.     JNZ    DOWN_BAR        ; NO, SKIP THIS LINE
  393.     PUSH    DI            ; DO NOT DISTURB THE STARTING ADDR
  394. ;
  395. DNBR_10:
  396.     INC    DI            ; MOVE PAST THE CHARACTER
  397.     XOR    BYTE PTR ES:[DI],0FFH    ; REVERSE THE ATTRIBUTE
  398.     INC    DI
  399.     LOOP    DNBR_10            ; CONTINUE TILL DONE...
  400.     POP    DI
  401.     RETURN
  402.  
  403. DOWN_BAR    ENDP
  404. ;
  405. ;
  406. ;---------------------------------------
  407. ; R E S T _ B A R  --  RESTORE THE BAR ON THE SCREEN
  408. ;
  409. ;
  410. REST_BAR PROC    NEAR
  411.     MOV    AX,[BP+2]        ; GET THE CURRENT LINE #
  412.     OR    AX,AX            ; IS IT THE NULL LINE?
  413.     JZ    RSTBR_10        ; YES, EXIT
  414.     PUSH    DI            ; SAVE THE CURRENT RAM PTR
  415.     MOV    CX,[BP+8]        ; GET THE COLUMN COUNT
  416. ;
  417. RSTBR_05:
  418.     INC    DI            ; MOVE PAST THE CHARACTER
  419.     XOR    BYTE PTR ES:[DI],0FFH    ; RESTORE THE ATTRIBUTE
  420.     INC    DI            ; MOVE PAST THE ATTRIBUTE
  421.     LOOP    RSTBR_05        ; DO THE WHOLE LINE
  422.     POP    DI
  423. ;
  424. RSTBR_10:
  425.     RETURN
  426.  
  427. REST_BAR    ENDP
  428. ;
  429. ;
  430. ;----------------------------------------
  431. ; UP_BAR  --  MOVE THE OPTION BAR UPWARD
  432. ;
  433. UP_BAR    PROC    NEAR
  434.     CMP    WORD PTR [BP+2],00    ; ARE WE AT THE TOP?
  435.     JNZ    UPBR_05            ; NO, CONTINUE ON...
  436.     MOV    AX,[BP+6]        ; YES, MOVE TO THE BOTTOM
  437.     INC    AX
  438.     MOV    [BP+2],AX
  439. ;
  440. ; CALCULATE THE BOTTOM ROW
  441. ;
  442.     MOV    CX,AX
  443. ;
  444. UPBR_02:
  445.     ADD    DI,[BP+4]        ; MOVES TO THE NEXT LINE
  446.     ADD    DI,[BP+8]        ; ADD IN THE BOX WIDTH
  447.     ADD    DI,[BP+8]
  448.     LOOP    UPBR_02
  449. ;
  450. UPBR_05:
  451.     SUB    DI,[BP+4]        ; MOVE BACK TO THE PREVIOUS LINE
  452.     SUB    DI,[BP+8]
  453.     SUB    DI,[BP+8]
  454.     DEC    WORD PTR [BP+2]        ; DECREMENT THE CURRENT LINE #
  455.     JZ    UPBR_15            ; EXIT IF AT 0
  456.     MOV    CX,[BP+8]        ; GET THE COLUMN COUNT
  457.     CMP    BYTE PTR ES:[DI],00    ; IS THE 1ST CHARACTER A NULL?
  458.     JZ    UP_BAR            ; YES, SKIP THIS LINE...
  459.     MOV    AL,[SI+BXATT]        ; GET THE BOX ATTRIBUTE
  460.     CMP    ES:[DI+1],AL        ; IS THE ATTRIBUTE THE SAME?
  461.     JNZ    UP_BAR            ; NO, SKIP THIS LINE
  462.     PUSH    DI            ; DO NOT DISTURB THE STARTING ADDR
  463. ;
  464. UPBR_10:
  465.     INC    DI            ; MOVE PAST THE CHARACTER
  466.     XOR    BYTE PTR ES:[DI],0FFH    ; REVERSE THE ATTRIBUTE
  467.     INC    DI
  468.     LOOP    UPBR_10            ; CONTINUE TILL DONE...
  469.     POP    DI
  470. ;
  471. UPBR_15:
  472.     RETURN
  473.  
  474. UP_BAR    ENDP
  475. ;
  476. ;
  477. ;=====================
  478. ;   ROUTINE SECTION
  479. ;    LEVEL 2
  480. ;=====================
  481. ;
  482. ;
  483. ; S H D R E G  --  SETUP THE PROPER REGISTERS
  484. ;
  485. ; Entry conditions:
  486. ;    DS:AX holds the video control block
  487. ; Exit conditions:
  488. ;    ES points to data segment
  489. ;    DS points to video segment
  490. ;    SI points to start of video buffer
  491. ;    DI points to the buffer
  492. ;    CX holds the length
  493. ;    DX holds the # of lines to move
  494. ;    BX holds the count of (80-cx)*2
  495. ;    AX holds the video control block address
  496. ;
  497.     PUBLIC    SHDREG
  498. SHDREG    PROC    NEAR
  499.     PUSH    AX
  500.     MOV    AH,0FH
  501.     INT    10H            ; GET THE VIDEO PAGE
  502.     MOV    CX,0B000H        ; MONO SEGMENT
  503.     TEST    [CRTFLAG],01        ; MONO CARD?
  504.     JZ    VBSU_05            ; YES, CONTINUE ON...
  505.     MOV    CX,0B800H        ; NO, SETUP FOR CGA
  506. ;
  507. VBSU_05:
  508.     XCHG    BH,BL
  509.     SUB    BH,BH            ; BX HOLDS THE PAGE #
  510.     MOV    AX,1000H        ; AX HOLDS THE FULL PAGE SIZE
  511.     MUL    BX            ; AX HOLDS THE PAGE STARTING ADDR
  512.     MOV    SI,AX
  513.     POP    BX            ; GET THE CONTROL BLOCK ADDRESS
  514.     MOV    AX,[BX+SROW]
  515.     MOV    DX,80*2
  516.     MUL    DX            ; AX = ROW * 80*2
  517.     ADD    SI,AX
  518.     ADD    SI,[BX+SCOL]        ; ADD IN THE COLUMNS
  519.     ADD    SI,[BX+SCOL]        ; ..TWICE FOR DOUBLE BYTE STORAGE
  520.     MOV    DX,[BX+NUMENT]        ; GET THE NUMBER OF LINE OF TEXT
  521.     ADD    DX,2            ; ADJUST FOR BOX
  522.     MOV    DI,[BX+VBOFF]        ; GET THE BUFFER ADDRESS
  523.     PUSH    DS
  524.     POP    ES            ; ES = DATA SEGMENT
  525.     MOV    DS,CX            ; DS = VIDEO SEGMENT
  526.     MOV    CX,ES:[BX+ECOL]        ; CALC THE NUMBER OF COLUMNS
  527.     SUB    CX,ES:[BX+SCOL]
  528.     INC    CX            ; CX HOLDS THE TOTAL COLUMNS
  529.     MOV    AX,BX            ; MAKE SURE AX HOLDS THE BLOCK ADDRESS
  530.     MOV    BX,80            ; CALC THE DISTANCE TO THE START OF
  531.     SUB    BX,CX            ; THE NEXT LINE
  532.     SHL    BX,1            ; BX = BX * 2
  533.     RETURN
  534.  
  535. SHDREG    ENDP
  536. ;
  537. ENDPGM    SHADE
  538. ;
  539.