*	back2ddt.asm	Version 1	September 5, 1981
*
*	Enables exiting from DDT via "G18" and returning via control-B.
*
*	(C) 1981 by Roy Lipscomb, Logic Associates, Chicago
*	Copying for non-profit distribution is permitted.
*
*
***********************************************************************
*
*	This module is useful when debugging a program for which you
*	have a .PRN file on disk.  You can exit from DDT; display the
*	.PRN listing; then return to DDT and the program being tested.
*
*	Notes:
*
*	1)  As supplied, BACK2DDT uses restart locations 3-6 (18h-37h).
*
*	2)  The CCP must be protected from being overlaid.  (This
*	requirement is met if DDT is loaded via DDTX, a public-
*	domain program by Ken Barbier available on many RCPM
*	systems.)
*
*	3)  The program being debugged will be preserved during
*	CCP resident commands--ERA, DIR, TYPE, REN, or SAVE.  Any
*	other (transient) commands will overlay the program.
*
*	4)  The CCP resets the dma to 80h, and alters 80h-ffh. Thus,
*
*		a)  Be sure you have nothing critical in this area
*		(such as the program stack) when exiting with "G18".
*
*		b)  If your program uses a different dma, be sure to
*		reset the dma after typing control-B.
*
*	5)  Registers A, PSW, and PC are not restored by control-B.
*
********************************************************************

	org 	100h
	jmp	begin

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		initial variables			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; change trap char, if so desired
trapchr	equ	2		;control-b means "back to ddt"


;do not change these
trubase	equ	18h		;actual load point of trap
bdos	equ	5
cindisp	equ	10		;displacement of conin addr in jmptable
display	equ	2

cr	equ	13
lf	equ	10

poph	equ	0e1h		;one of the test instructions



; "done" message
eom	equ	'$'

done	db	cr,lf,'Back2ddt   version 1, Sept 81'
	db	cr,lf
	db	cr,lf,'After protecting the CCP and loading DDT,'
	db	cr,lf,'exit DDT via "G18" and return via control-B.'
	db	cr,lf,eom

notdone	db	cr,lf,'Back2ddt already loaded:  no action',cr,lf,eom


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		mainline				;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

begin	push	h
	push	d
	push	b

;test if already loaded
	call	testit
	jz	return		;yes, already loaded

;move module into place
loadit	lxi	h,module
	lxi	d,trubase
	lxi	b,length
	call	move

;divert cp/m jmp-addresses to trap
	call	patchit	

;exit to cpm
return	pop	b
	pop	d
	pop	h
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		patch bios to trap conin		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;address conin entry in bios jump-table
patchit	lhld	1
	mvi	l,cindisp		;insert offset for conin

;remove true conin jmp-address
	mov	e,m
	inx	h
	mov	d,m

;insert trap address into jmp table
	lxi	b,trpentr-adjust
	mov	m,b
	dcx	h
	mov	m,c

;insert true conin address into trap
	xchg
	shld	trpentr-adjust+1

;print "done" message
	lxi	h,done
	call	message

	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		test if already loaded			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;test if bios jump table already points to trap

;address conin table entry
testit	lhld	1
	mvi	l,cindisp
	mov	c,m
	inx	h
	mov	b,m

;compare jump-table entry with trap entry
	lxi	d,trpentr-adjust

	mov	a,c
	sub	e

	mov	a,b
	sbb	d

	rnz		;if not equal, assume not already loaded

;already loaded, so output message
	lxi	h,notdone
	call	message

;turn on zero flag
	xra	a

	ret


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		move block of data			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;source in hl, destination in de, length in bc.

move	mov	a,b
	ora	c
	rz
	mov	a,m
	stax	d
	inx	d
	inx	h
	dcx	b
	jmp	move

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		print signoff mess			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
message	mov	a,m
	inx	h
	cpi	eom
	rz		;return if message completed

	mov	e,a
	mvi	c,display
	push	h
	call	bdos
	pop	h
	jmp	message


*********************************************************
*********************************************************
*		conin-trap module			*
*********************************************************
*********************************************************


module	equ	$
adjust	equ	module-trubase		;fudge factor, to compute
					;true address


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; exit from ddt (save important values)  (takes 15 bytes)
ddtexit	push	b		;save registers
	push	d
	push	h

	lhld	6		;save ddt trap address
	push	h

	lxi	h,0		;save stack pointer
	dad	sp
	shld	stksav-adjust

	rst	0		;reboot

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; if trapchr found, jmp to ddt; else return (takes 17 bytes)

trpentr	call	0		;perform conin (0 changed at run time)
	cpi	trapchr		;go to ddt?
	rnz			;no, back to CCP

	lxi	sp,0		;restore stack address
stksav	equ	$-2		;(filled at ddt-exit time)

;next two instructions are used to test for already-loaded module
testlod	pop	h		;restore ddt trap address
	shld	6

	pop	h		;restore registers
	pop	d
	pop	b

;must use actual RST 7 instruction, to preserve stack pointer.
	rst	7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;get length of relocatable routines
length	equ	$-module	;must equal 38h, in orig version.

	end
