view level1/cmds/dump.asm @ 1211:f54f04a78c54

Rodney Hamilton fixes
author boisy
date Mon, 23 Jun 2003 17:45:27 +0000
parents b8608857a4a2
children 84ea83668304
line wrap: on
line source

********************************************************************
* Dump - Show file contents in hex
*
* $Id$
*
* Dump follows the function of the original Microware version but now
* supports large files over 64K, and is free from the problems of garbage
* in wide listings.
*
* In addition it now allows dumping of memory modules and command modules
* in the execution directory.
*
* Ed.   Comments                                        Who YY/MM/DD
* ------------------------------------------------------------------
*   5   From Tandy OS-9 Level One VR 02.00.00
*   6   Incorporated R. Telkman's additions from 1987,  BGP 02/12/23
*       added -d option, added defs to conditionally
*       assemble without help or screen size check
*
*       Removed -d option                               BGP 03/01/17
*       Narrow screen now shows properly, only dumps    BGP 03/01/21
*       16 bits worth of address data to make room.
*       Fixed bug where header would be shown even if   BGP 03/03/03
*       there was no data in a file.
*   7   Restored Rubout processing for terminals        RVH 03/06/06

        nam     Dump
        ttl     Show file contents in hex

        ifp1
        use     defsfile
        endc

* Tweakable options
DOSCSIZ set     1	1 = include SS.ScSiz code, 0 = leave out
DOHELP  set     0	1 = include help message, 0 = leave out
BUFSZ   set     80

tylg    set     Prgrm+Objct
atrv    set     ReEnt+rev
rev     set     1
edition set     7

        org     0
nonopts rmb     1
D.Prm   rmb     2
D.Hdr   rmb     1
D.Mem   rmb     1
        IFNE    DOSCSIZ
narrow  rmb     1
        ENDC
Mode    rmb     1
D.Opn   rmb     1
D.Beg   rmb     2
D.End   rmb     2
D.Adr   rmb     4
D.Len   rmb     2
D.Ptr   rmb     2
D.Txt   rmb     2
Datbuf  rmb     16
Txtbuf  rmb     BUFSZ
        rmb     128
datsz   equ     .

        mod     length,name,tylg,atrv,start,datsz

name    fcs     /Dump/
        fcb     edition

title   fcc     /Address   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0 2 4 6 8 A C E/
titlelen equ    *-title
caret   fcb     C$CR
flund   fcc     /-------- ---- ---- ---- ---- ---- ---- ---- ----  ----------------/
        fcb     C$CR
        IFNE    DOSCSIZ
short   fcc     /     0 1 2 3 4 5 6 7  0 2 4 6/
        fcb     C$LF
        fcc     /Addr 8 9 A B C D E F  8 A C E/
        fcb     C$CR
shund   fcc     /==== +-+-+-+-+-+-+-+- +-+-+-+-/
        fcb     C$CR
        ENDC

start   stx     <D.Prm
        clra
        sta     <D.Hdr
        sta     <D.Mem
        sta     <nonopts	assume no non-opts
        inca
        sta     <Mode		READ.

        IFNE    DOSCSIZ
        clr     <narrow		assume wide

* Check screen size
        ldb     #SS.ScSiz
        os9     I$GetStt
        bcs     Pass1

        cmpx    #titlelen+1
        bge     PrePass

        sta     <narrow

PrePass ldx     <D.Prm
        ENDC

* Pass1 - process any options
* Entry: X = ptr to cmd line
Pass1
* Skip over spaces
        lda     ,x+
        cmpa    #C$SPAC
        beq     Pass1

* Check for EOL
        cmpa    #C$CR
        beq     Pass2

* Check for option
        cmpa    #'-
        bne     Pass1

* Here, X points to an option char
OptPass lda     ,x+
        cmpa    #C$SPAC
        beq     Pass1
        cmpa    #C$CR
        beq     Pass2

        anda    #$DF

IsItH   cmpa    #'H
        bne     IsItM

* Process H here
        sta     <D.Hdr
        bra     OptPass

IsItM   cmpa    #'M
        bne     IsItX

* Process M here
        sta     <D.Mem
        bra     OptPass

IsItX   cmpa    #'X
        bne     ShowHelp

* Process X here
        lda     <Mode
        ora     #EXEC.
        sta     <Mode
        bra     OptPass

        IFNE    DOHELP
ShowHelp leax   HelpMsg,pcr
        lda     #2
        ldy     #HelpLen
        os9     I$Write
        bra     ExitOk
        ENDC

* Pass2 - process any non-options
* Entry: X = ptr to cmd line
Pass2
        ldx     <D.Prm
Pass21
* Skip over spaces
        lda     ,x+
        cmpa    #C$SPAC
        beq     Pass21
        cmpa    #'-
        bne     Pass22

EatOpts lda     ,x+
        cmpa    #C$SPAC
        beq     Pass21
        cmpa    #C$CR
        bne     EatOpts

* Check for EOL
Pass22  cmpa    #C$CR
        beq     EndOfL

Call    leax    -1,x
        sta     nonopts,u
        bsr     DumpFile
        bra     Pass21

EndOfL  tst     <nonopts	any non-options on cmd line?
        bne     ExitOk
        tst     <D.Mem		memory option specified?
        bne     ShowHelp	yes, no module specified, show help
        clra			stdin
        bsr     DumpIn
        IFEQ    DOHELP
ShowHelp
        ENDC
