Skip to content

Commit a707474

Browse files
committed
+#include <avr/io.h>, simple test for NEXT (just compile/disassm)
1 parent 513cea7 commit a707474

File tree

7 files changed

+138
-9
lines changed

7 files changed

+138
-9
lines changed

README.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@ This project builds memxFORTH directly from assembler and try to be memory-effec
4949
__attribute__((naked, noreturn)) void function_A(void) { ... ;EIJMP; }
5050
5151
52+
.. code::
53+
54+
__attribute__((naked, noreturn))
55+
void jump_to(uint32_t addr) {
56+
__asm__ __volatile__ (
57+
"mov r30, r22\n\t"
58+
"mov r31, r23\n\t"
59+
"out %[_RAMPZ], r24\n\t"
60+
"eijmp\n\t"
61+
:
62+
: [_RAMPZ] "I" (_SFR_IO_ADDR(RAMPZ))
63+
);
64+
}
5265
5366
5467
License

SW/libs/FORTH/FORTH-Engine/FORTH-Engine.S

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <avr/io.h>
12
#include "../FORTH-Defines/FORTH-Defines.h"
23
; r2+Y = IP
34

@@ -11,34 +12,34 @@ NEXT:
1112
// DT=*IP; IP++; jmp **DT
1213
sbrc IP_hlo,7; skip if 0x80 not set (=FLASH)
1314
rjmp 1f
14-
out RAMPZ, IP_hlo
15+
out _SFR_IO_ADDR(RAMPZ), IP_hlo
1516
movw ZL, IP_lo
1617
elpm DT_lo, Z+
1718
elpm DT_hi, Z+
1819
elpm DT_hlo, Z+
1920
adiw IP_lo, 3
2021
rjmp 2f
2122
1:
22-
ldd DT_lo, Y+
23-
ldd DT_hi, Y+
24-
ldd DT_hlo, Y+
23+
ld DT_lo, Y+
24+
ld DT_hi, Y+
25+
ld DT_hlo, Y+
2526
2:
2627
movw ZL, DT_lo
2728
sbrc DT_hlo,7
2829
rjmp 1f
29-
out RAMPZ, DT_hlo
30+
out _SFR_IO_ADDR(RAMPZ), DT_hlo
3031
elpm r24, Z+
3132
elpm r25, Z+
3233
elpm r23, Z+ // hlo
3334
movw ZL, r24
34-
out EIND, r23
35+
out _SFR_IO_ADDR(EIND), r23
3536
eijmp
3637
1:
3738
ldd r24, Z+0
3839
ldd r25, Z+1
3940
ldd r23, Z+2// hlo
4041
movw ZL, r24
41-
out EIND, r23
42+
out _SFR_IO_ADDR(EIND), r23
4243
eijmp
4344
; === ====
4445

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,8 @@
1-
; === NEXT uses EIJMP to move
1+
#ifndef FORTH_ENGINE_H
2+
#define FORTH_ENGINE_H
3+
// ; === NEXT uses EIJMP to move
4+
// __attribute__((naked, noreturn)) void NEXT();
5+
void NEXT();
26

7+
8+
#endif

SW/progs/demo/serial_out/Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ $(TARGET).dis: $(BUILD)/$(TARGET).elf Makefile
6060
$(OBJDUMP) --disassemble --source --line-numbers --demangle -z --section=.text --section=.data --section=.bss $< > $@
6161

6262
upload: $(BUILD)/$(TARGET).hex
63-
/usr/bin/avrdude -v -V -p atmega2560 -D -c wiring -b 115200 -P /dev/ttyACM0 -U flash:w:$<:i
63+
/usr/bin/avrdude -v -V -p $(MCU) -D -c wiring -b 115200 -P /dev/ttyACM0 -U flash:w:$<:i
64+
65+
ispload: $(BUILD)/$(TARGET).hex
66+
/usr/bin/avrdude -v -V -p $(MCU) -c usbasp -b 115200 -U flash:w:$<:i
6467

