home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Assembly / DISP_SEC.ASM < prev    next >
Assembly Source File  |  1986-10-07  |  7KB  |  248 lines

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