home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Assembly / PHANTO27.ASM < prev    next >
Assembly Source File  |  1986-09-25  |  9KB  |  280 lines

  1. CGROUP    GROUP    CODE_SEG, DATA_SEG
  2.     ASSUME    CS:CGROUP, DS:CGROUP
  3.  
  4.  
  5. CODE_SEG    SEGMENT PUBLIC
  6.  
  7. ;-----------------------------------------------------------------------;
  8. ; These four procedures move the phantom cursors.            ;
  9. ;                                    ;
  10. ; Uses:        ERASE_PHANTOM, WRITE_PHANTOM                ;
  11. ;        SCROLL_DOWN, SCROLL_UP                    ;
  12. ; Reads:    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y            ;
  13. ; Writes:    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y            ;
  14. ;-----------------------------------------------------------------------;
  15.  
  16.     PUBLIC    PHANTOM_UP
  17. PHANTOM_UP    PROC    NEAR
  18.     CALL    ERASE_PHANTOM        ;Erase at current position
  19.     DEC    PHANTOM_CURSOR_Y    ;Move cursor up one line
  20.     JNS    WASNT_AT_TOP        ;Was not at the top, write cursor
  21.     CALL    SCROLL_DOWN        ;Was at the top, scroll
  22. WASNT_AT_TOP:
  23.     CALL    WRITE_PHANTOM        ;Write the phantom at new position
  24.     RET
  25. PHANTOM_UP    ENDP
  26.  
  27.     PUBLIC    PHANTOM_DOWN
  28. PHANTOM_DOWN    PROC    NEAR
  29.     CALL    ERASE_PHANTOM        ;Erase at current position
  30.     INC    PHANTOM_CURSOR_Y    ;Move cursor down one line
  31.     CMP    PHANTOM_CURSOR_Y,16    ;Was it at the bottom?
  32.     JB    WASNT_AT_BOTTOM        ;No, so write phantom
  33.     CALL    SCROLL_UP        ;Was at bottom, scroll
  34. WASNT_AT_BOTTOM:
  35.     CALL    WRITE_PHANTOM        ;Write the phantom cursor
  36.     RET
  37. PHANTOM_DOWN    ENDP
  38.  
  39.     PUBLIC    PHANTOM_LEFT
  40. PHANTOM_LEFT    PROC    NEAR
  41.     CALL    ERASE_PHANTOM        ;Erase at current position
  42.     DEC    PHANTOM_CURSOR_X    ;Move cursor left one column
  43.     JNS    WASNT_AT_LEFT        ;Was not at the left side, write cursor
  44.     MOV    PHANTOM_CURSOR_X,0    ;Was at left, so put back there
  45. WASNT_AT_LEFT:
  46.     CALL    WRITE_PHANTOM        ;Write the phantom cursor
  47.     RET
  48. PHANTOM_LEFT    ENDP
  49.  
  50.     PUBLIC    PHANTOM_RIGHT
  51. PHANTOM_RIGHT    PROC    NEAR
  52.     CALL    ERASE_PHANTOM        ;Erase at current position
  53.     INC    PHANTOM_CURSOR_X    ;Move cursor right one column
  54.     CMP    PHANTOM_CURSOR_X,16    ;Was it already at the right side?
  55.     JB    WASNT_AT_RIGHT
  56.     MOV    PHANTOM_CURSOR_X,15    ;Was at right, so put back there
  57. WASNT_AT_RIGHT:
  58.     CALL    WRITE_PHANTOM        ;Write the phantom cursor
  59.     RET
  60. PHANTOM_RIGHT    ENDP
  61.  
  62.  
  63.     EXTRN    DISP_HALF_SECTOR:NEAR, GOTO_XY:NEAR
  64. DATA_SEG    SEGMENT PUBLIC
  65.     EXTRN    SECTOR_OFFSET:WORD
  66.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  67. DATA_SEG    ENDS
  68. ;-----------------------------------------------------------------------;
  69. ; These two procedures move between the two half-sector displays.    ;
  70. ;                                    ;
  71. ; Uses:        WRITE_PHANTOM, DISP_HALF_SECTOR, ERASE_PHANTOM, GOTO_XY    ;
  72. ;        SAVE_REAL_CURSOR, RESTORE_REAL_CURSOR            ;
  73. ; Reads:    LINES_BEFORE_SECTOR                    ;
  74. ; Writes:    SECTOR_OFFSET, PHANTOM_CURSOR_Y                ;
  75. ;-----------------------------------------------------------------------;
  76. SCROLL_UP    PROC    NEAR
  77.     PUSH    DX
  78.     CALL    ERASE_PHANTOM        ;Remove the phantom cursor
  79.     CALL    SAVE_REAL_CURSOR    ;Save the real cursor position
  80.     XOR    DL,DL            ;Set cursor for half-sector display
  81.     MOV    DH,LINES_BEFORE_SECTOR
  82.     ADD    DH,2
  83.     CALL    GOTO_XY
  84.     MOV    DX,256            ;Display the second half sector
  85.     MOV    SECTOR_OFFSET,DX
  86.     CALL    DISP_HALF_SECTOR
  87.     CALL    RESTORE_REAL_CURSOR    ;Restore the real cursor position
  88.     MOV    PHANTOM_CURSOR_Y,0    ;Cursor at top of second half sector
  89.     CALL    WRITE_PHANTOM        ;Restore the phantom cursor
  90.     POP    DX
  91.     RET
  92. SCROLL_UP    ENDP
  93.  
  94. SCROLL_DOWN    PROC    NEAR
  95.     PUSH    DX
  96.     CALL    ERASE_PHANTOM        ;Remove the phantom cursor
  97.     CALL    SAVE_REAL_CURSOR    ;Save the real cursor position
  98.     XOR    DL,DL            ;Set cursor for half-sector display
  99.     MOV    DH,LINES_BEFORE_SECTOR
  100.     ADD    DH,2
  101.     CALL    GOTO_XY
  102.     XOR    DX,DX            ;Display the first half sector
  103.     MOV    SECTOR_OFFSET,DX
  104.     CALL    DISP_HALF_SECTOR
  105.     CALL    RESTORE_REAL_CURSOR    ;Restore the real cursor position
  106.     MOV    PHANTOM_CURSOR_Y,15    ;Cursor at bottom of first half sector
  107.     CALL    WRITE_PHANTOM        ;Restore the phantom cursor
  108.     POP    DX
  109.     RET
  110. SCROLL_DOWN    ENDP
  111.  
  112.  
  113.     PUBLIC    MOV_TO_HEX_POSITION
  114.     EXTRN    GOTO_XY:NEAR
  115. DATA_SEG    SEGMENT PUBLIC
  116.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  117. DATA_SEG    ENDS
  118. ;-----------------------------------------------------------------------;
  119. ; This procedure moves the real cursor to the position of the phantom    ;
  120. ; cursor in the hex window.                        ;
  121. ;                                    ;
  122. ; Uses:        GOTO_XY                            ;
  123. ; Reads:    LINES_BEFORE_SECTOR, PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y    ;
  124. ;-----------------------------------------------------------------------;
  125. MOV_TO_HEX_POSITION    PROC    NEAR
  126.     PUSH    AX
  127.     PUSH    CX
  128.     PUSH    DX
  129.     MOV    DH,LINES_BEFORE_SECTOR    ;Find row of phantom (0,0)
  130.     ADD    DH,2            ;Plus row of hex and horizontal bar
  131.     ADD    DH,PHANTOM_CURSOR_Y    ;DH = row of phantom cursor
  132.     MOV    DL,8            ;Indent on left side
  133.     MOV    CL,3            ;Each column uses 3 characters,so
  134.     MOV    AL,PHANTOM_CURSOR_X    ; we must multiply CURSOR_X by 3
  135.     MUL    CL
  136.     ADD    DL,AL            ;And add to the indent, to get column
  137.     CALL    GOTO_XY            ; for phantom cursor
  138.     POP    DX
  139.     POP    CX
  140.     POP    AX
  141.     RET
  142. MOV_TO_HEX_POSITION    ENDP
  143.  
  144.     PUBLIC    MOV_TO_ASCII_POSITION
  145.     EXTRN    GOTO_XY:NEAR
  146. DATA_SEG    SEGMENT PUBLIC
  147.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  148. DATA_SEG    ENDS
  149. ;-----------------------------------------------------------------------;
  150. ; This procedure moves the real cursor to the beginning of the phantom    ;
  151. ; cursor in the ASCII window.                        ;
  152. ;                                    ;
  153. ; Uses:        GOTO_XY                            ;
  154. ; Reads:    LINES_BEFORE_SECTOR, PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y    ;
  155. ;-----------------------------------------------------------------------;
  156. MOV_TO_ASCII_POSITION    PROC    NEAR
  157.     PUSH    AX
  158.     PUSH    DX
  159.     MOV    DH,LINES_BEFORE_SECTOR    ;Find row of phantom (0,0)
  160.     ADD    DH,2            ;Plus row of hex and horizontal bar
  161.     ADD    DH,PHANTOM_CURSOR_Y    ;DH = row of phantom cursor
  162.     MOV    DL,59            ;Indent on left side
  163.     ADD    DL,PHANTOM_CURSOR_X    ;Add CURSOR_X to get X position
  164.     CALL    GOTO_XY            ; for phantom cursor
  165.     POP    DX
  166.     POP    AX
  167.     RET
  168. MOV_TO_ASCII_POSITION    ENDP
  169.  
  170.     PUBLIC    SAVE_REAL_CURSOR
  171. ;-----------------------------------------------------------------------;
  172. ; This procedure saves the position of the real cursor in the two    ;
  173. ; variables REAL_CURSOR_X and REAL_CURSOR_Y.                ;
  174. ;                                    ;
  175. ; Writes:    REAL_CURSOR_X, REAL_CURSOR_Y                ;
  176. ;-----------------------------------------------------------------------;
  177. SAVE_REAL_CURSOR    PROC    NEAR
  178.     PUSH    AX
  179.     PUSH    BX
  180.     PUSH    CX
  181.     PUSH    DX
  182.     MOV    AH,3            ;Read cursor position
  183.     XOR    BH,BH            ; on page 0
  184.     INT    10h            ;And return in DL,DH
  185.     MOV    REAL_CURSOR_Y,DL    ;Save position
  186.     MOV    REAL_CURSOR_X,DH
  187.     POP    DX
  188.     POP    CX
  189.     POP    BX
  190.     POP    AX
  191.     RET
  192. SAVE_REAL_CURSOR    ENDP
  193.  
  194.     PUBLIC    RESTORE_REAL_CURSOR
  195.     EXTRN    GOTO_XY:NEAR
  196. ;-----------------------------------------------------------------------;
  197. ; This procedure restorest he real cursor to its old position, saved in    ;
  198. ; REAL_CURSOR_X and REAL_CURSOR_Y.                    ;
  199. ;                                    ;
  200. ; Uses:        GOTO_XY                            ;
  201. ; Reads:    REAL_CURSOR_X, REAL_CURSOR_Y                ;
  202. ;-----------------------------------------------------------------------;
  203. RESTORE_REAL_CURSOR    PROC    NEAR
  204.     PUSH    DX
  205.     MOV    DL,REAL_CURSOR_Y
  206.     MOV    DH,REAL_CURSOR_X
  207.     CALL    GOTO_XY
  208.     POP    DX
  209.     RET
  210. RESTORE_REAL_CURSOR    ENDP
  211.  
  212.     PUBLIC    WRITE_PHANTOM
  213.     EXTRN    WRITE_ATTRIBUTE_N_TIMES:NEAR
  214. ;-----------------------------------------------------------------------;
  215. ; This procedure uses CURSOR_X and CURSOR_Y, through MOV_TO_..., as the    ;
  216. ; coordinates for the phantom cursor.  WRITE_PHANTOM writes this    ;
  217. ; phantom cursor.                            ;
  218. ;                                    ;
  219. ; Uses:        WRITE_ATTRIBUTE_N_TIMES, SAVE_REAL_CURSOR        ;
  220. ;        RESTORE_REAL_CURSOR, MOV_TO_HEX_POSITION        ;
  221. ;        MOV_TO_ASCII_POSITION                    ;
  222. ;-----------------------------------------------------------------------;
  223. WRITE_PHANTOM    PROC    NEAR
  224.     PUSH    CX
  225.     PUSH    DX
  226.     CALL    SAVE_REAL_CURSOR
  227.     CALL    MOV_TO_HEX_POSITION    ;Coord. of cursor in hex window
  228.     MOV    CX,4            ;Make phantom cursor four chars wide
  229.     MOV    DL,70h
  230.     CALL    WRITE_ATTRIBUTE_N_TIMES
  231.     CALL    MOV_TO_ASCII_POSITION    ;Coord. of cursor in ASCII window
  232.     MOV    CX,1            ;Cursor is one character wide here
  233.     CALL    WRITE_ATTRIBUTE_N_TIMES
  234.     CALL    RESTORE_REAL_CURSOR
  235.     POP    DX
  236.     POP    CX
  237.     RET
  238. WRITE_PHANTOM    ENDP
  239.  
  240.     PUBLIC    ERASE_PHANTOM
  241.     EXTRN    WRITE_ATTRIBUTE_N_TIMES:NEAR
  242. ;-----------------------------------------------------------------------;
  243. ; This procedure erases the phantom cursor, just the opposite of    ;
  244. ; WRITE_PHANTOM.                            ;
  245. ;                                    ;
  246. ; Uses:        WRITE_ATTRIBUTE_N_TIMES, SAVE_REAL_CURSOR        ;
  247. ;        RESTORE_REAL_CURSOR, MOV_TO_HEX_POSITION        ;
  248. ;        MOV_TO_ASCII_POSITION                    ;
  249. ;-----------------------------------------------------------------------;
  250. ERASE_PHANTOM    PROC    NEAR
  251.     PUSH    CX
  252.     PUSH    DX
  253.     CALL    SAVE_REAL_CURSOR
  254.     CALL    MOV_TO_HEX_POSITION    ;Coord. of cursor in hex window
  255.     MOV    CX,4            ;Change back to white on black
  256.     MOV    DL,7
  257.     CALL    WRITE_ATTRIBUTE_N_TIMES
  258.     CALL    MOV_TO_ASCII_POSITION
  259.     MOV    CX,1
  260.     CALL    WRITE_ATTRIBUTE_N_TIMES
  261.     CALL    RESTORE_REAL_CURSOR
  262.     POP    DX
  263.     POP    CX
  264.     RET
  265. ERASE_PHANTOM    ENDP
  266.  
  267. CODE_SEG    ENDS
  268.  
  269.  
  270. DATA_SEG    SEGMENT PUBLIC
  271. REAL_CURSOR_X        DB    0
  272. REAL_CURSOR_Y        DB    0
  273.     PUBLIC    PHANTOM_CURSOR_X, PHANTOM_CURSOR_Y
  274. PHANTOM_CURSOR_X    DB    0
  275. PHANTOM_CURSOR_Y    DB    0
  276. DATA_SEG    ENDS
  277.  
  278.  
  279.     END
  280.