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

  1. .MODEL    SMALL
  2.  
  3.  
  4. ;-----------------------------------------------------------------------;
  5. ; This file contains procedures for displaying sectors on the screen:    ;
  6. ;                                    ;
  7. ; INIT_SEC_DISP            Reads a sector and redraws the screen    ;
  8. ; WRITE_HEADER            Writes the header on the screen        ;
  9. ; WRITE_TOP_HEX_NUMBERS        Writes numbers along the top of the box    ;
  10. ; DISP_HALF_SECTOR        Displays half of the sector        ;
  11. ; DISP_LINE            Displays one line of the sector        ;
  12. ; WRITE_PROMPT_LINE        Writes the prompt line to the screen    ;
  13. ; WRITE_FUNCTION_KEYS        Display the function-key line        ;
  14. ;-----------------------------------------------------------------------;
  15.  
  16.  
  17. ;-----------------------------------------------------------------------;
  18. ; Graphics characters for border of sector.                ;
  19. ;-----------------------------------------------------------------------;
  20. VERTICAL_BAR    EQU    0BAh
  21. HORIZONTAL_BAR    EQU    0CDh
  22. UPPER_LEFT    EQU    0C9h
  23. UPPER_RIGHT    EQU    0BBh
  24. LOWER_LEFT    EQU    0C8h
  25. LOWER_RIGHT    EQU    0BCh
  26. TOP_T_BAR    EQU    0CBh
  27. BOTTOM_T_BAR    EQU    0CAh
  28. TOP_TICK    EQU    0D1h
  29. BOTTOM_TICK    EQU    0CFh
  30.  
  31.  
  32. .DATA
  33.  
  34. TOP_LINE_PATTERN    LABEL    BYTE
  35.     DB    ' ',7
  36.     DB    UPPER_LEFT, 1
  37.     DB    HORIZONTAL_BAR,12
  38.     DB    TOP_TICK,1
  39.     DB    HORIZONTAL_BAR,11
  40.     DB    TOP_TICK,1
  41.     DB    HORIZONTAL_BAR,11
  42.     DB    TOP_TICK,1
  43.     DB    HORIZONTAL_BAR,12
  44.     DB    TOP_T_BAR,1
  45.     DB    HORIZONTAL_BAR,18
  46.     DB    UPPER_RIGHT,1
  47.     DB    0
  48. BOTTOM_LINE_PATTERN    LABEL    BYTE
  49.     DB    ' ',7
  50.     DB    LOWER_LEFT, 1
  51.     DB    HORIZONTAL_BAR,12
  52.     DB    BOTTOM_TICK,1
  53.     DB    HORIZONTAL_BAR,11
  54.     DB    BOTTOM_TICK,1
  55.     DB    HORIZONTAL_BAR,11
  56.     DB    BOTTOM_TICK,1
  57.     DB    HORIZONTAL_BAR,12
  58.     DB    BOTTOM_T_BAR,1
  59.     DB    HORIZONTAL_BAR,18
  60.     DB    LOWER_RIGHT,1
  61.     DB    0
  62.  
  63. .DATA?
  64.  
  65.     EXTRN    SECTOR:BYTE
  66.  
  67. .CODE
  68.  
  69.     PUBLIC    INIT_SEC_DISP
  70.     EXTRN    READ_SECTOR:PROC
  71.     EXTRN    WRITE_PATTERN:PROC, SEND_CRLF:PROC
  72.     EXTRN    GOTO_XY:PROC, WRITE_PHANTOM:PROC
  73. .DATA
  74.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  75.     EXTRN    SECTOR_OFFSET:WORD
  76. .CODE
  77. ;-----------------------------------------------------------------------;
  78. ; This procedure initializes the half-sector display.            ;
  79. ;                                    ;
  80. ; Uses:        WRITE_PATTERN, SEND_CRLF, DISP_HALF_SECTOR        ;
  81. ;        WRITE_TOP_HEX_NUMBERS, GOTO_XY, WRITE_PHANTOM        ;
  82. ; Reads:    TOP_LINE_PATTERN, BOTTOM_LINE_PATTERN            ;
  83. ;        LINES_BEFORE_SECTOR                    ;
  84. ; Writes:    SECTOR_OFFSET                        ;
  85. ;-----------------------------------------------------------------------;
  86. INIT_SEC_DISP    PROC
  87.     PUSH    DX
  88.     CALL    WRITE_HEADER        ;Write the new header
  89.     CALL    READ_SECTOR        ;Read in the disk sector
  90.  
  91.     XOR    DL,DL            ;Move cursor into position at start
  92.     MOV    DH,LINES_BEFORE_SECTOR    ; of the 3rd lines
  93.     CALL    GOTO_XY            ;Move the cursor
  94.     CALL    WRITE_TOP_HEX_NUMBERS    ;Write line of numbers along the top
  95.     LEA    DX,TOP_LINE_PATTERN    ;Display the top line of the box
  96.     CALL    WRITE_PATTERN
  97.     CALL    SEND_CRLF        ;Move to the next line
  98.  
  99.     XOR    DX,DX            ;Start at the beginning of the sector
  100.     MOV    SECTOR_OFFSET,DX    ;Set sector offset to 0
  101.     CALL    DISP_HALF_SECTOR    ;Display the first half sector
  102.     LEA    DX,BOTTOM_LINE_PATTERN    ;Display the bottom of the box
  103.     CALL    WRITE_PATTERN
  104.     CALL    WRITE_PHANTOM        ;Display the phantom cursor
  105.     POP    DX
  106.     RET
  107. INIT_SEC_DISP    ENDP
  108.  
  109.  
  110.     PUBLIC    WRITE_HEADER
  111. .DATA
  112.     EXTRN    HEADER_LINE_NO:BYTE
  113.     EXTRN    HEADER_PART_1:BYTE
  114.     EXTRN    HEADER_PART_2:BYTE
  115.     EXTRN    DISK_DRIVE_NO:BYTE
  116.     EXTRN    CURRENT_SECTOR_NO:WORD
  117.     EXTRN    FILE_FLAG:BYTE
  118.     EXTRN    FILE_HEADER:BYTE
  119.     EXTRN    FILE_NAME:BYTE
  120. .CODE
  121.     EXTRN    GOTO_XY:PROC, CLEAR_TO_END_OF_LINE:PROC
  122.     EXTRN    WRITE_DECIMAL:PROC
  123. ;-----------------------------------------------------------------------;
  124. ;  This procedure writes the header with disk drive and sector number.    ;
  125. ;                                    ;
  126. ; Uses:        GOTO_XY, WRITE_STRING, WRITE_CHAR, WRITE_DECIMAL    ;
  127. ;        CLEAR_TO_END_OF_LINE                    ;
  128. ; Reads:    HEADER_LINE_NO, HEADER_PART_1, HEADER_PART_2        ;
  129. ;        DISK_DRIVE_NO, CURRENT_SECTOR_NO, FILE_FLAG        ;
  130. ;        FILE_HEADER, FILE_NAME                    ;
  131. ;-----------------------------------------------------------------------;
  132. WRITE_HEADER    PROC
  133.     PUSH    DX
  134.     XOR    DL,DL            ;Move cursor to header line number
  135.     MOV    DH,HEADER_LINE_NO
  136.     CALL    GOTO_XY
  137.  
  138.     CMP    FILE_FLAG,1        ;Are we in file mode?
  139.     JE    WRITE_OFFSET        ;Yes, then don't write drive number
  140.     LEA    DX,HEADER_PART_1    ;Display "Disk "
  141.     CALL    WRITE_STRING
  142.     MOV    DL,DISK_DRIVE_NO    ;Display the disk drive number
  143.     ADD    DL,'A'            ;Print drives A, B, ...
  144.     CALL    WRITE_CHAR
  145. WRITE_OFFSET:
  146.     LEA    DX,HEADER_PART_2    ;Display "     Sector "
  147.     CALL    WRITE_STRING
  148.     MOV    DX,CURRENT_SECTOR_NO    ;Display the sector number
  149.     CALL    WRITE_DECIMAL
  150.     CMP    FILE_FLAG,1        ;Are we in file mode?
  151.     JNE    DONT_WRITE_FILE_HEADER    ;No, then don't write the file header
  152.     LEA    DX,FILE_HEADER        ;Yes, display the file header
  153.     CALL    WRITE_STRING
  154.     LEA    DX,FILE_NAME        ;Write the name of the file
  155.     CALL    WRITE_STRING
  156. DONT_WRITE_FILE_HEADER:
  157.     CALL    CLEAR_TO_END_OF_LINE    ;Clear rest of sector number
  158.     POP    DX
  159.     RET
  160. WRITE_HEADER    ENDP
  161.  
  162.  
  163.     EXTRN    WRITE_CHAR_N_TIMES:PROC, WRITE_HEX:PROC, WRITE_CHAR:PROC
  164.     EXTRN    WRITE_HEX_DIGIT:PROC, SEND_CRLF:PROC
  165. ;-----------------------------------------------------------------------;
  166. ; This procedure writes the index numbers (0 through F) at the top of    ;
  167. ; the half-sector display.                        ;
  168. ;                                    ;
  169. ; Uses:        WRITE_CHAR_N_TIMES, WRITE_HEX, WRITE_CHAR        ;
  170. ;        WRITE_HEX_DIGIT, SEND_CRLF                ;
  171. ;-----------------------------------------------------------------------;
  172. WRITE_TOP_HEX_NUMBERS    PROC
  173.     PUSH    CX
  174.     PUSH    DX
  175.     MOV    DL,' '            ;Write 9 spaces for left side
  176.     MOV    CX,9
  177.     CALL    WRITE_CHAR_N_TIMES
  178.     XOR    DH,DH            ;Start with 0
  179. HEX_NUMBER_LOOP:
  180.     MOV    DL,DH
  181.     CALL    WRITE_HEX        ;Write a two-digit hex number
  182.     MOV    DL,' '
  183.     CALL    WRITE_CHAR        ;Write a space between numbers
  184.     INC    DH            ;Increment the number
  185.     CMP    DH,10h            ;Have we written 16 numbers?
  186.     JB    HEX_NUMBER_LOOP        ;No, keep writing
  187.  
  188.     MOV    DL,' '            ;Write hex numbers over ASCII window
  189.     MOV    CX,2
  190.     CALL    WRITE_CHAR_N_TIMES
  191.     XOR    DL,DL            ;Start over at zero again
  192.  
  193. HEX_DIGIT_LOOP:
  194.     CALL    WRITE_HEX_DIGIT        ;Write a single-digit hex number
  195.     INC    DL            ;Increment the number
  196.     CMP    DL,10h            ;Have we written 16 numbers?
  197.     JB    HEX_DIGIT_LOOP        ;No, keep writing
  198.  
  199.     CALL    SEND_CRLF        ;Move to the start of the next line
  200.     POP    DX
  201.     POP    CX
  202.     RET
  203. WRITE_TOP_HEX_NUMBERS    ENDP
  204.  
  205.  
  206.     PUBLIC    DISP_HALF_SECTOR
  207.     EXTRN    SEND_CRLF:PROC
  208. ;-----------------------------------------------------------------------;
  209. ; This procedure displays half a sector (256 bytes)            ;
  210. ;                                    ;
  211. ; On entry:    DS:DX    Offset into sector, in bytes -- should be    ;
  212. ;            multiple of 16.                    ;
  213. ;                                    ;
  214. ; Uses:        DISP_LINE, SEND_CRLF                    ;
  215. ;-----------------------------------------------------------------------;
  216. DISP_HALF_SECTOR    PROC
  217.     PUSH    CX
  218.     PUSH    DX
  219.     MOV    CX,16            ;Display 16 lines
  220. HALF_SECTOR:
  221.     CALL    DISP_LINE        ;Display a single line
  222.     CALL    SEND_CRLF        ;Move to the start of the next line
  223.     ADD    DX,16            ;Increase our offset by 16 bytes
  224.     LOOP    HALF_SECTOR        ;Keep writing for 16 lines
  225.     POP    DX
  226.     POP    CX
  227.     RET
  228. DISP_HALF_SECTOR    ENDP
  229.  
  230.  
  231.     PUBLIC    DISP_LINE
  232.     EXTRN    WRITE_HEX:PROC
  233.     EXTRN    WRITE_CHAR:PROC
  234.     EXTRN    WRITE_CHAR_N_TIMES:PROC
  235. ;-----------------------------------------------------------------------;
  236. ; This procedure displays one line of data, or 16 bytes, first in hex,    ;
  237. ; then in ASCII.                            ;
  238. ;                                    ;
  239. ; On entry:    DS:DX    Offset into sector, in bytes.            ;
  240. ;                                    ;
  241. ; Uses:        WRITE_CHAR, WRITE_HEX, WRITE_CHAR_N_TIMES        ;
  242. ; Reads:    SECTOR                            ;
  243. ;-----------------------------------------------------------------------;
  244. DISP_LINE    PROC
  245.     PUSH    BX
  246.     PUSH    CX
  247.     PUSH    DX
  248.     MOV    BX,DX            ;Offset is more useful in BX
  249.     MOV    DL,' '
  250.     MOV    CX,3            ;Write 3 spaces before line
  251.     CALL    WRITE_CHAR_N_TIMES
  252.                     ;Write offset in hex
  253.     CMP    BX,100h            ;Is the first digit a 1?
  254.     JB    WRITE_ONE        ;No, write space already in DL
  255.     MOV    DL,'1'            ;Yes, then place '1' into DL for output
  256. WRITE_ONE:
  257.     CALL    WRITE_CHAR        ;Write either a space or a '1'
  258.     MOV    DL,BL            ;Copy lower byte into DL for hex output
  259.     CALL    WRITE_HEX        ;Display the lower byte of offset
  260.  
  261.     MOV    DL,' '            ;Write separator
  262.     CALL    WRITE_CHAR
  263.     MOV    DL,VERTICAL_BAR        ;Draw left side of box
  264.     CALL    WRITE_CHAR
  265.     MOV    DL,' '            ;Indent by one space from border
  266.     CALL    WRITE_CHAR
  267.                     ;Now write out 16 bytes
  268.     MOV    CX,16            ;Dump 16 bytes
  269.     PUSH    BX            ;Save the offset for ASCII_LOOP
  270. HEX_LOOP:
  271.     MOV    DL,SECTOR[BX]        ;Get one byte
  272.     CALL    WRITE_HEX        ;Dump this byte in hex
  273.     MOV    DL,' '            ;Write a space between numbers
  274.     CALL    WRITE_CHAR
  275.     INC    BX            ;Move to the next byte
  276.     LOOP    HEX_LOOP        ;Write 16 bytes of data
  277.  
  278.     MOV    DL,VERTICAL_BAR        ;Write separator
  279.     CALL    WRITE_CHAR
  280.     MOV    DL,' '            ;Add another space before characters
  281.     CALL    WRITE_CHAR
  282.  
  283.     MOV    CX,16            ;Now write 16 bytes of characters
  284.     POP    BX            ;Get back offset into SECTOR
  285. ASCII_LOOP:
  286.     MOV    DL,SECTOR[BX]        ;Get one byte
  287.     CALL    WRITE_CHAR        ;Display this as a character
  288.     INC    BX            ;Move to the next byte
  289.     LOOP    ASCII_LOOP        ;Display a total of 16 characters
  290.  
  291.     MOV    DL,' '            ;Write a space before the box border
  292.     CALL    WRITE_CHAR
  293.     MOV    DL,VERTICAL_BAR        ;Write the box border
  294.     CALL    WRITE_CHAR
  295.  
  296.     POP    DX
  297.     POP    CX
  298.     POP    BX
  299.     RET
  300. DISP_LINE    ENDP
  301.  
  302.  
  303.     PUBLIC    WRITE_PROMPT_LINE
  304.     EXTRN    CLEAR_TO_END_OF_LINE:PROC, WRITE_STRING:PROC
  305.     EXTRN    GOTO_XY:PROC
  306. .DATA
  307.     EXTRN    PROMPT_LINE_NO:BYTE
  308. .CODE
  309. ;-----------------------------------------------------------------------;
  310. ; This procedure writes the prompt line to the screen and clears the    ;
  311. ; end of the line.                            ;
  312. ;                                    ;
  313. ; On entry:    DS:DX    Address of the prompt-line message        ;
  314. ;                                    ;
  315. ; Uses:        WRITE_STRING, CLEAR_TO_END_OF_LINE, GOTO_XY        ;
  316. ; Reads:    PROMPT_LINE_NO                        ;
  317. ;-----------------------------------------------------------------------;
  318. WRITE_PROMPT_LINE    PROC
  319.     PUSH    DX
  320.     XOR    DL,DL            ;Write the prompt line and
  321.     MOV    DH,PROMPT_LINE_NO    ; move the cursor there
  322.     CALL    GOTO_XY
  323.     POP    DX
  324.     CALL    WRITE_STRING
  325.     CALL    CLEAR_TO_END_OF_LINE
  326.     RET
  327. WRITE_PROMPT_LINE    ENDP
  328.  
  329.  
  330.     PUBLIC    WRITE_EDITOR_PROMPT
  331. .DATA
  332.     EXTRN    EDITOR_PROMPT:BYTE
  333. .CODE
  334. ;-----------------------------------------------------------------------;
  335. ; This procedure writes the editor prompt line.  We've defined it as    ;
  336. ; a procedure since we need to switch to the Edit prompt in so many    ;
  337. ; places.                                ;
  338. ;                                    ;
  339. ; Uses:        WRITE_PROMPT_LINE                    ;
  340. ; Reads:    EDITOR_PROMPT                        ;
  341. ;-----------------------------------------------------------------------;
  342. WRITE_EDITOR_PROMPT    PROC
  343.     PUSH    DX
  344.     LEA    DX,EDITOR_PROMPT
  345.     CALL    WRITE_PROMPT_LINE
  346.     POP    DX
  347.     RET
  348. WRITE_EDITOR_PROMPT    ENDP
  349.  
  350.  
  351.     PUBLIC    WRITE_FUNCTION_KEYS
  352. .DATA
  353.     EXTRN    FUNCTION_KEY_LINE_NO:BYTE
  354.     EXTRN    FUNCTION_KEY_LINE:BYTE
  355. .CODE
  356.     EXTRN    GOTO_XY:PROC, CURSOR_RIGHT:PROC
  357.     EXTRN    WRITE_ATTRIBUTE_N_TIMES:PROC
  358. ;-----------------------------------------------------------------------;
  359. ; This procedure writes the function-key line in inverse video, with    ;
  360. ; the key numbers in normal video.                    ;
  361. ;                                    ;
  362. ; Uses:        GOTO_XY, WRITE_STRING, WRITE_ATTRIBUTE_N_TIMES        ;
  363. ;        CURSOR_RIGHT                        ;
  364. ; Reads:    FUNCTION_KEY_LINE                    ;
  365. ;-----------------------------------------------------------------------;
  366. WRITE_FUNCTION_KEYS    PROC
  367.     PUSH    AX
  368.     PUSH    BX
  369.     PUSH    CX
  370.     PUSH    DX
  371.     XOR    DL,DL            ;Start a left of screen
  372.     MOV    DH,FUNCTION_KEY_LINE_NO    ;And the bottom
  373.     CALL    GOTO_XY
  374.     PUSH    DX            ;Save start of line
  375.     LEA    DX,FUNCTION_KEY_LINE
  376.     CALL    WRITE_STRING
  377.     POP    DX            ;Restore start of line
  378.     CALL    GOTO_XY            ;Return to the start of this line
  379.     MOV    AX,9            ;Use as a counter
  380.     MOV    DL,70H            ;Attribute for inverse video
  381.     MOV    CX,6            ;Write 6 characters in inverse
  382. FUNCTION_KEY_LOOP:
  383.     CALL    CURSOR_RIGHT        ;Skip over the number
  384.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Write inverse video for 6 characters
  385.     CALL    CURSOR_RIGHT        ;Skip gap
  386.     DEC    AX            ;Done yet?
  387.     JNZ    FUNCTION_KEY_LOOP    ;No, invert another word
  388.     CALL    CURSOR_RIGHT        ;Skip the last gap
  389.     CALL    WRITE_ATTRIBUTE_N_TIMES    ;Invert the 10th word
  390.     POP    DX
  391.     POP    CX
  392.     POP    BX
  393.     POP    AX
  394.     RET
  395. WRITE_FUNCTION_KEYS    ENDP
  396.  
  397.     
  398.     END
  399.