1 REM =================================================================
2 REM DESASSEM.BAS le : 30 Mars 2007. Programme modifi par P. Lapierre
3 REM =================================================================

4 REM TABLEAUX DES CODES MNEMONIQUES
5 DIM CO$(7)
10 DIM AN$(15)
20 DIM IN$(12)
30 DIM EN$(3,15)

49 REM IN$ 
50 FOR I=0 TO 12
60 READ IN$(I)
70 NEXT I

79 REM AN$
80 FOR I=0 TO 15
90 READ AN$(I)
100 NEXT I

139 REM Gnration des caractres @,A,B,C,D,E,F pour la conversion en Hexa
140 FOR I=0 TO 6
150 CO$(I)=CHR$(I+64)
160 NEXT I

169 REM EN$
170 FOR I=0 TO 3
180 FOR J=0 TO 15
190 READ EN$(I,J)
200 NEXT J
210 NEXT I

220 GOTO 400

299 REM Routine de Conversion en Hexa dans C$
300 C$=STR$(C)
310 A=INT(VAL(C$)/16)
320 B=VAL(C$)-A*16
330 A$=RIGHT$(STR$(A),1)
340 B$=RIGHT$(STR$(B),1)
350 IF A>9 THEN A$=CO$(A-9)
360 IF B>9 THEN B$=CO$(B-9)
370 C$=A$+B$
380 RETURN

399 REM Initialisation du Dsassembleur
400 POKE 12314,0:POKE 249,136:EXEC 54958
410 INPUT "ADRESSE";A$
420 GOSUB 3000
430 CLS

439 REM Affichage de l'adresse de chaque ligne d'instruction dsassemble pour 24 lignes
440 FOR I=0 TO 23
460 TE=PEEK(AD)
470 AH=INT(AD/256)
480 C=AH:GOSUB 300
500 PRINT C$;
510 AL=AD-AH*256
520 C=AL:GOSUB 300
540 PRINT C$;
550 C=TE:GOSUB 300:A$(0)=C$
560 GOSUB 700
570 AD=AD+1
580 NEXT I

589 REM Commandes clavier ENTER = 24 lignes suivantes ,CTRL Q = autre adresse  dsassembler
590 A$=INKEY$:IF A$="" THEN 590
595 CLS
600 IF A$=CHR$(13) THEN 440
610 IF A$=CHR$(8) THEN 400
620 GOTO 590

699 REM TI = Quartet fort ,TJ = Quartet faible pour chaque code d'instruction  dcoder 
700 TI=INT(TE/16):TJ=TE-TI*16
710 IF TI<8 THEN 1200
722 IF TI=8 AND TJ=3 THEN A$(3)="SUBD":F$="#":GOTO 850
723 IF TI=8 AND TJ=7 THEN A$(3)="???":GOTO 2000
724 IF TI=8 AND TJ=12 THEN A$(3)="CPX":F$="#":GOTO 850
725 IF TI=8 AND TJ=14 THEN A$(3)="LDS":F$="#":GOTO 850
731 IF TI=12 AND TJ=3 THEN A$(3)="ADDD":F$="#":GOTO 850
732 IF TI=12 AND TJ=7 THEN A$(3)="???":GOTO 2000
733 IF TI=12 AND TJ=12 THEN A$(3)="LDD":F$="#":GOTO 850
734 IF TI=12 AND TJ=14 THEN A$(3)="LDX":F$="#":GOTO 850
738 IF TJ>12 THEN 1000
739 A$(3)=IN$(TJ)
740 IF TJ=12 AND TI>11 THEN A$(3)="LDD"
750 IF TJ=3 AND TI>11 THEN A$(3)="ADDD":GOTO 790
755 IF TJ=3 THEN 790
760 IF TJ=12 THEN 790
770 IF TI<12 THEN A$(4)="A":GOTO 790
780 A$(4)="B"

789 REM Dcodage du mode d'adressage pour chaque instruction
790 ON TI-7 GOTO 800,950,900,850,800,950,900,850

799 REM Adressage Immdiat
800 A$(5)="#"
810 AD=AD+1:C=PEEK(AD)
820 GOSUB 300
830 A$(1)=C$:A$(6)="$"+C$
840 GOTO 2000

849 REM Adressage Direct Etendu
850 AD=AD+1:C=PEEK(AD)
860 GOSUB 300:A$(1)=C$
870 AD=AD+1:C=PEEK(AD):GOSUB 300:A$(2)=C$
880 A$(5)=F$+"$"+A$(1)+A$(2)
890 GOTO 2000

899 REM Adressage Index
900 AD=AD+1
910 C=PEEK(AD):GOSUB 300
920 A$(5)="$"+C$:A$(1)=C$
930 A$(6)=",":A$(7)="X"
940 GOTO 2000

949 REM Adressage Direct en Page 0
950 AD=AD+1:C=PEEK(AD):GOSUB 300:A$(1)=C$
960 A$(5)="<$"+C$
970 GOTO 2000

999 REM 
1000 IF TJ<>14 THEN 1050
1010 IF TI<12 THEN A$(3)="LDS":GOTO 790
1020 A$(3)="LDX":GOTO 790

