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