180 lines
6.1 KiB
QBasic
180 lines
6.1 KiB
QBasic
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 |