home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / nor_asm / disp_s21.asm < prev    next >
Assembly Source File  |  1989-05-17  |  7KB  |  295 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, WRITE_PHANTOM:PROC
  59. .DATA
  60.     EXTRN    LINES_BEFORE_SECTOR:BYTE
  61.     EXTRN    SECTOR_OFFSET:WORD
  62. .CODE
  63. ;-----------------------------------------------------------------------;
  64. ; This procedure initializes the half-sector display.            ;
  65. ;                                    ;
  66. ; Uses:        WRITE_PATTERN, SEND_CRLF, DISP_HALF_SECTOR        ;
  67. ;        WRITE_TOP_HEX_NUMBERS, GOTO_XY, WRITE_PHANTOM        ;
  68. ; Reads:    TOP_LINE_PATTERN, BOTTOM_LINE_PATTERN            ;
  69. ;        LINES_BEFORE_SECTOR                    ;
  70. ; Writes:    SECTOR_OFFSET                        ;
  71. ;-----------------------------------------------------------------------;
  72. INIT_SEC_DISP    PROC
  73.     PUSH    DX
  74.     XOR    DL,DL            ;Move cursor into position
  75.     MOV    DH,LINES_BEFORE_SECTOR
  76.     CALL    GOTO_XY
  77.     CALL    WRITE_TOP_HEX_NUMBERS
  78.     LEA    DX,TOP_LINE_PATTERN
  79.     CALL    WRITE_PATTERN
  80.     CALL    SEND_CRLF
  81.     XOR    DX,DX            ;Start at the beginning of the sector
  82.     MOV    SECTOR_OFFSET,DX    ;Set sector offset to 0
  83.     CALL    DISP_HALF_SECTOR
  84.     LEA    DX,BOTTOM_LINE_PATTERN
  85.     CALL    WRITE_PATTERN
  86.     CALL    WRITE_PHANTOM        ;Display the phantom cursor
  87.     POP    DX
  88.     RET
  89. INIT_SEC_DISP    ENDP
  90.  
  91.  
  92.     PUBLIC    WRITE_HEADER
  93. .DATA
  94.     EXTRN    HEADER_LINE_NO:BYTE
  95.     EXTRN    HEADER_PART_1:BYTE
  96.     EXTRN    HEADER_PART_2:BYTE
  97.     EXTRN    DISK_DRIVE_NO:BYTE
  98.     EXTRN    CURRENT_SECTOR_NO:WORD
  99. .CODE
  100.     EXTRN    WRITE_STRING:PROC, WRITE_DECIMAL:PROC
  101.     EXTRN    GOTO_XY:PROC, CLEAR_TO_END_OF_LINE:PROC
  102. ;-----------------------------------------------------------------------;
  103. ; This procedure writes the header with disk-drive and sector number.    ;
  104. ;                                    ;
  105. ; Uses:        GOTO_XY, WRITE_STRING, WRITE_CHAR, WRITE_DECIMAL    ;
  106. ;        CLEAR_TO_END_OF_LINE                    ;
  107. ; Reads:    HEADER_LINE_NO, HEADER_PART_1, HEADER_PART_2        ;
  108. ;        DISK_DRIVE_NO, CURRENT_SECTOR_NO            ;
  109. ;-----------------------------------------------------------------------;
  110. WRITE_HEADER    PROC
  111.     PUSH    DX
  112.     XOR    DL,DL            ;Move cursor to header line number
  113.     MOV    DH,HEADER_LINE_NO
  114.     CALL    GOTO_XY
  115.     LEA    DX,HEADER_PART_1
  116.     CALL    WRITE_STRING
  117.     MOV    DL,DISK_DRIVE_NO
  118.     ADD    DL,'A'            ;Print drives A, B, ...
  119.     CALL    WRITE_CHAR
  120.     LEA    DX,HEADER_PART_2
  121.     CALL    WRITE_STRING
  122.     MOV    DX,CURRENT_SECTOR_NO
  123.     CALL    WRITE_DECIMAL
  124.     CALL    CLEAR_TO_END_OF_LINE    ;Clear rest of sector number
  125.     POP    DX
  126.     RET
  127. WRITE_HEADER    ENDP
  128.  
  129.  
  130.     EXTRN    WRITE_CHAR_N_TIMES:PROC, WRITE_HEX:PROC, WRITE_CHAR:PROC
  131.     EXTRN    WRITE_HEX_DIGIT:PROC, SEND_CRLF:PROC
  132. ;-----------------------------------------------------------------------;
  133. ; This procedure writes the index numbers (0 through F) at the top of    ;
  134. ; the half-sector display.                        ;
  135. ;                                    ;
  136. ; Uses:        WRITE_CHAR_N_TIMES, WRITE_HEX, WRITE_CHAR        ;
  137. ;        WRITE_HEX_DIGIT, SEND_CRLF                ;
  138. ;-----------------------------------------------------------------------;
  139. WRITE_TOP_HEX_NUMBERS    PROC
  140.     PUSH    CX
  141.     PUSH    DX
  142.     MOV    DL,' '            ;Write 9 spaces for left side
  143.     MOV    CX,9
  144.     CALL    WRITE_CHAR_N_TIMES
  145.     XOR    DH,DH            ;Start with 0
  146. HEX_NUMBER_LOOP:
  147.     MOV    DL,DH
  148.     CALL    WRITE_HEX
  149.     MOV    DL,' '
  150.     CALL    WRITE_CHAR
  151.     INC    DH
  152.     CMP    DH,10h            ;Done yet?
  153.     JB    HEX_NUMBER_LOOP
  154.  
  155.     MOV    DL,' '            ;Write hex numbers over ASCII window
  156.     MOV    CX,2
  157.     CALL    WRITE_CHAR_N_TIMES
  158.     XOR    DL,DL
  159. HEX_DIGIT_LOOP:
  160.     CALL    WRITE_HEX_DIGIT
  161.     INC    DL
  162.     CMP    DL,10h
  163.     JB    HEX_DIGIT_LOOP
  164.     CALL    SEND_CRLF
  165.     POP    DX
  166.     POP    CX
  167.     RET
  168. WRITE_TOP_HEX_NUMBERS    ENDP
  169.  
  170.     PUBLIC    DISP_HALF_SECTOR
  171.     EXTRN    SEND_CRLF:PROC
  172. ;-----------------------------------------------------------------------;
  173. ; This procedure displays half a sector (256 bytes)            ;
  174. ;                                    ;
  175. ; On entry:    DS:DX    Offset into sector, in bytes -- should be    ;
  176. ;            multiple of 16.                    ;
  177. ;                                    ;
  178. ; Uses:        DISP_LINE, SEND_CRLF                    ;
  179. ;-----------------------------------------------------------------------;
  180. DISP_HALF_SECTOR    PROC
  181.     PUSH    CX
  182.     PUSH    DX
  183.     MOV    CX,16            ;Display 16 lines
  184. HALF_SECTOR:
  185.     CALL    DISP_LINE
  186.     CALL    SEND_CRLF
  187.     ADD    DX,16
  188.     LOOP    HALF_SECTOR
  189.     POP    DX
  190.     POP    CX
  191.     RET
  192. DISP_HALF_SECTOR    ENDP
  193.  
  194.  
  195.     PUBLIC    DISP_LINE
  196.     EXTRN    WRITE_HEX:PROC
  197.     EXTRN    WRITE_CHAR:PROC
  198.     EXTRN    WRITE_CHAR_N_TIMES:PROC
  199. ;-----------------------------------------------------------------------;
  200. ; This procedure displays one line of data, or 16 bytes, first in hex,    ;
  201. ; then in ASCII.                            ;
  202. ;                                    ;
  203. ; On entry:    DS:DX    Offset into sector, in bytes.            ;
  204. ;                                    ;
  205. ; Uses:        WRITE_CHAR, WRITE_HEX, WRITE_CHAR_N_TIMES        ;
  206. ; Reads:    SECTOR                            ;
  207. ;-----------------------------------------------------------------------;
  208. DISP_LINE    PROC
  209.     PUSH    BX
  210.     PUSH    CX
  211.     PUSH    DX
  212.     MOV    BX,DX            ;Offset is more useful in BX
  213.     MOV    DL,' '
  214.     MOV    CX,3            ;Write 3 spaces before line
  215.     CALL    WRITE_CHAR_N_TIMES
  216.                     ;Write offset in hex
  217.     CMP    BX,100h            ;Is the first digit a 1?
  218.     JB    WRITE_ONE        ;No, write space already in DL
  219.     MOV    DL,'1'            ;Yes, then place '1' into DL for output
  220. WRITE_ONE:
  221.     CALL    WRITE_CHAR
  222.     MOV    DL,BL            ;Copy lower byte into DL for hex output
  223.     CALL    WRITE_HEX
  224.                     ;Write separator
  225.     MOV    DL,' '
  226.     CALL    WRITE_CHAR
  227.     MOV    DL,VERTICAL_BAR        ;Draw left side of box
  228.     CALL    WRITE_CHAR
  229.     MOV    DL,' '
  230.     CALL    WRITE_CHAR
  231.                     ;Now write out 16 bytes
  232.     MOV    CX,16            ;Dump 16 bytes
  233.     PUSH    BX            ;Save the offset for ASCII_LOOP
  234. HEX_LOOP:
  235.     MOV    DL,SECTOR[BX]        ;Get 1 byte
  236.     CALL    WRITE_HEX        ;Dump this byte in hex
  237.     MOV    DL,' '            ;Write a space between numbers
  238.     CALL    WRITE_CHAR
  239.     INC    BX
  240.     LOOP    HEX_LOOP
  241.  
  242.     MOV    DL,VERTICAL_BAR        ;Write separator
  243.     CALL    WRITE_CHAR
  244.     MOV    DL,' '            ;Add another space before characters
  245.     CALL    WRITE_CHAR
  246.  
  247.     MOV    CX,16
  248.     POP    BX            ;Get back offset into SECTOR
  249. ASCII_LOOP:
  250.     MOV    DL,SECTOR[BX]
  251.     CALL    WRITE_CHAR
  252.     INC    BX
  253.     LOOP    ASCII_LOOP
  254.  
  255.     MOV    DL,' '            ;Draw right side of box
  256.     CALL    WRITE_CHAR
  257.     MOV    DL,VERTICAL_BAR
  258.     CALL    WRITE_CHAR
  259.  
  260.     POP    DX
  261.     POP    CX
  262.     POP    BX
  263.     RET
  264. DISP_LINE    ENDP
  265.  
  266.  
  267.     PUBLIC    WRITE_PROMPT_LINE
  268.     EXTRN    CLEAR_TO_END_OF_LINE:PROC, WRITE_STRING:PROC
  269.     EXTRN    GOTO_XY:PROC
  270. .DATA
  271.     EXTRN    PROMPT_LINE_NO:BYTE
  272. .CODE
  273. ;-----------------------------------------------------------------------;
  274. ; This procedure writes the prompt line to the screen and clears the    ;
  275. ; end of the line.                            ;
  276. ;                                    ;
  277. ; On entry:    DS:DX    Address of the prompt-line message        ;
  278. ;                                    ;
  279. ; Uses:        WRITE_STRING, CLEAR_TO_END_OF_LINE, GOTO_XY        ;
  280. ; Reads:    PROMPT_LINE_NO                        ;
  281. ;-----------------------------------------------------------------------;
  282. WRITE_PROMPT_LINE    PROC
  283.     PUSH    DX
  284.     XOR    DL,DL            ;Write the prompt line and
  285.     MOV    DH,PROMPT_LINE_NO    ; move the cursor there
  286.     CALL    GOTO_XY
  287.     POP    DX
  288.     CALL    WRITE_STRING
  289.     CALL    CLEAR_TO_END_OF_LINE
  290.     RET
  291. WRITE_PROMPT_LINE    ENDP
  292.  
  293.  
  294.     END
  295.