view level1/cmds/dump.asm @ 2898:28ed72477814 lwtools-port

Dummy merge of default branch into lwtools hg -y merge --tool=internal:fail default hg revert --all --no-backup --rev . hg resolve -a -m This dummy merge discards any changes from the default branch so that the result is the same as what lwtools already had. When merging back to default branch later, the discarded changes will be discarded there also, so the result will be that the default branch will contain what the lwtools branch had before these merges. Only scripts/burst was "rescued" from default branch.
author Tormod Volden <debian.tormod@gmail.com>
date Sat, 11 Jan 2014 18:40:44 +0100
parents 84ea83668304
children
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.
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*   5      ????/??/??
* From Tandy OS-9 Level One VR 02.00.00.
*
*   6      2002/12/23  Boisy G. Pitre
* Incorporated R. Telkman's additions from 1987, added -d option,
* added defs to conditionally assemble without help or screen size check.
*
*          2003/01/17  Boisy G. Pitre
* Removed -d option.
*
*          2003/01/21  Boisy G. Pitre
* Narrow screen now shows properly, only dumps 16 bits worth of address
* data to make room.
*
*          2003/03/03  Boisy G. Pitre
* Fixed bug where header would be shown even if there was no data in a file.
*
*   7      2003/06/06  Rodney V. Hamilton
* Restored Rubout processing for terminals.

        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