home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Unsorted BBS Collection
/
thegreatunsorted.tar
/
thegreatunsorted
/
texts
/
boxes
/
ass80xx.gfa
(
.txt
)
< prev
next >
Wrap
GFA-BASIC Atari
|
1993-06-05
|
13KB
|
634 lines
PRINT "80XX Singel-Computer Assembler (by Jolly Roger)"
PRINT "Usefull for 8039/8049 boards. Atari Modifications by Zaphod Beeblebrox."
PRINT
DIM op$(255),pa$(255),op#(255),pa#(255),lb$(200),lb#(200),a$(4)
t#=0
debug#=0
DO
READ op$(t#),pa$(t#),op#(t#),pa#(t#)
t#=t#+1
LOOP WHILE op$(t#-1)<>"end"
op$(t#)=""
FILESELECT "\*.A49","",n$
IF NOT EXIST(n$)
END
ENDIF
PRINT "assembling: ";n$
PRINT
error#=0
pass#=1
@asm
IF error# THEN
PRINT "error occured during pass 1 in line ";linenum#;":"
PRINT normline$
GOTO error
ENDIF
pass#=2
@asm
IF error# THEN
PRINT "error occured during pass 2 in line ";linenum#;":"
PRINT normline$
GOTO error
ENDIF
FILESELECT "\*.ROM","",o$
OPEN "o",#1,o$
PRINT #1,bincode$;
CLOSE #1
PRINT "assembler finished "
GOTO quit
error:
PRINT "assembler stopped "
GOTO quit
PROCEDURE asm
bincode$=""
linenum#=0
OPEN "i",#1,n$
PRINT "Pass";pass#;" "
getline:
IF EOF(#1) THEN
GOTO fileend
ENDIF
line$=""
getchar:
IF EOF(#1) THEN
GOTO analine
ENDIF
a$=INPUT$(1,#1)
IF ASC(a$)>=ASC("a") AND ASC(a$)<=ASC("z")
a$=CHR$(ASC(a$)-ASC("a")+ASC("A"))
ENDIF
IF a$<>CHR$(10) AND a$<>CHR$(13) THEN
line$=line$+a$
GOTO getchar
ENDIF
REM analyze line
analine:
linenum#=linenum#+1
PRINT "line ";STR$(linenum#);" adress $";RIGHT$("000"+HEX$(LEN(bincode$)),3);CHR$(13);
gotline:
normline$=line$
IF debug# THEN
PRINT "ascii:";line$
ENDIF
IF INSTR(line$,";") THEN
line$=LEFT$(line$,INSTR(line$,";")-1)
ENDIF
IF line$="" THEN
GOTO getline
ENDIF
IF INSTR(line$,":") THEN
label$=LEFT$(line$,INSTR(line$,":")-1)
line$=RIGHT$(line$,LEN(line$)-INSTR(line$,":"))
IF label$<>"" THEN
deflabel
GOTO gotline
ENDIF
PRINT "no label before `:'!"
error#=1
GOTO fileend
ENDIF
REM analyze of opcode,param,value/label
anacode:
IF line$="" THEN
GOTO getline
ENDIF
new#=1
c#=0
a$(1)=""
a$(2)=""
a$(3)=""
FOR tt#=1 TO LEN(line$)
a$=MID$(line$,tt#,1)
IF c#>3 THEN
GOTO endtt
ENDIF
IF a$=" " OR a$=CHR$(9) THEN
new#=1
GOTO endtt
ENDIF
IF new#=1 THEN
c#=c#+1
new#=0
ENDIF
a$(c#)=a$(c#)+a$
endtt:
NEXT tt#
IF c#>3 THEN
PRINT "too many arguments!"
error#=1
GOTO fileend
ENDIF
IF INSTR(a$(2),"=") THEN
IF c#>2 THEN
PRINT "too many arguments!"
error#=1
GOTO fileend
ENDIF
a$(3)=RIGHT$(a$(2),LEN(a$(2))-INSTR(a$(2),"="))
a$(2)=LEFT$(a$(2),INSTR(a$(2),"="))
c#=3
ENDIF
REM search for the opcode
IF a$(1)="" THEN
GOTO getline
ENDIF
IF a$(1)="PAGE" THEN
a#=VAL(a$(2))*256
IF a#<LEN(bincode$) THEN
PRINT "cannot skip to ";a#;", because ";LEN(bincode$);" already passed!"
error#=1
GOTO fileend
ENDIF
page:
IF LEN(bincode$)<a# THEN
bincode$=bincode$+CHR$(0)
GOTO page
ENDIF
GOTO getline
ENDIF
tt#=0
searchcode:
IF op$(tt#)=a$(1) THEN
GOTO foundcode
ENDIF
tt#=tt#+1
IF tt#<=255 THEN
GOTO searchcode
ENDIF
PRINT "unknown opcode `";a$(1);"'!"
error#=1
GOTO fileend
foundcode:
REM global ass
IF pa#(tt#)=4 THEN
IF c#<2 THEN
PRINT "no label found!"
error#=1
GOTO fileend
ENDIF
IF c#>2 THEN
PRINT "only one label allowed!"
error#=1
GOTO fileenf
ENDIF
REM global assembling
labelget
IF l#=-1 THEN
PRINT "label `";a$(3);"' not found!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#+INT(l#/256)))+CHR$(l# AND 255)
GOTO compiled
ENDIF
REM local ass without parameter
IF pa#(tt#)=3 THEN
IF c#<2 THEN
PRINT "no label found!"
error#=1
GOTO fileend
ENDIF
IF c#>2 THEN
PRINT "only one label allowed!"
error#=1
GOTO fileenf
ENDIF
REM global assembling
labelget
IF l#=-1 THEN
PRINT "label not found!"
error#=1
GOTO fileend
ENDIF
IF INT(LEN(bincode$)/256)<>INT(l#/256) THEN
PRINT "only jumps inside a page with `"+a$(1)+"'!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))+CHR$(l# AND 255)
GOTO compiled
ENDIF
REM local ass without parameter
IF pa#(tt#)=3.5 THEN
IF c#<2 THEN
PRINT "no parameters/label found!"
error#=1
GOTO fileend
ENDIF
IF c#>2 THEN
PRINT "only one label allowed!"
error#=1
GOTO fileend
ENDIF
IF LEFT$(a$(2),1)="R" AND MID$(a$(2),3,1)="," THEN
mr#=INSTR("01234567",MID$(a$(2),2,1))-1
IF mr#<0 THEN
PRINT "you only can use R0-R7 in DJNZ jumps!"
error#=1
GOTO fileend
ENDIF
ENDIF
REM global assembling
tt#=tt#+mr#
a$(2)=RIGHT$(a$(2),LEN(a$(2))-3)
labelget
IF l#=-1 THEN
PRINT "label not found!"
error#=1
GOTO fileend
ENDIF
IF INT(LEN(bincode$)/256)<>INT(l#/256) THEN
PRINT "only jumps inside a page with `"+a$(1)+"'!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))+CHR$(l# AND 255)
GOTO compiled
ENDIF
IF pa$(tt#)="" THEN
IF c#>1 THEN
PRINT "no arguments are allowed here!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))
GOTO compiled
ENDIF
IF a$(2)="" THEN
PRINT "argumets expected!"
error#=1
GOTO fileend
ENDIF
nextcode:
IF op$(tt#)<>a$(1) THEN
PRINT "unknown parameter `";a$(2);"'!"
error#=1
GOTO fileend
ENDIF
IF pa$(tt#)=a$(2) THEN
GOTO anapar
ENDIF
tt#=tt#+1
GOTO nextcode
anapar:
IF pa#(tt#)=1
IF c#>2 THEN
PRINT "no values are allowed here!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))
GOTO compiled
ENDIF
IF c#<3 THEN
PRINT "values are missed!"
error#=1
GOTO fileend
ENDIF
REM compile value
a$=LEFT$(a$(3),1)
b$=RIGHT$(a$(3),LEN(a$(3))-1)
IF a$="%" THEN
IF LEN(b$)<>8 THEN
PRINT "only values %00000000-%11111111 with 2 digits allowed!"
error#=1
GOTO fileend
ENDIF
a#=(INSTR("01",MID$(b$,1,1))-1)*128
a#=a#+(INSTR("01",MID$(b$,2,1))-1)*64
a#=a#+(INSTR("01",MID$(b$,3,1))-1)*32
a#=a#+(INSTR("01",MID$(b$,4,1))-1)*16
a#=a#+(INSTR("01",MID$(b$,5,1))-1)*8
a#=a#+(INSTR("01",MID$(b$,6,1))-1)*4
a#=a#+(INSTR("01",MID$(b$,7,1))-1)*2
a#=a#+(INSTR("01",MID$(b$,8,1))-1)
IF a#<0 THEN
PRINT "only digits 0 or 1 allowed!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))+CHR$(a#)
GOTO compiled
ENDIF
IF a$="$" THEN
IF LEN(b$)<>2 THEN
PRINT "only values $00-$ff with 2 digits allowed!"
error#=1
GOTO fileend
ENDIF
a#=(INSTR("0123456789ABCDEF",LEFT$(b$,1))-1)*16
a#=a#+INSTR("0123456789ABCDEF",RIGHT$(b$,1))-1
IF a#<0 THEN
PRINT "only digits 0-f allowed!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))+CHR$(a#)
GOTO compiled
ENDIF
a$=a$+b$
IF STR$(VAL(a$))<>a$ THEN
PRINT "not a valid decimal value!"
error#=1
GOTO fileend
ENDIF
a#=VAL(a$)
IF a#<0 OR a#>255 THEN
PRINT "value `";a$(3);"' out of range!"
error#=1
GOTO fileend
ENDIF
bin$=CHR$(op#(tt#))+CHR$(a#)
GOTO compiled
compiled:
IF debug# THEN
PRINT LEN(bincode$);" gets ";LEN(bin$);" bytes. Opcode:";a$(1);". Paramter:";a$(2);". Var:";a$(3);".";
ENDIF
IF debug# THEN
IF LEN(bin$)=1 THEN
PRINT ASC(bin$)
ENDIF
IF LEN(bincode$)=2 THEN
PRINT ASC(LEFT$(bin$,1));",";ASC(RIGHT$(bin$,1))
ENDIF
ENDIF
bincode$=bincode$+bin$
GOTO getline
fileend:
CLOSE #1
RETURN
> PROCEDURE deflabel
IF pass#=2 THEN
GOTO nodefine
ENDIF
lb$(lb#)=label$
lb#(lb#)=LEN(bincode$)
IF debug# THEN
PRINT "label defined:";lb$(lb#),lb#(lb#)
ENDIF
lb#=lb#+1
nodefine:
RETURN
> PROCEDURE labelget
REM get adress l of a$(2)
IF pass#=1 THEN
l#=LEN(bincode$)
GOTO nogetlabel
ENDIF
l#=-1
IF lb#=0 THEN
GOTO nogetlabel
ENDIF
FOR i#=0 TO lb#-1
IF lb$(i#)=a$(2) THEN
IF l#<>-1 THEN
PRINT "error label declared twice: `";a$(2);"'"
ENDIF
l#=lb#(i#)
ENDIF
NEXT i#
nogetlabel:
RETURN
quit:
PRINT
PRINT "PRESS ENTER KEY TO EXIT"
quit1:
a$=INKEY$
IF a$<>CHR$(13) THEN
GOTO quit1
ENDIF
END
REM opcode,parameter,binvalue,1=singel 2=parameter 3=localjump 4=globaljump
DATA "ADD","A,=",3,2
DATA "ADD","A,@R0",96,1
DATA "ADD","A,@R1",97,1
DATA "ADD","A,R0",104,1
DATA "ADD","A,R1",105,1
DATA "ADD","A,R2",106,1
DATA "ADD","A,R3",107,1
DATA "ADD","A,R4",108,1
DATA "ADD","A,R5",109,1
DATA "ADD","A,R6",110,1
DATA "ADD","A,R7",111,1
DATA "ADDC","A,=",19,2
DATA "ADDC","A,@R0",112,1
DATA "ADDC","A,@R1",113,1
DATA "ADDC","A,R0",120,1
DATA "ADDC","A,R1",121,1
DATA "ADDC","A,R2",122,1
DATA "ADDC","A,R3",123,1
DATA "ADDC","A,R4",124,1
DATA "ADDC","A,R5",125,1
DATA "ADDC","A,R6",126,1
DATA "ADDC","A,R7",127,1
DATA "ANL","A,=",83,2
DATA "ANL","A,@R0",80,1
DATA "ANL","A,@R1",81,1
DATA "ANL","A,R0",88,1
DATA "ANL","A,R1",89,1
DATA "ANL","A,R2",90,1
DATA "ANL","A,R3",91,1
DATA "ANL","A,R4",92,1
DATA "ANL","A,R5",93,1
DATA "ANL","A,R6",94,1
DATA "ANL","A,R7",95,1
DATA "ANL","BUS,=",152,2
DATA "ANL","P1,=",153,2
DATA "ANL","P2,=",154,2
DATA "ANLD","P0,A",156,1
DATA "ANLD","P1,A",157,1
DATA "ANLD","P2,A",158,1
DATA "ANLD","P3,A",159,1
DATA "CALL","",20,4
DATA "CALL","",52,4
DATA "CALL","",84,4
DATA "CALL","",116,4
DATA "CALL","",148,4
DATA "CALL","",180,4
DATA "CALL","",212,4
DATA "CALL","",244,4
DATA "CLR","A",39,1
DATA "CLR","C",151,1
DATA "CLR","F0",133,1
DATA "CLR","F1",165,1
DATA "CPL","A",55,1
DATA "CPL","C",167,1
DATA "CPL","F0",149,1
DATA "CPL","F1",181,1
DATA "DA","A",87,1
DATA "DEC","A",7,1
DATA "DEC","R0",200,1
DATA "DEC","R1",201,1
DATA "DEC","R2",202,1
DATA "DEC","R3",203,1
DATA "DEC","R4",204,1
DATA "DEC","R5",205,1
DATA "DEC","R6",206,1
DATA "DEC","R7",207,1
DATA "DIS","I",21,1
DATA "DIS","TCNTI",53,1
DATA "DJNZ","R0,",232,3.5
DATA "DJNZ","R1,",233,3.5
DATA "DJNZ","R2,",234,3.5
DATA "DJNZ","R3,",235,3.5
DATA "DJNZ","R4,",236,3.5
DATA "DJNZ","R5,",237,3.5
DATA "DJNZ","R6,",238,3.5
DATA "DJNZ","R7,",239,3.5
DATA "EN","I",5,1
DATA "EN","TCNTI",37,1
DATA "ENT0","CLK",117,1
DATA "IN","A,P1",9,1
DATA "IN","A,P2",10,1
DATA "INC","@R0",16,1
DATA "INC","@R1",17,1
DATA "INC","A",23,1
DATA "INC","R0",24,1
DATA "INC","R1",25,1
DATA "INC","R2",26,1
DATA "INC","R3",27,1
DATA "INC","R4",28,1
DATA "INC","R5",29,1
DATA "INC","R6",30,1
DATA "INC","R7",31,1
DATA "INS","A,BUS",8,1
DATA "JB0","",18,3
DATA "JB1","",50,3
DATA "JB2","",82,3
DATA "JB3","",114,3
DATA "JB4","",146,3
DATA "JB5","",178,3
DATA "JB6","",210,3
DATA "JB7","",242,3
DATA "JC","",246,3
DATA "JF0","",182,3
DATA "JF1","",118,3
DATA "JMP","",4,4
DATA "JMP","",36,4
DATA "JMP","",68,4
DATA "JMP","",100,4
DATA "JMP","",132,4
DATA "JMP","",164,4
DATA "JMP","",196,4
DATA "JMP","",228,4
DATA "JMPP","@",179,1
DATA "JNC","",230,3
DATA "JNI","",134,3
DATA "JNT0","",38,3
DATA "JNT1","",70,3
DATA "JNZ","",150,3
DATA "JT0","",54,3
DATA "JT1","",86,3
DATA "JTF","",22,3
DATA "JZ","",198,3
DATA "MOV","@R0,=",176,2
DATA "MOV","@R0,A",160,1
DATA "MOV","@R1,=",177,2
DATA "MOV","@R1,A",161,1
DATA "MOV","A,=",35,2
DATA "MOV","A,@R0",240,1
DATA "MOV","A,@R1",241,1
DATA "MOV","A,PSW",199,1
DATA "MOV","A,R0",248,1
DATA "MOV","A,R1",249,1
DATA "MOV","A,R2",250,1
DATA "MOV","A,R3",251,1
DATA "MOV","A,R4",252,1
DATA "MOV","A,R5",253,1
DATA "MOV","A,R6",254,1
DATA "MOV","A,R7",255,1
DATA "MOV","A,T",66,1
DATA "MOV","PSW,A",215,1
DATA "MOV","R0,=",184,2
DATA "MOV","R0,A",168,1
DATA "MOV","R1,=",185,2
DATA "MOV","R1,A",169,1
DATA "MOV","R2,=",186,2
DATA "MOV","R2,A",170,1
DATA "MOV","R3,=",187,2
DATA "MOV","R3,A",171,1
DATA "MOV","R4,=",188,2
DATA "MOV","R4,A",172,1
DATA "MOV","R5,=",189,2
DATA "MOV","R5,A",173,1
DATA "MOV","R6,=",190,2
DATA "MOV","R6,A",174,1
DATA "MOV","R7,=",191,2
DATA "MOV","R7,A",175,1
DATA "MOV","T,A",98,1
DATA "MOVD","A,P0",12,1
DATA "MOVD","A,P1",13,1
DATA "MOVD","A,P2",14,1
DATA "MOVD","A,P3",15,1
DATA "MOVD","P0,A",60,1
DATA "MOVD","P1,A",61,1
DATA "MOVD","P2,A",62,1
DATA "MOVD","P3,A",63,1
DATA "MOVP","A,@A",163,1
DATA "MOVP3","A,@A",227,1
DATA "MOVX","@R0,A",144,1
DATA "MOVX","@R1,A",145,1
DATA "MOVX","A,@R0",128,1
DATA "MOVX","A,@R1",129,1
DATA "NOP","",0,1
DATA "ORL","A,=",67,2
DATA "ORL","A,@R0",64,1
DATA "ORL","A,@R1",65,1
DATA "ORL","A,R0",72,1
DATA "ORL","A,R1",73,1
DATA "ORL","A,R2",74,1
DATA "ORL","A,R3",75,1
DATA "ORL","A,R4",76,1
DATA "ORL","A,R5",77,1
DATA "ORL","A,R6",78,1
DATA "ORL","A,R7",79,1
DATA "ORL","BUS,=",136,2
DATA "ORL","P1,=",137,2
DATA "ORL","P2,=",138,2
DATA "ORLD","P0,A",140,1
DATA "ORLD","P1,A",141,1
DATA "ORLD","P2,A",142,1
DATA "ORLD","P3,A",143,1
DATA "OUTL","BUS,A",2,1
DATA "OUTL","P1,A",57,1
DATA "OUTL","P2,A",58,1
DATA "RET","",131,1
DATA "RETR","",147,1
DATA "RL","A",231,1
DATA "RLC","A",247,1
DATA "RR","A",119,1
DATA "RRC","A",103,1
DATA "SEL","MB0",229,1
DATA "SEL","MB1",245,1
DATA "SEL","RB0",197,1
DATA "SEL","RB1",213,1
DATA "STOP","TCNTI",101,1
DATA "STRT","CNT",69,1
DATA "STRT","T",85,1
DATA "SWAP","A",71,1
DATA "XCH","A,R0",32,1
DATA "XCH","A,R0",40,1
DATA "XCH","A,R1",33,1
DATA "XCH","A,R1",41,1
DATA "XCH","A,R2",42,1
DATA "XCH","A,R3",43,1
DATA "XCH","A,R4",44,1
DATA "XCH","A,R5",45,1
DATA "XCH","A,R6",46,1
DATA "XCH","A,R7",47,1
DATA "XCHD","A,@R0",48,1
DATA "XCHD","A,@R1",49,1
DATA "XRL","A,=",211,2
DATA "XRL","A,@R0",208,1
DATA "XRL","A,@R1",209,1
DATA "XRL","A,R0",216,1
DATA "XRL","A,R1",217,1
DATA "XRL","A,R2",218,1
DATA "XRL","A,R3",219,1
DATA "XRL","A,R4",220,1
DATA "XRL","A,R5",221,1
DATA "XRL","A,R6",222,1
DATA "XRL","A,R7",223,1
DATA "end","",0,0
REM end of code