[net.micro.apple] Apple Disassembler

zben@umd5.UUCP (08/08/85)

Sorry about the delay, took a few days to locate a good Kermit to get it
transfered up.  BTW I used the SERDAC version of the MACC implementation.

Run the program, give it the start and end addresses (IN HEX!!!) of the
range you want to disassemble, and a file name to which it will write a
data file containing the disassembled code.  It uses a short patch at $300,
so it will not disassemble code at $300 without modification.  The patch is
position-independant, so you could relocate it to $8000 or something if you
need to disassemble code at $300.

As stated before, I used it to freak code from DOS, so the address problems
never came up.

This could probably be done much simpler by planting a CSWL hook that just
saves and restores X and Y, but I didn't think about that until after I had
written the program.

I apologize to C and every other systems implementation language I have ever
cursed.  Systems programming in Applesoft Basic is really like pulling teeth!

-----------------------------------------------------


1  REM ARKABLE PROGRAM
2  REM TO DISASSEMBLE
3  REM PROGRAMS FROM CORE
4  REM TO A TEXT FILE!
5  REM YOU GIVE IT START
6  REM AND END ADDRESSES
7  REM AND THE NAME OF THE
8  REM FILE IT PUTS IT IN.
9  REM
100  REM
101  REM POKE ASSEMBLY INTO
102  REM LOW-CORE ($300)
103  REM
110  GOSUB 7000
200  REM
201  REM GET START ADDRESS
202  REM
210  INPUT "FROM: ";H$
220  GOSUB 6000
230  IF D >  = 0 GOTO 260
240  PRINT "OOPS!"
250  GOTO 210
260  LET F = D
270  LET B1 =  INT (F / 256)
280  LET B2 = F - 256 * B1
290  POKE 58,B2: POKE 59,B1
300  REM
301  REM GET END ADDRESS
302  REM
310  INPUT " TO : ";H$
320  GOSUB 6000
330  IF D >  = 0 GOTO 360
340  PRINT "OOPS!"
350  GOTO 310
360  LET T = D
370  IF T >  = F GOTO 400
380  PRINT "WILL NEVER GET THERE!"
390  GOTO 310
400  REM
401  REM GET FILENAME
402  REM IF NONE THEN
403  REM OUTPUT TO SCREEN
404  REM
410  INPUT "FILE: ";F$
420  IF  LEN (F$) = 0 GOTO 500
430  ONERR  GOTO 450
440  PRINT  CHR$ (4);"DELETE ";F$
450  POKE 216,0
470  PRINT  CHR$ (4);"OPEN ";F$
480  PRINT  CHR$ (4);"WRITE ";F$
500  REM
501  REM DO THE DISASSEMBLY.
502  REM
510  GOSUB 8000
520  FOR I = 512 TO 511 +  PEEK (6)
530  PRINT  CHR$ ( PEEK (I));
540  NEXT I
550  LET F = 256 *  PEEK (59) +  PEEK (58)
560  IF F <  = T GOTO 510
600  REM
601  REM IF OUTPUT TO FILE
602  REM THEN CLOSE FILE
603  REM
610  PRINT  CHR$ (13)
620  IF  LEN (F$) = 0 GOTO 9999
630  PRINT  CHR$ (4);"CLOSE ";F$
640  GOTO 9999
6000  REM
6001  REM HEX TO DEC CONVERT.
6002  REM
6010  LET D = 0
6020  FOR I = 1 TO  LEN (H$)
6030  LET H =  ASC ( MID$ (H$,I,1)) - 48
6040  IF H >  = 0 AND H <  = 9 GOTO 6070
6050  LET H = H - 7
6060  IF H < 10 OR H > 15 GOTO 6200
6070  LET D = 16 * D + H
6080  NEXT I
6090  RETURN
6200  REM
6201  REM HEX NUMBER ERROR.
6202  REM
6210  LET D =  - 1
6220  RETURN
7000  REM
7001  REM POKE ASSEMBLY ROUTINE
7002  REM USED BY BELOW.
7003  REM
7010  FOR I = 768 TO 785
7020  READ B
7030  POKE I,B
7040  NEXT I
7050  RETURN
7100  REM
7101  REM LISTING OF ASSEMBLY
7102  REM ROUTINE USED TO CALL
7103  REM MONITOR DISASSEMBLER.
7104  REM
7110  REM       ORG $300
7111  REM PTR   EQU $6
7112  REM YSV   EQU $7
7113  REM BUF   EQU $200
7114  REM LIST2 EQU $FE63
7115  REM *
7116  REM * CALL DISASSEMBLER.
7117  REM *
7118  REM DOIT  LDA #1
7119  REM       JSR LIST2
7120  REM       RTS
7121  REM *
7122  REM * INTERCEPT ROUTINE.
7123  REM *
7124  REM ZAP   STY YSV
7125  REM       LDY PTR
7126  REM       STA BUF,Y
7127  REM       LDY YSV
7128  REM       INC PTR
7129  REM       RTS
7200  REM
7201  REM THIS IS THE CODE
7202  REM FOR ABOVE THAT
7203  REM WE POKE INTO CORE.
7204  REM
7220  DATA 169,001,032,099
7230  DATA 254,096,132,007
7240  DATA 164,006,153,000
7250  DATA 002,164,007,230
7260  DATA 006,096
8000  REM
8001  REM DISASSEMBLE PROGRAM
8002  REM FROM MEMORY.
8003  REM
8030  LET S1 =  PEEK (54)
8040  LET S2 =  PEEK (55)
8050  POKE 54,6: POKE 55,3
8060  POKE 6,0
8070  CALL 768
8080  POKE 54,S1: POKE 55,S2
8090  RETURN
9999  END
-- 
Ben Cranston  ...{seismo!umcp-cs,ihnp4!rlgvax}!cvl!umd5!zben  zben@umd2.ARPA