home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
debug
/
ddttools.aqm
/
DDTTOOLS.ASM
Wrap
Assembly Source File
|
1986-12-21
|
6KB
|
215 lines
;DDTtools.* --CHR$(13)08DEC84lastupdate
; ...to be kept as a *.HEX file. DDT
;brings it in as an overlay to other work (or,
;better, in its initial load), to provide a few
;tools Kildall didn't think we'd need back in
;the TTY days. Don't LOAD it to a *.COM file;
;the COMfile is a memory image that'll take up
;a lot of diskfile space and wipe out
;whatever's in low memory when it's brought in.
;Use the *.HEX file.
; Variables are loaded into registers using the
;"X" command before entry with "G". Constants
;are provided by the routines. The labels are
;there to point out the starting points for
;these routines.
; The binary-to-decimal conversion routine came
;from "Soul of CP/M".
; This code is self-modifying, to avoid over-
;using the little DDT stack in the DMA block.
;Print a copy of this or the *.PRN file to
;serve as a manual. I need it, and I wrote the
;thing!
;
; I hereby place my portions of this work in
;the public domain. I do request credit in its
;distribution, complete with call-letters and
;my weird pseudoBasic signature/datecode.
; --C. R. Bryan III WB1HKU/6
; IMPORTANT: If you are running with less than
;64k of memory, you MUST lower the origin. This
;package should load in just under DDT where it
;overlays the CCP, leaving room for a few
;scribbles . In my Ampro system, DDT starts at
;0D000h.
;
;
;EQUATES:
BDOS equ 5
CR equ 0Dh
LF equ 0Ah
CTRLC equ 3
CTRLZ equ 01Ah
org 0CA00h ;well out of the way of a PUMP image.
ORIGIN: equ $ ;Here. Whatever you change org to be.
LABEL1: db 'STRINGFINDR:'
mvi a,1
sta HIT+1
lda BYCT
sta CHECK+1
lxi h,STRING
CEIL: lxi b,ORIGIN-1 ;early stop, otherwise it'll
;match the string with itself.
lxi d,100h ;TPA start.
LUP: ldax d
ani 7Fh ;NO-OP this out for object code.
;This mask keeps WordStar
;raised bits from preventing
;a match.
cmp m
jz HIT ;go advance everything for the next byte.
mvi a,1
sta HIT+1 ;we reset our hit-count on any mismatch.
lxi h,STRING ;and our pointer.
MIDLUP: inx d ;HIT rejoins us here.
dcx b
mvi a,0 ;test: have we run out of room to play?
cmp c
jnz LUP
cmp b
jnz LUP
lxi h,0 ;this is your indication of failure to
rst 7 ;find a match. An address in h and nonzero
;in b means h has end--of-match address.
;
BYCT db 0 ;it's zero until you put something in it.
;this is the number of bytes you put in the
;string to be matched (byte count).
STRING: db 'PUT ' ;if you need more room, repoint to somewhere
;else in memory. Don't forget to load BYCT.
db 'STRING HERE!'
;
HIT: mvi a,1 ;we rezero this up at the top for each use.
CHECK: cpi 0 ;this too gets modified, to BYCT.
jz REPORT ;hitcount = BYCT. We found it. Go brag.
inr a ;well, not all of it.
sta HIT+1
inx h ;point to the next byte to match
jmp MIDLUP ;and get on with it.
;
REPORT: xchg
shld SCRTCH
mvi e,7 ;beep
mvi c,2
call BDOS
mvi e,24h ;sure sign of success: dollar-signs
mvi c,2 ;(well, one) showing up on your screen.
call BDOS ;use "eXamine" function of DDT to see
lhld SCRTCH ;where the string was, in hl.
rst 7
SCRTCH: dw 0 ;scratchpad
;
LABEL2: db 'PAGES:'
;this is why I wrote this package in
;the first place. Saves the HP-16's
;batteries if the Z80 tells how many
;pages to SAVE. Give it the last valid
;address in hl (or leave it in there if
;it's already there). Then go see what it
;left you after SAVE:.
mov l,h
mvi h,0
lxi d,-100
call SUBCNT
sta LOOKY+6
lxi d,-10
call SUBCNT
sta LOOKY+7
lxi d,-1
call SUBCNT
sta LOOKY+8
rst 7
;
SUBCNT: mvi c,2Fh
SUBL: inr c
shld SCRTCH
dad d
jc SUBL
lhld SCRTCH
mov a,c
ret
;
LOOKY: db 'SAVE: '
;
LABEL3: db 'TOPSTRIP:'
;resets the top bit of each byte so
;WordStar files aren't cloudy with dots. PIP
;does the same thing if you transfer with
;a [z argument, but only if you're willing
;to copy over to a new file. This does it
;for you within DDT, ready to SAVE. Load
;hl with the first address, de with the last.
;Next time, write your .ASM file in
;non-document mode and avoid all this.
STRIP: mov a,m
ani 7Fh
mov m,a
inx h
mov a,e
cmp l
jnz STRIP
mov a,d
cmp h
jnz STRIP
rst 7
;
LABEL4: db 'PRINTSAF:'
;this routine makes embedded strings
;(like those in WINSTALL) readable by
;WordStar, once you've reformed and
;thrown out the gibberish. Anything
;that would bother a printer gets turned
;into a space, leaving only linefeeds,
;carriage returns, and good printing
;characters. First address in hl, last
;address in de.
SAFT: mov a,m
ani 7Fh
cpi 20h ;less than a space?
jc ITSOK
cpi 0Dh ;carriage-return
jz ITSOK
cpi 0Ah ;linefeed
jz ITSOK
mvi a,20h ;well, it's NOT okay. Space it.
ITSOK: mov m,a
inx h
mov a,e
cmp l
jnz SAFT
mov a,d
cmp h
jnz SAFT
rst 7
;
LABEL5: db 'TYPECHAR:'
;when invoked, this routine lets you
;type ASCII strings directly into
;memory,rather than having to translate
;them into hex. Stops when you give it
;a control C, or whenever it hits the
;ceiling. Control Z is allowed as a
;character. Load hl with the first byte's
;address first.
GOTYPE: shld SCRTCH
mvi c,1 ;Conin. Any mail? Wait 'til there is.
call BDOS
cpi 3 ;test: control C?
jz QUIT
lhld SCRTCH
mov m,a
inx h
lda CEIL+2 ;ceiling page over in Stringfindr
cmp h
jnz GOTYPE
lda CEIL+1 ;final allowed bytes.
cmp l
jnz GOTYPE ;these routines won't work if you type on
QUIT: rst 7 ;them, you know.
;
end
eof DDTTOOLS/ampro[000049] --CHR$(13)07DEC84