1049 REM
1050 IF TJ<>15 THEN 1100
1060 IF TI=8 OR TI=12 THEN A$(3)="???":GOTO 2000
1070 IF TI<12 THEN A$(3)="STS":GOTO 790
1080 A$(3)="STX":GOTO 790

1099 REM
1100 IF TI=9 AND TJ=13 THEN A$(3)="JSR":GOTO 790
1105 IF TI=9 OR TI=12 THEN A$(3)="???":GOTO 2000
1110 IF TI>12 THEN 1160
1120 IF TI>9 THEN A$(3)="JSR":GOTO 790
1130 A$(3)="BSR":GOTO 1620

1159 REM
1160 A$(3)="STD":GOTO 790

1199 REM
1200 IF TI<4 THEN 1600
1210 A$(3)=AN$(TJ)
1220 IF A$(3)="???" THEN 2000
1230 IF TI>5 THEN TI=TI+4:GOTO 790
1240 IF TJ=14 AND TI<6 THEN A$(3)="???":GOTO 2000
1250 IF TI=4 THEN A$(4)="A":GOTO 2000
1260 A$(4)="B":GOTO 2000

1599 REM Adressage Implicite
1600 A$(3)=EN$(TI,TJ)
1610 IF TI<>2 THEN 2000

1619 REM Adressage Relatif
1620 AD=AD+1
1630 C=PEEK(AD):GOSUB 300:A$(1)=C$
1640 IF C>127 THEN 1700

1649 REM Calcul Dplacement Positif
1650 AB=AD+1+C:GOSUB 1800
1660 GOTO 2000

1699 REM Calcul Dplacement Ngatif
1700 AB=AD+1-(256-C):GOSUB 1800
1710 GOTO 2000

1799 REM Conversion du Saut en Adresse Absolue
1800 AH=INT(AB/256):C=AH:GOSUB 300
1810 A$(5)=C$
1820 AL=AB-AH*256:C=AL:GOSUB 300
1840 A$(5)="$"+A$(5)+C$
1850 RETURN

1998 REM Affichage Codes Oprationnel et Oprande en Hexa et Mnmonique aprs l'affichage de
1999 REM l'adresse en Hexa de l'instruction en cours de dsassemblage  
2000 PRINT TAB(8) A$(0);TAB(11) A$(1);TAB(13) A$(2);TAB(25) A$(3);TAB(28) A$(4);TAB(30) A$(5);
2030 PRINT TAB(31) A$(6);TAB(35) A$(7)
2035 FOR K=0 TO 7
2040 A$(K)="":F$=""
2050 NEXT K
2080 RETURN

2998 REM Choix entre saisie de l'adresse dbut dsassemblage en dcimal ou si le signe $ est
2999 REM saisi --> adresse Hexa par ex: 49152 ou $C000
3000 IF LEFT$(A$,1)<>"$" THEN AD=VAL(A$):RETURN
3010 AL$=MID$(A$,4,2)
3020 AH$=MID$(A$,2,2)
3030 A$=AH$:GOSUB 3100
3040 AD=A*256
3050 A$=AL$:GOSUB 3100
3060 AD=AD+A
3070 RETURN

3099 REM Conversion de la saisie ci-dessus 
3100 IF LEN(A$)<2 THEN A$="0"+A$
3110 B$=RIGHT$(A$,1)
3120 C$=LEFT$(A$,1)
3130 FOR L=1 TO 6
3140 IF C$=CO$(L) THEN C$=STR$(9+L)
3150 IF B$=CO$(L) THEN B$=STR$(9+L)
3160 NEXT L
3170 A=VAL(C$)*16+VAL(B$)
3180 RETURN 

4999 REM Tableau pour IN$ = 13 Mnmoniques ($8x,$9x,$Ax,$Bx,$Cx,$Dx,$Ex,$Fx)
5000 DATA SUB,CMP,SBC,SUBD,AND,BIT,LDA,STA,EOR,ADC,ORA,ADD,CPX

5009 REM Tableau pour AN$ = 16 Mnmoniques ($4x,$5x,$6x,$7x)
5010 DATA NEG,???,???,COM,LSR,???,ROR,ASR,ASL,ROL,DEC,???,INC,TST,JMP,CLR

5015 REM Tableau EN$(I,J) contenant 4 regroupements de 64 Mnmoniques

5019 REM Tableau 1 ($0x) 16 Mnmoniques
5020 DATA ???,NOP,???,???,LSRD,ASLD,TAP,TPA,INX,DEX,CLV,SEV,CLC,SEC,CLI,SEI

5029 REM Tableau 2 ($1x) 16 Mnmoniques
5030 DATA SBA,CBA,???,???,???,???,TAB,TBA,???,DAA,???,ABA,???,???,???,???

5039 REM Tableau 3 ($2x) 16 Mnmoniques
5040 DATA BRA,BRN,BHI,BLS,BCC,BCS,BNE,BEQ,BVC,BVS,BPL,BMI,BGE,BLT,BGT,BLE

5049 REM Tableau 4 ($3x) 16 Mnmoniques
5050 DATA TSX,INS,PULA,PULB,DES,TXS,PSHA,PSHB,PULX,RTS,ABX,RTI,PSHX,MUL,WAI,SWI
