;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