home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol067 / whodere2.asm < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  460 lines

  1. ;
  2. ;    WHODERE.ASM by R.H.JOHNSON
  3. ;    Modifications by BILL WOOD (New name WHODERE1.ASM)
  4. ;
  5. ;    What you say in secret,
  6. ;        shall be shouted from the house tops.
  7. ;
  8. ; An SAU to display sneaky Bios reads and writes.
  9. ;
  10. ;       A DEBUG PROGRAM FOR DISK READS AND WRITES
  11. ; This program will list all disk reads and writes to the
  12. ; CRT: (if CRT is TRUE) or to the LST: (if CRT is FALSE).
  13. ;
  14. ; N O T E :  This program runs in HI memory.
  15. ;         CP/M must be moved below HI memory to allow
  16. ;         room for this program. Set LOAD above CP/M.
  17. ;
  18. ;         As this program must use direct BIOS call
  19. ;         for CONOUT, the program may not work with
  20. ;         future releases of CP/M . The BDOS call "6"
  21. ;         for direct BIOS calls will not work with
  22. ;         this program as we would have two BDOS
  23. ;         call at the same time.          B Wood.
  24. ;
  25. ;MODIFICATIONS:
  26. ;            ------------
  27. ;03/30/82
  28. ;    Added routine to locate the address of BIOS.
  29. ;    Added conditional for output to CRT: or LST: .
  30. ;    Removed LDIR macro and added subroutine LDIR
  31. ;    to move memory. Program will now assemble with
  32. ;    ASM.COM .
  33. ;    Made other minor changes to program.
  34. ;
  35. ;        Bill Wood , Mississauga, Ontario, Canada.
  36. ;            ------------
  37. ;
  38. ;04/02/82
  39. ;    Added on/off toggle for print out with CTRL ^A .
  40. ;    Check so program will not load a second time.
  41. ;           Bill Wood
  42. ;            ------------
  43. ;
  44. ;
  45. FALSE    EQU    0
  46. TRUE    EQU    NOT FALSE
  47. ;
  48. LOAD    EQU    62    ;FREE MEMORY SPACE ABOVE CP/M (IN K)
  49. ;
  50. NEWBIOS EQU    (LOAD*1024)+1
  51. ;
  52. CRT    EQU    TRUE    ;OUTPUT TO CRT: IF TRUE (LST: IF FALSE)
  53. ;
  54. BASE    EQU    0    ;BASE OF CP/M
  55. BDOS    EQU    BASE+5    ;BDOS CALL
  56. STRING    EQU    09H    ;BDOS PRINT STRING
  57. CR    EQU    0DH
  58. LF    EQU    0AH
  59. ;
  60. ;
  61.     ORG    100H
  62. ;
  63. ;DO NOT ALLOW PROGRAM TO BY LOADED A SECOND TIME (SYSTEM WILL CRASH)
  64. START:    LHLD    BASE+1    ;GET BIOS ADDRESS IN HL
  65.     LXI    B,07H    ;GET TO CONIN JMP ADDRESS
  66.     DAD    B    ;ADD BC TO HL
  67.     MOV    E,M
  68.     INX    H
  69.     MOV    D,M    ;ADDRESS NOW IN DE
  70.     LXI    H,NEWIN ;GET ADDRESS
  71.     MOV    A,H
  72.     CMP    D
  73.     JNZ    START1    ;IF NOT SAME MUST BE 1ST. LOAD
  74.     MOV    A,L
  75.     CMP    E
  76.     JNZ    START1    ;IF NOT SAME MUST BE 1ST. LOAD
  77.     LXI    D,LOADED
  78.     MVI    C,STRING ;TELL THIS IS SECOND LOAD
  79.     CALL    BDOS
  80.     JMP    BASE    ;GET BACK TO CM/M
  81. ;
  82. LOADED: DB    CR,LF,'DUMMY !      WHODERE1 IS LOADED'
  83.     DB    CR,LF,'USE CTRL ^A TO TURN PROGRAM ON',CR,LF,'$'
  84. ;
  85. ;
  86. ;OK LOAD PROGRAM
  87. ;SET UP LOGOUT FOR CRT: OR LST:
  88. START1: LHLD    BASE+1     ;GET BIOS ADDRESS IN HL
  89.     LXI    B,18H     ;OFFSET TO SETDSK
  90.     DAD    B     ;ADD BC TO HL
  91.     SHLD    WASBIOS  ;STORE IT
  92. ;
  93.     LHLD    BASE+1     ;GET BIOS ADDRESS IN HL
  94.  ;
  95.     IF    CRT
  96.     LXI    B,9H     ;CONOUT (CRT:)
  97.     ENDIF
  98. ;
  99.     IF    NOT CRT
  100.     LXI    B,12     ;LIST    (LST:)
  101.     ENDIF
  102. ;
  103.     DAD    B     ;ADD BC TO HL
  104.     SHLD    OVLAY1+1 ;OVERLAY BIOS CALL+1  CRT: OR LST:
  105. ;
  106. ;SET UP CONOUT FOR CRTMSG
  107.     LHLD    BASE+1     ;GET BIOS ADDRESS IN HL
  108.     LXI    B,9H     ;CONOUT
  109.     DAD    B     ;ADD TO HL
  110.     SHLD    OVLAY2+1 ;OVERLAY BIOS CALL+1 CRT:
  111. ;
  112. ;
  113. ;SET UP TO TEST BIOS CONIN FOR CTRL ^A
  114.     LHLD    BASE+1
  115.     LXI    B,07H     ;OFFSET TO CONIN
  116.     DAD    B     ;ADD BC TO HL
  117.     MOV    E,M
  118.     INX    H
  119.     MOV    D,M
  120.     XCHG
  121.     SHLD    OVLAY3+1 ;OVERLAY CONIN CALL+1
  122. ;
  123. ;
  124. ;    COPY PROGRAM TO HIGH CORE
  125.     LXI    H,PROGRAM
  126.     LXI    D,NEWBIOS
  127.     LXI    B,PROEND-PROGRAM
  128.     CALL    LDIR
  129. ;
  130. ;    COPY OLD BIOS JUMPS TO TABLE
  131.     LHLD    WASBIOS
  132.     LXI    D,OLDDSK
  133.     LXI    B,18
  134.     CALL    LDIR
  135. ;
  136. ;    COPY IN NEWBIOS TABLE
  137.     LHLD    WASBIOS
  138.     XCHG
  139.     LXI    H,SELDSK
  140.     LXI    B,18
  141.     CALL    LDIR
  142. ;
  143.     LXI    H,NEWIN
  144.     XCHG         ;OVERLAY BIOS CONIN JMP
  145.     LHLD    BASE+1
  146.     LXI    B,07H     ;OFFSET TO CONIN
  147.     DAD    B     ;ADD BC TO HL
  148.     MOV    M,E
  149.     INX    H
  150.     MOV    M,D
  151. ;
  152.     LXI    D,SIGNIN
  153.     MVI    C,STRING ;PRINT STRING
  154.     CALL    BDOS
  155. ;    DONE
  156.     JMP    BASE
  157. ;
  158. ;
  159. WASBIOS:DS    2
  160. ;
  161. SIGNIN: DB    ' WHODERE1.ASM '
  162.     DB    ' VERSION 2.1 '
  163.     DB    ' 3/03/82  R.H.JOHNSON',CR,LF
  164.     DB    ' REV(1) BY BILL WOOD 03/30/82',CR,LF,LF
  165.     IF    CRT
  166.     DB    ' ALL DISK READS AND WRITES WILL DISPLAY ON CRT:',CR,LF,LF
  167.     ENDIF
  168.     IF    NOT CRT
  169.     DB    ' ALL DISK READS AND WRITES WILL DISPLAY ON LST:',CR,LF,LF
  170.     ENDIF
  171.     DB    '   N O T E :  USE CTRL ^A TO TOGGLE WHODERE ON & OFF',CR,LF
  172.     DB    '           WHODERE IS NOW OFF',CR,LF,LF,'$'
  173. ;
  174. ;
  175. ;    MOVE MEMORY
  176. ;    HL=GET      DE=PUT     BC=COUNT
  177. ;
  178. LDIR:    MOV    A,B
  179.     ORA    C
  180.     RZ        ;RETURN IF COUNT IS 0
  181.     MOV    A,M    ;GET IT
  182.     INX    H
  183.     XCHG
  184.     MOV    M,A    ;PUT IT
  185.     INX    H
  186.     XCHG
  187.     DCX    B    ;COUNT
  188.     JMP    LDIR
  189. ;
  190. ;
  191. ;
  192. ;    BIOS OVERLAY TABLE
  193. ;
  194. SELDSK: JMP    NEWDSK
  195. SETTRK: JMP    NEWTRK
  196. SETSEC: JMP    NEWSEC
  197. SETDMA: JMP    NEWDMA
  198. SETRED: JMP    NEWRED
  199. SETWRT: JMP    NEWWRT
  200. ;
  201. ;
  202. ;    START OF RELOCATED CODE
  203. ;
  204. PROGRAM:EQU    $
  205. OFFSET: EQU    NEWBIOS-PROGRAM
  206. ;
  207. NEWIN:    EQU    $+OFFSET
  208. OVLAY3: CALL    $-$    ;BIOS CONIN (ADDRESS OVERLAY)
  209.     PUSH    PSW    ;TEST ALL CONIN'S FOR CTRL A
  210.     ANI    7FH    ;STRIP IT
  211.     CPI    01H    ;CTRL A
  212.     JZ    TOGFLA    ;YES TOGGLE PRINT FLAG
  213.     POP    PSW
  214.     RET
  215. ;
  216. TOGFLA: EQU    $+OFFSET ;PRINT FLAG
  217.     PUSH    H
  218.     PUSH    D    ;PSW IS PUSHED
  219.     PUSH    B
  220.     LXI    H,FLAG
  221.     MOV    A,M    ;GET FLAG
  222.     CMA        ;FLIP IT (TOGGLE)
  223.     MOV    M,A    ;PUT IT BACK
  224.     CPI    0
  225.     JZ    TOG1    ;IT'S OFF SO SAY IT
  226.     LXI    H,FLGON ;IT'S ON SO SAY IT
  227.     JMP    TOG2
  228. TOG1:    EQU    $+OFFSET
  229.     LXI    H,FLGOFF
  230. TOG2:    EQU    $+OFFSET
  231.     CALL    CRTMSG    ;PRINT MESSAGE (ON OR OFF)
  232.     POP    B    ;MUST USE BIOS AS WE HAVE A BDOS CONIN CALL
  233.     POP    D    ;ON THE GO. CAN'T HAVE TWO BDOS CALLS AT THE
  234.     POP    H    ;SAME TIME.
  235.     POP    PSW
  236.     MVI    A,CR    ;SEND BACK A CR
  237.     RET
  238. ;
  239. FLAG:    EQU    $+OFFSET
  240.     DB    0    ;START WITH PRINT FLAG NOT SET
  241. ;
  242. FLGON:    EQU    $+OFFSET
  243.     DB    '^A WHODERE ON',CR,LF,0
  244. FLGOFF: EQU    $+OFFSET
  245.     DB    '^A WHODERE OFF',CR,LF,0
  246. ;
  247. ;
  248. NEWDSK: EQU    $+OFFSET    ;CONVERT DISK # TO LETTER
  249.     PUSH    PSW        ;PUT IN TABLE,
  250.     MOV    A,C        ;AND DOIT
  251.     STA    TDISK
  252.     POP    PSW
  253.     JMP    OLDDSK
  254. ;
  255. NEWTRK: EQU    $+OFFSET    ;SEEK TO TRACK
  256.     PUSH    PSW        ;PUT IN TABLE,
  257.     MOV    A,C        ;AND DOIT
  258.     STA    TTRACK
  259.     POP    PSW
  260.     JMP    OLDTRK
  261. NEWSEC: EQU    $+OFFSET    ;SET SECTOR NUMBER
  262.     PUSH    PSW        ;PUT IN TABLE,
  263.     MOV    A,C        ;AND DOIT
  264.     STA    TSECT
  265.     POP    PSW
  266.     JMP    OLDSEC
  267. NEWDMA: EQU    $+OFFSET    ;SET START ADDRESS FOR I/O
  268.     PUSH    PSW        ;PUT IN TABLE,
  269.     MOV    A,B        ;AND DOIT
  270.     STA    TDMA
  271.     MOV    A,C
  272.     STA    TDMA+1    
  273.     POP    PSW
  274.     JMP    OLDDMA
  275. NEWRED: EQU    $+OFFSET    ;READ SELECTED SECTOR
  276.     PUSH    PSW        ;PUT IN TABLE, DISPLAY
  277.     MVI    A,'R'        ;AND DOIT
  278.     STA    OPCD
  279.     CALL    CNVERT
  280.     POP    PSW
  281.     JMP    OLDRED
  282. NEWWRT: EQU    $+OFFSET    ;WRITE SELECTED SECTOR
  283.     PUSH    PSW        ;PUT IN TABLE, DISPLAY
  284.     MVI    A,'W'        ;AND DOIT
  285.     STA    OPCD
  286.     CALL    CNVERT
  287.     POP    PSW
  288.     JMP    OLDWRT
  289. ;
  290. ; CONVERTS STRING POINTED TO BY HL AND PUTS
  291. ; RESULT IN MEMORY POINTED TO BY DE
  292. CNVERT: EQU    $+OFFSET
  293.     PUSH    H
  294.     LXI    H,FLAG    ;TEST PRINT FLAG
  295.     MOV    A,M
  296.     CPI    0
  297.     JNZ    CNVER1    ;FLAG IS SET SO PRINT IT
  298.     POP    H
  299.     RET        ;FLAG NOT SET SO NO PRINT OUT
  300. CNVER1: EQU    $+OFFSET
  301.     PUSH    D
  302.     PUSH    B
  303.     LXI    H,TDISK
  304.     LXI    D,DISK
  305.     CALL    CVERT
  306. ;
  307.     LXI    H,TTRACK
  308.     LXI    D,TRACK
  309.     CALL    CVERT
  310. ;
  311.     LXI    H,TSECT
  312.     LXI    D,SECT
  313.     CALL    CVERT
  314. ;
  315.     LXI    H,TDMA
  316.     LXI    D,DMA
  317.     CALL    CVERT
  318. ;
  319.     LXI    H,TDMA+1
  320.     LXI    D,DMA+2
  321.     CALL    CVERT
  322. ;
  323.     LXI    H,TABSTG
  324.     CALL    MSG    
  325.     POP    B
  326.     POP    D
  327.     POP    H
  328.     RET
  329. ;
  330. ;
  331. CVERT:    EQU    $+OFFSET
  332.     MOV    A,M
  333.     ANI    0F0H
  334.     RRC
  335.     RRC
  336.     RRC
  337.     RRC    ;CONVERT THE HIGH NIBBLE FIRST
  338.     CALL    ASCII
  339.     STAX    D    
  340.     INX    D
  341.     MOV    A,M    ;STORE CHAR IN PRINT LINE
  342.     ANI    0FH
  343.     CALL    ASCII
  344.     STAX    D
  345.     RET        ;CONVERT LOW NIBBLE
  346. ;
  347. ;
  348. ;CONVERT A TO ASCII
  349. ;
  350. ASCII:    EQU    $+OFFSET
  351.     ADI    30H
  352.     CPI    '9'+1    ;FE 3A OPCODE
  353.     RM        
  354.     ADI    7
  355.     RET        ;A NOW IN ASCIIFORM
  356. ;
  357. ;PMSG STRING POINTED TO BY HL TO LOGOUT
  358. ;MSB OF 1 IN LAST CHARACTER SENDS CR,LF.
  359. ;ZERO WILL ALSO END STRING WITH NO CR,LF...
  360. ;
  361. ;
  362. MSG:    EQU    $+OFFSET
  363.     MOV    C,M    ;C=CHAR TO SEND TO CONSOLE
  364.     CALL    LOGOUT
  365.     MOV    A,M
  366.     ANI    80H
  367.     JNZ    LFCR    ;LAST ONE IF MSB=1
  368.     INX    H
  369.     MOV    A,M
  370.     ORA    A    ;TEST CHAR FOR 0
  371.     RZ
  372.     JMP    MSG
  373. ;
  374. ;SEND CR,LF TO CONSOLE
  375. ;
  376. LFCR:    EQU    $+OFFSET
  377.     MVI    C,CR
  378.     CALL    LOGOUT
  379.     MVI    C,LF
  380.     CALL    LOGOUT
  381.     RET
  382. ;
  383. LOGOUT: EQU    $+OFFSET
  384.     PUSH    H
  385.     MOV    A,C
  386.     ANI    7FH    ;STRIP HIGH BIT
  387.     MOV    C,A    ;PUT IT BACK IN C FOR BIOS
  388. OVLAY1: CALL    $-$    ;CALL BIOS (ADDRESS OVERLAYED)
  389.     POP    H
  390.     RET
  391. ;
  392. ;PRINT MESSAGE TO CRT VIA BIOS
  393. CRTMSG: EQU    $+OFFSET
  394.     MOV    C,M    ;C=CHAR TO SEND TO CONSOLE
  395.     PUSH    H
  396. OVLAY2: CALL    $-$    ;BIOS CONOUT
  397.     POP    H
  398.     INX    H
  399.     MOV    A,M
  400.     ORA    A    ;TEST CHAR FOR 0
  401.     RZ
  402.     JMP    CRTMSG
  403. ;
  404. ;    OLD BIOS STORAGE
  405. OLDDSK: EQU    $+OFFSET
  406.     DB 0,0,0
  407. OLDTRK: EQU    $+OFFSET
  408.     DB 0,0,0
  409. OLDSEC: EQU    $+OFFSET
  410.     DB 0,0,0
  411. OLDDMA: EQU    $+OFFSET
  412.     DB 0,0,0
  413. OLDRED: EQU    $+OFFSET
  414.     DB 0,0,0
  415. OLDWRT: EQU    $+OFFSET
  416.     DB 0,0,0
  417. ;
  418. ;PRINT TABLE STORAGE
  419. TABSTG: EQU    $+OFFSET
  420.     DB    ' DSK- '
  421. ;
  422. DISK:    EQU    $+OFFSET
  423.     DB    20H,20H
  424.     DB    ' TRK- '
  425. ;
  426. TRACK:    EQU    $+OFFSET
  427.     DB    20H,20H
  428.     DB    ' SEC- '
  429. ;
  430. SECT:    EQU    $+OFFSET
  431.     DB    20H,20H
  432.     DB    ' DMA- '
  433. ;
  434. DMA:    EQU    $+OFFSET
  435.     DB    20H,20H,20H,20H
  436.     DB    ' OPCD-  '
  437. ;
  438. OPCD:    EQU    $+OFFSET
  439.     DB    20H,0A0H
  440. ;
  441. ;
  442. ;TEMP VALUE STORAGE
  443. ;
  444. TDISK:    EQU    $+OFFSET
  445.     DB    0
  446. TTRACK: EQU    $+OFFSET
  447.     DB    0
  448. TSECT:    EQU    $+OFFSET
  449.     DB    0
  450. TDMA:    EQU    $+OFFSET
  451.     DB    0,0
  452. TOPCD:    EQU    $+OFFSET
  453.     DB    0
  454. ;
  455. ;
  456. PROEND: EQU    $
  457. ;
  458. ;
  459.     END    START
  460.