home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / look.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.6 KB  |  417 lines

  1. ;
  2. ;                    +++++++  LOOK  +++++++
  3. ;
  4. ;By Kenyon Swartwout
  5. ;Reprinted from INTERFACE AGE, May, 1978
  6. ;
  7. ;This program will look for a byte or a sequence of 2 to 9
  8. ;bytes in any program and when found, the address and byte
  9. ;will be printed.  If no match is found "NO MATCH" will be
  10. ;printed.  Type a "0" when asked for number of bytes to re-
  11. ;turn to CP/M.
  12. ;
  13. ; CP/Mified on 5/16/80 by:
  14. ;
  15. ;    Kelly Smith
  16. ;    Simi Valley, Calif.
  17. ;    (805) 527-0518 Verbal
  18. ;    (805) 527-9321 Modem
  19. ;
  20.  
  21. ;
  22. ; CP/M VERSION 1.4 FUNCTION CALL EQUATES
  23. ;
  24.  
  25. RDCON    EQU    1    ;READ CONSOLE CHARACTER
  26. WRCON    EQU    2    ;WRITE CONSOLE CHARACTER
  27. WRCBUF    EQU    9    ;WRITE BUFFER CONTENTS TO CONSOLE
  28.  
  29. ;
  30. ; CP/M VERSION 1.4 ADDRESS CONSTANTS
  31. ;
  32.  
  33. BASE    EQU    0
  34. BDOS    EQU    05H+BASE    ;ENTRY TO FDOS
  35.  
  36. ;
  37. ; DEFINE THE ASCII CONTROL CHARACTERS
  38. ;
  39.  
  40. BEL    EQU    007H    ;(^G) BELL
  41. LF    EQU    00AH    ;(^J) LINE FEED
  42. CR    EQU    00DH    ;(^M) CARRIAGE RETURN
  43.  
  44.  
  45.  
  46.      ORG    0100H
  47. ;
  48.     LXI    H,0    ;CLEAR H&L REGS.
  49.     DAD    SP    ;ADD STACK POINTER
  50.     SHLD    OLDSTK    ;SAVE "OLD" STACK
  51. START:    LXI    SP,NEWSTK    ;MAKE "NEW" STACK
  52.     CALL    ZBUF        ;ZERO BUFFER
  53.     LXI    D,MSG1
  54.      CALL    MSGOUT        ;OUTPUT 1ST MESSAGE
  55. ST1:    CALL    CONIN
  56.     CPI    '0'
  57.     JZ    CPM    ;EXIT TO CP/M IF "0"
  58.     CPI    '1'
  59.     JC    ST1
  60.     CPI    '9'+1
  61.     JNC    ST1
  62.     SUI    48
  63.     MOV    C,A        ;SAVE COUNT IN C
  64.     STA    NBR
  65.     STA    NM
  66.     LXI    D,MSG2
  67.     CALL    MSGOUT        ;OUTPUT 2ND MESSAGE
  68.     LXI    D,BYTE
  69.     CALL    GET1
  70.     JMP    LK2
  71.  
  72. LK1:    CALL    CONIN
  73.     STAX    D        ;PUT 1ST CHAR IN MEMORY
  74.     INX    D
  75.     CALL    CONIN        ;INPUT 2ND CHAR
  76.     STAX    D        ;PUT 2ND CHAR IN MEMORY
  77.     DCX    D        ;BACK TO 1ST CHAR
  78.     CALL    AHEX        ;HEX TO BINARY
  79.     MOV    A,L
  80.     DCX    D
  81.     DCX    D
  82.     STAX    D
  83.     INX    D
  84.     DCR    C
  85.     MVI    A,0
  86.     CMP    C
  87.     RZ            ;RETURN WHEN ENTERED
  88.     JMP    LK1        ;TO ENTER NEXT BYTE
  89.  
  90. LK2:    LXI    D,MSG3
  91.     CALL    MSGOUT
  92.     LXI    D,SA
  93.     MVI    C,2
  94.     CALL    LK1        ;TO ENTER START ADDR.
  95.     CALL    REV
  96.     LXI    D,MSG4
  97.     CALL    MSGOUT        ;OUT FIN. ADDR MESSAGE
  98.     LXI    D,FA
  99.     MVI    C,2
  100.     CALL    LK1        ;TO ENTER FINISH ADDR
  101.     CALL    REV
  102. ;
  103. ;LOOK FOR CHARACTER SEQUENCE
  104. ;
  105.     CALL    CRLF
  106. LOOK:    LXI    H,FA        ;FINISH ADDR IN H,L
  107.     MOV    C,M
  108.     INX    H
  109.     MOV    B,M
  110. LOOK1:    LXI    D,BYTE
  111.     LHLD    SA
  112.     LDAX    D
  113.     PUSH    PSW
  114.     LDA    NBR
  115.     STA    NUM
  116.     CALL    ENCK        ;CHECK FOR FINISH
  117.     POP    PSW
  118.     CMP    M
  119.     JZ    LOOK2
  120.     INX    H
  121.     SHLD    SA        ;NEXT ADDR IN SA
  122.     JMP    LOOK1
  123. LOOK2:    INX    H
  124.     SHLD    SA
  125.     DCX    H
  126. LOOK3:    LDA    NUM    ;CHECK FOR COMPLETION OF BYTE MATCH
  127.     DCR    A
  128.     STA    NUM
  129.     JZ    PRT
  130.     INX    H
  131.     INX    D
  132.     LDAX    D
  133.     CMP    M
  134.     JZ    LOOK3
  135.     JMP    LOOK1
  136. ;
  137. ;THIS ROUTINE PRINTS ADDRESS AND MATCHED BYTES
  138. ;
  139. PRT:    CALL    CRLF
  140.     MVI    A,BEL    ;RING THE BELL...
  141.     CALL    CONOUT
  142.     LHLD    SA
  143.     DCX    H        ;ADDR OF OK BYTE
  144.     SHLD    SA
  145.     MOV    A,H        ;CONVERT TO HEX & OUT
  146.     PUSH    H
  147.     CALL    HOUT
  148.     POP    H
  149.     MOV    A,L
  150.     CALL    HOUT
  151.     MVI    A,' '
  152.     CALL    CONOUT
  153.     LXI    H,NBR
  154.     MOV    C,M
  155.     LXI    H,BYTE
  156. PRT1:    MOV    A,M
  157.     PUSH    H
  158.     CALL    HOUT
  159.     POP    H
  160.     MVI    A,' '
  161.     CALL    CONOUT
  162.     DCR    C
  163.     PUSH    H
  164.     LXI    H,NM
  165.     MOV    A,C
  166.     MOV    M,C
  167.     POP    H
  168.     MVI    A,0
  169.     CMP    C
  170.     JZ    PRT2        ;IF THRU
  171.     INX    H
  172.     JMP    PRT1
  173. PRT2:    LXI    H,NBR    ;GET BYTE COUNT
  174.     MOV    C,M
  175.     LHLD    SA    ;GET CURRENT MEMORY POINTER
  176. PRT3:    INX    H
  177.     DCR    C
  178.     JNZ    PRT3    ;BUMP POINTER PER BYTE COUNT
  179.     SHLD    SA    ;SAVE NEW POINTER
  180.     JMP    LOOK
  181.  
  182. GET1:    CALL    CONIN
  183.     STAX    D        ;PUT 1ST CHAR IN MEMORY
  184.     INX    D
  185.     CALL    CONIN        ;INPUT 2ND CHAR
  186.     STAX    D        ;PUT 2ND CHAR IN MEMORY
  187.     MVI    A,' '
  188.     CALL    CONOUT
  189.     DCX    D        ;BACK TO 1ST CHAR
  190.     CALL    AHEX        ;HEX TO BINARY
  191.     MOV    A,L
  192.     DCX    D
  193.     DCX    D
  194.     STAX    D
  195.     INX    D
  196.     DCR    C
  197.     MVI    A,0
  198.     CMP    C
  199.     RZ            ;RETURN WHEN ENTERED
  200.     JMP    GET1        ;TO ENTER NEXT BYTE
  201.  
  202.  
  203. MSG1:    DB    CR,LF,CR,LF,'How many bytes (0,1-9)? $'
  204. MSG2:    DB    CR,LF,'List bytes in hex ..... $'
  205. MSG3:    DB    CR,LF,'Start address ......... $'
  206. MSG4:    DB    CR,LF,'Finish address ........ $'
  207. MSG5:    DB    CR,LF,'NO MATCH$'
  208. MSG6:    DB    CR,LF,'$'
  209. ;
  210. ;THIS ROUTINE CHECKS FOR HL AT FINISH ADDRESS
  211. ;
  212. ENCK:    MOV    A,B
  213.     CMP    H
  214.     RNZ            ;RETURN IF NOT COMPLETE
  215.     MOV    A,C
  216.     CMP    L
  217.     RNZ            ;RETURN IF NOT COMPLETE
  218.     LDA    NM
  219.     CPI    0
  220.     JZ    START    ;MATCHING COMPLETED
  221.     LXI    D,MSG5
  222.     CALL    MSGOUT
  223.     CALL    CRLF
  224.     JMP    START
  225. ;
  226. ;THIS ROUTINE REVERSES 2 BYTES IN MEMORY
  227. ;
  228. REV:    DCX    D
  229.     XCHG
  230.     PUSH    B
  231.     MOV    C,M
  232.     DCX    H
  233.     MOV    B,M
  234.     MOV    M,C
  235.     INX    H
  236.     MOV    M,B
  237.     POP    B
  238.     XCHG
  239.     INX    D
  240.     RET
  241. ;
  242. ;
  243. ;
  244. ;
  245. ;
  246. ;THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII
  247. ;HEX AND OUTPUTS CHAR.  MEMORY AT HCON.
  248. ;
  249. HOUT:    CALL    BINH
  250.     LXI    H,HCON        ;CONVERSION AREA
  251. CHOT:    MOV    A,M
  252.     CALL    CONOUT
  253.     INX    H
  254.     MOV    A,M
  255.     CALL    CONOUT
  256.     RET
  257. ;
  258. ;CONVERTS BINARY VALUE IN REG A TO ASCII HEX
  259. ;DIGITS AND STORES IN MEMORY.
  260. ;
  261. BINH:    LXI    H,HCON
  262.     MOV    B,A
  263.     RAR
  264.     RAR
  265.     RAR
  266.     RAR
  267.     CALL    BIN1
  268.     MOV    M,A
  269.     INX    H
  270.     MOV    A,B
  271.     CALL    BIN1
  272.     MOV    M,A
  273.     RET
  274. ;
  275. ;THIS ROUTINE CONVERTS BINARY TO HEX
  276. ;
  277. BIN1:    ANI    0FH        ;LOW 4 BITS
  278.     ADI    48        ;CONVERTS TO ASCII
  279.     CPI    58        ;DIGIT 0-9
  280.     RC
  281.     ADI    7        ;MODIFY FOR A-F
  282.     RET
  283. ;
  284. ;THIS ROUTINE FETCHES DIGITS FROM THE
  285. ;BUFFER ADDRESSED BY B,C AND CONVERTS
  286. ;ASCII HEX DIGITS TO BINARY.  UP TO
  287. ;16 BITS CAN BE CONVERTED.  STOPS AT 0.
  288. ;
  289. AHEX:    LXI    H,0
  290. AHE1:    LDAX    D        ;FETCH ASCII DIGIT
  291.     ORA    A        ;SET Z FLAG
  292.     RZ
  293.     DAD    H
  294.     DAD    H
  295.     DAD    H
  296.     DAD    H
  297.     CALL    ASH1        ;CONVERT TO BINARY
  298.     CPI    10H        ;CHECK FOR LEGAL VALUE
  299.     CMC
  300.     RC            ;RETURN IF ERROR
  301.     ADD    L
  302.     MOV    L,A
  303.     INX    D
  304.     JMP    AHE1
  305. ;
  306. ;CONVERTS ASCII HEX TO BINARY
  307. ;
  308. ASH1:    SUI    48        ;ASCII BIAS
  309.     CPI    10        ;DIGIT 1-10
  310.     RC
  311.     SUI    7        ;ALPHA BIAS
  312.     RET
  313. ;
  314. ;
  315. ;THIS ROUTINE ZEROES OUT A BUFFER
  316. ;
  317. ZBUF:    MVI    B,ENDZ-STARTZ
  318.     LXI    H,STARTZ
  319. ZBU1:    XRA    A
  320.     MOV    M,A
  321.     INX    H
  322.     DCR    B
  323.     JNZ    ZBU1    ;LOOP 'TILL BUFFER ZERO'D
  324.     RET
  325. ;
  326.  
  327. ;
  328. ; CONSOLE CHARACTER INPUT SUBROUTINE
  329. ;
  330. ; ENTRY = NONE
  331. ; EXIT =  ASCII CHARACTER RETURNS IN A REG.
  332. ;
  333. CONIN:    PUSH    H    ;SAVE REGISTERS
  334.     PUSH    D
  335.     PUSH    B
  336.     MVI    C,RDCON    ;READ CONSOLE
  337.     CALL    BDOS
  338.     POP    B
  339.     POP    D
  340.     POP    H    ;RESTORE REGISTERS
  341.     RET
  342.  
  343. ;
  344. ; CONSOLE CHARACTER OUTPUT SUBROUTINE
  345. ;
  346. ; ENTRY = ENTER WITH ASCII CHARACTER IN A REG.
  347. ; EXIT = NONE
  348. ;
  349. CONOUT:    PUSH    H    ;SAVE REGISTERS
  350.     PUSH    D
  351.     PUSH    B
  352.     PUSH    PSW
  353.     MOV    E,A    ;CHARACTER TO E REG.
  354.     MVI    C,WRCON    ;WRITE CONSOLE FUNCTION
  355.     CALL    BDOS
  356.     POP    PSW
  357.     POP    B
  358.     POP    D
  359.     POP    H    ;RESTORE REGISTERS
  360.     RET
  361.  
  362. ;
  363. ; PRINT MESSAGE TO CONSOLE SUBROUTINE
  364. ;
  365. ; ENTER = MESSAGE STRING POINTED TO BY D&E REGS.
  366. ; EXIT = NONE
  367. ;
  368. MSGOUT:    PUSH    H    ;SAVE ALL REGISTERS
  369.     PUSH    B
  370.     PUSH    PSW
  371.     MVI    C,WRCBUF;PRINT CONSOLE BUFFER FUNCTION
  372.     CALL    BDOS
  373.     POP    PSW
  374.     POP    B
  375.     POP    H    ;RESTORE REGISTERS
  376.     RET
  377.  
  378. ;
  379. ; DISPLAY CARRIAGE RETURN/LINE FEED SUBROUTINE
  380. ;
  381. ; ENTRY = NONE
  382. ; EXIT =NONE
  383. ;
  384.  
  385. CRLF:    PUSH    H    ;SAVE ALL REGISTERS
  386.     PUSH    D
  387.     PUSH    B
  388.     PUSH    PSW
  389.     LXI    D,MSG6    ;POINT TO CR/LF MESSAGE
  390.     CALL    MSGOUT
  391.     POP    PSW
  392.     POP    B
  393.     POP    D
  394.     POP    H    ;RESTORE ALL REGISTERS
  395.     RET        ;RETURN FROM "CRLF"
  396.  
  397. CPM:    LHLD    OLDSTK    ;GET "OLD" STACK POINTER
  398.     SPHL        ;RESTORE THE STACK POINTER
  399.     RET        ;RETURN FROM WHENCE WE CAME...
  400.  
  401. STAT    EQU    3
  402. DATA    EQU    2
  403. STARTZ    EQU    $    ;START OF ZERO'D BUFFER
  404. NBR    DS    1
  405. NUM    DS    1
  406. BYTE    DS    10
  407. HCON    DS    2
  408. NM    DS    1
  409. SA    DS    3
  410. FA    DS    3
  411. ENDZ    EQU    $    ;END OF ZERO'D BUFFER
  412. OLDSTK    DS    2    ;STORAGE FOR "OLD" STACK
  413.     DS    64    ;32 LEVEL STACK
  414. NEWSTK    EQU    $    ;STORAGE FOR "NEW" STACK
  415. ;
  416.     END
  417.