RISCV = /opt/riscv
#RISCV = /opt/rv32im
TARGET = riscv64-unknown-elf
CC = ${RISCV}/bin/${TARGET}-gcc -march=rv32im -mabi=ilp32
CXX = ${RISCV}/bin/${TARGET}-g++ -march=rv32im -mabi=ilp32
AS = ${RISCV}/bin/${TARGET}-as
LD = ${RISCV}/bin/${TARGET}-ld
STRIP = ${RISCV}/bin/${TARGET}-strip
GDB = ${RISCV}/bin/${TARGET}-gdb
PK = ${RISCV}/${TARGET}/bin/pk
DUMP= ${RISCV}/${TARGET}/bin/objdump
READELF= ${RISCV}/bin/${TARGET}-readelf

BINCONV=java BinaryConverter
BINCONV2=java BinaryConverter2
QEMU=qemu-riscv32

GFLAGS= -g -Wall -pedantic -std=c99
OFLAGS= -O -Wall -pedantic -std=c99
CFLAGS= ${OFLAGS}
LDFLAGS=

all:
	@less README.txt

factor.lrv: factor.o test-factor.o
factor.o test-factor.o: factor.h

%.s: %.c
	${CC} -S ${OFLAGS} $<

%.o: %.s
	${CC} -c $<

%.dump: %.lrv
	$(DUMP) -S $(*F).lrv | less

%.ddd-l: %.lrv
	ddd --debugger ${GDB} --command target.gdb $(*F).lrv &
	@echo "No es muy util tratar de depurar este binario en ddd."
	@echo "Si es util para desensamblar el codigo que se esta ejecutando"
	@echo "en Logisim.  Vea la direccion en el tunel PC (abajo a la"
	@echo "izquierda). Si la direccion es 0x10150 por ejemplo, desensable"
	@echo "con este comando de ddd: x/20i 0x10150"
	@echo "Eso mostrara las siguientes 20 instrucciones que"
	@echo "se van a ejecutar."
	${QEMU} -g 1234 $(*F).lrv

%.rom: %.c
	gcc $(GFLAGS) $(*F).c -o $(*F)
	./$(*F)

ucode.rom: ucode
	./ucode

ucode: ucode.c
	gcc $(GFLAGS) ucode.c -o ucode

%.qemu-O: %.o term-qemu.o
	make "CFLAGS=$(OFLAGS)" $^
	${CC} ${LDFLAGS} $^ ${LDLIBS} -o $@

%.qemu-g: %.o term-qemu.o
	make "CFLAGS=$(GFLAGS)" $^
	${CC} -g ${LDFLAGS} $^ ${LDLIBS} -o $@

%.run-O: %.qemu-O
	${QEMU} $<

%.ddd-g: %.qemu-g
	ddd --debugger ${GDB} --command target.gdb $^ &
	@echo "Coloque los breakpoints que necesite"
	@echo "Para comenzar la ejecucion, ingrese en ddd: cont"
	@echo "Si necesita ejecutar nuevamente, ingrese en ddd: kill"
	@echo "Y ejecute en el terminal: make $(*F).rerun-g"
	@echo "Luego ejecute en ddd: target remote localhost:1234"
	@echo "Y finalmente en ddd: cont"
	${QEMU} -g 1234 $(*F).qemu-g

%.rerun-g: %.qemu-g
	@echo "Ejecute en ddd: target remote localhost:1234"
	@echo "Y luego: cont"
	${QEMU} -g 1234 $(*F).qemu-g

%.lrv: %.o term.o crt0.o
	${CC} ${LDFLAGS} $^ ${LDLIBS} -o $@

%.ram: %.lrv
	${DUMP} -s $< | ${BINCONV2} `${READELF} -a $< | grep " _LRV32IM_start"` > $@

#	${DUMP} -s $< | ${BINCONV2} `${READELF} -a $< | grep " _start"` > $@

clean:
	rm -f *.o *.ram *.rom ucode *.lrv *.qemu-O *.qemu-g ucode-up ucode-intr ucode-up-intr
