; ; 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