home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1993 May / SIMTEL_0593.ISO / msdos / filutl / filehex.asm < prev    next >
Assembly Source File  |  1983-08-13  |  4KB  |  138 lines

  1.     TITLE    FILEHEX - Dump Diskette File in Hex
  2.     PAGE    60,132
  3. ;
  4. ; Filehex Program
  5. ; Dick Gillmann, June 1982
  6. ;
  7. ; EQUATES
  8. DISPLAY1 EQU    2            ; DOS PRINT CHAR TO TERMINAL
  9. DISPLAY    EQU    9            ; DOS PRINT STRING TO TERMINAL
  10. READ    EQU    0AH            ; DOS READ STRING FROM TERMINAL
  11. OPEN    EQU    0FH            ; DOS FILE OPEN
  12. SEQ_READ EQU    14H            ; DOS SEQUENTIAL READ
  13. DTA    EQU    1AH            ; DOS SET DISK TRANSFER ADDRESS
  14. PARSE    EQU    29H            ; DOS PARSE FILENAME
  15. DOS_FUNC EQU    21H            ; DOS FUNCTION INTERRUPT CODE
  16. LF    EQU    0AH            ; ASCII LINEFEED
  17. CR    EQU    0DH            ; ASCII CARRIAGE RETURN
  18.     SUBTTL    Stack Segment
  19.     PAGE
  20. STACK    SEGMENT    PARA STACK 'STACK'
  21.     DB    100 DUP("STACK   ")    ; MAKE VISIBLE FOR DEBUG
  22. STACK    ENDS
  23.     SUBTTL    Data Segment
  24.     PAGE
  25. DATA    SEGMENT    PARA PUBLIC 'DATA'
  26. MSG1    DB    "Input file:  $"    ; PROMPT FOR INPUT FILENAME
  27. ; PARAMETER BLOCK FOR DOS SCREEN READ
  28. MAXCHAR    EQU    20            ; FILENAME SIZE LIMIT
  29. INF1    LABEL    BYTE            ; BLOCK NAME
  30. BUFSIZE    DB    MAXCHAR            ; MAX CHARS ALLOWED
  31. INSIZE    DB    ?            ; NUMBER ACTUALLY READ
  32. TEXT    DB    MAXCHAR DUP(" ")    ; BUFFER
  33.     DB    "$"            ; MARKS END OF BUFFER
  34. ; OTHER DATA
  35. N    EQU    20            ; NUMBER OF BYTES DUMPED/LINE
  36. FCB    DB    37 DUP(?)        ; FILE CONTROL BLOCK
  37. BUFFER    DB    N DUP(?)        ; INPUT BUFFER
  38. HEX    DB    "0123456789ABCDEF"    ; ASCII CODES FOR HEX
  39. OUTBUF    DB    3*N DUP(" ")        ; OUTPUT BUFFER
  40. CRLF    DB    CR            ; CRLF SEQUENCE
  41.     DB    LF            ; LINEFEED
  42.     DB    "$"            ; END OF PRINT STRING
  43. DATA    ENDS
  44.     SUBTTL    Main Program
  45.     PAGE
  46. CODE    SEGMENT    PARA PUBLIC 'CODE'
  47. START    PROC    FAR            ; MAIN ENTRY POINT
  48.     ASSUME    CS:CODE,DS:DATA,SS:STACK,ES:DATA
  49. ; SAVE PARAMS FOR RETURN TO DOS
  50.     PUSH    DS            ; SAVE PREFIX ADDRESS
  51.     XOR    AX,AX            ; CLEAR AX
  52.     PUSH    AX            ; ZERO RETURN ADDRESS
  53. ; ESTABLISH ADDRESSABILITY
  54.     MOV    AX,DATA            ; DATA SEGMENT
  55.     MOV    DS,AX            ; TO DS
  56.     MOV    ES,AX            ; AND ES
  57. ; PROMPT FOR INPUT FILENAME
  58. PROMPT:    MOV    DX,OFFSET MSG1        ; MSG TO BE DISPLAYED
  59.     MOV    AH,DISPLAY        ; CONSOLE OUTPUT
  60.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  61. ; READ FILENAME
  62.     MOV    DX,OFFSET INF1        ; INPUT BUFFER
  63.     MOV    AH,READ            ; READ FUNCTION
  64.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  65. ; CRLF
  66.     MOV    DX,OFFSET CRLF        ; ADDRESS OF CRLF
  67.     MOV    AH,DISPLAY        ; DOS PRINT TO TERMINAL
  68.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  69. ; PARSE FILENAME & CREATE FCB
  70.     MOV    SI,OFFSET TEXT        ; FILENAME BUFFER ADDRESS
  71.     MOV    DI,OFFSET FCB        ; FCB ADDRESS
  72.     MOV    AL,0            ; DON'T STRIP COMMAS
  73.     MOV    AH,PARSE        ; DOS FILENAME PARSE
  74.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  75.     CMP    FCB+1," "        ; IF BLANK, NO FILENAME GIVEN
  76.     JE    BYEBYE            ; SO GIVE UP
  77.     CMP    AL,0            ; DRIVE OK?
  78.     JNE    PROMPT            ; NOPE, ASK AGAIN
  79. ; OPEN THE INPUT FILE
  80.     MOV    DX,OFFSET FCB        ; FILE CONTROL BLOCK
  81.     MOV    AH,OPEN            ; DOS OPEN
  82.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  83.     CMP    AL,0            ; FILE FOUND?
  84.     JNE    PROMPT            ; NOPE, ASK AGAIN
  85.     MOV    WORD PTR FCB+0EH,LENGTH BUFFER    ; SET RECLEN
  86. ; SET DISK TRANSFER ADDRESS
  87.     MOV    DX,OFFSET BUFFER    ; WHERE INPUT DATA GOES
  88.     MOV    AH,DTA            ; DOS SET DTA
  89.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  90. ; READ A RECORD
  91. LUPE:    MOV    DX,OFFSET FCB        ; FILE CONTROL BLOCK
  92.     MOV    AH,SEQ_READ        ; DOS SEQUENTIAL READ
  93.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  94.     CMP    AL,1            ; PAST EOF?
  95.     JE    BYEBYE            ; YES, DON'T DUMP ANYTHING
  96.     PUSH    AX            ; SAVE EOF INDICATION
  97. ; CALL DUMP ROUTINE
  98.     CALL    DUMP            ; CONVERT TO HEX
  99. ; DISPLAY RESULT
  100.     MOV    DX,OFFSET OUTBUF    ; OUTBUT BUFFER
  101.     MOV    AH,DISPLAY        ; DOS PRINT TO TERMINAL
  102.     INT    DOS_FUNC        ; REQUEST DOS SERVICE
  103.     POP    AX            ; RESTORE EOF INDICATION
  104. ; LOOP UNTIL EOF
  105.     CMP    AL,0            ; EOF?
  106.     JE    LUPE            ; NOPE, READ THE NEXT RECORD
  107. ; DONE
  108. BYEBYE:    RET                ; RETURN TO DOS
  109. START    ENDP
  110.     SUBTTL    Dump N bytes in hex
  111.     PAGE
  112. ; CONVERT BYTES TO HEX
  113. DUMP    PROC
  114.     MOV    BX,0            ; CLEAR ACCUMULATOR
  115.     MOV    CX,LENGTH BUFFER    ; LOOP N TIMES
  116.     MOV    SI,0            ; FIRST INPUT BYTE AT 0
  117.     MOV    DI,0            ; FIRST OUTPUT BYTE AT 0
  118. NEXT:    MOV    BL,BUFFER[SI]        ; GET NEXT BYTE
  119.     SHR    BL,1            ; HI-ORDER NYBBLE
  120.     SHR    BL,1            ; GRIND
  121.     SHR    BL,1            ;   "
  122.     SHR    BL,1            ;   "
  123.     MOV    AL,HEX[BX]        ; LOAD ASCII CODE FOR HEX DIGIT
  124.     MOV    OUTBUF[DI],AL        ; MOVE IT TO THE OUTPUT BUFFER
  125.     INC    DI            ; ADVANCE OUPUT BUFFER PTR
  126.     MOV    BL,BUFFER[SI]        ; GET BYTE AGAIN
  127.     AND    BL,0FH            ; EXTRACT LO-ORDER NYBBLE
  128.     MOV    AL,HEX[BX]        ; LOAD ASCII CODE FOR IT
  129.     MOV    OUTBUF[DI],AL        ; MOVE IT TO OUTPUT BUFFER
  130.     INC    DI            ; ADVANCE OUTPUT PTR
  131.     INC    DI            ; TWICE
  132.     INC    SI            ; ADVANCE INPUT PTR
  133.     LOOP    NEXT            ; BACK FOR MORE
  134.     RET                ; DONE
  135. DUMP    ENDP
  136. CODE    ENDS
  137.     END    START            ; TRANSFER ADDRESS
  138.