home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
sysutl
/
whoder1.aqm
/
WHODER1.ASM
Wrap
Assembly Source File
|
1985-02-09
|
6KB
|
339 lines
;
; WHODERE.ASM by R.H.JOHNSON
; Modifications by BILL WOOD (New name WHODERE1.ASM)
;
; What you say in secret,
; shall be shouted from the house tops.
;
; An SAU to display sneaky Bios reads and writes.
;
; A DEBUG PROGRAM FOR DISK READS AND WRITES
; This program will list all disk reads and writes to the
; CRT: (if CRT is TRUE) or to the LST: (if CRT is FALSE).
;
; N O T E : This program runs in HI memory.
; CP/M must be moved below HI memory to allow
; room for this program. Set LOAD above CP/M.
;
;MODIFICATIONS:
; ------------
;03/30/82
; Added routine to locate the address of BIOS.
; Added conditional for output to CRT: or LST: .
; Removed LDIR macro and added subroutine LDIR
; to move memory. Program will now assemble with
; ASM.COM .
; Made other minor changes to program.
;
; Bill Wood , Mississauga, Ontario, Canada.
; ------------
;
;
FALSE EQU 0
TRUE EQU NOT FALSE
;
LOAD EQU 62 ;FREE MEMORY SPACE ABOVE CP/M (IN K)
;
NEWBIOS EQU (LOAD*1024)+1
;
CRT EQU TRUE ;OUTPUT TO CRT: IF TRUE (LST: IF FALSE)
;
BASE EQU 0
BDOS EQU BASE+5
CR EQU 0DH
LF EQU 0AH
;
;
ORG 100H
;
START: LHLD BASE+1 ;GET BIOS ADDRESS IN HL
LXI B,18H ;OFFSET TO SETDSK
DAD B ;ADD BC TO HL
SHLD WASBIOS ;STORE IT
LHLD BASE+1 ;GET BIOS ADDRESS IN HL
;
IF CRT
LXI B,9H ;CONOUT (CRT:)
ENDIF
;
IF NOT CRT
LXI B,12 ;LIST (LST:)
ENDIF
;
DAD B ;ADD BC TO HL
SHLD OVRLAY+1 ;OVERLAY BIOS CALL +1
;
; COPY PROGRAM TO HIGH CORE
LXI H,PROGRAM
LXI D,NEWBIOS
LXI B,PROEND-PROGRAM
CALL LDIR
;
; COPY OLD BIOS JUMPS TO TABLE
LHLD WASBIOS
LXI D,OLDDSK
LXI B,18
CALL LDIR
;
; COPY IN NEWBIOS TABLE
LHLD WASBIOS
XCHG
LXI H,SELDSK
LXI B,18
CALL LDIR
;
LXI D,SIGNIN
MVI C,9 ;PRINT STRING
CALL BDOS
; DONE
JMP BASE
;
;
WASBIOS:DS 2
;
SIGNIN: DB ' WHODERE1.ASM '
DB ' VERSION 2.1 '
DB ' 3/03/82 R.H.JOHNSON',CR,LF
DB ' REV(1) BY BILL WOOD 03/30/82',CR,LF,LF
IF CRT
DB ' ALL DISK READS AND WRITES WILL DISPLAY ON CRT:',CR,LF,LF
ENDIF
IF NOT CRT
DB ' ALL DISK READS AND WRITES WILL DISPLAY ON LST:',CR,LF,LF
ENDIF
DB '$'
;
;
; MOVE MEMORY
; HL=GET DE=PUT BC=COUNT
;
LDIR: MOV A,B
ORA C
RZ ;RETURN IF COUNT IS 0
MOV A,M ;GET IT
INX H
XCHG
MOV M,A ;PUT IT
INX H
XCHG
DCX B ;COUNT
JMP LDIR
;
;
;
; BIOS OVERLAY TABLE
;
SELDSK: JMP NEWDSK
SETTRK: JMP NEWTRK
SETSEC: JMP NEWSEC
SETDMA: JMP NEWDMA
SETRED: JMP NEWRED
SETWRT: JMP NEWWRT
;
;
; START OF RELOCATED CODE
;
PROGRAM:EQU $
OFFSET: EQU NEWBIOS-PROGRAM
;
NEWDSK: EQU $+OFFSET ;CONVERT DISK # TO LETTER
PUSH PSW ;PUT IN TABLE,
MOV A,C ;AND DOIT
STA TDISK
POP PSW
JMP OLDDSK
;
NEWTRK: EQU $+OFFSET ;SEEK TO TRACK
PUSH PSW ;PUT IN TABLE,
MOV A,C ;AND DOIT
STA TTRACK
POP PSW
JMP OLDTRK
NEWSEC: EQU $+OFFSET ;SET SECTOR NUMBER
PUSH PSW ;PUT IN TABLE,
MOV A,C ;AND DOIT
STA TSECT
POP PSW
JMP OLDSEC
NEWDMA: EQU $+OFFSET ;SET START ADDRESS FOR I/O
PUSH PSW ;PUT IN TABLE,
MOV A,B ;AND DOIT
STA TDMA
MOV A,C
STA TDMA+1
POP PSW
JMP OLDDMA
NEWRED: EQU $+OFFSET ;READ SELECTED SECTOR
PUSH PSW ;PUT IN TABLE, DISPLAY
MVI A,'R' ;AND DOIT
STA OPCD
CALL CNVERT
POP PSW
JMP OLDRED
NEWWRT: EQU $+OFFSET ;WRITE SELECTED SECTOR
PUSH PSW ;PUT IN TABLE, DISPLAY
MVI A,'W' ;AND DOIT
STA OPCD
CALL CNVERT
POP PSW
JMP OLDWRT
;
; CONVERTS STRING POINTED TO BY HL AND PUTS
; RESULT IN MEMORY POINTED TO BY DE
CNVERT: EQU $+OFFSET
PUSH H
PUSH D
PUSH B
LXI H,TDISK
LXI D,DISK
CALL CVERT
;
LXI H,TTRACK
LXI D,TRACK
CALL CVERT
;
LXI H,TSECT
LXI D,SECT
CALL CVERT
;
LXI H,TDMA
LXI D,DMA
CALL CVERT
;
LXI H,TDMA+1
LXI D,DMA+2
CALL CVERT
;
LXI H,TABSTG
CALL MSG
POP B
POP D
POP H
RET
;
;
CVERT: EQU $+OFFSET
MOV A,M
ANI 0F0H
RRC
RRC
RRC
RRC ;CONVERT THE HIGH NIBBLE FIRST
CALL ASCII
STAX D
INX D
MOV A,M ;STORE CHAR IN PRINT LINE
ANI 0FH
CALL ASCII
STAX D
RET ;CONVERT LOW NIBBLE
;
;
;CONVERT A TO ASCII
;
ASCII: EQU $+OFFSET
ADI 30H
CPI '9'+1 ;FE 3A OPCODE
RM
ADI 7
RET ;A NOW IN ASCIIFORM
;
;PMSG STRING POINTED TO BY HL TO CONSOLE
;MSB OF 1 IN LAST CHARACTER SENDS CR,LF.
;ZERO WILL ALSO END STRING WITH NO CR,LF...
;
;
MSG: EQU $+OFFSET
MOV C,M ;C=CHAR TO SEND TO CONSOLE
CALL CONOUT
MOV A,M
ANI 80H
JNZ LFCR ;LAST ONE IF MSB=1
INX H
MOV A,M
ORA A ;TEST CHAR
RZ ;C8 OPCODE
JMP MSG
;
;SEND CR,LF TO CONSOLE
;
LFCR: EQU $+OFFSET
PUSH B
MVI C,0DH
CALL CONOUT
MVI C,0AH
CALL CONOUT
POP B
RET
;
CONOUT: EQU $+OFFSET
PUSH H
PUSH D
PUSH B
MOV A,C
ANI 7FH ;STRIP HIGH BIT
MOV C,A ;PUT IT BACK IN C FOR BIOS
OVRLAY: CALL $-$ ;CALL BIOS (ADDRESS OVERLAYED)
POP B
POP D
POP H
RET
;
;
; OLD BIOS STORAGE
OLDDSK: EQU $+OFFSET
DB 0,0,0
OLDTRK: EQU $+OFFSET
DB 0,0,0
OLDSEC: EQU $+OFFSET
DB 0,0,0
OLDDMA: EQU $+OFFSET
DB 0,0,0
OLDRED: EQU $+OFFSET
DB 0,0,0
OLDWRT: EQU $+OFFSET
DB 0,0,0
;
;PRINT TABLE STORAGE
TABSTG: EQU $+OFFSET
DB ' DSK- '
;
DISK: EQU $+OFFSET
DB 20H,20H
DB ' TRK- '
;
TRACK: EQU $+OFFSET
DB 20H,20H
DB ' SEC- '
;
SECT: EQU $+OFFSET
DB 20H,20H
DB ' DMA- '
;
DMA: EQU $+OFFSET
DB 20H,20H,20H,20H
DB ' OPCD- '
;
OPCD: EQU $+OFFSET
DB 20H,0A0H
;
;
;TEMP VALUE STORAGE
;
TDISK: EQU $+OFFSET
DB 0
TTRACK: EQU $+OFFSET
DB 0
TSECT: EQU $+OFFSET
DB 0
TDMA: EQU $+OFFSET
DB 0,0
TOPCD: EQU $+OFFSET
DB 0
;
;
PROEND: EQU $
;
;
END START