ExitOk  clrb
DoExit  os9     F$Exit

mlink   clra
        pshs    u
        os9     F$Link
        stu     <D.Beg
        puls    u
        bcc     DumpIn
        bra     DoExit

DumpFile tst    <D.Mem
        bne     mlink
        lda     <Mode
opath   tfr     x,y
        os9     I$Open
        bcc     DumpIn
        tfr     y,x
        ora     #DIR.		try directory mode
        os9     I$Open		open it
        bcs     DoExit		branch if error
DumpIn  stx     <D.Prm
        sta     <D.Opn
        ldx     <D.Beg
        ldd     M$Size,x
        leax    d,x
        stx     <D.End
        clra
        clrb
        tfr     d,x
onpas   std     <D.Adr+2
        bcc     notbg
        leax    1,x
notbg   stx     <D.Adr
        tst     <D.Hdr
        bne     nohed
        IFNE    DOSCSIZ
        tst     <narrow
        beq     flpag
        aslb
        ENDC
flpag   tstb
        bne     nohed
        lbsr    iseof
        bcc     flpag2
        ldx     <D.Prm
        rts
flpag2  leax    caret,pcr
        lbsr    print
        ldb     #16
        leax    title,pcr
        leay    flund,pcr
        IFNE    DOSCSIZ
        tst     <narrow
        beq     doprt
        ldb     #8
        leax    short,pcr
        leay    shund,pcr
        ENDC
doprt   pshs    y
        clra
        std     <D.Len
        bsr     print
        puls    x
        bsr     print
nohed   leax    Txtbuf,u
        stx     <D.Ptr
        ldb     <D.Len+1
        lda     #3
        mul
        addd    #2
        IFNE    DOSCSIZ
        tst     <narrow
        beq     leayit
        subd    #4
        ENDC
leayit  leay    d,x
        sty     <D.Txt
        lda     #C$SPAC
        ldb     #BUFSZ-1
clbuf   sta     b,x
        decb
        bpl     clbuf
        ldb     #D.Adr
        IFNE    DOSCSIZ
        tst     <narrow
        beq     adlop
        incb			we  skip first two bytes ...
        incb			...  if on a narrow screen
        ENDC
adlop   lda     b,u
        lbsr    onbyt
        incb
        cmpb    #D.Adr+4
        bne     adlop
        ldx     <D.Ptr
        leax    1,x
        stx     <D.Ptr
        bsr     readi
        bcs     eofck
onlin   lbsr    onchr
        decb
        ble     enlin
        lbsr    onchr
        decb
        ble     enlin
        IFNE    DOSCSIZ
        tst     <narrow
        bne     onlin
        ENDC
        lda     #C$SPAC
        lbsr    savec
        bra     onlin
enlin   lda     #C$CR
        ldx     <D.Txt
        sta     ,x
        leax    Txtbuf,u
        bsr     print
        ldd     <D.Adr+2
        ldx     <D.Adr
        addd    <D.Len
        lbra    onpas
print   ldy     #BUFSZ
        lda     #1
        os9     I$WritLn
        lbcs    DoExit
        rts
readi   ldy     <D.Len
        clrb
        tst     <D.Mem
        bne     redad
        leax    Datbuf,u
        lda     <D.Opn
        os9     I$Read
        bcs     reded
        tfr     y,d
reded   rts

redad   bsr     iseofm
        bcc     setct
        rts
setct   subd    <D.Len
        bcs     redof
        clra
        clrb
redof   addd    <D.Len
        clr     -1,s
        leay    d,x
        sty     <D.Beg
        rts

eofck   cmpb    #E$EOF
        orcc    #Carry
        lbne    DoExit
        clrb
        ldx     <D.Prm
        rts

iseof   tst     <D.Mem
        bne     iseofm
        lda     <D.Opn
        ldb     #SS.EOF
        os9     I$GetStt
        cmpb    #E$EOF
        beq     iseofex
        clrb
iseofok rts
iseofex orcc    #Carry
        ldb     #E$EOF
        rts
iseofm  ldd     <D.End
        ldx     <D.Beg
        subd    <D.Beg
        beq     iseofex
        andcc   #^Carry
        rts

onibl   anda    #$0F
        cmpa    #9
        bls     nocom
        adda    #7
nocom   adda    #'0
savec   pshs    x
        ldx     <D.Ptr
        sta     ,x+
        stx     <D.Ptr
        puls    x,pc
onchr   lda     ,x+
        bsr     onbyt
        pshs    x,a
        anda    #$7F
        cmpa    #C$SPAC		control char?
        blo     cntrl
        cmpa    #$7F		rubout?
        blo     savet
cntrl   lda     #'.		make printable
savet   ldx     <D.Txt
        sta     ,x+
        stx     <D.Txt
        puls    a,x,pc
onbyt   pshs    a
        lsra
        lsra
        lsra
        lsra
        bsr     onibl
        lda     ,s
        bsr     onibl
        puls    a,pc

        IFNE    DOHELP
HelpMsg fcc     "Use: Dump [opts] [<path>] [opts]"
        fcb     C$CR,C$LF
        fcc     "  -h = no header"
        fcb     C$CR,C$LF
        fcc     "  -m = module in memory"
        fcb     C$CR,C$LF
        fcc     "  -x = file in exec dir"
        fcb     C$CR,C$LF
HelpLen equ     *-HelpMsg
        ENDC

        emod
length  equ     *
        end