6568
monitor:
6669
picocom -b 115200 --flow n --noreset --quiet /dev/ttyACM0
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <avr/io.h>
2+
#include <avr/interrupt.h>
3+
// LIBS: Serial/usart0 FORTH/FORTH-Engine
4+
5+
#include "Serial/usart0/usart0.h"
6+
#include "FORTH/FORTH-Engine/FORTH-Engine.h"
7+
8+
9+
void setup(void) {
10+
usart0_setup();
11+
DDRF = 0xFF;
12+
DDRK = 0xFF;
13+
sei();
14+
}
15+
16+
void loop(void) {
17+
uint8_t rx_avail = RX0_Available();
18+
PORTK = rx_avail;
19+
20+
uint8_t tx_used = TX0_Used();
21+
PORTF = tx_used;
22+
23+
uint16_t ch = RX0_Read();
24+
if (ch >> 8) { // Pokud r25 != 0
25+
TX0_Write((char)(ch & 0xFF)); // Blokuje dokud není volno
26+
}
27+
__asm__ __volatile__ ("jmp NEXT \n\t");
28+
NEXT();
29+
}
30+
31+
int main(void) {
32+
setup();
33+
while (1) {
34+
loop();
35+
}
36+
}
37+

SW/progs/test/FORTH_c_001/Makefile

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
BUILD ?= build-mega-atmega2560
2+
# MCU & nástroje
3+
MCU ?= atmega2560
4+
CC = avr-gcc
5+
OBJCOPY = avr-objcopy
6+
OBJDUMP = avr-objdump
7+
8+
LIB_PREFIX = ../../../libs
9+
Ilibs = -I$(LIB_PREFIX)
10+
11+
CFLAGS = -Os -mmcu=$(MCU) -std=gnu99 -ffreestanding -fno-exceptions -fno-unwind-tables $(Ilibs)
12+
ASFLAGS = -mmcu=$(MCU)
13+
LDFLAGS = -Wl,-Ttext=0
14+
15+
SRC ?= $(notdir $(CURDIR)).c
16+
TARGET := $(notdir $(CURDIR))
17+
18+
# ========== Automatická detekce knihoven ==========
19+
# Vyhledá řádky jako: .* LIBS: serial file
20+
21+
LIB_NAMES := $(shell grep -o '\<LIBS:.*' $(SRC) | sed 's/^.*\<LIBS: //' | tr ' ' '\n' | sort -u)
22+
LIB_OBJS := $(foreach lib,$(LIB_NAMES),$(LIB_PREFIX)/$(lib)/$(BUILD)/$(notdir $(lib)).o)
23+
24+
OBJS = $(BUILD)/$(TARGET).o $(LIB_OBJS)
25+
# OBJS=\
26+
$(LIB_PREFIX)/Serial/usart0/$(BUILD)/usart0.o \
27+
$(BUILD)/$(TARGET).o
28+
# ========== Build pravidla ==========
29+
30+
all: $(BUILD)/$(TARGET).hex $(TARGET).dis | $(BUILD)/
31+
32+
%/:
33+
mkdir -p $@
34+
35+
$(BUILD)/$(TARGET).elf: $(OBJS) | $(BUILD)/
36+
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS)
37+
define LIB_RULE_template
38+
$(LIB_PREFIX)/$(1)/$(BUILD)/$(notdir $(1)).o: $(LIB_PREFIX)/$(1)/*
39+
$(MAKE) -C $(LIB_PREFIX)/$(1) MCU=$(MCU) BUILD=$(BUILD) $(BUILD)/$(notdir $(1)).o
40+
endef
41+
42+
$(BUILD)/%.o: %.c | $(BUILD)/
43+
$(CC) $(CFLAGS) -c $< -o $@
44+
45+
$(BUILD)/%.o: %.S | $(BUILD)/
46+
$(CC) $(ASFLAGS) -c $< -o $@
47+
48+
$(foreach lib,$(LIB_NAMES),$(eval $(call LIB_RULE_template,$(lib))))
49+
50+
$(BUILD)/$(TARGET).hex: $(BUILD)/$(TARGET).elf
51+
$(OBJCOPY) -O ihex -R .eeprom $< $@
52+
53+
$(TARGET).dis: $(BUILD)/$(TARGET).elf Makefile
54+
$(OBJDUMP) --disassemble --source --line-numbers --demangle -z --section=.text --section=.data --section=.bss $< > $@
55+
56+
upload: $(BUILD)/$(TARGET).hex
57+
/usr/bin/avrdude -v -V -p atmega2560 -D -c wiring -b 115200 -P /dev/ttyACM0 -U flash:w:$<:i
58+
59+
monitor:
60+
picocom -b 115200 --flow n --noreset --quiet /dev/ttyACM0
61+
62+
upload_monitor: upload monitor
63+
64+
clean:
65+
rm -f *.o *.elf *.hex *.dis
66+
rm -rf $(BUILD)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Simple USART echo, with LEDs on PortF and PortK showing usage of RX and TX buffers
2+
use speed 115200
3+
Rewritten to C, with prologue and INTs via __vector_xx

0 commit comments

Comments
 (0)