URL
https://opencores.org/ocsvn/natalius_8bit_risc/natalius_8bit_risc/trunk
Subversion Repositories natalius_8bit_risc
Compare Revisions
- This comparison shows the changes necessary to convert path
/natalius_8bit_risc/trunk
- from Rev 1 to Rev 2
- ↔ Reverse comparison
Rev 1 → Rev 2
/assembler/assembler.py
0,0 → 1,229
#!/usr/bin/python |
|
import sys |
import re |
|
tipo1=['ldi','ldm','stm', 'adi'] |
tipo2=['cmp','add','sub','and','oor','xor'] |
tipo3=['jmp','jpz','jnz','jpc','jnc','csr', 'csz', 'cnz', 'csc', 'cnc'] |
tipo4=['sl0','sl1','sr0','sr1','rrl','rrr', 'not'] |
tipo5=['ret', 'nop'] |
#instruccion opcode |
opcodes={} |
opcodes['ldi']=2; |
opcodes['ldm']=3; |
opcodes['stm']=4; |
opcodes['cmp']=5; |
opcodes['add']=6; |
opcodes['sub']=7; |
opcodes['and']=8; |
opcodes['oor']=9; |
opcodes['xor']=10; |
opcodes['jmp']=11; |
opcodes['jpz']=12; |
opcodes['jnz']=13; |
opcodes['jpc']=14; |
opcodes['jnc']=15; |
opcodes['csr']=16; |
opcodes['ret']=17; |
opcodes['adi']=18; |
opcodes['csz']=19; |
opcodes['cnz']=20; |
opcodes['csc']=21; |
opcodes['cnc']=22; |
opcodes['sl0']=23; |
opcodes['sl1']=24; |
opcodes['sr0']=25; |
opcodes['sr1']=26; |
opcodes['rrl']=27; |
opcodes['rrr']=28; |
opcodes['not']=29; |
opcodes['nop']=30; |
|
|
|
def verify_args(line): |
if len(line)>1: |
line_split=line.split() |
opcode=line_split[0] |
if opcode in tipo1+tipo2+tipo4: |
args=re.findall(r'r(\d+)',line) |
else: |
return 'invalid command' |
|
if not opcode in tipo1+tipo2+tipo3+tipo4+tipo5: |
return 'invalid command' |
else: |
if opcode in tipo1: |
arg2=line.split(',') |
direccion=arg2[1] |
|
if len(args)!=1 : |
return 'incorrect number of arguments' |
else: |
if int(args[0])<0 or int(args[0])>7: |
return 'arg1 out of range (0-7)' |
else: |
if int(direccion)<0 or int(direccion)>255: |
return 'addr out of range (0-255)' |
else: |
return 'ok' |
|
if opcode in tipo2: |
if len(args)!=2: |
return 'incorrect number of arguments' |
else: |
if int(args[0])<0 or int(args[0])>7: |
return 'arg1 out of range (0-7)' |
else: |
if int(args[1])<0 or int(args[1])>7: |
return 'arg2 out of range (0-7)' |
else: |
return 'ok' |
if opcode in tipo3: |
addr=line_split[1] |
if len(line_split)!=2: |
return 'incorrect argument' |
else: |
if int(addr)<0 or int(addr)>2048: |
return 'addr out of range (0-2048)' |
else: |
return 'ok' |
|
if opcode in tipo4: |
if len(args)!=2 : |
return 'incorrect number of arguments' |
else: |
if int(args[1])<0 or int(args[1])>7: |
return 'arg1 out of range (0-7)' |
else: |
return 'ok' |
|
if opcode in tipo5: |
return 'ok' |
|
|
def extract_info(file,flag): |
tags={} |
f=open(file,'rU') |
text=f.read() |
f.close() |
text=text.lower() |
|
|
#para quitar los saltos de linea '\n' '\t' al final del archivo |
while text[-1]=='\n' or text[-1]=='\t' or text[-1]=='\s' or text[-1]=='\r': |
text=text[:-1] |
|
lines=text.split('\n') |
line_number=0 |
lines2=[] |
|
for line in lines: |
if len(line)!=0: |
line_split=line.split() |
opcode=line_split[0] |
if not opcode in tipo1+tipo2+tipo3+tipo4+tipo5: |
if not opcode in tags: |
tags[opcode]=line_number |
line=' '.join(line_split[1:]) |
line='\t'+line |
|
else: |
print 'label used more than once' |
|
lines2.append(line) |
line_number+=1 |
|
text2='\n'.join(lines2) |
##parte que se encarga de reemplazar los tags en las direcciones |
for tags_elements in tags.keys(): |
line2=text2.split(tags_elements) |
text2=str(tags[tags_elements]).join(line2) |
|
|
lines=text2.split('\n') |
error_line=0 |
text_asm='' |
for line in lines: |
erro=verify_args(line) |
if erro!='ok': |
print 'error in line:',error_line |
print line, '->', erro,'\n' |
else: |
line_split=line.split() |
opcode=line_split[0] |
if opcode in tipo1+tipo2+tipo4: |
args=re.findall(r'r(\d+)',line) |
if opcode in tipo1: |
arg2=line.split(',') |
direccion=arg2[1] |
dato=(opcodes[opcode]<<11) | (int(args[0])<<8) | int(direccion) |
text_asm+= '%X' % dato + '\n' |
if opcode in tipo2: |
dato=(opcodes[opcode]<<11) | (int(args[0])<<8) | (int(args[1])<<5) |
text_asm+= '%X' % dato + '\n' |
if opcode in tipo3: |
addr=line_split[1] |
dato=(opcodes[opcode]<<11) | int(addr) |
text_asm+= '%X' % dato + '\n' |
if opcode in tipo4: |
dato=(opcodes[opcode]<<11) | (int(args[1])<<8) |
text_asm+= '%X' % dato + '\n' |
if opcode in tipo5: |
dato=(opcodes[opcode]<<11) |
text_asm+= '%X' % dato + '\n' |
error_line+=1 |
|
line_show=text2.split('\n') |
line_text=text_asm.split('\n') |
|
if flag: |
print 'addr inst\t\t\t\tasm\n' |
for i in range(len(line_show)): |
esp=4-len(line_text[i]) |
val='' |
while esp: |
esp-=1 |
val+=' ' |
|
ntabs=5-len(str(i)) |
tab=' ' |
etab='' |
ctabs=0 |
while ctabs<ntabs: |
ctabs+=1 |
etab+=tab |
|
print str(i)+etab+line_text[i]+val+'\t'+line_show[i] |
|
line_zero='' |
|
for i in range(2048-len(line_show)): |
line_zero=line_zero+'0000\n' |
text_asm+=line_zero |
|
return text_asm |
|
def main(): |
|
args = sys.argv[1:] |
|
if not args: |
print 'uso: ./assembler.py [-s] archivo.asm' |
sys.exit(1) |
|
show = False |
if args[0] == '-s': |
show = True |
del args[0] |
|
text=extract_info(args[0],show) |
outf = open('instructions.mem', 'w') |
outf.write(text) |
outf.close() |
|
|
|
if __name__ == '__main__': |
main() |
/assembler/video_pong.asm
0,0 → 1,408
ldi r0,0 |
csr negro |
ldi r1,25 |
stm r1,21 |
stm r1,22 |
ldi r1,5 |
stm r1,11 |
ldi r1,75 |
stm r1,12 |
stm r0,5 |
stm r0,6 |
ldi r1,1 |
stm r0,8 |
stm r1,9 |
punto ldi r1,40 |
stm r1,10 |
ldi r1,30 |
stm r1,20 |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
csr dbl |
inicio csr marca |
csr vermarc |
csr negro |
csr marca |
ldm r2,21 |
ldm r5,32 |
ldi r6,1 |
and r6,r5 |
ldi r7,2 |
and r7,r5 |
sr0 r7 |
csr moli |
stm r2,21 |
ldm r2,22 |
ldm r5,32 |
ldi r6,4 |
and r6,r5 |
sr0 r6 |
sr0 r6 |
ldi r7,8 |
and r7,r5 |
sr0 r7 |
sr0 r7 |
sr0 r7 |
csr moli |
stm r2,22 |
csr cobo |
csr mobo |
ldm r1,11 |
ldm r2,21 |
ldi r4,7 |
csr lineav |
ldm r1,12 |
ldm r2,22 |
ldi r4,7 |
csr lineav |
csr bola |
csr delay |
csr delay |
csr delay |
csr delay |
ldi r7,1 |
stm r7,128 |
stm r0,128 |
jmp inicio |
delay ldi r1,0 |
ldi r2,0 |
ldi r3,255 |
pat04 cmp r1,r3 |
jpz pat03 |
pat02 cmp r2,r3 |
jpz pat01 |
adi r2,1 |
jmp pat02 |
pat01 adi r1,1 |
ldi r2,0 |
jmp pat04 |
pat03 ret |
bola ldm r1,10 |
ldm r2,20 |
ldi r4,7 |
stm r1,32 |
stm r2,64 |
stm r4,96 |
csr we |
ret |
mobo ldm r1,10 |
ldm r2,20 |
ldm r3,8 |
ldm r4,9 |
ldi r5,1 |
cmp r3,r5 |
jpz comp12 |
sub r2,r5 |
jmp comp13 |
comp12 adi r2,1 |
comp13 cmp r4,r5 |
jnz comp14 |
adi r1,1 |
jmp comp15 |
comp14 sub r1,r5 |
comp15 stm r1,10 |
stm r2,20 |
ret |
cobo ldm r1,10 |
ldm r2,20 |
ldi r3,78 |
ldi r4,58 |
ldi r7,2 |
cmp r1,r7 |
jnz comp04 |
ldm r6,6 |
adi r6,1 |
stm r6,6 |
ldi r6,1 |
stm r6,9 |
jmp punto |
comp04 cmp r1,r3 |
jnz comp05 |
ldm r6,5 |
adi r6,1 |
stm r6,5 |
stm r0,9 |
jmp punto |
comp05 cmp r2,r7 |
jnz comp06 |
ldi r6,1 |
stm r6,8 |
comp06 cmp r2,r4 |
jnz comp07 |
stm r0,8 |
comp07 ldm r3,11 |
ldm r4,21 |
adi r3,1 |
cmp r1,r3 |
jnz comp08 |
cmp r2,r4 |
jpz comp09 |
adi r4,1 |
cmp r2,r4 |
jpz comp09 |
adi r4,1 |
cmp r2,r4 |
jpz comp09 |
adi r4,1 |
cmp r2,r4 |
jpz comp09 |
adi r4,1 |
cmp r2,r4 |
jpz comp09 |
adi r4,1 |
cmp r2,r4 |
jnz comp08 |
comp09 ldi r6,1 |
stm r6,9 |
comp08 ldm r3,12 |
ldi r6,1 |
ldm r4,22 |
sub r4,r6 |
cmp r1,r3 |
jnz comp10 |
cmp r2,r4 |
jpz comp11 |
adi r4,1 |
cmp r2,r4 |
jpz comp11 |
adi r4,1 |
cmp r2,r4 |
jpz comp11 |
adi r4,1 |
cmp r2,r4 |
jpz comp11 |
adi r4,1 |
cmp r2,r4 |
jpz comp11 |
adi r4,1 |
cmp r2,r4 |
jnz comp10 |
comp11 stm r0,9 |
comp10 ret |
moli ldi r3,1 |
ldi r4,55 |
ldi r5,2 |
cmp r6,r3 |
jnz comp03 |
cmp r2,r3 |
jpz finmol |
sub r2,r5 |
comp03 cmp r7,r3 |
jnz finmol |
cmp r2,r4 |
jpz finmol |
add r2,r5 |
finmol ret |
marca ldm r5,5 |
ldi r1,19 |
ldi r2,5 |
ldi r4,6 |
csr impnum |
ldm r5,6 |
ldi r1,57 |
ldi r2,5 |
csr impnum |
ret |
vermarc ldm r1,5 |
ldm r2,6 |
ldi r3,6 |
cmp r1,r3 |
jnz comp01 |
ldm r1,12 |
ldm r2,22 |
ldi r4,4 |
csr lineav |
gana1 jmp gana1 |
comp01 ldi r3,6 |
cmp r2,r3 |
jnz comp02 |
ldm r1,11 |
ldm r2,21 |
ldi r4,4 |
csr lineav |
gana2 jmp gana2 |
comp02 ret |
lineav ldi r3,5 |
add r3,r2 |
con cmp r2,r3 |
jnc ter |
stm r2, 64 |
stm r1, 32 |
stm r4, 96 |
csr we |
adi r2,1 |
jmp con |
ter ret |
negro ldi r7,1 |
stm r7,160 |
stm r0,96 |
ldi r1,80 |
ldi r2,60 |
ldi r3,0 |
ldi r4,0 |
nextc cmp r4,r1 |
jpz inc_fil |
stm r3,64 |
stm r4,32 |
adi r4,1 |
jmp nextc |
inc_fil ldi r4,0 |
cmp r3,r2 |
jpz fneg |
adi r3,1 |
jmp nextc |
fneg stm r0,160 |
ret |
we ldi r7,1 |
stm r7,160 |
ldi r7,0 |
stm r7,160 |
ret |
dbl csr delay |
csr delay |
csr delay |
ldm r1,11 |
ldm r2,21 |
ldi r4,2 |
csr lineav |
ldm r1,12 |
ldm r2,22 |
ldi r4,2 |
csr lineav |
csr bola |
ret |
segh ldi r3,3 |
add r3,r1 |
pon1 cmp r1,r3 |
jpz mer1 |
stm r2, 64 |
stm r1, 32 |
stm r4, 96 |
csr we |
adi r1,1 |
jmp pon1 |
mer1 ldi r3,3 |
sub r1,r3 |
ret |
segv ldi r3,3 |
add r3,r2 |
pon2 cmp r2,r3 |
jpz mer2 |
stm r2, 64 |
stm r1, 32 |
stm r4, 96 |
csr we |
adi r2,1 |
jmp pon2 |
mer2 ldi r3,3 |
sub r2,r3 |
ret |
sega csr segh |
ret |
segb ldi r7,2 |
add r1,r7 |
csr segv |
ldi r7,2 |
sub r1,r7 |
ret |
segc ldi r7,2 |
add r1,r7 |
add r2,r7 |
csr segv |
ldi r7,2 |
sub r1,r7 |
sub r2,r7 |
ret |
segd ldi r7,4 |
adi r2,4 |
csr segh |
ldi r7,4 |
sub r2,r7 |
ret |
sege ldi r7,2 |
adi r2,2 |
csr segv |
ldi r7,2 |
sub r2,r7 |
ret |
segf csr segv |
ret |
segg ldi r7,2 |
adi r2,2 |
csr segh |
ldi r7,2 |
sub r2,r7 |
ret |
impnum ldi r7,1 |
cmp r5,r7 |
jpz num01 |
ldi r7,4 |
cmp r5,r7 |
jpz num01 |
csr sega |
num01 ldi r7,5 |
cmp r5,r7 |
jpz num02 |
ldi r7,6 |
cmp r5,r7 |
jpz num02 |
csr segb |
num02 ldi r7,2 |
cmp r5,r7 |
jpz num03 |
csr segc |
num03 ldi r7,1 |
cmp r5,r7 |
jpz num04 |
ldi r7,4 |
cmp r5,r7 |
jpz num04 |
ldi r7,7 |
cmp r5,r7 |
jpz num04 |
csr segd |
num04 ldi r7,0 |
cmp r5,r7 |
jpz num05 |
ldi r7,2 |
cmp r5,r7 |
jpz num05 |
ldi r7,6 |
cmp r5,r7 |
jpz num05 |
ldi r7,8 |
cmp r5,r7 |
jnz num06 |
num05 csr sege |
num06 ldi r7,1 |
cmp r5,r7 |
jpz num07 |
ldi r7,2 |
cmp r5,r7 |
jpz num07 |
ldi r7,3 |
cmp r5,r7 |
jpz num07 |
ldi r7,7 |
cmp r5,r7 |
jpz num07 |
csr segf |
num07 ldi r7,0 |
cmp r5,r7 |
jpz num08 |
ldi r7,1 |
cmp r5,r7 |
jpz num08 |
csr segg |
num08 ret |
/assembler/example.asm
0,0 → 1,22
csr negro |
end jmp end |
|
negro stm r0,32 |
ldi r1,80 |
ldi r2,60 |
ldi r3,0 |
ldi r4,0 |
nextc cmp r4,r1 |
jpz inc_fil |
stm r3,64 |
stm r4,32 |
adi r4,1 |
jmp nextc |
inc_fil ldi r4,0 |
cmp r3,r2 |
jpz fneg |
adi r3,1 |
jmp nextc |
fneg ret |
|
|