10 REM *** MINI-ASSEMBLER FUER DEN C64 *** 20 DIM MN$(140),MD(140),OP(140) 30 N=0 40 READ M$ 50 IF M$="END" THEN 100 60 READ TD,TP 70 N=N+1: MN$(N)=M$: MD(N)=TD: OP(N)=TP 80 GOTO 40 100 PRINT CHR$(147);"MINI-ASSEMBLER - ";N;"OPCODES GELADEN" 110 PRINT 120 PRINT "STARTADRESSE (HEX, Z.B. C000)?" 130 INPUT "";H$ 140 GOSUB 3000 145 IF ER=1 THEN PRINT "? UNGUELTIGE ADRESSE": GOTO 120 150 CA=VL: SA=CA 160 PRINT 170 PRINT "EINGABE: MNEMONIC [OPERAND]" 180 PRINT "LEER=UEBERSPRINGEN, 'END'=FERTIG" 190 PRINT 200 AD=CA: GOSUB 4000 210 PRINT HX$;" "; 220 GOSUB 1000 230 IF L$="" THEN 200 240 IF L$="END" THEN 900 250 SP=0 260 FOR I=1 TO LEN(L$) 270 IF MID$(L$,I,1)=" " AND SP=0 THEN SP=I 280 NEXT I 290 IF SP=0 THEN M$=L$: OP$="" 300 IF SP>0 THEN M$=LEFT$(L$,SP-1): OP$=MID$(L$,SP+1) 310 IF LEFT$(OP$,1)=" " THEN OP$=MID$(OP$,2): GOTO 310 320 ISBR=0 330 IF M$="BEQ" OR M$="BNE" OR M$="BCC" OR M$="BCS" THEN ISBR=1 340 IF M$="BPL" OR M$="BMI" OR M$="BVC" OR M$="BVS" THEN ISBR=1 350 GOSUB 2000 360 IF MODE=-1 THEN PRINT "? OPERAND UNBEKANNT": GOTO 200 370 FOUND=0 380 FOR I=1 TO N 390 IF MN$(I)=M$ AND MD(I)=MODE THEN OC=OP(I): FOUND=1 395 IF FOUND=1 THEN I=N 400 NEXT I 410 IF FOUND=0 THEN PRINT "? BEFEHL/MODUS UNBEKANNT: ";M$: GOTO 200 420 IF MODE=10 THEN GOSUB 6000: IF ER=1 THEN GOTO 200 430 POKE CA,OC 440 IF MODE=0 THEN LN=1 450 IF MODE=1 OR MODE=2 OR MODE=3 OR MODE=4 THEN POKE CA+1,VL: LN=2 460 IF MODE=5 OR MODE=6 OR MODE=7 THEN POKE CA+1,VL AND 255: POKE CA+2,INT(VL/256): LN=3 470 IF MODE=10 THEN POKE CA+1,BY: LN=2 480 CA=CA+LN 490 GOTO 200 900 PRINT 901 AD=SA: GOSUB 4000: SH$=HX$ 902 AD=CA: GOSUB 4000: EH$=HX$ 903 PRINT "START: $";SH$;" = SYS";SA 904 PRINT "ENDE: $";EH$ 905 PRINT "LAENGE: ";CA-SA;" BYTES" 906 PRINT 907 PRINT "SPEICHERN? (J/N)" 910 GET K$: IF K$="" THEN 910 920 IF K$="N" THEN 990 930 IF K$<>"J" THEN 910 940 PRINT "DATEINAME:" 950 GOSUB 1000 960 IF L$="" THEN 950 970 NM$=L$ 971 OT=PEEK(43)+256*PEEK(44): OV=PEEK(45)+256*PEEK(46) 972 POKE 43,SA AND 255: POKE 44,INT(SA/256) 973 POKE 45,CA AND 255: POKE 46,INT(CA/256) 974 SAVE NM$,8,1 975 POKE 43,OT AND 255: POKE 44,INT(OT/256) 976 POKE 45,OV AND 255: POKE 46,INT(OV/256) 977 PRINT "GESPEICHERT ALS ";NM$ 978 PRINT "NEULADEN: LOAD";CHR$(34);NM$;CHR$(34);",8,1" 979 PRINT "DANACH STARTEN MIT: SYS";SA 990 PRINT "FERTIG." 1000 REM ZEILE EINLESEN MIT GET (KOMMA-SICHER) 1010 L$="" 1020 GET K$ 1030 IF K$="" THEN 1020 1040 IF K$=CHR$(13) THEN RETURN 1050 IF K$=CHR$(20) THEN GOSUB 1100: GOTO 1020 1060 IF LEN(L$)>37 THEN 1020 1070 L$=L$+K$: PRINT K$;: GOTO 1020 1100 IF LEN(L$)=0 THEN RETURN 1110 L$=LEFT$(L$,LEN(L$)-1) 1120 PRINT CHR$(20); 1130 RETURN 2000 REM OPERAND ANALYSIEREN -> MODE, VL 2010 IF OP$="" THEN MODE=0: RETURN 2020 IF ISBR=1 AND LEFT$(OP$,1)<>"$" THEN MODE=-1: RETURN 2021 IF ISBR=1 THEN H$=MID$(OP$,2): GOSUB 3000: IF ER=1 THEN MODE=-1: RETURN 2022 IF ISBR=1 THEN MODE=10: RETURN 2030 IF LEFT$(OP$,2)="#$" THEN H$=MID$(OP$,3): GOSUB 3000 2031 IF ER=1 THEN MODE=-1: RETURN 2035 IF LEFT$(OP$,2)="#$" THEN MODE=1: RETURN 2040 IF LEFT$(OP$,1)<>"$" THEN MODE=-1: RETURN 2050 CP=0 2060 FOR I=1 TO LEN(OP$) 2070 IF MID$(OP$,I,1)="," AND CP=0 THEN CP=I 2080 NEXT I 2090 IF CP>0 THEN GOTO 2140 2100 H$=MID$(OP$,2) 2110 GOSUB 3000 2115 IF ER=1 THEN MODE=-1: RETURN 2120 IF VL<=255 THEN MODE=2 ELSE MODE=5 2130 RETURN 2140 H$=MID$(OP$,2,CP-2) 2150 GOSUB 3000 2155 IF ER=1 THEN MODE=-1: RETURN 2160 IX$=MID$(OP$,CP+1,1) 2170 IF VL<=255 AND IX$="X" THEN MODE=3 2180 IF VL<=255 AND IX$="Y" THEN MODE=4 2190 IF VL>255 AND IX$="X" THEN MODE=6 2200 IF VL>255 AND IX$="Y" THEN MODE=7 2210 RETURN 3000 REM HEX-STRING H$ -> DEZIMAL VL 3010 VL=0: ER=0 3015 IF H$="" THEN ER=1: RETURN 3020 FOR I=1 TO LEN(H$) 3030 D=ASC(MID$(H$,I,1))-48 3040 IF D>9 THEN D=D-7 3045 IF D<0 OR D>15 THEN ER=1 3050 VL=VL*16+D 3060 NEXT I 3065 IF VL>65535 THEN ER=1 3070 RETURN 4000 REM AD (DEZIMAL) -> HX$ (4-STELLIG HEX) 4010 DG$="0123456789ABCDEF" 4020 A2=AD 4030 D1=INT(A2/4096): A2=A2-D1*4096 4040 D2=INT(A2/256): A2=A2-D2*256 4050 D3=INT(A2/16): D4=A2-D3*16 4060 HX$=MID$(DG$,D1+1,1)+MID$(DG$,D2+1,1)+MID$(DG$,D3+1,1)+MID$(DG$,D4+1,1) 4070 RETURN 6000 REM RELATIVSPRUNG (BRANCH) BERECHNEN 6010 ER=0 6020 OF=VL-(CA+2) 6030 IF OF<-128 OR OF>127 THEN PRINT "? SPRUNGWEITE ZU GROSS": ER=1: RETURN 6040 IF OF<0 THEN OF=OF+256 6050 BY=OF 6060 RETURN 9000 REM --- LADEN (LDA/LDX/LDY) --- 9010 DATA LDA,1,169,LDA,2,165,LDA,3,181,LDA,5,173,LDA,6,189,LDA,7,185 9020 DATA LDX,1,162,LDX,2,166,LDX,4,182,LDX,5,174,LDX,7,190 9030 DATA LDY,1,160,LDY,2,164,LDY,3,180,LDY,5,172,LDY,6,188 9040 REM --- SPEICHERN (STA/STX/STY) --- 9050 DATA STA,2,133,STA,3,149,STA,5,141,STA,6,157,STA,7,153 9060 DATA STX,2,134,STX,4,150,STX,5,142 9070 DATA STY,2,132,STY,3,148,STY,5,140 9080 REM --- ARITHMETIK (ADC/SBC) --- 9090 DATA ADC,1,105,ADC,2,101,ADC,3,117,ADC,5,109,ADC,6,125,ADC,7,121 9100 DATA SBC,1,233,SBC,2,229,SBC,3,245,SBC,5,237,SBC,6,253,SBC,7,249 9110 REM --- LOGIK (AND/ORA/EOR) --- 9120 DATA AND,1,41,AND,2,37,AND,3,53,AND,5,45,AND,6,61,AND,7,57 9130 DATA ORA,1,9,ORA,2,5,ORA,3,21,ORA,5,13,ORA,6,29,ORA,7,25 9140 DATA EOR,1,73,EOR,2,69,EOR,3,85,EOR,5,77,EOR,6,93,EOR,7,89 9150 REM --- VERGLEICH (CMP/CPX/CPY) --- 9160 DATA CMP,1,201,CMP,2,197,CMP,3,213,CMP,5,205,CMP,6,221,CMP,7,217 9170 DATA CPX,1,224,CPX,2,228,CPX,5,236 9180 DATA CPY,1,192,CPY,2,196,CPY,5,204 9190 REM --- ZAEHLEN (INC/DEC/INX/INY/DEX/DEY) --- 9200 DATA INC,2,230,INC,3,246,INC,5,238,INC,6,254 9210 DATA DEC,2,198,DEC,3,214,DEC,5,206,DEC,6,222 9220 DATA INX,0,232,INY,0,200,DEX,0,202,DEY,0,136 9230 REM --- SCHIEBEN/ROTIEREN --- 9240 DATA ASL,0,10,ASL,2,6,ASL,3,22,ASL,5,14,ASL,6,30 9250 DATA LSR,0,74,LSR,2,70,LSR,3,86,LSR,5,78,LSR,6,94 9260 DATA ROL,0,42,ROL,2,38,ROL,3,54,ROL,5,46,ROL,6,62 9270 DATA ROR,0,106,ROR,2,102,ROR,3,118,ROR,5,110,ROR,6,126 9280 REM --- SPRUNG/KONTROLLE --- 9290 DATA JMP,5,76,JSR,5,32,RTS,0,96,RTI,0,64,NOP,0,234,BRK,0,0 9300 REM --- TRANSFER/STACK/FLAGS --- 9310 DATA TAX,0,170,TAY,0,168,TXA,0,138,TYA,0,152,TSX,0,186,TXS,0,154 9320 DATA PHA,0,72,PLA,0,104,PHP,0,8,PLP,0,40 9330 DATA CLC,0,24,SEC,0,56,CLI,0,88,SEI,0,120,CLD,0,216,SED,0,248,CLV,0,184 9340 DATA BIT,2,36,BIT,5,44 9350 REM --- VERZWEIGUNGEN --- 9360 DATA BEQ,10,240,BNE,10,208,BCC,10,144,BCS,10,176 9370 DATA BPL,10,16,BMI,10,48,BVC,10,80,BVS,10,112 9999 DATA END