home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / nor_asm / disp_s19.asm < prev    next >
Assembly Source File  |  1989-05-17  |  7KB  |  287 lines

  1. .MODEL    SMALL
  2.  
  3.  
  4. ;-----------------------------------------------------------------------;
  5. ; Graphics characters for border of sector.                ;
  6. ;-----------------------------------------------------------------------;
  7. VERTICAL_BAR    EQU    0BAh
  8. HORIZONTAL_BAR    EQU    0CDh
  9. UPPER_LEFT    EQU    0C9h
  10. UPPER_RIGHT    EQU    0BBh
  11. LOWER_LEFT    EQU    0C8h
  12. LOWER_RIGHT    EQU    0BCh
  13. TOP_T_BAR    EQU    0CBh
  14. BOTTOM_T_BAR    EQU    0CAh
  15. TOP_TICK    EQU    0D1h
  16. BOTTOM_TICK    EQU    0CFh
  17.  
  18.  
  19. .DATA
  20.  
  21. TOP_LINE_PATTERN    LABEL    BYTE
  22.     DB    ' ',7
  23.     DB    UPPER_LEFT, 1
  24.     DB    HORIZONTAL_BAR,12
  25.     DB    TOP_TICK,1
  26.     DB    HORIZONTAL_BAR,11
  27.     DB    TOP_TICK,1
  28.     DB    HORIZONTAL_BAR,11
  29.     DB    TOP_TICK,1
  30.     DB    HORIZONTAL_BAR,12
  31.     DB    TOP_T_BAR,1
  32.     DB    HORIZONTAL_BAR,18
  33.     DB    UPPER_RIGHT,1
  34.     DB    0
  35. BOTTOM_LINE_PATTERN    LABEL    BYTE
  36.     DB    ' ',7
  37.     DB    LOWER_LEFT, 1
  38.     DB    HORIZONTAL_BAR,12
  39.     DB    BOTTOM_TICK,1
  40.     DB    HORIZONTAL_BAR,11
  41.     DB    BOTTOM_TICK,1
  42.     DB    HORIZONTAL_BAR,11
  43.     DB    BOTTOM_TICK,1
  44.     DB    HORIZONTAL_BAR,12
  45.     DB    BOTTOM_T_BAR,1
  46.     DB    HORIZONTAL_BAR,18
  47.     DB    LOWER_RIGHT,1
  48.     DB    0
  49.  
  50. .DATA?
  51.  
  52.     EXTRN    SECTOR:BYTE
  53.  
  54. .CODE
  55.  
  56.     PUBLIC    INIT_SEC_DISP
  57.     EXTRN    WRITE_PATTERN:PROC, SEND_CRLF:PROC
  58.     EXTRN    GOTO_XY:PROC
  59. ;-----------------------------------------------------------------------;
  60. ; This procedure initializes the half-sector display.            ;
  61. ;                                    ;
  62. ; Uses:        WRITE_PATTERN, SEND_CRLF, DISP_HALF_SECTOR        ;
  63. ;        WRITE_TOP_HEX_NUMBERS, GOTO_XY                ;
  64. ; Reads:    TOP_LINE_PATTERN, BOTTOM_LINE_PATTERN            ;
  65. ;-----------------------------------------------------------------------;
  66. INIT_SEC_DISP    PROC
  67.     PUSH    DX
  68.     XOR    DL,DL            ;Move cursor into position at beginning
  69.     MOV    DH,2            ;of 3rd line
  70.     CALL    GOTO_XY
  71.     CALL    WRITE_TOP_HEX_NUMBERS
  72.     LEA    DX,TOP_LINE_PATTERN
  73.     CALL    WRITE_PATTERN
  74.     CALL    SEND_CRLF
  75.     XOR    DX,DX            ;Start at the beginning of the sector
  76.     CALL    DISP_HALF_SECTOR
  77.     LEA    DX,BOTTOM_LINE_PATTERN
  78.     CALL    WRITE_PATTERN
  79.     POP    DX
  80.     RET
  81. INIT_SEC_DISP    ENDP
  82.  
  83.  
  84.     PUBLIC    WRITE_HEADER
  85. .DATA
  86.     EXTRN    HEADER_LINE_NO:BYTE
  87.     EXTRN    HEADER_PART_1:BYTE
  88.     EXTRN    HEADER_PART_2:BYTE
  89.     EXTRN    DISK_DRIVE_NO:BYTE
  90.     EXTRN    CURRENT_SECTOR_NO:WORD
  91. .CODE
  92.     EXTRN    WRITE_STRING:PROC, WRITE_DECIMAL:PROC
  93.     EXTRN    GOTO_XY:PROC, CLEAR_TO_END_OF_LINE:PROC
  94. ;-----------------------------------------------------------------------;
  95. ; This procedure writes the header with disk-drive and sector number.    ;
  96. ;                                    ;
  97. ; Uses:        GOTO_XY, WRITE_STRING, WRITE_CHAR, WRITE_DECIMAL    ;
  98. ;        CLEAR_TO_END_OF_LINE                    ;
  99. ; Reads:    HEADER_LINE_NO, HEADER_PART_1, HEADER_PART_2        ;
  100. ;        DISK_DRIVE_NO, CURRENT_SECTOR_NO            ;
  101. ;-----------------------------------------------------------------------;
  102. WRITE_HEADER    PROC
  103.     PUSH    DX
  104.     XOR    DL,DL            ;Move cursor to header line number
  105.     MOV    DH,HEADER_LINE_NO
  106.     CALL    GOTO_XY
  107.     LEA    DX,HEADER_PART_1
  108.     CALL    WRITE_STRING
  109.     MOV    DL,DISK_DRIVE_NO
  110.     ADD    DL,'A'            ;Print drives A, B, ...
  111.     CALL    WRITE_CHAR
  112.     LEA    DX,HEADER_PART_2
  113.     CALL    WRITE_STRING
  114.     MOV    DX,CURRENT_SECTOR_NO
  115.     CALL    WRITE_DECIMAL
  116.     CALL    CLEAR_TO_END_OF_LINE    ;Clear rest of sector number
  117.     POP    DX
  118.     RET
  119. WRITE_HEADER    ENDP
  120.  
  121.  
  122.     EXTRN    WRITE_CHAR_N_TIMES:PROC, WRITE_HEX:PROC, WRITE_CHAR:PROC
  123.     EXTRN    WRITE_HEX_DIGIT:PROC, SEND_CRLF:PROC
  124. ;-----------------------------------------------------------------------;
  125. ; This procedure writes the index numbers (0 through F) at the top of    ;
  126. ; the half-sector display.                        ;
  127. ;                                    ;
  128. ; Uses:        WRITE_CHAR_N_TIMES, WRITE_HEX, WRITE_CHAR        ;
  129. ;        WRITE_HEX_DIGIT, SEND_CRLF                ;
  130. ;-----------------------------------------------------------------------;
  131. WRITE_TOP_HEX_NUMBERS    PROC
  132.     PUSH    CX
  133.     PUSH    DX
  134.     MOV    DL,' '            ;Write 9 spaces for left side
  135.     MOV    CX,9
  136.     CALL    WRITE_CHAR_N_TIMES
  137.     XOR    DH,DH            ;Start with 0
  138. HEX_NUMBER_LOOP:
  139.     MOV    DL,DH
  140.     CALL    WRITE_HEX
  141.     MOV    DL,' '
  142.     CALL    WRITE_CHAR
  143.     INC    DH
  144.     CMP    DH,10h            ;Done yet?
  145.     JB    HEX_NUMBER_LOOP
  146.  
  147.     MOV    DL,' '            ;Write hex numbers over ASCII window
  148.     MOV    CX,2
  149.     CALL    WRITE_CHAR_N_TIMES
  150.     XOR    DL,DL
  151. HEX_DIGIT_LOOP:
  152.     CALL    WRITE_HEX_DIGIT
  153.     INC    DL
  154.     CMP    DL,10h
  155.     JB    HEX_DIGIT_LOOP
  156.     CALL    SEND_CRLF
  157.     POP    DX
  158.     POP    CX
  159.     RET
  160. WRITE_TOP_HEX_NUMBERS    ENDP
  161.  
  162.     PUBLIC    DISP_HALF_SECTOR
  163.     EXTRN    SEND_CRLF:PROC
  164. ;-----------------------------------------------------------------------;
  165. ; This procedure displays half a sector (256 bytes)            ;
  166. ;                                    ;
  167. ; On entry:    DS:DX    Offset into sector, in bytes -- should be    ;
  168. ;            multiple of 16.                    ;
  169. ;                                    ;
  170. ; Uses:        DISP_LINE, SEND_CRLF                    ;
  171. ;-----------------------------------------------------------------------;
  172. DISP_HALF_SECTOR    PROC
  173.     PUSH    CX
  174.     PUSH    DX
  175.     MOV    CX,16            ;Display 16 lines
  176. HALF_SECTOR:
  177.     CALL    DISP_LINE
  178.     CALL    SEND_CRLF
  179.     ADD    DX,16
  180.     LOOP    HALF_SECTOR
  181.     POP    DX
  182.     POP    CX
  183.     RET
  184. DISP_HALF_SECTOR    ENDP
  185.  
  186.  
  187.     PUBLIC    DISP_LINE
  188.     EXTRN    WRITE_HEX:PROC
  189.     EXTRN    WRITE_CHAR:PROC
  190.     EXTRN    WRITE_CHAR_N_TIMES:PROC
  191. ;-----------------------------------------------------------------------;
  192. ; This procedure displays one line of data, or 16 bytes, first in hex,    ;
  193. ; then in ASCII.                            ;
  194. ;                                    ;
  195. ; On entry:    DS:DX    Offset into sector, in bytes.            ;
  196. ;                                    ;
  197. ; Uses:        WRITE_CHAR, WRITE_HEX, WRITE_CHAR_N_TIMES        ;
  198. ; Reads:    SECTOR                            ;
  199. ;-----------------------------------------------------------------------;
  200. DISP_LINE    PROC
  201.     PUSH    BX
  202.     PUSH    CX
  203.     PUSH    DX
  204.     MOV    BX,DX            ;Offset is more useful in BX
  205.     MOV    DL,' '
  206.     MOV    CX,3            ;Write 3 spaces before line
  207.     CALL    WRITE_CHAR_N_TIMES
  208.                     ;Write offset in hex
  209.     CMP    BX,100h            ;Is the first digit a 1?
  210.     JB    WRITE_ONE        ;No, write space already in DL
  211.     MOV    DL,'1'            ;Yes, then place '1' into DL for output
  212. WRITE_ONE:
  213.     CALL    WRITE_CHAR
  214.     MOV    DL,BL            ;Copy lower byte into DL for hex output
  215.     CALL    WRITE_HEX
  216.                     ;Write separator
  217.     MOV    DL,' '
  218.     CALL    WRITE_CHAR
  219.     MOV    DL,VERTICAL_BAR        ;Draw left side of box
  220.     CALL    WRITE_CHAR
  221.     MOV    DL,' '
  222.     CALL    WRITE_CHAR
  223.                     ;Now write out 16 bytes
  224.     MOV    CX,16            ;Dump 16 bytes
  225.     PUSH    BX            ;Save the offset for ASCII_LOOP
  226. HEX_LOOP:
  227.     MOV    DL,SECTOR[BX]        ;Get 1 byte
  228.     CALL    WRITE_HEX        ;Dump this byte in hex
  229.     MOV    DL,' '            ;Write a space between numbers
  230.     CALL    WRITE_CHAR
  231.     INC    BX
  232.     LOOP    HEX_LOOP
  233.  
  234.     MOV    DL,VERTICAL_BAR        ;Write separator
  235.     CALL    WRITE_CHAR
  236.     MOV    DL,' '            ;Add another space before characters
  237.     CALL    WRITE_CHAR
  238.  
  239.     MOV    CX,16
  240.     POP    BX            ;Get back offset into SECTOR
  241. ASCII_LOOP:
  242.     MOV    DL,SECTOR[BX]
  243.     CALL    WRITE_CHAR
  244.     INC    BX
  245.     LOOP    ASCII_LOOP
  246.  
  247.     MOV    DL,' '            ;Draw right side of box
  248.     CALL    WRITE_CHAR
  249.     MOV    DL,VERTICAL_BAR
  250.     CALL    WRITE_CHAR
  251.  
  252.     POP    DX
  253.     POP    CX
  254.     POP    BX
  255.     RET
  256. DISP_LINE    ENDP
  257.  
  258.  
  259.     PUBLIC    WRITE_PROMPT_LINE
  260.     EXTRN    CLEAR_TO_END_OF_LINE:PROC, WRITE_STRING:PROC
  261.     EXTRN    GOTO_XY:PROC
  262. .DATA
  263.     EXTRN    PROMPT_LINE_NO:BYTE
  264. .CODE
  265. ;-----------------------------------------------------------------------;
  266. ; This procedure writes the prompt line to the screen and clears the    ;
  267. ; end of the line.                            ;
  268. ;                                    ;
  269. ; On entry:    DS:DX    Address of the prompt-line message        ;
  270. ;                                    ;
  271. ; Uses:        WRITE_STRING, CLEAR_TO_END_OF_LINE, GOTO_XY        ;
  272. ; Reads:    PROMPT_LINE_NO                        ;
  273. ;-----------------------------------------------------------------------;
  274. WRITE_PROMPT_LINE    PROC
  275.     PUSH    DX
  276.     XOR    DL,DL            ;Write the prompt line and
  277.     MOV    DH,PROMPT_LINE_NO    ; move the cursor there
  278.     CALL    GOTO_XY
  279.     POP    DX
  280.     CALL    WRITE_STRING
  281.     CALL    CLEAR_TO_END_OF_LINE
  282.     RET
  283. WRITE_PROMPT_LINE    ENDP
  284.  
  285.  
  286.     END
  287.