home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / CDT128.SFX / dasmbl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-12  |  5.0 KB  |  148 lines

  1. /***********************************************************************/
  2. /***********************************************************************/
  3. /*                                                                     */
  4. /* ╘HIS PROGRAM IS COPYRIGHT 1986 BY ┴LAN ┘ORINKS.  ╔T MAY BE FREELY   */
  5. /* DISTRIBUTED FOR NON COMMERCIAL USAGE IF THIS COPYRIGHT NOTICE IS    */
  6. /* LEFT INTACT. ├OMMERCIAL USAGE OF THIS PROGRAM IS EXPLICITLY         */
  7. /* FORBIDDEN WITHOUT THE WRITTEN PERMISSION OF THE AUTHOR.             */
  8. /*                                                                     */
  9. /***********************************************************************/
  10. /***********************************************************************/
  11.  
  12.  
  13. /*     CDT VERSION 1.0    PART 13 OF 15   ╩ULY 25, 1986                 */
  14.  
  15. /*     6502/8502 DISASSEMBLER                                           */
  16.  
  17. #INCLUDE <STDIO.H>
  18. #INCLUDE "DBUG.H"
  19.  
  20. #IFDEF ├64
  21.     #DEFINE ╬╪╘┬┘╘┼ ╨┼┼╦(╙┴──╥(DSDMP)++)
  22. #ELSE
  23.     #DEFINE ╬╪╘┬┘╘┼ (CHAR)PEEK(┬┴╬╦(DSDMP),╙┴──╥(DSDMP)++)
  24. #ENDIF
  25.  
  26. #DEFINE ┴──╥ñ═╧─┼ 3   /* ADDRESSING MODE POSITION */
  27.  
  28.  
  29.  
  30. VOID
  31. DASMBL()
  32.      INT NUMBYTE ;               /* NUMBER OF BYTES TO PRINT PER OPCODE */
  33. AUTO CHAR BYTE1, BYTE2, BYTE3 ;  /* VARIABLES TO HOLD OPCODE AND OPERAND BYTES*/
  34. AUTO CHAR OPBUF[10] ;            /* TEMPORARY BUFFER FOR PRINTED OUTPUT */
  35.      EXTERN CHAR *OPCODE[] ;     /* OPCODE AND ADDRESSING STRUCTURE */
  36.      EXTERN INT   PAGE ;         /* PAGINATION FLAG */
  37.      EXTERN VOID  PAGER() ;
  38.  
  39.     /* ╙┴──╥(DSDMP) WILL BE INCREMENTED BY THE MACRO ╬╪╘┬┘╘ */
  40.  
  41.     WHILE( ╙┴──╥(DSDMP) < ┼┴──╥(DSDMP) )
  42.     █
  43.         BYTE1 = ╬╪╘┬┘╘┼ ;
  44.  
  45.         /* PRINT ADDRESS OF BYTE - ADJUST FOR INCREMENT OF ╬╪╘┬┘╘┼ */
  46.         PRINTF("%04X  ",(╙┴──╥(DSDMP)) - 1) ;
  47.  
  48.         /* PRINT OPCODE IN HEX */
  49.         PRINTF("%02X ",BYTE1) ;
  50.  
  51.         /* GET ASCII REPRESENTATION OF OPCODE AND # OF BYTES OF OPERAND */
  52.         /* PLACE HEX VALUES OF OPERANDS IN OPBUF TO BE OUTPUT AFTER     */
  53.         /* AFTER ASCII OPCODE IN RECOGNIZABLE ORDER( HI BYTE - LOW BYTE */                        
  54.         SWITCH(OPCODE[BYTE1][┴──╥ñ═╧─┼])
  55.         █
  56.             CASE ╔══:
  57.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  58.                 SPRINTF(OPBUF,"#$%02X",BYTE2) ;
  59.                 NUMBYTE = 1 ;
  60.                 BREAK ;
  61.             CASE ┴┬╙:
  62.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  63.                 BYTE3 = ╬╪╘┬┘╘┼ ;
  64.                 SPRINTF(OPBUF,"$%02X%02X",BYTE3,BYTE2) ;
  65.                 NUMBYTE = 2 ;
  66.                 BREAK ;
  67.             CASE ┴┬╙╪:
  68.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  69.                 BYTE3 = ╬╪╘┬┘╘┼ ;
  70.                 SPRINTF(OPBUF,"$%02X%02X,X",BYTE3,BYTE2) ;
  71.                 NUMBYTE = 2 ;
  72.                 BREAK ;
  73.             CASE ┴┬╙┘:
  74.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  75.                 BYTE3 = ╬╪╘┬┘╘┼ ;
  76.                 SPRINTF(OPBUF,"$%02X%02X,Y",BYTE3,BYTE2) ;
  77.                 NUMBYTE = 2 ;
  78.                 BREAK ;
  79.             CASE ┌╨:
  80.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  81.                 SPRINTF(OPBUF,"#$%02X",BYTE2) ;
  82.                 NUMBYTE = 1 ;
  83.                 BREAK ;
  84.             CASE ┌╨╪:
  85.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  86.                 SPRINTF(OPBUF,"#$%02X,X",BYTE2) ;
  87.                 NUMBYTE = 1 ;
  88.                 BREAK ;
  89.             CASE ┌╨┘:
  90.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  91.                 SPRINTF(OPBUF,"#$%02X,Y",BYTE2) ;
  92.                 NUMBYTE = 1 ;
  93.                 BREAK ;
  94.             CASE ╔╬─:
  95.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  96.                 BYTE3 = ╬╪╘┬┘╘┼ ;
  97.                 SPRINTF(OPBUF,"$%02X%02X,X",BYTE3,BYTE2) ;
  98.                 NUMBYTE = 2 ;
  99.                 BREAK ;
  100.             CASE ╔╬─╪:
  101.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  102.                 SPRINTF(OPBUF,"#$%02X,X",BYTE2) ;
  103.                 NUMBYTE = 1 ;
  104.                 BREAK ;
  105.             CASE ╔╬─┘:
  106.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  107.                 SPRINTF(OPBUF,"#$%02X,Y",BYTE2) ;
  108.                 NUMBYTE = 1 ;
  109.                 BREAK ;
  110.             CASE ╥┼╠:
  111.                 BYTE2 = ╬╪╘┬┘╘┼ ;
  112.                 IF( BYTE2 <= 0X7F )      /* FORWARD BRANCH */
  113.                     SPRINTF(OPBUF,"$%04X",╙┴──╥(DSDMP) + (CHAR)BYTE2 ) ;
  114.                 ELSE
  115.                     /* BACKWARD BRANCH - 2'S COMPLEMENT */
  116.                     SPRINTF(OPBUF,"$%04X",╙┴──╥(DSDMP) - 
  117.                             ( (CHAR)(»BYTE2 & 0X00FF) + 1) ) ;
  118.                 NUMBYTE = 1 ;
  119.                 BREAK ;
  120.             CASE ┴├├:
  121.                 SPRINTF(OPBUF,"A") ;
  122.                 NUMBYTE = 0 ;
  123.                 BREAK ;
  124.             CASE ╬╧╬┼:
  125.             DEFAULT  :
  126.                 *OPBUF = '\0' ;
  127.                 NUMBYTE = 0 ;
  128.                 BREAK ;
  129.         ▌
  130.  
  131.         /* PRINT THE HEX VALUES OF OPERANDS IN READ ORDER AFTER HEX OPCODE */
  132.         PRINTF( (NUMBYTE >= 1  ?  "%02X "  :  "   "),BYTE2) ;
  133.         PRINTF( (NUMBYTE >= 2  ?  "%02X "  :  "   "),BYTE3) ;
  134.  
  135.         /* PRINT ASCII REPRESENTATION OF OPCODE */
  136.         PRINTF("    %C%C%C ",OPCODE[BYTE1][0],OPCODE[BYTE1][1],
  137.                              OPCODE[BYTE1][2] ) ;
  138.  
  139.         /* PRINT OPERANDS STORED IN OPBUF */
  140.         PRINTF("%S\N",OPBUF) ;
  141.  
  142.         /* TAKE CARE OF PAGEING IF NECESSARY */
  143.         IF ( PAGE == ╘╥╒┼ )
  144.             PAGER() ;
  145.     ▌
  146.