Add mini-assembler.bas
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user