home *** CD-ROM | disk | FTP | other *** search
- ;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