home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / nor_asm / disp_s16.asm < prev    next >
Assembly Source File  |  1989-05-16  |  5KB  |  218 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.     PUBLIC    SECTOR
  53. SECTOR    DB    8192 DUP (?)
  54.  
  55. .CODE
  56.  
  57.     PUBLIC    INIT_SEC_DISP
  58.     EXTRN    WRITE_PATTERN:PROC, SEND_CRLF: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                    ;
  64. ; Reads:    TOP_LINE_PATTERN, BOTTOM_LINE_PATTERN            ;
  65. ;-----------------------------------------------------------------------;
  66. INIT_SEC_DISP    PROC
  67.     PUSH    DX
  68.     CALL    WRITE_TOP_HEX_NUMBERS
  69.     LEA    DX,TOP_LINE_PATTERN
  70.     CALL    WRITE_PATTERN
  71.     CALL    SEND_CRLF
  72.     XOR    DX,DX            ;Start at the beginning of the sector
  73.     CALL    DISP_HALF_SECTOR
  74.     LEA    DX,BOTTOM_LINE_PATTERN
  75.     CALL    WRITE_PATTERN
  76.     POP    DX
  77.     RET
  78. INIT_SEC_DISP    ENDP
  79.  
  80.     EXTRN    WRITE_CHAR_N_TIMES:PROC, WRITE_HEX:PROC, WRITE_CHAR:PROC
  81.     EXTRN    WRITE_HEX_DIGIT:PROC, SEND_CRLF:PROC
  82. ;-----------------------------------------------------------------------;
  83. ; This procedure writes the index numbers (0 through F) at the top of    ;
  84. ; the half-sector display.                        ;
  85. ;                                    ;
  86. ; Uses:        WRITE_CHAR_N_TIMES, WRITE_HEX, WRITE_CHAR        ;
  87. ;        WRITE_HEX_DIGIT, SEND_CRLF                ;
  88. ;-----------------------------------------------------------------------;
  89. WRITE_TOP_HEX_NUMBERS    PROC
  90.     PUSH    CX
  91.     PUSH    DX
  92.     MOV    DL,' '            ;Write 9 spaces for left side
  93.     MOV    CX,9
  94.     CALL    WRITE_CHAR_N_TIMES
  95.     XOR    DH,DH            ;Start with 0
  96. HEX_NUMBER_LOOP:
  97.     MOV    DL,DH
  98.     CALL    WRITE_HEX
  99.     MOV    DL,' '
  100.     CALL    WRITE_CHAR
  101.     INC    DH
  102.     CMP    DH,10h            ;Done yet?
  103.     JB    HEX_NUMBER_LOOP
  104.  
  105.     MOV    DL,' '            ;Write hex numbers over ASCII window
  106.     MOV    CX,2
  107.     CALL    WRITE_CHAR_N_TIMES
  108.     XOR    DL,DL
  109. HEX_DIGIT_LOOP:
  110.     CALL    WRITE_HEX_DIGIT
  111.     INC    DL
  112.     CMP    DL,10h
  113.     JB    HEX_DIGIT_LOOP
  114.     CALL    SEND_CRLF
  115.     POP    DX
  116.     POP    CX
  117.     RET
  118. WRITE_TOP_HEX_NUMBERS    ENDP
  119.  
  120.     PUBLIC    DISP_HALF_SECTOR
  121.     EXTRN    SEND_CRLF:PROC
  122. ;-----------------------------------------------------------------------;
  123. ; This procedure displays half a sector (256 bytes)            ;
  124. ;                                    ;
  125. ; On entry:    DS:DX    Offset into sector, in bytes -- should be    ;
  126. ;            multiple of 16.                    ;
  127. ;                                    ;
  128. ; Uses:        DISP_LINE, SEND_CRLF                    ;
  129. ;-----------------------------------------------------------------------;
  130. DISP_HALF_SECTOR    PROC
  131.     PUSH    CX
  132.     PUSH    DX
  133.     MOV    CX,16            ;Display 16 lines
  134. HALF_SECTOR:
  135.     CALL    DISP_LINE
  136.     CALL    SEND_CRLF
  137.     ADD    DX,16
  138.     LOOP    HALF_SECTOR
  139.     POP    DX
  140.     POP    CX
  141.     RET
  142. DISP_HALF_SECTOR    ENDP
  143.  
  144.  
  145.     PUBLIC    DISP_LINE
  146.     EXTRN    WRITE_HEX:PROC
  147.     EXTRN    WRITE_CHAR:PROC
  148.     EXTRN    WRITE_CHAR_N_TIMES:PROC
  149. ;-----------------------------------------------------------------------;
  150. ; This procedure displays one line of data, or 16 bytes, first in hex,    ;
  151. ; then in ASCII.                            ;
  152. ;                                    ;
  153. ; On entry:    DS:DX    Offset into sector, in bytes.            ;
  154. ;                                    ;
  155. ; Uses:        WRITE_CHAR, WRITE_HEX, WRITE_CHAR_N_TIMES        ;
  156. ; Reads:    SECTOR                            ;
  157. ;-----------------------------------------------------------------------;
  158. DISP_LINE    PROC
  159.     PUSH    BX
  160.     PUSH    CX
  161.     PUSH    DX
  162.     MOV    BX,DX            ;Offset is more useful in BX
  163.     MOV    DL,' '
  164.     MOV    CX,3            ;Write 3 spaces before line
  165.     CALL    WRITE_CHAR_N_TIMES
  166.                     ;Write offset in hex
  167.     CMP    BX,100h            ;Is the first digit a 1?
  168.     JB    WRITE_ONE        ;No, write space already in DL
  169.     MOV    DL,'1'            ;Yes, then place '1' into DL for output
  170. WRITE_ONE:
  171.     CALL    WRITE_CHAR
  172.     MOV    DL,BL            ;Copy lower byte into DL for hex output
  173.     CALL    WRITE_HEX
  174.                     ;Write separator
  175.     MOV    DL,' '
  176.     CALL    WRITE_CHAR
  177.     MOV    DL,VERTICAL_BAR        ;Draw left side of box
  178.     CALL    WRITE_CHAR
  179.     MOV    DL,' '
  180.     CALL    WRITE_CHAR
  181.                     ;Now write out 16 bytes
  182.     MOV    CX,16            ;Dump 16 bytes
  183.     PUSH    BX            ;Save the offset for ASCII_LOOP
  184. HEX_LOOP:
  185.     MOV    DL,SECTOR[BX]        ;Get 1 byte
  186.     CALL    WRITE_HEX        ;Dump this byte in hex
  187.     MOV    DL,' '            ;Write a space between numbers
  188.     CALL    WRITE_CHAR
  189.     INC    BX
  190.     LOOP    HEX_LOOP
  191.  
  192.     MOV    DL,VERTICAL_BAR        ;Write separator
  193.     CALL    WRITE_CHAR
  194.     MOV    DL,' '            ;Add another space before characters
  195.     CALL    WRITE_CHAR
  196.  
  197.     MOV    CX,16
  198.     POP    BX            ;Get back offset into SECTOR
  199. ASCII_LOOP:
  200.     MOV    DL,SECTOR[BX]
  201.     CALL    WRITE_CHAR
  202.     INC    BX
  203.     LOOP    ASCII_LOOP
  204.  
  205.     MOV    DL,' '            ;Draw right side of box
  206.     CALL    WRITE_CHAR
  207.     MOV    DL,VERTICAL_BAR
  208.     CALL    WRITE_CHAR
  209.  
  210.     POP    DX
  211.     POP    CX
  212.     POP    BX
  213.     RET
  214. DISP_LINE    ENDP
  215.  
  216.  
  217.     END
  218.