home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug040.ark / HEXDUMP.ASM < prev    next >
Encoding:
Assembly Source File  |  1985-02-10  |  8.6 KB  |  331 lines

  1.  
  2.         .TITLE "BINARY TO HEX-ASCII FORMATTER"
  3.         .PABS
  4.         .LADDR
  5.         .LALL
  6.         .LIMAGE
  7. ;
  8. ;       SYSTEM EQUATES
  9. ;
  10. READBL  =       20      ;READ SECTOR
  11. FCB     =       5CH     ;INPUT FILE FCB
  12. COFN    =       2       ;CONSOLE CHARACTER WRITE
  13. BDOS    =       5       ;DOS ENTRY POINT
  14. SDMA    =       26      ;SET DMA FUNCTION
  15. DWRIT   =       21      ;WRITE SECTOR FUNCTION
  16. BUFF    =       80H     ;READ BUFFER ADDRESS
  17. WTFN    =       9       ;CONSOLE BUFFERED WRITE
  18. WBOOT   =       0       ;WARM BOOT
  19. CONZ    =       26      ;EOF MARKER
  20. CLSFN   =       16      ;CLOSE FILE
  21. LOGIN   =       14      ;LOG-IN DISK
  22. SEARCH  =       17      ;SEARCH FOR FILE
  23. DELETE  =       19      ;DELETE FILE
  24. MAKEF   =       22      ;CREATE FILE
  25. OPENF   =       15      ;OPEN FILE
  26. START   =       100H    ;WORK FILE START ADDRESS
  27. ;
  28. ;
  29.         .LOC    100H
  30.         LXI     SP,STKTOP
  31. ;
  32. ;       GET PARAMETERS
  33. ;
  34.         LXI     B,33    ;GET HEX FCB
  35.         LXI     H,FCB+16;AND MOVE IT
  36.         LXI     D,FCBH
  37.         LDIR
  38.         LXI     B,3     ;MOVE HEX EXT.
  39.         LXI     H,HEXT
  40.         LXI     D,FCBH+9
  41.         LDIR
  42.         MVI     B,8
  43.         LXI     H,FCB+17;CHECH FOR CONSOLE
  44. AGAIN:  MOV     A,M     ;OR FILE OPERATION
  45.         CPI     ' '
  46.         JRNZ    AFORT
  47.         INX     H
  48.         DJNZ    AGAIN
  49.         JMPR    RDOPEN
  50. AFORT:  XRA     A
  51.         STA     CONTST  ;SET FLAG FOR HEX FILE
  52. ;
  53. ;       SET UP HEX FILE
  54. ;
  55.         LDA     FCBH    ;GET DRIVE
  56.         DCR     A       ;AND LOG-IN DISK
  57.         MVI     D,0
  58.         MOV     E,A
  59.         MVI     C,LOGIN
  60.         CALL    BDOS
  61.         LXI     D,FCBH  ;SEARCH FOR FILE
  62.         MVI     C,SEARCH
  63.         CALL    BDOS
  64.         CPI     255
  65.         JRZ     MAKE    ;SEE IF FILE EXISTS
  66.         LXI     D,FCBH
  67.         MVI     C,DELETE
  68.         CALL    BDOS    ;ERASE FILE
  69. MAKE:   LXI     D,FCBH
  70.         MVI     C,MAKEF ;CREATE FILE
  71.         CALL    BDOS
  72.         CPI     255
  73.         JRNZ    OPENZ
  74.         LXI     D,DIREM ;ERROR DETECTED
  75.         MVI     C,WTFN
  76.         CALL    BDOS
  77.         JP      WBOOT
  78. OPENZ:  LXI     D,FCBH
  79.         CALL    SETUP
  80.         XRA     A
  81.         STA     FCBH+32 ;INIT. SECTOR COUNT
  82.         STA     WTPTR   ;INIT. POINTER
  83. ;
  84. ;       OPEN READ FILE
  85. ;
  86. RDOPEN: LXI     D,FCB
  87.         CALL    SETUP
  88.         XRA     A
  89.         STA     FCB+32  ;INIT. SECTOR COUNT
  90.         MVI     A,80H
  91.         STA     RIBP    ;INIT POINTER
  92. ;
  93. ;       BINARY TO HEX-ASCII CONVERSION
  94. ;
  95.         LXI     Y,START
  96. WRITE:  CALL    CRLF    ;WRITE CRLF
  97.         MVI     C,11    ;TEST TO ABORT
  98.         CALL    BDOS
  99.         ANI     1
  100.         JRZ     OKNOW
  101.         MVI     C,1
  102.         CALL    BDOS
  103.         ANI     127
  104.         CPI     3       ;ABORT
  105.         JRNZ    OKNOW
  106.         LXI     D,ABORT
  107.         MVI     C,WTFN
  108.         CALL    BDOS
  109.         JMP     WBOOT
  110. OKNOW:  MVI     C,':'   ;START OF RECORD CUE
  111.         CALL    PRINT   ;PRINT IT
  112.         CALL    PIMP
  113.         LDA     EOFLG   ;CHECK FOR EOF
  114.         CPI     0
  115.         JRZ     WRITE   ;GET NEXT RECORD
  116.         CALL    CRLF
  117.         MVI     C,':'
  118.         CALL    PRINT
  119.         MVI     B,10
  120. SST:    MVI     C,'0'
  121.         CALL    PRINT
  122.         DJNZ    SST
  123.         CALL    CRLF
  124.         JMP     CLOSE   ;FINISHED
  125. PIMP:   MVI     D,0     ;INIT CHECKSUM
  126.         MVI     B,24    ;24 BYTES PER RECORD
  127.         MOV     A,B     ;FILE LENGTH
  128.         CALL    PBYTE   ;PRINT IT
  129.         PUSH    Y
  130.         POP     H       ;GET ADDRESS
  131.         MOV     A,H
  132.         CALL    PBYTE   ;HIGH BYTE FIRST
  133.         MOV     A,L
  134.         CALL    PBYTE   ;LOW BYTE NEXT
  135.         XRA     A       ;FILE TYPE=0
  136.         CALL    PBYTE   ;PRINT IT
  137. ..W3:   CALL    READ    ;GET DATA BYTE
  138.         CALL    PBYTE   ;PRINT IT
  139.         INX     Y       ;ADVANCE ADDRESS
  140.         DJNZ    ..W3    ;DEC FILE COUNT
  141.         XRA     A
  142.         SUB     D       ;CALC. CHECKSUM
  143.         JMP     PBYTE   ;PRINT IT, RETURN
  144. ;
  145. ;       WRITE A SINGLE BYTE
  146. ;
  147. PBYTE:  PUSH    PSW     ;NIBBLE AT A TIME
  148.         RRC
  149.         RRC
  150.         RRC
  151.         RRC
  152.         CALL    CONV
  153.         CALL    PRINT   ;PRINT IT
  154.         POP     PSW     ;NEXT NIBBLE
  155.         PUSH    PSW     ;SAVE FOR CHECKSUM
  156.         CALL    CONV
  157.         CALL    PRINT   ;PRINT IT
  158.         POP     PSW
  159.         ADD     D       ;ADD TO CHECKSUM
  160.         MOV     D,A     ;UPDATE CHECKSUM
  161.         RET
  162. ;
  163. ;       CONVERT ASCII TO HEX
  164. ;
  165. CONV:   ANI     0FH     ;LOW NIBBLE ONLY
  166.         ADI     90H
  167.         DAA
  168.         ACI     40H
  169.         DAA
  170.         MOV     C,A
  171.         RET
  172. ;
  173. ;       CRLF
  174. ;
  175. CRLF:   MVI     C,0DH
  176.         CALL    PRINT
  177.         MVI     C,0AH
  178. ;
  179. ;       CONSOLE AND FILE
  180. ;       CHARACTER WRITE
  181. ;
  182. PRINT:  PUSH    PSW     ;SAVE ENVIRONMENT
  183.         PUSH    B
  184.         PUSH    D
  185.         PUSH    H
  186.         LDA     CONTST  ;TEST FLAG
  187.         CPI     0
  188.         JRZ     DISKWR  ;FILE ACCESS
  189.         MVI     D,0
  190.         MOV     E,C     ;CHAR. IN C
  191.         MVI     C,COFN
  192.         CALL    BDOS    ;PRINT TO CRT
  193. PREXIT: POP     H       ;RESTORE ENVIRONMENT
  194.         POP     D
  195.         POP     B
  196.         POP     PSW
  197.         RET
  198. DISKWR: LDA     WTPTR   ;GET POINTER
  199.         CPI     80H     ;CHECK FOR ROLLOVER
  200.         JRNZ    WTBYT
  201.         CALL    DISKCR
  202.         XRA     A
  203. WTBYT:  MOV     E,A     ;WRITE BYTE AT
  204.         MVI     D,0     ;BUFF+A
  205.         INR     A
  206.         STA     WTPTR   ;UPDATE POINTER
  207.         LXI     H,WTBUF
  208.         DAD     D
  209.         MOV     M,C     ;WRITE CHAR TO BUFF
  210.         JMPR    PREXIT  ;DONE
  211. ;
  212. ;       WRITE   SECTOR
  213. ;
  214. DISKCR: PUSH    B
  215.         LXI     D,WTBUF
  216.         MVI     C,SDMA
  217.         CALL    BDOS    ;SET WRITE DMA
  218.         LXI     D,FCBH
  219.         MVI     C,DWRIT ;WRITE SECTOR
  220.         CALL    BDOS
  221.         PUSH    PSW
  222.         LXI     D,BUFF  ;RESET DMA ADDRESS
  223.         MVI     C,SDMA
  224.         CALL    BDOS
  225.         POP     PSW
  226.         CPI     0       ;CHECK FOR ERROR
  227.         JRZ     BNC2
  228.         LXI     D,WEMS1
  229.         MVI     C,WTFN
  230.         CALL    BDOS    ;WRITE ERROR MESSAGE
  231.         JMP     WBOOT
  232. BNC2:   POP     B
  233.         RET
  234. ;
  235. ;       CLOSE THE FILE
  236. ;
  237. CLOSE:  LDA     CONTST  ;TEST FLAG
  238.         CPI     0
  239.         JNZ     WBOOT   ;DONE IF CONSOLE
  240.         MVI     B,10    ;WRITE EOF MARKER
  241. OVAGN:  MVI     C,CONZ
  242.         CALL    PRINT
  243.         DJNZ    OVAGN
  244.         CALL    DISKCR  ;FINAL SECTOR
  245.         LXI     D,FCBH
  246.         MVI     C,CLSFN ;CLOSE FILE
  247.         CALL    BDOS
  248.         CPI     255     ;CHECK FOR ERRORS
  249.         JNZ     WBOOT   ;NO ERROR, DONE.
  250.         LXI     D,CLEER
  251.         MVI     C,WTFN
  252.         CALL    BDOS
  253.         JMP     WBOOT
  254. ;
  255. ;       SET UP FILES TO OPEN
  256. ;
  257. SETUP:  MVI     C,OPENF
  258.         CALL    BDOS
  259.         CPI     255     ;CHECK FOR ERRORS
  260.         RNZ
  261.         LXI     D,OPNM
  262.         MVI     C,WTFN
  263.         CALL    BDOS
  264.         JMP     WBOOT
  265. ;
  266. ;       READ A CHARACTER
  267. ;
  268. READ:   PUSH    H
  269.         PUSH    D
  270.         PUSH    B
  271.         LDA     EOFLG
  272.         CPI     0
  273.         JRNZ    OUT
  274.         LDA     RIBP    ;GET POINTER
  275.         CPI     80H
  276.         JRNZ    TEMP
  277.         LXI     D,FCB
  278.         MVI     C,READBL
  279.         CALL    BDOS    ;READ NEW SECTOR
  280.         CPI     0
  281.         JRZ     BNC1
  282.         CPI     1       ;ERROR DETECTED
  283.         JRNZ    ALTER   ;EOF?
  284.         MVI     A,1     ;YES, SET FLAG
  285.         STA     EOFLG
  286.         JMPR    OUT
  287. ALTER:  LXI     D,RDERRM
  288.         MVI     C,WTFN
  289.         CALL    BDOS
  290.         JMP     WBOOT
  291. BNC1:   XRA     A
  292. TEMP:   MOV     E,A     ;READ BYTE FROM
  293.         MVI     D,0     ;BUFF+A
  294.         INR     A
  295.         STA     RIBP    ;UPDATE POINTER
  296.         LXI     H,BUFF
  297.         DAD     D
  298.         MOV     A,M     ;GET BYTE
  299. OUT:    POP     B
  300.         POP     D
  301.         POP     H
  302.         RET
  303. ;
  304. ;       STORAGE AND BUFFER
  305. ;
  306. RIBP:   .BYTE   80H     ;READ POINTER
  307. EOFLG:  .BYTE   0       ;EOF FLAG
  308. CONTST: .BYTE   1       ;CONSOLE FLAG
  309. WTPTR:  .BYTE   0       ;WRITE POINTER
  310. WTBUF:  .BLKB   128     ;WRITE BUFFER
  311. FCBH:   .BLKB   33      ;FCB FOR HEX FILE
  312. HEXT:   .ASCII  "HEX"   ;DEFAULT EXTENSION
  313. STACK:  .BLKB   64      ;STACK AREA
  314. STKTOP  =       .
  315. ;
  316. ;       ERROR MESSAGES
  317. ;
  318. WEMS1:  .ASCII  [^H0D] [^H0A] "ERROR ON CLOSING FILE" [^H0D] [^H0A] "$"
  319. CLEER:  .ASCII  [^H0D] [^H0A] "ERROR ON CLOSING FILE" [^H0D] [^H0A] "$"
  320. RDERRM: .ASCII  [^H0D] [^H0A] "ERROR ON READING FILE" [^H0D] [^H0A] "$"
  321. DIREM:  .ASCII  [^H0D] [^H0A] "NO MORE DIRECTORY SPACE" [^H0D] [^H0A] "$
  322. "
  323. OPNM:   .ASCII  [^H0D] [^H0A] "ERROR ON OPENING FILE" [^H0D] [^H0A] "$"
  324. ABORT:  .ASCII  [^H0D] [^H0A] "...ABORTED" [^H0D] [^H0A] "$"
  325.         .END
  326. A>
  327.  
  328. !
  329.  
  330. !∩╧@╝■v<⌠@┐≥ⁿaï@çI╧FÅ
  331. ╧ â╧Γ╧√╧    ∩ ╟╧O ü @ é∩╧Γ∩"»H█ └ÅC ¥Å┐╧⌐∩I╧▀I∩└∩B√╩╧D╧@»J≈└»K╧A┐@╡P┐P ²ƒ@²8┤▐∩J∩`ÅBÅ