home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / nor_asm / phantom.asm < prev    next >
Assembly Source File  |  1989-08-13  |  20KB  |  624 lines

  1. .MODEL    SMALL
  2.  
  3. ;-----------------------------------------------------------------------;
  4. ; This file contains procedures that handle the phantom cursor:        ;
  5. ;                                    ;
  6. ; WRITE_PHANTOM            Write the phantom cursor        ;
  7. ; ERASE_PHANTOM            Erase the phantom cursor        ;
  8. ;                                    ;
  9. ; PHANTOM_UP            Move the phantom cursor up        ;
  10. ; PHANTOM_DOWN            Move the pahntom cursor down        ;
  11. ; PHANTOM_LEFT            Move the phantom cursor left        ;
  12. ; PHANTOM_RIGHT            Move the phantom cursor right        ;
  13. ; PAGE_UP            Scroll window back by 8 lines        ;
  14. ; PAGE_DOWN            Scroll window forward by 8 lines    ;
  15. ; HOME_KEY            Move to the first byte in the sector    ;
  16. ; END_KEY            Move to the last byte in the sector    ;
  17. ;                                    ;
  18. ; MOV_TO_HEX_POSITION        Move cursor to hex phantom cursor    ;
  19. ; MOV_TO_ASCII_POSITION        Move cursor to ASCII phantom cursor    ;
  20. ; MOV_TO_LEFT_NUMBERS        Move to current left number        ;
  21. ; MOV_TO_TOP_HEX_NUMBERS    Move to current top hex number        ;
  22. ; MOV_TO_ASCII_NUMBERS        Move to number above ASCII window    ;
  23. ; SAVE_REAL_CURSOR        Remember the location of real cursor    ;
  24. ; RESTORE_REAL_CURSOR        Put real cursor back where it was    ;
  25. ; SCROLL_UP            Scroll the window up by N lines        ;
  26. ; SCROLL_DOWN            Scroll the window down by N lines    ;
  27. ; SCROLL_WINDOW            Do the actual scrolling of windows    ;
  28. ; FILL_SCROLLED_LINES        Fill lines left blank by scrolling    ;
  29. ;-----------------------------------------------------------------------;
  30.  
  31. .DATA
  32.  
  33. REAL_CURSOR_X        DB    0
  34. REAL_CURSOR_Y        DB    0
  35.     PUBLIC    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y
  36. PHANTOM_CURSOR_X    DB    0
  37. PHANTOM_CURSOR_Y    DB    0
  38.  
  39. .CODE
  40.  
  41.     PUBLIC    WRITE_PHANTOM
  42.     EXTRN    WRITE_ATTRIBUTE_N_TIMES:PROC
  43. ;-----------------------------------------------------------------------;
  44. ; This procedure uses CURSOR_X and CURSOR_Y, through MOV_TO_..., as the    ;
  45. ; coordinates for the phantom cursor.  WRITE_PHANTOM writes this    ;
  46. ;                                    ;
  47. ; Uses:        WRITE_ATTRIBUTE_N_TIMES, SAVE_REAL_CURSOR        ;
  48. ;        RESTORE_REAL_CURSOR, MOV_TO_HEX_POSITION        ;
  49. ;        MOV_TO_ASCII_POSITION                    ;
  50. ;-----------------------------------------------------------------------;
  51. WRITE_PHANTOM    PROC
  52.     PUSH    CX
  53.     PUSH    DX
  54.     CALL    SAVE_REAL_CURSOR    ;Save position of the real cursor
  55.     CALL    MOV_TO_HEX_POSITION    ;Coord of cursor in hex window
  56.     MOV    CX,4            ;Make phantom cursor four chars wide
  57.     MOV    DL,70H            ;Attribute for reverse video
  58.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Write hex number in inverse video
  59.     CALL    MOV_TO_ASCII_POSITION    ;Coord. of cursor in ASCII window
  60.     MOV    CX,1            ;Cursor is one character wide here
  61.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Write ASCII character in inverse
  62.     MOV    DL,0FH            ;Attribute for high intensity
  63.     CALL    MOV_TO_LEFT_NUMBERS    ;Move to current offset on left side
  64.     MOV    CX,5
  65.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make current offset bright
  66.     CALL    MOV_TO_TOP_HEX_NUMBERS    ;Move to hex offset along top
  67.     MOV    CX,4
  68.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make current offset bright
  69.     CALL    MOV_TO_TOP_ASCII_NUMBERS ;Move to offset above ASCII window
  70.     MOV    CX,1
  71.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make current offset bright
  72.     CALL    RESTORE_REAL_CURSOR    ;Put cursor back where it was
  73.     POP    DX
  74.     POP    CX
  75.     RET
  76. WRITE_PHANTOM    ENDP
  77.  
  78.  
  79.     PUBLIC    ERASE_PHANTOM
  80.     EXTRN    WRITE_ATTRIBUTE_N_TIMES:PROC
  81. ;-----------------------------------------------------------------------;
  82. ; This procedure erases the phantom cursor, just the opposite of    ;
  83. ; WRITE_PHANTOM.                            ;
  84. ;                                    ;
  85. ; Uses:        WRITE_ATTRIBUTE_N_TIMES, SAVE_REAL_CURSOR        ;
  86. ;        RESTORE_REAL_CURSOR, MOV_TO_HEX_POSITION        ;
  87. ;        MOV_TO_ASCII_POSITION                    ;
  88. ;-----------------------------------------------------------------------;
  89. ERASE_PHANTOM    PROC
  90.     PUSH    CX
  91.     PUSH    DX
  92.     CALL    SAVE_REAL_CURSOR    ;Remember where the cursor was
  93.     CALL    MOV_TO_HEX_POSITION    ;Coord. of cursor in hex window
  94.     MOV    CX,4            ;Make characters normal video
  95.     MOV    DL,7            ;Attribute for normal video
  96.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make hex number normal video
  97.     CALL    MOV_TO_ASCII_POSITION    ;Move to character in ASCII window
  98.     MOV    CX,1
  99.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make attribute normal video
  100.     CALL    MOV_TO_LEFT_NUMBERS    ;Move to offset along left side
  101.     MOV    CX,5
  102.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make attribute normal video
  103.     CALL    MOV_TO_TOP_HEX_NUMBERS    ;Move to offset above hex window
  104.     MOV    CX,4
  105.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make attribute normal video
  106.     CALL    MOV_TO_TOP_ASCII_NUMBERS ;Move to offset above ASCII window
  107.     MOV    CX,1
  108.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Make attribute normal video
  109.     CALL    RESTORE_REAL_CURSOR    ;Put cursor back where it was
  110.     POP    DX
  111.     POP    CX
  112.     RET
  113. ERASE_PHANTOM    ENDP
  114.  
  115.  
  116. ;-----------------------------------------------------------------------;
  117. ; These four procedures move the phantom cursors.            ;
  118. ;                                    ;
  119. ; Uses:        ERASE_PHANTOM, WRITE_PHANTOM                ;
  120. ;        SCROLL_DOWN, SCROLL_UP                    ;
  121. ; Reads:    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y            ;
  122. ; Writes:    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y            ;
  123. ;-----------------------------------------------------------------------;
  124.  
  125.     PUBLIC    PHANTOM_UP
  126. PHANTOM_UP    PROC
  127.     PUSH    CX
  128.     CALL    ERASE_PHANTOM        ;Erase at current position
  129.     DEC    PHANTOM_CURSOR_Y    ;Move cursor up one line
  130.     JNS    WASNT_AT_TOP        ;Was not at the top, write cursor
  131.     MOV    PHANTOM_CURSOR_Y,0    ;Was at top, so put back there
  132.     MOV    CL,1            ;Scroll by one line
  133.     CALL    SCROLL_DOWN        ;Was at the top, scroll
  134. WASNT_AT_TOP:
  135.     CALL    WRITE_PHANTOM        ;Write the phantom at new position
  136.     POP    CX
  137.     RET
  138. PHANTOM_UP    ENDP
  139.  
  140.  
  141.     PUBLIC    PHANTOM_DOWN
  142. PHANTOM_DOWN    PROC
  143.     PUSH    CX
  144.     CALL    ERASE_PHANTOM        ;Erase at current position
  145.     INC    PHANTOM_CURSOR_Y    ;Move cursor up one line
  146.     CMP    PHANTOM_CURSOR_Y,16    ;Was it at the bottom?
  147.     JB    WASNT_AT_BOTTOM        ;No, so write phantom
  148.     MOV    PHANTOM_CURSOR_Y,15    ;Was at bottom, so put back there
  149.     MOV    CL,1            ;Scroll by one line
  150.     CALL    SCROLL_UP        ;Was at bottom, scroll
  151. WASNT_AT_BOTTOM:
  152.     CALL    WRITE_PHANTOM        ;Write the phantom cursor
  153.     POP    CX
  154.     RET
  155. PHANTOM_DOWN    ENDP
  156.  
  157.  
  158.     PUBLIC    PHANTOM_LEFT
  159. PHANTOM_LEFT    PROC
  160.     CALL    ERASE_PHANTOM        ;Erase at current position
  161.     DEC    PHANTOM_CURSOR_X    ;Move cursor left one column
  162.     JNS    WASNT_AT_LEFT        ;Was not at the left side, write cursor
  163.     MOV    PHANTOM_CURSOR_X,0    ;Was at left, so put back there
  164. WASNT_AT_LEFT:
  165.     CALL    WRITE_PHANTOM        ;Write the phantom cursor
  166.     RET
  167. PHANTOM_LEFT    ENDP
  168.  
  169.  
  170.     PUBLIC    PHANTOM_RIGHT
  171. PHANTOM_RIGHT    PROC
  172.     CALL    ERASE_PHANTOM        ;Erase at current position
  173.     INC    PHANTOM_CURSOR_X    ;Move cursor right one column
  174.     CMP    PHANTOM_CURSOR_X,16    ;Was it already at the right side?
  175.     JB    WASNT_AT_RIGHT
  176.     MOV    PHANTOM_CURSOR_X,15    ;Was at right, so put back there
  177. WASNT_AT_RIGHT:
  178.     CALL    WRITE_PHANTOM        ;Write the phantom cursor
  179.     RET
  180. PHANTOM_RIGHT    ENDP
  181.  
  182.  
  183. ;-----------------------------------------------------------------------;
  184. ; These two procedures move the window 8 lines at a time.        ;
  185. ;                                    ;
  186. ; Uses:        ERASE_PHANTOM, WRITE_PHANTOM, SCROLL_DOWN (UP)        ;
  187. ;-----------------------------------------------------------------------;
  188.     PUBLIC    PAGE_UP
  189. PAGE_UP        PROC
  190.     PUSH    CX
  191.     CALL    ERASE_PHANTOM        ;Remove the phantom cursor
  192.     MOV    CL,16
  193.     CALL    SCROLL_DOWN        ;Scroll windows down by 16 lines
  194.     CALL    WRITE_PHANTOM        ;Draw the phantom cursor again
  195.     POP    CX
  196.     RET
  197. PAGE_UP        ENDP
  198.  
  199.  
  200.     PUBLIC    PAGE_DOWN
  201. PAGE_DOWN    PROC
  202.     PUSH    CX
  203.     CALL    ERASE_PHANTOM        ;Remove the phantom cursor
  204.     MOV    CL,16
  205.     CALL    SCROLL_UP        ;Scroll windows up by 16 lines
  206.     CALL    WRITE_PHANTOM        ;Draw the phantom cursor again
  207.     POP    CX
  208.     RET
  209. PAGE_DOWN    ENDP
  210.  
  211.  
  212. ;-----------------------------------------------------------------------;
  213. ; These two procedures move the cursor to the end and beginning of the    ;
  214. ; sector.                                ;
  215. ;                                    ;
  216. ; Uses:        ERASE_PHANTOM, WRITE_PHANTOM, SCROLL_DOWN (UP)        ;
  217. ; Writes:    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y            ;
  218. ;-----------------------------------------------------------------------;
  219.     PUBLIC    HOME_KEY
  220. HOME_KEY    PROC
  221.     PUSH    CX
  222.     CALL    ERASE_PHANTOM        ;First remove the phantom cursor
  223.     MOV    CL,16            ;Now scroll down by 16 lines to move
  224.     CALL    SCROLL_DOWN        ;  to the beginning of the sector
  225.     XOR    CL,CL            ;Now reset the cursor to (0,0)
  226.     MOV    PHANTOM_CURSOR_X,CL    ;Save the new phantom cursor position
  227.     MOV    PHANTOM_CURSOR_Y,CL
  228.     CALL    WRITE_PHANTOM        ;and write phantom cursor at (0,0)
  229.     POP    CX
  230.     RET
  231. HOME_KEY    ENDP
  232.  
  233.  
  234.     PUBLIC    END_KEY
  235. END_KEY        PROC
  236.     PUSH    CX
  237.     CALL    ERASE_PHANTOM        ;First remove the phantom cursor
  238.     MOV    CL,16            ;Now scroll down by 16 lines to move
  239.     CALL    SCROLL_UP        ; to the end of the sector
  240.     MOV    CL,15
  241.     MOV    PHANTOM_CURSOR_X,CL    ;Save the new phantom cursor position
  242.     MOV    PHANTOM_CURSOR_Y,CL
  243.     CALL    WRITE_PHANTOM        ;And write phantom cursor at (15,15)
  244.     POP    CX
  245.     RET
  246. END_KEY        ENDP
  247.  
  248.  
  249.     PUBLIC    MOV_TO_HEX_POSITION
  250.     EXTRN    GOTO_XY:PROC
  251. .DATA
  252.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  253. .CODE
  254. ;-----------------------------------------------------------------------;
  255. ; This procedure moves the real cursor to the position of the phantom    ;
  256. ; cursor in the hex window.                        ;
  257. ;                                    ;
  258. ; Uses:        GOTO_XY                            ;
  259. ; Reads:    LINES_BEFORE_SECTOR, PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y    ;
  260. ;-----------------------------------------------------------------------;
  261. MOV_TO_HEX_POSITION    PROC
  262.     PUSH    AX
  263.     PUSH    CX
  264.     PUSH    DX
  265.     MOV    DH,LINES_BEFORE_SECTOR    ;Find row of phantom (0,0)
  266.     ADD    DH,2            ;Plus row of hex and horizontal bar
  267.     ADD    DH,PHANTOM_CURSOR_Y    ;DH = row of phantom cursor
  268.     MOV    DL,8            ;Indent on left side
  269.     MOV    CL,3            ;Each column uses 3 characters, so
  270.     MOV    AL,PHANTOM_CURSOR_X    ; we must multiply CURSOR_X by 3
  271.     MUL    CL
  272.     ADD    DL,AL            ;And add to the indent, to get column
  273.     CALL    GOTO_XY            ; for phantom cursor
  274.     POP    DX
  275.     POP    CX
  276.     POP    AX
  277.     RET
  278. MOV_TO_HEX_POSITION    ENDP
  279.  
  280.  
  281.     PUBLIC    MOV_TO_ASCII_POSITION
  282.     EXTRN    GOTO_XY:PROC
  283. .DATA
  284.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  285. .CODE
  286. ;-----------------------------------------------------------------------;
  287. ; This procedure moves the real cursor to the beginning of the phantom    ;
  288. ; cursor in the ASCII window.                        ;
  289. ;                                    ;
  290. ; Uses:        GOTO_XY                            ;
  291. ; Reads:    LINES_BEFORE_SECTOR, PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y    ;
  292. ;-----------------------------------------------------------------------;
  293. MOV_TO_ASCII_POSITION    PROC
  294.     PUSH    AX
  295.     PUSH    DX
  296.     MOV    DH,LINES_BEFORE_SECTOR    ;Find row of phantom (0,0)
  297.     ADD    DH,2            ;Plus row of hex and horizontal bar
  298.     ADD    DH,PHANTOM_CURSOR_Y    ;DH = row of phantom cursor
  299.     MOV    DL,59            ;Indent on left side
  300.     ADD    DL,PHANTOM_CURSOR_X    ;Add CURSOR_X to get X position
  301.     CALL    GOTO_XY            ; for phantom cursor
  302.     POP    DX
  303.     POP    AX
  304.     RET
  305. MOV_TO_ASCII_POSITION    ENDP
  306.  
  307.  
  308.     PUBLIC    MOV_TO_LEFT_NUMBERS
  309.     EXTRN    GOTO_XY:PROC
  310. .DATA
  311.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  312. .CODE
  313. ;-----------------------------------------------------------------------;
  314. ; This procedure moves the real cursor to the hex offset number to the    ;
  315. ; left of the half-sector display.                    ;
  316. ;                                    ;
  317. ; Uses:        GOTO_XY                            ;
  318. ; Reads:    LINES_BEFORE_SECTOR                    ;
  319. ;-----------------------------------------------------------------------;
  320. MOV_TO_LEFT_NUMBERS    PROC
  321.     PUSH    AX
  322.     PUSH    DX
  323.     MOV    DH,LINES_BEFORE_SECTOR    ;Find row of phantom (0,0)
  324.     ADD    DH,2            ;Plus row of hex and horizontal bar
  325.     ADD    DH,PHANTOM_CURSOR_Y    ;DH = row of phantom cursor
  326.     MOV    DL,2            ;Indent of left side
  327.     CALL    GOTO_XY
  328.     POP    DX
  329.     POP    AX
  330.     RET
  331. MOV_TO_LEFT_NUMBERS    ENDP
  332.  
  333.  
  334.     PUBLIC    MOV_TO_TOP_HEX_NUMBERS
  335.     EXTRN    GOTO_XY:PROC, READ_CURSOR_POSITION:PROC
  336. .DATA
  337.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  338. .CODE
  339. ;-----------------------------------------------------------------------;
  340. ; This procedure moves the real cursor to the hex offset number above    ;
  341. ; the hex window.                            ;
  342. ;                                    ;
  343. ; Uses:        MOV_TO_HEX_POSITION, READ_CURSOR_POSITION, GOTO_XY    ;
  344. ; Reads:    LINES_BEFORE_SECTOR                    ;
  345. ;-----------------------------------------------------------------------;
  346. MOV_TO_TOP_HEX_NUMBERS    PROC
  347.     PUSH    DX
  348.     CALL    MOV_TO_HEX_POSITION    ;Get to proper column
  349.     CALL    READ_CURSOR_POSITION    ;Now read cursor position
  350.     MOV    DH,LINES_BEFORE_SECTOR    ;Move up to line with numbers
  351.     CALL    GOTO_XY
  352.     POP    DX
  353.     RET
  354. MOV_TO_TOP_HEX_NUMBERS    ENDP
  355.  
  356.  
  357.     PUBLIC    MOV_TO_TOP_ASCII_NUMBERS
  358. .DATA
  359.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  360. .CODE
  361. ;-----------------------------------------------------------------------;
  362. ; This procedure moves to the hex offset number at the top of the    ;
  363. ; ASCII window.                                ;
  364. ;                                    ;
  365. ; Uses:        MOV_TO_ASCII_POSITION, READ_CURSOR_POSITION, GOTO_XY    ;
  366. ; Reads:    LINES_BEFORE_SECTOR                    ;
  367. ;-----------------------------------------------------------------------;
  368. MOV_TO_TOP_ASCII_NUMBERS    PROC
  369.     PUSH    DX
  370.     CALL    MOV_TO_ASCII_POSITION    ;Get to proper column
  371.     CALL    READ_CURSOR_POSITION    ;Now read cursor position
  372.     MOV    DH,LINES_BEFORE_SECTOR    ;Move up to line with numbers
  373.     CALL    GOTO_XY
  374.     POP    DX
  375.     RET
  376. MOV_TO_TOP_ASCII_NUMBERS    ENDP
  377.  
  378.  
  379.     PUBLIC    SAVE_REAL_CURSOR
  380. ;-----------------------------------------------------------------------;
  381. ; This procedure saves the position of the real cursor in the two    ;
  382. ; variables REAL_CURSOR_X and REAL_CURSOR_Y.                ;
  383. ;                                    ;
  384. ; Writes:    REAL_CURSOR_X, REAL_CURSOR_Y                ;
  385. ;-----------------------------------------------------------------------;
  386. SAVE_REAL_CURSOR    PROC
  387.     PUSH    AX
  388.     PUSH    BX
  389.     PUSH    CX
  390.     PUSH    DX
  391.     MOV    AH,3            ;Read cursor position
  392.     XOR    BH,BH            ; on page 0
  393.     INT    10h            ;And return in DL,DH
  394.     MOV    REAL_CURSOR_Y,DL    ;Save position
  395.     MOV    REAL_CURSOR_X,DH
  396.     POP    DX
  397.     POP    CX
  398.     POP    BX
  399.     POP    AX
  400.     RET
  401. SAVE_REAL_CURSOR    ENDP
  402.  
  403.  
  404.     PUBLIC    RESTORE_REAL_CURSOR
  405.     EXTRN    GOTO_XY:PROC
  406. ;-----------------------------------------------------------------------;
  407. ; This procedure restores the real cursor to its old position, saved in    ;
  408. ; REAL_CURSOR_X and REAL_CURSOR_Y.                    ;
  409. ;                                    ;
  410. ; Uses:        GOTO_XY                            ;
  411. ; Reads:    REAL_CURSOR_X, REAL_CURSOR_Y                ;
  412. ;-----------------------------------------------------------------------;
  413. RESTORE_REAL_CURSOR    PROC
  414.     PUSH    DX
  415.     MOV    DL,REAL_CURSOR_Y
  416.     MOV    DH,REAL_CURSOR_X
  417.     CALL    GOTO_XY
  418.     POP    DX
  419.     RET
  420. RESTORE_REAL_CURSOR    ENDP
  421.  
  422.  
  423.     PUBLIC    SCROLL_UP
  424. .DATA
  425.     EXTRN    SECTOR_OFFSET:WORD
  426. .CODE
  427. ;-----------------------------------------------------------------------;
  428. ; This procedure scrolls the sector display, leaving blank lines at    ;
  429. ; the bottom of the display.  SCROLL_UP uses SECTOR_OFFSET to determine    ;
  430. ; how many lines it can scroll without moving past the end of the half-    ;
  431. ; sector display.                            ;
  432. ;                                    ;
  433. ;    CL    Number of lines to scroll by.                ;
  434. ;                                    ;
  435. ; Uses:        SCROLL_WINDOW, FILL_SCROLLED_LINES            ;
  436. ; Reads:    SECTOR_OFFSET                        ;
  437. ; Writes:    SECTOR_OFFSET                        ;
  438. ;-----------------------------------------------------------------------;
  439. SCROLL_UP    PROC
  440.     PUSH    AX
  441.     PUSH    BX
  442.     PUSH    CX
  443.     PUSH    DX
  444.     MOV    AL,CL            ;Move scroll count; we need to use CL
  445.     MOV    BX,SECTOR_OFFSET    ;See where we are in the buffer
  446.     MOV    CL,4            ;divide by 16 to get number of lines
  447.     SHR    BX,CL            ;  offset into the half-sector
  448.     ADD    BL,AL            ;See if we have enough room to scroll
  449.     CMP    BL,16            ;Enough room?
  450.     JBE    CAN_SCROLL_UP        ;Yes, scroll up by AL lines
  451.     SUB    BL,16            ;Number of extra lines we can't scroll
  452.     SUB    AL,BL            ;Total number of lines we can scroll
  453.     JLE    DONT_SCROLL        ;Don't scroll if this is zero
  454. CAN_SCROLL_UP:
  455.     MOV    BL,AL            ;Adjust the SECTOR_OFFSET
  456.     XOR    BH,BH            ;BX contains num of lines scrolled
  457.     MOV    CL,4
  458.     SHL    BX,CL            ;Number of bytes scrolled
  459.     ADD    BX,SECTOR_OFFSET    ;New sector offset
  460.     MOV    SECTOR_OFFSET,BX
  461.     MOV    CL,AL            ;Mov scroll count into CL
  462.     MOV    AL,6            ;Call for scroll up
  463.     CALL    SCROLL_WINDOW
  464.     MOV    DL,16            ;(16 - scroll count) = first blank
  465.     SUB    DL,CL            ;  blank line
  466.     CALL    FILL_SCROLLED_LINES
  467.  
  468. DONT_SCROLL:
  469.     POP    DX
  470.     POP    CX
  471.     POP    BX
  472.     POP    AX
  473.     RET
  474. SCROLL_UP    ENDP
  475.  
  476.  
  477.     PUBLIC    SCROLL_DOWN
  478. .DATA
  479.     EXTRN    SECTOR_OFFSET:WORD
  480. .CODE
  481. ;-----------------------------------------------------------------------;
  482. ; This procedure scrolls the sector display, leaving blank lines at    ;
  483. ; the top of the display.  SCROLL_UP uses SECTOR_OFFSET to determine    ;
  484. ; how many lines it can scroll without moving past the top of the half-    ;
  485. ; sector display.                            ;
  486. ;                                    ;
  487. ;    CL    Number of lines to scroll by.                ;
  488. ;                                    ;
  489. ; Uses:        SCROLL_WINDOW, FILL_SCROLLED_LINES            ;
  490. ; Reads:    SECTOR_OFFSET                        ;
  491. ; Writes:    SECTOR_OFFSET                        ;
  492. ;-----------------------------------------------------------------------;
  493. SCROLL_DOWN    PROC
  494.     PUSH    AX
  495.     PUSH    BX
  496.     PUSH    CX
  497.     PUSH    DX
  498.     MOV    AL,CL            ;Move scroll count; we need to use CL
  499.     MOV    BX,SECTOR_OFFSET    ;See where we are in the buffer
  500.     MOV    CL,4            ;divide by 16 to get number of lines
  501.     SHR    BX,CL            ;  offset into the half-sector
  502.     SUB    BL,AL            ;See if we have enough room to scroll
  503.     JNS    CAN_SCROLL_DOWN        ;Yes, we can scroll down
  504.     ADD    AL,BL            ;Total number of lines we can scroll
  505.     JZ    DONT_SCROLL        ;Don't scroll if zero
  506. CAN_SCROLL_DOWN:
  507.     MOV    BL,AL            ;Adjust the SECTOR_OFFSET
  508.     XOR    BH,BH            ;BX contains num of lines scrolled
  509.     MOV    CL,4
  510.     SHL    BX,CL            ;Number of bytes scrolled
  511.     SUB    BX,SECTOR_OFFSET    ;New sector offset
  512.     NEG    BX
  513.     MOV    SECTOR_OFFSET,BX
  514.     MOV    CL,AL            ;Mov scroll count into CL
  515.     MOV    AL,7            ;Call for scroll up
  516.     CALL    SCROLL_WINDOW
  517.     MOV    DL,0            ;First blank line
  518.     CALL    FILL_SCROLLED_LINES
  519.     JMP    DONT_SCROLL
  520. SCROLL_DOWN    ENDP
  521.  
  522.  
  523.     PUBLIC    SCROLL_WINDOW
  524. .DATA
  525.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  526. .CODE
  527. ;-----------------------------------------------------------------------;
  528. ; This procedure scrolls the half-sector display.            ;
  529. ;                                    ;
  530. ;    AL    6 for scroll up, 7 for scroll down.            ;
  531. ;    CL    Number of lines to scroll                ;
  532. ;                                    ;
  533. ; Reads:    LINES_BEFORE_SECTOR                    ;
  534. ;-----------------------------------------------------------------------;
  535. SCROLL_WINDOW    PROC
  536.     PUSH    AX
  537.     PUSH    BX
  538.     PUSH    CX
  539.     PUSH    DX
  540.     MOV    AH,AL            ;Put 6 or 7 into AH register
  541.     MOV    AL,CL            ;Place scroll count into AL
  542.     CMP    AL,15            ;Should we blank entire window?
  543.     JBE    DONT_BLANK        ;No, continue.
  544.     XOR    AL,AL            ;Yes, set scroll count to 0
  545. DONT_BLANK:
  546.     MOV    CH,LINES_BEFORE_SECTOR    ;Top row
  547.     ADD    CH,2
  548.     MOV    DH,CH            ;Bottom row
  549.     ADD    DH,15
  550.  
  551.     XOR    CL,CL            ;Left column
  552.     MOV    DL,6            ;Right column
  553.     MOV    BH,7            ;Normal attribute for blank lines
  554.     PUSH    AX
  555.     INT    10h            ;Scroll offset numbers on left side
  556.     POP    AX
  557.  
  558.     MOV    CL,8            ;Left side of the hex window
  559.     MOV    DL,56            ;Right side of the hex window
  560.     PUSH    AX
  561.     INT    10h            ;Scroll the hex window
  562.     POP    AX
  563.  
  564.     MOV    CL,58            ;Left side of the ASCII window
  565.     MOV    DL,75            ;Right side of the ASCII window
  566.     PUSH    AX
  567.     INT    10h            ;Scroll the ASCII window
  568.     POP    AX
  569.  
  570.     POP    DX
  571.     POP    CX
  572.     POP    BX
  573.     POP    AX
  574.     RET
  575. SCROLL_WINDOW    ENDP
  576.  
  577.  
  578.     PUBLIC    FILL_SCROLLED_LINES
  579.     EXTRN    DISP_LINE:PROC, SEND_CRLF:PROC
  580.     EXTRN    GOTO_XY:PROC
  581. .DATA
  582.     EXTRN    SECTOR_OFFSET:WORD
  583.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  584. .CODE
  585. ;-----------------------------------------------------------------------;
  586. ; This procedure fills in the lines blanked by scrolling.        ;
  587. ;                                    ;
  588. ;    CL    Number of lines scrolled                ;
  589. ;    DL    First line to fill in                    ;
  590. ;                                    ;
  591. ; Uses:        DISP_LINE, SEND_CRLF, GOTO_XY                ;
  592. ;        SAVE_REAL_CURSOR, RESTORE_REAL_CURSOR            ;
  593. ; Reads:    LINES_BEFORE_SECTOR, SECTOR_OFFSET            ;
  594. ;-----------------------------------------------------------------------;
  595. FILL_SCROLLED_LINES    PROC
  596.     PUSH    CX
  597.     PUSH    DX
  598.     CALL    SAVE_REAL_CURSOR    ;Remember where cursor was
  599.     MOV    DH,LINES_BEFORE_SECTOR    ;Calculate the first row
  600.     ADD    DH,2            ;Row of first line in sector display
  601.     ADD    DH,DL            ;Row of first line to fill
  602.     XOR    DL,DL
  603.     CALL    GOTO_XY            ;Move cursor to start of row
  604.     POP    DX            ;Restore DX
  605.     PUSH    DX
  606.     XOR    DH,DH            ;DX -- first line to fill in (0..15)
  607.     PUSH    CX
  608.     MOV    CL,4
  609.     SHL    DX,CL            ;Number of bytes from start of display
  610.     POP    CX
  611.     ADD    DX,SECTOR_OFFSET    ;Starting byte.
  612. FILL_LINE_LOOP:
  613.     CALL    DISP_LINE        ;Display one line
  614.     CALL    SEND_CRLF        ;Move to start of next line
  615.     ADD    DX,16            ;Move to next line in SECTOR
  616.     LOOP    FILL_LINE_LOOP        ;Keep filling empty lines
  617.     CALL    RESTORE_REAL_CURSOR    ;Put cursor back where it was
  618.     POP    DX
  619.     POP    CX
  620.     RET
  621. FILL_SCROLLED_LINES    ENDP
  622.  
  623.  
  624.     END