home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / nor_asm / phanto27.asm < prev    next >
Assembly Source File  |  1989-06-07  |  8KB  |  274 lines

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