Davex/src/xtn/2/dump.asm

293 lines
4.7 KiB
NASM

;*********************************************
;*********************************************
;
; External command for Davex
;
; dump -- dump a file in hex/ASCII
;
; Dave Lyons, 4-Mar-88
;
; Modified 17-Dec-88 DL ==> v1.2
; added -s and -e options
;
;*********************************************
;
; Converted to MPW IIgs 20-Sep-92 DAL
;
;*********************************************
.include "Common/2/Globals2.asm"
.include "Common/2/Apple.Globals2.asm"
.include "Common/2/Mli.globals2.asm"
.include "Common/Macros.asm"
;
.segment "CODE_A000"
OrgAdr = $A000 ;change as necessary (end below $B000)
; org OrgAdr
Space = $A0
MyVersion = $12
MinVersion = $11
;*********************************************
rts
.byte $ee,$ee
.byte MyVersion,MinVersion
.byte %00000000 ;hardware req
.addr descr
.addr OrgAdr
.addr start
.byte 0,0,0,0
; parameters here
.byte 0,t_wildpath
.byte $80+'a',t_nil ;ASCII only
.byte $80+'h',t_nil ;hex only
.byte $80+'o',t_nil ;no offsets
.byte $80+'s',t_int3 ;starting offset
.byte $80+'e',t_int3 ;ending offset
.byte 0,0
descr: pstr "dump a file in hex/ASCII"
;*********************************************
data = pagebuff
;
; dum xczpage ;32 locations
skip_hex = xczpage ;.res 1
skip_asc = skip_hex+1 ;.res 1
count = skip_asc+1 ;.res 1
width = count+1 ;.res 1
o_end = width+1 ;.res 3
; dend
;*********************************************
start:
sta open_path+1
sty open_path
;
; check -s and -e options
;
lda #0
sta offset
sta offset+1
sta offset+2
lda #$ff
sta o_end
sta o_end+1
sta o_end+2
lda #'s'+$80
jsr xgetparm_ch
bcs noffset
sta offset+2
stx offset+1
sty offset
noffset: lda #'e'+$80
jsr xgetparm_ch
bcs no_end
sta o_end+2
stx o_end+1
sty o_end
no_end:
;
; check -a and -h options
;
lda #'a'+$80
jsr xgetparm_ch
ror skip_asc
;
lda #'h'+$80
jsr xgetparm_ch
ror skip_hex
;
lda skip_hex
and skip_asc
bpl not_both
lsr skip_hex
lsr skip_asc
not_both = *
;
; Width (bytes per line) = 16 if hex is being printed,
; otherwise 64 (whether ASCII is there or not)
;
lda #16
bit skip_hex
bpl is16
lda #64
is16: sta width
;
; Open the source file
;
jsr mli
.byte mli_open
.addr open_parms
bcs err1
;
lda open_ref
sta read_ref
sta close_ref
sta mark_ref
;
jsr mli
.byte mli_setmark
.addr mark_parms
bcs err1
;
MainLp:
jsr ReadSome
bcs MaybeDone
jsr DoTheOffset
jsr DoTheHex
jsr DoTheASCII
jsr crout
jsr xcheck_wait
bcs Done
;
clc
lda offset
adc width
sta offset
bcc off_ok
inc offset+1
bne off_ok
inc offset+2
off_ok:
jsr CheckDone
bcs Done
jmp MainLp
;
MaybeDone:
cmp #err_eof
beq Done
err1: jmp xProDOS_err
Done: jsr mli
.byte mli_close
.addr close_parms
rts
;*********************************************
;
; print offset to left
;
DoTheOffset = *
lda #'o'+$80
jsr xgetparm_ch
bcc NoOff
lda #'$'+$80
jsr cout
lda offset+2
;beq dto_1
jsr prbyte
dto_1: lda offset+1
jsr prbyte
lda offset
jsr prbyte
lda #_':'
jsr cout
lda #Space
jsr cout
NoOff: rts
;*********************************************
;
; Read some data (up to WIDTH bytes; return
; amount read in COUNT)
;
ReadSome = *
lda width
sta read_req
jsr mli
.byte mli_read
.addr read_parms
bcs RdErr
lda read_xfer
sta count
RdErr: rts
;
read_parms:
.byte 4
read_ref:
.res 1
.addr data
read_req:
.addr 1
read_xfer:
.addr 0
;*********************************************
DoTheHex = *
bit skip_hex
bmi SkippedHex
ldx #0
MoreHex: cpx count
bcs Blanks
lda data,x
jsr prbyte
lda #Space
jsr cout
inx
bne MoreHex
Blanks: cpx width
bcs HexDone
lda #Space
jsr cout
jsr cout
jsr cout
inx
bne Blanks
HexDone: jsr xmess
asc " "
.byte 0
SkippedHex = *
rts
;*********************************************
;
; print the ASCII to the right
;
DoTheASCII = *
bit skip_asc
bmi SkippedASC
ldx #0
PrASC: lda data,x
ora #%10000000
cmp #$ff
beq PrtDot
cmp #Space
bcs PrtChar
PrtDot: lda #'.'+$80
PrtChar: jsr cout
inx
cpx count
bcc PrASC
SkippedASC: rts
;*********************************************
;
; CheckDone -- return sec if offset>o_end
;
CheckDone = *
lda offset+2
cmp o_end+2
bne checked
lda offset+1
cmp o_end+1
bne checked
lda offset
cmp o_end
checked: beq notDone
rts
notDone: clc
rts
;*********************************************
;*********************************************
open_parms: .byte 3
open_path: .res 2
.addr filebuff
open_ref: .res 1
;
close_parms: .byte 1
close_ref: .byte 1
;
mark_parms: .byte 2
mark_ref: .res 1
offset: .res 3
;*********************************************