Add mini-assembler.bas

This commit is contained in:
2026-07-13 14:43:50 +02:00
parent dbd8fd5c29
commit 627e2e0c10
+179
View File
@@ -0,0 +1,179 @@
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: 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