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

  1. ; Doug's Programming Language  -- DPL, Version 2.22
  2. ; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
  3. ;-----------------------------------------
  4. ; S H D D O - SHADE manipulation routines
  5. ;
  6. ;
  7. ; S H D S U P  -  SCROLL THE SHADE UP
  8. ;
  9. ; Entry Conditions:
  10. ;    AX points to the control block
  11. ; Exit Conditions:
  12. ;    No registers modified
  13. ;
  14. ;
  15. ; S H D S D N  -  SCROLL THE SHADE DOWN
  16. ;
  17. ; Entry Conditions:
  18. ;    AX points to the control block
  19. ; Exit Conditions:
  20. ;    No registers modified
  21. ;
  22. ;
  23. ; S H D C L R  -  CLEAR THE SHADE
  24. ;
  25. ; Entry Conditions:
  26. ;    AX points to the control block
  27. ; Exit Conditions:
  28. ;    No registers modified
  29. ;
  30. ;
  31. ; S H D E X P  -  EXPAND THE SHADE SIZE
  32. ;
  33. ; Entry Conditions:
  34. ;    AX points to the control block
  35. ; Exit Conditions:
  36. ;    No registers modified
  37. ;
  38. ;
  39. ; S H D S M L  -  REDUCE THE SHADE SIZE
  40. ;
  41. ; Entry Conditions:
  42. ;    AX points to the control block
  43. ; Exit Conditions:
  44. ;    No registers modified
  45. ;
  46. ;
  47. ; Screen Control Block:
  48. ;        DW    Starting row
  49. ;        DW    Starting column
  50. ;        DW    Ending column
  51. ;        DW    Number of entries in the table
  52. ;        DW    Video buffer backup buffer
  53. ;        DW    Border display attribute
  54. ;        DW    Box display Attribute
  55. ;        DW    Last option choosen
  56. ;        DW    Shade is opened flag (0ffh=opened, 00h=closed)
  57. ;        DW    1st string
  58. ;        :
  59. ;        DW    Xth string
  60. ;
  61. SUBPGM    SHDDO
  62. ;
  63. ; SHADE CONTROL BLOCK OFFSETS
  64. ;
  65. SROW        EQU    0    ; STARTING ROW
  66. SCOL        EQU    2    ; STARTING COLUMN
  67. ECOL        EQU    4    ; ENDING COLUMN
  68. NUMENT        EQU    6    ; NUMBER OF ENTRIES IN STRING LIST
  69. VBOFF        EQU    8    ; VIDEO BUFFER OFFSET
  70. BDATT        EQU    10    ; VIDEO BOARDER ATTRIBUTE
  71. BXATT        EQU    12    ; VIDEO BOX ATTRIBUTE
  72. LSTOP        EQU    14    ; LAST OPTION CHOOSEN BY OPERATOR
  73. SHDFLG        EQU    16    ; SHADE IS OPENED FLAG
  74. STROFF        EQU    18    ; START OF STRING LIST
  75. ;
  76. ; WORKING STORAGE OFFSETS
  77. ;
  78. SHDOPN        EQU    16    ; 0  SHADE-IS-OPENED FLAG
  79. SHDEX1        EQU    17    ; 1  UNUSED
  80. SHDROW        EQU    18    ; 2  CURRENT ROW
  81. SHDCOL        EQU    20    ; 4  CURRENT COLUMN
  82. ;
  83. ; BOARDER CHARACTERS
  84. ;
  85. LTC        EQU    218    ; LEFT TOP CORNER
  86. TPL        EQU    196    ; TOP LINE
  87. RTC        EQU    183    ; RIGHT TOP CORNER
  88. LVB        EQU    179    ; LEFT VERTICAL BAR
  89. RVB        EQU    186    ; RIGHT VERITCAL BAR
  90. LBC        EQU    212    ; LEFT BOTTOM CORNER
  91. BTL        EQU    205    ; BOTTOM LINE
  92. RBC        EQU    188    ; RIGHT BOTTOM CORNER
  93. ;
  94. ; KEYBOARD SCAN CODES & MAIN KEY CODES
  95. ;
  96. KEY_U        EQU    048H    ; UPWARD ARROW KEY
  97. KEY_L        EQU    04BH    ; LEFT ARROW KEY
  98. KEY_R        EQU    04DH    ; RIGHT ARROW KEY
  99. KEY_D        EQU    050H    ; DOWNWARD ARROW KEY
  100. KEY_ESC        EQU    01BH    ; ESCAPE KEY
  101. KEY_SP        EQU    020H    ; SPACE KEY
  102. KEY_CR        EQU    00DH    ; CARRIAGE RETURN
  103. ;
  104. ;-----------------------------====< EXECUTION >====----------------------------
  105. ;
  106. BEGIN    SHDDO
  107.     EXTRN    SHADE:NEAR, OPSHD:NEAR, CLSHD:NEAR
  108.     EXTRN    VIDOFF:NEAR, VIDON:NEAR
  109.     RETURN
  110. ;
  111. ;
  112. ;--------------------------------
  113. ; S H D C L R  --  CLEAR THE SHADE
  114. ;
  115.     PUBLIC    SHDCLR
  116. SHDCLR    PROC    NEAR 
  117.     CALL    SAVE_REG        ; SAVE THE REGISTERS
  118. ;
  119.     CALL    SETUP_REG        ; SETUP THE REGISTERS FOR THE BIOS CALL
  120.     MOV    AX,0600H        ; BLANK OUT THE SHADE
  121.     INT    10H
  122. ;
  123.     CALL    REST_REG        ; RESTORE & RETURN
  124.     RETURN
  125.  
  126. SHDCLR    ENDP
  127. ;
  128. ;
  129. ;--------------------------------
  130. ; S H D E X P  --  EXPAND THE SHADE
  131. ;
  132.     PUBLIC    SHDEXP
  133. SHDEXP    PROC    NEAR 
  134.     CALL    SAVE_REG        ; SAVE THE REGISTERS
  135. ;
  136.     MOV    SI,AX            ; SI POINTS TO THE CONTROL BLOCK
  137.     PUSH    [SI+SHDFLG]        ; SAVE THE OPENED FLAG
  138.     CMP    BYTE PTR [SI+SHDFLG],00    ; IS THE SHADE CLOSED?
  139.     JZ    SHDEXP_05        ; YES, DONT BOTHER CLOSING IT
  140. ;
  141.     CALL    CLSHD            ; NO, CLOSE THE SHADE FIRST...
  142. ;
  143. SHDEXP_05:
  144.     PUSH    [SI+BDATT]        ; SAVE THE OLD BOARDER ATTRIBUTE
  145.     OR    BYTE PTR [SI+BDATT],80H    ; SET THE BLINK ATTRIBUTE
  146. ;
  147.     CALL    OPSHD            ; OPEN THE SHADE WITH OUR BLINK
  148. ;
  149. SHDEXP_07:
  150.     INKEY    ,WAIT            ; GET THE KEY
  151.     OR    AL,AL            ; SCAN CODE ONLY?
  152.     JNZ    SHDEXP_10        ; NO, USE AL
  153.     MOV    AL,AH            ; YES, SO COMPARE IT
  154. ;
  155. SHDEXP_10:
  156.     CMP    AL,KEY_U        ; MOVE THE TOP BOARDER
  157.     JZ    SHDEXP_30
  158.     CMP    AL,KEY_D        ; MOVE THE TOP BOARDER
  159.     JZ    SHDEXP_35
  160.     CMP    AL,KEY_L        ; MOVE THE LEFT BOARDER
  161.     JZ    SHDEXP_40
  162.     CMP    AL,KEY_R        ; MOVE THE TOP BOARDER
  163.     JZ    SHDEXP_45
  164.     CMP    AL,KEY_ESC        ; ESCAPE?
  165.     JZ    SHDEXP_15        ; YES, EXIT
  166.     CMP    AL,KEY_CR        ; CARRIAGE RETURN?
  167.     JNZ    SHDEXP_07        ; NO, TOSS OUT THE KEY
  168. ;
  169. SHDEXP_15:
  170.     MOV    AX,SI            ; RESTORE THE BLOCK POINTER
  171.     CALL    CLSHD            ; CLOSE OUR MESS
  172.     POP    [SI+BDATT]        ; RESTORE THE ATTRIBUTE
  173.     POP    [SI+SHDFLG]        ; RESTORE THE OPENED FLAG
  174.     CMP    BYTE PTR [SI+SHDFLG],00    ; WAS IT CLOSED?
  175.     JZ    SHDEXP_20        ; YES, EXIT
  176.     CALL    OPSHD            ; NO, RESTORE IT
  177. ;
  178. SHDEXP_20:
  179.     CALL    REST_REG        ; RESTORE & RETURN
  180.     RETURN
  181. ;
  182. ; EXPAND THE SHADE IN A GIVEN DIRECTION
  183. ;
  184. SHDEXP_30:        ; MOVE TOP BOARDER
  185.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  186.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  187.     CMP    WORD PTR [SI+SROW],00    ; ARE WE AT THE TOP?
  188.     JZ    SHDEXP_RET        ; YES, EXIT
  189.     DEC    WORD PTR [SI+SROW]    ; NO, MOVE THE BOARDER
  190.     INC    WORD PTR [SI+NUMENT]    ; ADD 1 TO THE # OF ENTRIES
  191.     JMP    SHORT SHDEXP_RET    ; RETURN THROUGH COMMON CODE
  192. ;
  193. SHDEXP_35:        ; MOVE THE BOTTOM BOARDER
  194.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  195.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  196.     MOV    AX,[SI+SROW]        ; GET THE STARTING ROW
  197.     ADD    AX,[SI+NUMENT]        ; ADD IN THE BOTTOM ROW
  198.     CMP    AX,23            ; ARE WE AT THE BOTTOM?
  199.     JZ    SHDEXP_RET        ; YES, EXIT
  200.     INC    WORD PTR [SI+NUMENT]    ; ADD 1 TO THE # OF ENTRIES
  201.     JMP    SHORT SHDEXP_RET    ; RETURN THROUGH COMMON CODE
  202. ;
  203. SHDEXP_40:        ; MOVE THE BOTTOM BOARDER
  204.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  205.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  206.     CMP    WORD PTR [SI+SCOL],00    ; ARE WE AT THE LEFT MOST COLUMN?
  207.     JZ    SHDEXP_RET        ; YES, EXIT
  208.     DEC    WORD PTR [SI+SCOL]    ; NO, MOVE THE BOARDER
  209.     JMP    SHORT SHDEXP_RET    ; RETURN THROUGH COMMON CODE
  210. ;
  211. SHDEXP_45:        ; MOVE THE RIGHT BOARDER
  212.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  213.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  214.     CMP    WORD PTR [SI+ECOL],79    ; ARE WE AT THE RIGHT MOST COLUMN?
  215.     JZ    SHDEXP_RET        ; YES, EXIT
  216.     INC    WORD PTR [SI+ECOL]    ; NO, MOVE THE BOARDER
  217. ;
  218. SHDEXP_RET:
  219.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  220.     CALL    OPSHD            ; THEN RE-OPEN IT
  221.     JMP    SHDEXP_07        ; GO GET ANOTHER KEY
  222.  
  223. SHDEXP    ENDP
  224. ;
  225. ;
  226. ;-----------------------------------------
  227. ; S H D S D N  --  SCROLL THE SHADE DOWNWARD
  228. ;
  229.     PUBLIC    SHDSDN
  230. SHDSDN    PROC    NEAR 
  231.     CALL    SAVE_REG        ; SAVE THE REGISTERS
  232. ;
  233.     CALL    SETUP_REG        ; SETUP THE REGISTERS FOR THE BIOS CALL
  234.     MOV    AX,0701H        ; MOVE ONE LINE DOWN
  235.     INT    10H
  236. ;
  237.     CALL    REST_REG        ; RESTORE & RETURN
  238.     RETURN
  239.  
  240. SHDSDN    ENDP
  241. ;
  242. ;
  243. ;--------------------------------
  244. ; S H D S M L  --  REDUCE THE SHADE SIZE
  245. ;
  246.     PUBLIC    SHDSML
  247. SHDSML    PROC    NEAR 
  248.     CALL    SAVE_REG        ; SAVE THE REGISTERS
  249. ;
  250.     MOV    SI,AX            ; SI POINTS TO THE CONTROL BLOCK
  251.     PUSH    [SI+SHDFLG]        ; SAVE THE OPENED FLAG
  252.     CMP    BYTE PTR [SI+SHDFLG],00    ; IS THE SHADE CLOSED?
  253.     JZ    SHDSML_05        ; YES, DONT BOTHER CLOSING IT
  254. ;
  255.     CALL    CLSHD            ; NO, CLOSE THE SHADE FIRST...
  256. ;
  257. SHDSML_05:
  258.     PUSH    [SI+BDATT]        ; SAVE THE OLD BOARDER ATTRIBUTE
  259.     OR    BYTE PTR [SI+BDATT],80H    ; SET THE BLINK ATTRIBUTE
  260. ;
  261.     CALL    OPSHD            ; OPEN THE SHADE WITH OUR BLINK
  262. ;
  263. SHDSML_07:
  264.     INKEY    ,WAIT            ; GET THE KEY
  265.     OR    AL,AL            ; SCAN CODE ONLY?
  266.     JNZ    SHDSML_10        ; NO, USE AL
  267.     MOV    AL,AH            ; YES, SO COMPARE IT
  268. ;
  269. SHDSML_10:
  270.     CMP    AL,KEY_U        ; MOVE THE TOP BOARDER
  271.     JZ    SHDSML_30
  272.     CMP    AL,KEY_D        ; MOVE THE TOP BOARDER
  273.     JZ    SHDSML_35
  274.     CMP    AL,KEY_L        ; MOVE THE RIGHT BOARDER
  275.     JZ    SHDSML_40
  276.     CMP    AL,KEY_R        ; MOVE THE LEFT BOARDER
  277.     JZ    SHDSML_45
  278.     CMP    AL,KEY_ESC        ; ESCAPE?
  279.     JZ    SHDSML_15        ; YES, EXIT
  280.     CMP    AL,KEY_CR        ; CARRIAGE RETURN?
  281.     JNZ    SHDSML_07        ; NO, TOSS OUT THE KEY
  282. ;
  283. SHDSML_15:
  284.     MOV    AX,SI            ; RESTORE THE BLOCK POINTER
  285.     CALL    CLSHD            ; CLOSE OUR MESS
  286.     POP    [SI+BDATT]        ; RESTORE THE ATTRIBUTE
  287.     POP    [SI+SHDFLG]        ; RESTORE THE OPENED FLAG
  288.     CMP    BYTE PTR [SI+SHDFLG],00    ; WAS IT CLOSED?
  289.     JZ    SHDSML_20        ; YES, EXIT
  290.     CALL    OPSHD            ; NO, RESTORE IT
  291. ;
  292. SHDSML_20:
  293.     CALL    REST_REG        ; RESTORE & RETURN
  294.     RETURN
  295. ;
  296. ; SHRINK THE SHADE IN A GIVEN DIRECTION
  297. ;
  298. SHDSML_30:        ; UPWARD ARROW KEY
  299.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  300.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  301.     CMP    WORD PTR [SI+NUMENT],00    ; ARE WE ALREADY SMALL ENOUGH?
  302.     JZ    SHDSML_RET        ; YES, EXIT
  303.     DEC    WORD PTR [SI+NUMENT]    ; ADD 1 TO THE # OF ENTRIES
  304.     JMP    SHORT SHDSML_RET    ; RETURN THROUGH COMMON CODE
  305. ;
  306. SHDSML_35:        ; DOWNWARD ARROW KEY
  307.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  308.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  309.     CMP    WORD PTR [SI+NUMENT],00    ; ARE WE ALREADY SMALL ENOUGH?
  310.     JZ    SHDSML_RET        ; YES, EXIT
  311.     INC    WORD PTR [SI+SROW]    ; NO, MOVE THE ROW DOWNWARD
  312.     DEC    WORD PTR [SI+NUMENT]    ; ADD 1 TO THE # OF ENTRIES
  313.     JMP    SHORT SHDSML_RET    ; RETURN THROUGH COMMON CODE
  314. ;
  315. SHDSML_40:        ; LEFT ARROW KEY
  316.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  317.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  318.     MOV    AX,[SI+ECOL]        ; GET THE RIGHT COLUMN
  319.     DEC    AX            ; ADJUST FOR THE BOARDERS
  320.     CMP    AX,[SI+SCOL]        ; ARE WE AT THE LEFT MOST COLUMN?
  321.     JZ    SHDSML_RET        ; YES, EXIT
  322.     DEC    WORD PTR [SI+ECOL]    ; NO, MOVE THE BOARDER
  323.     JMP    SHORT SHDSML_RET    ; RETURN THROUGH COMMON CODE
  324. ;
  325. SHDSML_45:        ; RIGHT ARROW KEY
  326.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  327.     CALL    CLSHD            ; CLOSE THE SHADE FIRST
  328.     MOV    AX,[SI+SCOL]        ; GET THE LEFT COLUMN
  329.     INC    AX            ; ADD IN THE MINIMAL SIZE
  330.     CMP    AX,[SI+ECOL]        ; ARE WE AT THE RIGHT MOST POSITION?
  331.     JZ    SHDSML_RET        ; YES, EXIT
  332.     INC    WORD PTR [SI+SCOL]    ; NO, MOVE THE BOARDER
  333.     JMP    SHORT SHDSML_RET    ; RETURN THROUGH COMMON CODE
  334. ;
  335. SHDSML_RET:
  336.     MOV    AX,SI            ; RESTORE THE CONTROL BLOCK ADDR
  337.     CALL    OPSHD            ; THEN RE-OPEN IT
  338.     JMP    SHDSML_07        ; GO GET ANOTHER KEY
  339.  
  340. SHDSML    ENDP
  341. ;
  342. ;
  343. ;-----------------------------------------
  344. ; S H D S U P  --  SCROLL THE SHADE UPWARD
  345. ;
  346.     PUBLIC    SHDSUP
  347. SHDSUP    PROC    NEAR 
  348.     CALL    SAVE_REG        ; SAVE THE REGISTERS
  349. ;
  350.     CALL    SETUP_REG        ; SETUP THE REGISTERS FOR THE BIOS CALL
  351.     MOV    AX,0601H        ; MOVE ONE LINE UP
  352.     INT    10H
  353. ;
  354.     CALL    REST_REG        ; RESTORE & RETURN
  355.     RETURN
  356.  
  357. SHDSUP    ENDP
  358. ;
  359. ;
  360. ;=====================
  361. ;   ROUTINE SECTION
  362. ;    LEVEL 1
  363. ;=====================
  364. ;
  365. ;
  366. REST_REG PROC    NEAR
  367.     POP    CS:[RET_ADDR]
  368.     POP    ES
  369.     POP    DS
  370.     POP    BP
  371.     POP    DI
  372.     POP    SI
  373.     POP    DX
  374.     POP    CX
  375.     POP    BX
  376.     POP    AX
  377.     JMP    CS:[RET_ADDR]
  378.  
  379. REST_REG ENDP
  380. ;
  381. ;
  382. INTEGER    RET_ADDR            ; WORK INTEGER FOR ROUTINES
  383. ;
  384. ;
  385. SAVE_REG PROC    NEAR
  386.     POP    CS:[RET_ADDR]
  387.     PUSH    AX
  388.     PUSH    BX
  389.     PUSH    CX
  390.     PUSH    DX
  391.     PUSH    SI
  392.     PUSH    DI
  393.     PUSH    BP
  394.     PUSH    DS
  395.     PUSH    ES
  396.     JMP    CS:[RET_ADDR]
  397.  
  398. SAVE_REG ENDP
  399. ;
  400. ;
  401. SETUP_REG PROC    NEAR
  402.     MOV    SI,AX            ; SI POINTS TO THE BLOCK
  403.     MOV    CH,[SI+SROW]        ; FETCH THE STARTING ROW
  404.     MOV    CL,[SI+SCOL]        ; FETCH THE STARTING COLUMN
  405.     MOV    DH,[SI+NUMENT]        ; GET THE NUMBER OF ENTRIES (# OF ROWS)
  406.     ADD    DH,CH
  407.     INC    CL            ; MOVE PAST THE BOARDER
  408.     INC    CH            ; MOVE PAST THE BOARDER
  409.     MOV    DL,[SI+ECOL]        ; FETCH THE ENDING COLUMN
  410.     DEC    DL            ; MOVE PAST THE BOARDER
  411.     MOV    BH,[SI+BXATT]        ; GET THE BOX ATTRIBUTE
  412.     RETURN
  413.  
  414. SETUP_REG    ENDP
  415. ;
  416. ENDPGM    SHDDO
  417. ;
  418.