home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Assembly / DISP_S17.ASM < prev    next >
Assembly Source File  |  1986-09-24  |  5KB  |  221 lines

  1. CGROUP    GROUP    CODE_SEG, DATA_SEG    ;Group two segments together
  2.     ASSUME    CS:CGROUP, DS:CGROUP
  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. CODE_SEG    SEGMENT PUBLIC
  19.  
  20.     PUBLIC    INIT_SEC_DISP
  21.     EXTRN    WRITE_PATTERN:NEAR, SEND_CRLF:NEAR
  22.     EXTRN    GOTO_XY:NEAR
  23. ;-----------------------------------------------------------------------;
  24. ; This procedure initializes the half_sector display.            ;
  25. ;                                    ;
  26. ; Uses:        WRITE_PATTERN, SEND_CRLF, DISP_HALF_SECTOR        ;
  27. ;        WRITE_TOP_HEX_NUMBERS, GOTO_XY                ;
  28. ; Reads:    TOP_LINE_PATTERN, BOTTOM_LINE_PATTERN            ;
  29. ;-----------------------------------------------------------------------;
  30. INIT_SEC_DISP    PROC    NEAR
  31.     PUSH    DX
  32.     XOR    DL,DL            ;Move cursor into position at beginning
  33.     MOV    DH,2            ;of 3rd line
  34.     CALL    GOTO_XY
  35.     CALL    WRITE_TOP_HEX_NUMBERS
  36.     LEA    DX,TOP_LINE_PATTERN
  37.     CALL    WRITE_PATTERN
  38.     CALL    SEND_CRLF
  39.     XOR    DX,DX            ;Start at the beginning of the sector
  40.     CALL    DISP_HALF_SECTOR
  41.     LEA    DX,BOTTOM_LINE_PATTERN
  42.     CALL    WRITE_PATTERN
  43.     POP    DX
  44.     RET
  45. INIT_SEC_DISP    ENDP
  46.  
  47.     EXTRN    WRITE_CHAR_N_TIMES:NEAR, WRITE_HEX:NEAR, WRITE_CHAR:NEAR
  48.     EXTRN    WRITE_HEX_DIGIT:NEAR, SEND_CRLF:NEAR
  49. ;-----------------------------------------------------------------------;
  50. ; This procedure writes the index numbers (0 through F) at the top of    ;
  51. ; the half-sector display.                        ;
  52. ;                                    ;
  53. ; Uses:        WRITE_CHAR_N_TIMES, WRITE_HEX, WRITE_CHAR        ;
  54. ;        WRITE_HEX_DIGIT, SEND_CRLF                ;
  55. ;-----------------------------------------------------------------------;
  56. WRITE_TOP_HEX_NUMBERS    PROC    NEAR
  57.     PUSH    CX
  58.     PUSH    DX
  59.     MOV    DL,' '            ;Write 9 spaces for left side
  60.     MOV    CX,9
  61.     CALL    WRITE_CHAR_N_TIMES
  62.     XOR    DH,DH            ;Start with 0
  63. HEX_NUMBER_LOOP:
  64.     MOV    DL,DH
  65.     CALL    WRITE_HEX
  66.     MOV    DL,' '
  67.     CALL    WRITE_CHAR
  68.     INC    DH
  69.     CMP    DH,10h            ;Done yet?
  70.     JB    HEX_NUMBER_LOOP
  71.  
  72.     MOV    DL,' '            ;Write hex numbers over ASCII window
  73.     MOV    CX,2
  74.     CALL    WRITE_CHAR_N_TIMES
  75.     XOR    DL,DL
  76. HEX_DIGIT_LOOP:
  77.     CALL    WRITE_HEX_DIGIT
  78.     INC    DL
  79.     CMP    DL,10h
  80.     JB    HEX_DIGIT_LOOP
  81.     CALL    SEND_CRLF
  82.     POP    DX
  83.     POP    CX
  84.     RET
  85. WRITE_TOP_HEX_NUMBERS    ENDP
  86.  
  87.  
  88.     PUBLIC    DISP_HALF_SECTOR
  89.     EXTRN    SEND_CRLF:NEAR
  90. ;-----------------------------------------------------------------------;
  91. ; This procedure displays half a sector (256 bytes)            ;
  92. ;                                    ;
  93. ;    DS:DX    Offset into sector, in bytes -- should be multiple of 16;
  94. ;                                    ;
  95. ; Uses:        DISP_LINE, SEND_CRLF                    ;
  96. ;-----------------------------------------------------------------------;
  97. DISP_HALF_SECTOR    PROC    NEAR
  98.     PUSH    CX
  99.     PUSH    DX
  100.     MOV    CX,16            ;Display 16 lines
  101. HALF_SECTOR:
  102.     CALL    DISP_LINE
  103.     CALL    SEND_CRLF
  104.     ADD    DX,16
  105.     LOOP    HALF_SECTOR
  106.     POP    DX
  107.     POP    CX
  108.     RET
  109. DISP_HALF_SECTOR    ENDP
  110.  
  111.     PUBLIC    DISP_LINE
  112.     EXTRN    WRITE_HEX:NEAR
  113.     EXTRN    WRITE_CHAR:NEAR
  114.     EXTRN    WRITE_CHAR_N_TIMES:NEAR
  115. ;-----------------------------------------------------------------------;
  116. ; This procedure displays one line of data, or 16 bytes, first in hex,    ;
  117. ; then in ASCII.                            ;
  118. ;                                    ;
  119. ;    DS:DX    Offset into sector, in bytes.                ;
  120. ;                                    ;
  121. ; Uses:        WRITE_CHAR, WRITE_HEX, WRITE_CHAR_N_TIMES        ;
  122. ; Reads:    SECTOR                            ;
  123. ;-----------------------------------------------------------------------;
  124. DISP_LINE    PROC    NEAR
  125.     PUSH    BX
  126.     PUSH    CX
  127.     PUSH    DX
  128.     MOV    BX,DX            ;Offset is more useful in BX
  129.  
  130.     MOV    DL,' '
  131.     MOV    CX,3            ;Write 3 spaces before line
  132.     CALL    WRITE_CHAR_N_TIMES
  133.                     ;Write offset in hex
  134.     CMP    BX,100h            ;Is the first digit a 1?
  135.     JB    WRITE_ONE        ;No, write space already in DL
  136.     MOV    DL,'1'            ;Yes, then place '1' into DL for output
  137. WRITE_ONE:
  138.     CALL    WRITE_CHAR
  139.     MOV    DL,BL            ;Copy lower byte into DL for hex output
  140.     CALL    WRITE_HEX
  141.                     ;Write separator
  142.     MOV    DL,' '
  143.     CALL    WRITE_CHAR
  144.     MOV    DL,VERTICAL_BAR        ;Draw left side of box
  145.     CALL    WRITE_CHAR
  146.     MOV    DL,' '
  147.     CALL    WRITE_CHAR
  148.                     ;Now write out 16 bytes
  149.     MOV    CX,16            ;Dump 16 bytes
  150.     PUSH    BX            ;Save the offset for ASCII_LOOP
  151. HEX_LOOP:
  152.     MOV    DL,SECTOR[BX]        ;Get 1 byte
  153.     CALL    WRITE_HEX        ;Dump this byte in hex
  154.     MOV    DL,' '            ;Write a space between numbers
  155.     CALL    WRITE_CHAR
  156.     INC    BX
  157.     LOOP    HEX_LOOP
  158.  
  159.     MOV    DL,VERTICAL_BAR        ;Write separator
  160.     CALL    WRITE_CHAR
  161.     MOV    DL,' '            ;Add another space before characters
  162.     CALL    WRITE_CHAR
  163.  
  164.     MOV    CX,16
  165.     POP    BX            ;Get back offset into SECTOR
  166. ASCII_LOOP:
  167.     MOV    DL,SECTOR[BX]
  168.     CALL    WRITE_CHAR
  169.     INC    BX
  170.     LOOP    ASCII_LOOP
  171.  
  172.     MOV    DL,' '            ;Draw right side of box
  173.     CALL    WRITE_CHAR
  174.     MOV    DL,VERTICAL_BAR
  175.     CALL    WRITE_CHAR
  176.  
  177.     POP    DX
  178.     POP    CX
  179.     POP    BX
  180.     RET
  181. DISP_LINE    ENDP
  182.  
  183. CODE_SEG    ENDS
  184.  
  185.  
  186. DATA_SEG    SEGMENT PUBLIC
  187.     EXTRN    SECTOR:BYTE
  188.  
  189. TOP_LINE_PATTERN    LABEL    BYTE
  190.     DB    ' ',7
  191.     DB    UPPER_LEFT,1
  192.     DB    HORIZONTAL_BAR,12
  193.     DB    TOP_TICK,1
  194.     DB    HORIZONTAL_BAR,11
  195.     DB    TOP_TICK,1
  196.     DB    HORIZONTAL_BAR,11
  197.     DB    TOP_TICK,1
  198.     DB    HORIZONTAL_BAR,12
  199.     DB    TOP_T_BAR,1
  200.     DB    HORIZONTAL_BAR,18
  201.     DB    UPPER_RIGHT,1
  202.     DB    0
  203. BOTTOM_LINE_PATTERN    LABEL    BYTE
  204.     DB    ' ',7
  205.     DB    LOWER_LEFT,1
  206.     DB    HORIZONTAL_BAR,12
  207.     DB    BOTTOM_TICK,1
  208.     DB    HORIZONTAL_BAR,11
  209.     DB    BOTTOM_TICK,1
  210.     DB    HORIZONTAL_BAR,11
  211.     DB    BOTTOM_TICK,1
  212.     DB    HORIZONTAL_BAR,12
  213.     DB    BOTTOM_T_BAR,1
  214.     DB    HORIZONTAL_BAR,18
  215.     DB    LOWER_RIGHT,1
  216.     DB    0
  217. DATA_SEG    ENDS
  218.  
  219.  
  220.     END
  221.