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

  1. CGROUP    GROUP    CODE_SEG, DATA_SEG    ;Group two segments together
  2.     ASSUME    CS:CGROUP, DS:CGROUP
  3.  
  4. CODE_SEG    SEGMENT PUBLIC
  5.  
  6.     PUBLIC    WRITE_HEADER
  7. DATA_SEG    SEGMENT PUBLIC
  8.     EXTRN    HEADER_LINE_NO:BYTE
  9.     EXTRN    HEADER_PART_1:BYTE
  10.     EXTRN    HEADER_PART_2:BYTE
  11.     EXTRN    DISK_DRIVE_NO:BYTE
  12.     EXTRN    CURRENT_SECTOR_NO:WORD
  13. DATA_SEG    ENDS
  14.     EXTRN    GOTO_XY:NEAR
  15. ;-----------------------------------------------------------------------;
  16. ; This procedure writes the header with disk-drive and sector number.    ;
  17. ;                                    ;
  18. ; Uses:        GOTO_XY, WRITE_STRING, WRITE_CHAR, WRITE_DECIMAL    ;
  19. ; Reads:    HEADER_LINE_NO, HEADER_PART_1, HEADER_PART_2        ;
  20. ;        DISK_DRIVE_NO, CURRENT_SECTOR_NO            ;
  21. ;-----------------------------------------------------------------------;
  22. WRITE_HEADER    PROC    NEAR
  23.     PUSH    DX
  24.     XOR    DL,DL            ;Move cursor to header line number
  25.     MOV    DH,HEADER_LINE_NO
  26.     CALL    GOTO_XY
  27.     LEA    DX,HEADER_PART_1
  28.     CALL    WRITE_STRING
  29.     MOV    DL,DISK_DRIVE_NO
  30.     ADD    DL,'A'            ;Print drives A, B, ...
  31.     CALL    WRITE_CHAR
  32.     LEA    DX,HEADER_PART_2
  33.     CALL    WRITE_STRING
  34.     MOV    DX,CURRENT_SECTOR_NO
  35.     CALL    WRITE_DECIMAL
  36.     POP    DX
  37.     RET
  38. WRITE_HEADER    ENDP
  39.  
  40.     PUBLIC    WRITE_STRING
  41. ;-----------------------------------------------------------------------;
  42. ; This procedure writes a string of characters to the screen.  The    ;
  43. ; string must end with        DB    0                ;
  44. ;                                    ;
  45. ;    DS:DX    Address of the string                    ;
  46. ;                                    ;
  47. ; Uses:        WRITE_CHAR                        ;
  48. ;-----------------------------------------------------------------------;
  49. WRITE_STRING    PROC    NEAR
  50.     PUSH    AX
  51.     PUSH    DX
  52.     PUSH    SI
  53.     PUSHF                ;Save direction flag
  54.     CLD                ;Set direction for increment (forward)
  55.     MOV    SI,DX            ;Place address into SI for LODSB
  56. STRING_LOOP:
  57.     LODSB                ;Get a character into the AL register
  58.     OR    AL,AL            ;Have we found the 0 yet?
  59.     JZ    END_OF_STRING        ;Yes, we are done with the string
  60.     MOV    DL,AL            ;No, write character
  61.     CALL    WRITE_CHAR
  62.     JMP    STRING_LOOP
  63. END_OF_STRING:
  64.     POPF                ;Restore direction flag
  65.     POP    SI
  66.     POP    DX
  67.     POP    AX
  68.     RET
  69. WRITE_STRING    ENDP
  70.  
  71.     PUBLIC    WRITE_HEX
  72. ;-----------------------------------------------------------------------;
  73. ; This procedure converts the byte in the DL register to hex and writes    ;
  74. ; the two hex digits at the current cursor position.            ;
  75. ;                                    ;
  76. ;    DL    Byte to be converted to hex.                ;
  77. ;                                    ;
  78. ; Uses:        WRITE_HEX_DIGIT                        ;
  79. ;-----------------------------------------------------------------------;
  80. WRITE_HEX    PROC    NEAR        ;Entry point
  81.     PUSH    CX            ;Save registers used in this procedure
  82.     PUSH    DX
  83.     MOV    DH,DL            ;Make a copy of byte
  84.     MOV    CX,4            ;Get the upper nibble in DL
  85.     SHR    DL,CL
  86.     CALL    WRITE_HEX_DIGIT        ;Display first hex digit
  87.     MOV    DL,DH            ;Get lower nibble into DL
  88.     AND    DL,0Fh            ;Remove the upper nibble
  89.     CALL    WRITE_HEX_DIGIT        ;Display second hex digit
  90.     POP    DX
  91.     POP    CX
  92.     RET
  93. WRITE_HEX    ENDP
  94.  
  95.     PUBLIC    WRITE_HEX_DIGIT
  96. ;-----------------------------------------------------------------------;
  97. ; This procedure converts the lower 4 bits of DL to a hex digit and    ;
  98. ; writes it to the screen.                        ;
  99. ;                                    ;
  100. ;    DL    Lower 4 bits contain number to be printed in hex.    ;
  101. ;                                    ;
  102. ; Uses:        WRITE_CHAR                        ;
  103. ;-----------------------------------------------------------------------;
  104. WRITE_HEX_DIGIT        PROC    NEAR
  105.     PUSH    DX            ;Save registers used
  106.     CMP    DL,10            ;Is this nibble <10?
  107.     JAE    HEX_LETTER        ;No, convert to a letter
  108.     ADD    DL,"0"            ;Yes, convert to a digit
  109.     JMP    Short WRITE_DIGIT    ;Now write this character
  110. HEX_LETTER:
  111.     ADD    DL,"A"-10        ;Convert to hex letter
  112. WRITE_DIGIT:
  113.     CALL    WRITE_CHAR        ;Display the letter on the screen
  114.     POP    DX            ;Restore old value of AX
  115.     RET
  116. WRITE_HEX_DIGIT        ENDP
  117.  
  118.     PUBLIC    WRITE_CHAR
  119. ;-----------------------------------------------------------------------;
  120. ; This procedure prints a character on the screen using the DOS        ;
  121. ; function call.  WRITE_CHAR replaces the characters 0 through 1Fh with    ;
  122. ; a period.                                ;
  123. ;    DL    Byte to print on screen.                ;
  124. ;-----------------------------------------------------------------------;
  125. WRITE_CHAR    PROC    NEAR
  126.     PUSH    AX
  127.     PUSH    DX
  128.     CMP    DL,32            ;Is character before a space?
  129.     JAE    IS_PRINTABLE        ;No, then print as is
  130.     MOV    DL,'.'            ;Yes, replace with a period
  131. IS_PRINTABLE:
  132.     MOV    AH,2            ;Call for character output
  133.     INT    21h            ;Output character in DL register
  134.     POP    DX            ;Restore old value in AX and DX
  135.     POP    AX
  136.     RET
  137. WRITE_CHAR    ENDP
  138.  
  139.     PUBLIC    WRITE_DECIMAL
  140. ;-----------------------------------------------------------------------;
  141. ; This procedure writes a 16-bit, unsigned number in decimal notation.    ;
  142. ;                                    ;
  143. ;    DX    N : 16-bit, unsigned number.                ;
  144. ;                                    ;
  145. ;-----------------------------------------------------------------------;
  146. WRITE_DECIMAL    PROC    NEAR
  147.     PUSH    AX            ;Save registers used here
  148.     PUSH    CX
  149.     PUSH    DX
  150.     PUSH    SI
  151.     MOV    AX,DX
  152.     MOV    SI,10            ;Will divide by 10 using SI
  153.     XOR    CX,CX            ;Count of digits placed on stack
  154. NON_ZERO:
  155.     XOR    DX,DX            ;Set upper word of N to 0
  156.     DIV    SI            ;Calculate N/10 and (N mod 10)
  157.     PUSH    DX            ;Push one digit onto the stack
  158.     INC    CX            ;One more digit added
  159.     OR    AX,AX            ;N = 0 yet?
  160.     JNE    NON_ZERO        ;Nope, continue
  161. WRITE_DIGIT_LOOP:
  162.     POP    DX            ;Get the digits in reverse order
  163.     CALL    WRITE_HEX_DIGIT
  164.     LOOP    WRITE_DIGIT_LOOP
  165. END_DECIMAL:
  166.     POP    SI
  167.     POP    DX
  168.     POP    CX
  169.     POP    AX
  170.     RET
  171. WRITE_DECIMAL    ENDP
  172.  
  173.     PUBLIC    WRITE_CHAR_N_TIMES
  174. ;-----------------------------------------------------------------------;
  175. ; This procedure writes more than one copy of a character        ;
  176. ;                                    ;
  177. ;    DL    Character code                        ;
  178. ;    CX    Number of times to write the character            ;
  179. ;                                    ;
  180. ; Uses:        WRITE_CHAR                        ;
  181. ;-----------------------------------------------------------------------;
  182. WRITE_CHAR_N_TIMES    PROC    NEAR
  183.     PUSH    CX
  184. N_TIMES:
  185.     CALL    WRITE_CHAR
  186.     LOOP    N_TIMES
  187.     POP    CX
  188.     RET
  189. WRITE_CHAR_N_TIMES    ENDP
  190.  
  191.     PUBLIC    WRITE_PATTERN
  192. ;-----------------------------------------------------------------------;
  193. ; This procedure writes a line to the screen, based on data in the    ;
  194. ; form                                    ;
  195. ;                                    ;
  196. ;    DB    {character, number of times to write character}, 0    ;
  197. ; Where {x} means that x can be repeated any number of times        ;
  198. ;    DS:DX    Address of above data statement                ;
  199. ;                                    ;
  200. ; Uses:        WRITE_CHAR_N_TIMES                    ;
  201. ;-----------------------------------------------------------------------;
  202. WRITE_PATTERN    PROC    NEAR
  203.     PUSH    AX
  204.     PUSH    CX
  205.     PUSH    DX
  206.     PUSH    SI
  207.     PUSHF                ;Save the direction flag
  208.     CLD                ;Set direction flag for increment
  209.     MOV    SI,DX            ;Move offset into SI register for LODSB
  210. PATTERN_LOOP:
  211.     LODSB                ;Get character data into AL
  212.     OR    AL,AL            ;Is it the end of data (0h)?
  213.     JZ    END_PATTERN        ;Yes, return
  214.     MOV    DL,AL            ;No, set up to write character N times
  215.     LODSB                ;Get repeat count into AL
  216.     MOV    CL,AL            ;And put in CX for WRITE_CHAR_N_TIMES
  217.     XOR    CH,CH            ;Zero upper byte of CX
  218.     CALL    WRITE_CHAR_N_TIMES
  219.     JMP    PATTERN_LOOP
  220. END_PATTERN:
  221.     POPF                ;Restore direction flag
  222.     POP    SI
  223.     POP    DX
  224.     POP    CX
  225.     POP    AX
  226.     RET
  227. WRITE_PATTERN    ENDP
  228.  
  229. CODE_SEG    ENDS
  230.  
  231.     END
  232.