From 3524892f801830708ccd13d2a90c622555bc6f11 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Tue, 28 Nov 2023 17:45:20 -0800 Subject: [PATCH 1/8] Add quick uart irq test --- hw/efinix_fpga/simulation/Makefile | 2 +- .../simulation/tbs/uart_irq_code_tb.sv | 36 ++++++++++++++++ sw/test_code/uart_irq_test/Makefile | 42 +++++++++++++++++++ sw/test_code/uart_irq_test/link.ld | 35 ++++++++++++++++ sw/test_code/uart_irq_test/main.s | 35 ++++++++++++++++ sw/test_code/uart_irq_test/vectors.s | 14 +++++++ 6 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 hw/efinix_fpga/simulation/tbs/uart_irq_code_tb.sv create mode 100644 sw/test_code/uart_irq_test/Makefile create mode 100644 sw/test_code/uart_irq_test/link.ld create mode 100644 sw/test_code/uart_irq_test/main.s create mode 100644 sw/test_code/uart_irq_test/vectors.s diff --git a/hw/efinix_fpga/simulation/Makefile b/hw/efinix_fpga/simulation/Makefile index 63fa1ed..b304dde 100644 --- a/hw/efinix_fpga/simulation/Makefile +++ b/hw/efinix_fpga/simulation/Makefile @@ -11,7 +11,7 @@ TEST_PROGRAM?=$(REPO_TOP)/sw/test_code/$(TEST_PROGRAM_NAME)/$(TEST_PROGRAM_NAME) STANDALONE_TB= interrupt_controller_tb mapper_tb rtc_tb uart_irq_tb CODE_TB= interrupt_controller_code_tb mapper_code_tb rtc_code_tb \ - devices_setup_code_tb + devices_setup_code_tb uart_irq_code_tb #TODO implement something like sources.list diff --git a/hw/efinix_fpga/simulation/tbs/uart_irq_code_tb.sv b/hw/efinix_fpga/simulation/tbs/uart_irq_code_tb.sv new file mode 100644 index 0000000..4c63a70 --- /dev/null +++ b/hw/efinix_fpga/simulation/tbs/uart_irq_code_tb.sv @@ -0,0 +1,36 @@ +`timescale 1ns/1ps + +module uart_irq_code_tb(); + +sim_top u_sim_top(); + +always begin + if ( + u_sim_top.w_cpu_addr == 16'h0 && + u_sim_top.w_cpu_we == '1 + ) begin + if (u_sim_top.w_cpu_data_from_cpu == 8'h6d) begin + $display("Good finish!"); + $finish(); + end else begin + $display("Bad finish!"); + $finish_and_return(-1); + end + end + # 1; +end + +initial begin + repeat(15000) @(posedge u_sim_top.r_clk_cpu) + u_sim_top.u_sim_uart.tx_en = 1; + @(posedge u_sim_top.r_clk_cpu); + u_sim_top.u_sim_uart.tx_data = 8'hAA; + repeat (100) @(posedge u_sim_top.r_clk_cpu); + $finish(); +end + +always @(u_sim_top.u_dut.u_rtc.r_output) begin + $display("counter: %d", u_sim_top.u_dut.u_rtc.r_output); +end + +endmodule \ No newline at end of file diff --git a/sw/test_code/uart_irq_test/Makefile b/sw/test_code/uart_irq_test/Makefile new file mode 100644 index 0000000..9e16104 --- /dev/null +++ b/sw/test_code/uart_irq_test/Makefile @@ -0,0 +1,42 @@ +CC=../../cc65/bin/cl65 +LD=../../cc65/bin/cl65 +CFLAGS=-T -t none -I. --cpu "65C02" +LDFLAGS=-C link.ld -m $(NAME).map + +NAME=uart_irq_test + +DEVICES=$(REPO_TOP)/sw/kernel/devices + +BIN=$(NAME).bin +HEX=$(NAME).hex + +LISTS=lists + +SRCS=$(wildcard *.s) $(wildcard *.c) +SRCS+=$(DEVICES)/interrupt_controller.s +SRCS+=$(wildcard **/*.s) $(wildcard **/*.c) +OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) +OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) + +# Make sure the kernel linked to correct address, no relocation! +all: $(HEX) + +$(HEX): $(BIN) + objcopy --input-target=binary --output-target=verilog $(BIN) $(HEX) + +$(BIN): $(OBJS) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $@ + +%.o: %.c $(LISTS) + $(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@ + +%.o: %.s $(LISTS) + $(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@ + +$(LISTS): + mkdir -p $(addprefix $(LISTS)/,$(sort $(dir $(SRCS)))) + +.PHONY: clean +clean: + rm -rf $(OBJS) $(BIN) $(HEX) $(LISTS) $(NAME).map + diff --git a/sw/test_code/uart_irq_test/link.ld b/sw/test_code/uart_irq_test/link.ld new file mode 100644 index 0000000..66a42fe --- /dev/null +++ b/sw/test_code/uart_irq_test/link.ld @@ -0,0 +1,35 @@ +MEMORY +{ + ZP: start = $0, size = $100, type = rw, define = yes; + SDRAM: start = $9200, size = $4d00, type = rw, define = yes; + ROM: start = $F000, size = $1000, file = %O; +} + +SEGMENTS { + ZEROPAGE: load = ZP, type = zp, define = yes; + DATA: load = ROM, type = rw, define = yes, run = SDRAM; + BSS: load = SDRAM, type = bss, define = yes; + HEAP: load = SDRAM, type = bss, optional = yes; + STARTUP: load = ROM, type = ro; + ONCE: load = ROM, type = ro, optional = yes; + CODE: load = ROM, type = ro; + RODATA: load = ROM, type = ro; + VECTORS: load = ROM, type = ro, start = $FFFA; +} + +FEATURES { + CONDES: segment = STARTUP, + type = constructor, + label = __CONSTRUCTOR_TABLE__, + count = __CONSTRUCTOR_COUNT__; + CONDES: segment = STARTUP, + type = destructor, + label = __DESTRUCTOR_TABLE__, + count = __DESTRUCTOR_COUNT__; +} + +SYMBOLS { + # Define the stack size for the application + __STACKSIZE__: value = $0200, type = weak; + __STACKSTART__: type = weak, value = $0800; # 2k stack +} diff --git a/sw/test_code/uart_irq_test/main.s b/sw/test_code/uart_irq_test/main.s new file mode 100644 index 0000000..9ce4fbb --- /dev/null +++ b/sw/test_code/uart_irq_test/main.s @@ -0,0 +1,35 @@ +.export _init, nmi_int, irq_int + +.autoimport + +.import _init_interrupt_controller + +.zeropage + +finish: .res 1 + +.code + +nmi_int: +irq_int: + lda #$6d + sta $00 + +_init: + ldx #$ff + txs + + LDA #<(__STACKSTART__ + __STACKSIZE__) + STA sp + LDA #>(__STACKSTART__ + __STACKSIZE__) + STA sp+1 + + ; enable interrupt 0 + lda #$00 + jsr pusha + lda #$1 + jsr _enable_irq + + cli + +@end: bra @end \ No newline at end of file diff --git a/sw/test_code/uart_irq_test/vectors.s b/sw/test_code/uart_irq_test/vectors.s new file mode 100644 index 0000000..73c2865 --- /dev/null +++ b/sw/test_code/uart_irq_test/vectors.s @@ -0,0 +1,14 @@ +; --------------------------------------------------------------------------- +; vectors.s +; --------------------------------------------------------------------------- +; +; Defines the interrupt vector table. + +.import _init +.import nmi_int, irq_int + +.segment "VECTORS" + +.addr nmi_int ; NMI vector +.addr _init ; Reset vector +.addr irq_int ; IRQ/BRK vector \ No newline at end of file From fd9ccdbce47d6d3ca1527626249f80e3689bb617 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Tue, 28 Nov 2023 22:54:26 -0800 Subject: [PATCH 2/8] Add serial driver and irq support --- sw/kernel/devices/sd_card.c | 12 +++- sw/kernel/devices/serial.h | 17 ++++++ sw/kernel/devices/serial.s | 94 ++++++++++++++++++++++++++++++++ sw/kernel/interrupts/interrupt.s | 4 +- sw/kernel/kernel.c | 15 ++++- 5 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 sw/kernel/devices/serial.h create mode 100644 sw/kernel/devices/serial.s diff --git a/sw/kernel/devices/sd_card.c b/sw/kernel/devices/sd_card.c index 8eaf708..4dd6a4e 100644 --- a/sw/kernel/devices/sd_card.c +++ b/sw/kernel/devices/sd_card.c @@ -339,12 +339,16 @@ token = 0xFF - response timeout *******************************************************************************/ uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) { + + (void)addr; + (void)buf; + (void)token; + + /* uint16_t readAttempts; uint8_t res1, read; uint16_t i; - /* - // set token to none *token = 0xFF; @@ -391,9 +395,11 @@ uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) spi_deselect(0); spi_exchange(0xFF); + return res1; + */ - return res1; + return 0; } /******************************************************************************* diff --git a/sw/kernel/devices/serial.h b/sw/kernel/devices/serial.h new file mode 100644 index 0000000..2f85df4 --- /dev/null +++ b/sw/kernel/devices/serial.h @@ -0,0 +1,17 @@ +#ifndef _SERIAL_H +#define _SERIAL_H + +#include + +void serial_handle_irq(); + +void serial_init(); + +void serial_putc(char c); +void serial_puts(char* s); + + +char serial_getc(); +char serial_getc_nb(); + +#endif \ No newline at end of file diff --git a/sw/kernel/devices/serial.s b/sw/kernel/devices/serial.s new file mode 100644 index 0000000..0203826 --- /dev/null +++ b/sw/kernel/devices/serial.s @@ -0,0 +1,94 @@ +.MACPACK generic + +.autoimport + +.import _enable_irq, _send_eoi, _uart_txb_block + +.importzp tmp1, ptr1 + +.export _serial_init +.export _serial_handle_irq + +.export _serial_putc, _serial_puts, _serial_getc, _serial_get_nb + +.zeropage + +last_char: .res 1 + + +.code + +UART = $efe6 +UART_TXB = UART +UART_RXB = UART +UART_STATUS = UART + 1 + +; Initialize Serial Port +; No initialization needed, just register irq handler. +.proc _serial_init + lda #<_serial_handle_irq + ldx #>_serial_handle_irq + jsr pushax + lda #$01 + jsr _register_irq + stz last_char + rts +.endproc + +; Serial Port IRQ Handler +; Get the character and store it. +.proc _serial_handle_irq + lda UART_RXB + sta last_char + ora #$80 ; set msb + jsr _send_eoi + rti +.endproc + +; Serial Port Get Character +; If a character has not been received, block until one is. +.proc _serial_getc +L1: lda last_char + bpl L1 + and #$7f + sta last_char + rts +.endproc + +; Serial Port Get Character Non-Blocking +; return last character, even if it has already been read. +; If the character is new, we still clear the new flag. +.proc _serial_get_nb + lda last_char + bpl L1 + and #$7f + sta last_char +L1: rts +.endproc + + +; Serial Port Put Character +; send a single character over the serial port. +.proc _serial_putc + jsr _uart_txb_block + cmp #$0a + bne @1 + lda #$0d + jsr _uart_txb_block +@1: rts +.endproc + +; Send a string over the serial port. Needs stlen +.proc _serial_puts + sta ptr1 ; Store pointer in ptr1 + stx ptr1+1 + ldy #$00 ; initialize y to 0 +L1: lda (ptr1),y ; load character from string + beq L2 ; Quit if NULL + jsr _uart_txb_block ; send character (does not change y or ptr1) + iny ; increment y + bne L1 ; If Y == 0, increment high byte of pointer + inc ptr1+1 + bne L1 ; if high byte wraps around, give up +L2: rts +.endproc \ No newline at end of file diff --git a/sw/kernel/interrupts/interrupt.s b/sw/kernel/interrupts/interrupt.s index 0344b0a..ede0000 100644 --- a/sw/kernel/interrupts/interrupt.s +++ b/sw/kernel/interrupts/interrupt.s @@ -48,7 +48,7 @@ rti sta IRQ_CMD_ADDR lda IRQ_DAT_ADDR ; shift by 2 (oh so only 128 interrupts are supported lol) - lsr + asl tax jmp (irq_table,x) ; use that to index jump table @@ -56,6 +56,7 @@ rti ; void register_irq(void* addr, uint8_t irqn); .proc _register_irq + asl tax jsr popa sta irq_table,x @@ -65,6 +66,7 @@ rti lda #$00 jsr pusha txa + lsr jsr _enable_irq rts .endproc diff --git a/sw/kernel/kernel.c b/sw/kernel/kernel.c index 6441fb3..6870a2e 100644 --- a/sw/kernel/kernel.c +++ b/sw/kernel/kernel.c @@ -3,6 +3,7 @@ #include "interrupts/interrupt.h" #include "devices/mapper.h" #include "devices/rtc.h" +#include "devices/serial.h" void handle_rtc_interrupt() { @@ -14,6 +15,8 @@ void handle_rtc_interrupt() { int main() { + uint8_t c; + cputs("Kernel\n"); cputs("Init Mapper\n"); @@ -32,9 +35,15 @@ int main() { asm volatile("cli"); - // cputs("Initialize Serial\n"); - // // init_serial(); - // enable_irq(2, IRQ_EDGE); + cputs("Initialize Serial\n"); + serial_init(); + + serial_puts("Hello from serial!\n"); + + c = serial_getc(); + + serial_puts("Got a character!: "); + serial_putc(c); while(1); From e73d8db74ce9560bd9c701bdc3a455c6deddb9ae Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Tue, 28 Nov 2023 23:23:31 -0800 Subject: [PATCH 3/8] Serial Fix Fixes a typo with getc_nb, removes the RTC tick code (since we know it works now and it is clogging up the screen), read characters in a loop instead of just once. --- sw/kernel/devices/serial.s | 6 +++--- sw/kernel/kernel.c | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sw/kernel/devices/serial.s b/sw/kernel/devices/serial.s index 0203826..89b60c8 100644 --- a/sw/kernel/devices/serial.s +++ b/sw/kernel/devices/serial.s @@ -9,7 +9,7 @@ .export _serial_init .export _serial_handle_irq -.export _serial_putc, _serial_puts, _serial_getc, _serial_get_nb +.export _serial_putc, _serial_puts, _serial_getc, _serial_getc_nb .zeropage @@ -39,8 +39,8 @@ UART_STATUS = UART + 1 ; Get the character and store it. .proc _serial_handle_irq lda UART_RXB - sta last_char ora #$80 ; set msb + sta last_char jsr _send_eoi rti .endproc @@ -58,7 +58,7 @@ L1: lda last_char ; Serial Port Get Character Non-Blocking ; return last character, even if it has already been read. ; If the character is new, we still clear the new flag. -.proc _serial_get_nb +.proc _serial_getc_nb lda last_char bpl L1 and #$7f diff --git a/sw/kernel/kernel.c b/sw/kernel/kernel.c index 6870a2e..6c67395 100644 --- a/sw/kernel/kernel.c +++ b/sw/kernel/kernel.c @@ -8,7 +8,7 @@ void handle_rtc_interrupt() { // cputs("In IRQ interrupt!\n"); - cputc('A'); + // cputc('A'); send_eoi(); asm volatile ("rti"); } @@ -40,12 +40,12 @@ int main() { serial_puts("Hello from serial!\n"); - c = serial_getc(); - - serial_puts("Got a character!: "); - serial_putc(c); - - while(1); + while(1) { + c = serial_getc(); + serial_puts("Got a character!: "); + serial_putc(c); + serial_putc('\n'); + } return 0; } From 5b6a4e14421a2702437adc1a4ae7defa815659f8 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Tue, 28 Nov 2023 23:52:27 -0800 Subject: [PATCH 4/8] Start terminal driver --- sw/kernel/devices/terminal.h | 13 ++++++++++++ sw/kernel/devices/terminal.s | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 sw/kernel/devices/terminal.h create mode 100644 sw/kernel/devices/terminal.s diff --git a/sw/kernel/devices/terminal.h b/sw/kernel/devices/terminal.h new file mode 100644 index 0000000..42a9864 --- /dev/null +++ b/sw/kernel/devices/terminal.h @@ -0,0 +1,13 @@ +#ifndef _TERMINAL_H +#define _TERMINAL_H + +#include + +int8_t terminal_read(uint8_t fd, void* buf, uint8_t nbytes); +int8_t terminal_write(uint8_t fd, const void* buf, uint8_t nbytes); +int8_t terminal_open(const uint8_t* filename); +int8_t terminal_close(uint8_t fd); + + +#endif /* _TERMINAL_H */ + diff --git a/sw/kernel/devices/terminal.s b/sw/kernel/devices/terminal.s new file mode 100644 index 0000000..56351cb --- /dev/null +++ b/sw/kernel/devices/terminal.s @@ -0,0 +1,41 @@ +.MACPACK generic + +.autoimport + +.export _terminal_read, _terminal_write, _terminal_open, _terminal_close + +.data + +terminal_buf: .res 128 + +.code + +.proc _terminal_read + +.endproc + +.proc _terminal_write + +.endproc + +; terminal_open +; open terminal device +; Inputs: uint8_t* filename +; Outputs: none +; Return Value: 0 on success +; Function: none. +.proc _terminal_open + lda #$0 + rts +.endproc + +; terminal_close +; close terminal device +; Inputs: int32_t fd +; Outputs: none +; Return Value: 0 on success (but this always failes) +; Function: none. +.proc _terminal_close + lda #$ff ; -1 + rts +.endproc \ No newline at end of file From b25d0e9bdb951d7d2174a60ca6062c1893574c4f Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Wed, 29 Nov 2023 08:38:25 -0800 Subject: [PATCH 5/8] First shot at terminal read --- sw/kernel/devices/terminal.s | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/sw/kernel/devices/terminal.s b/sw/kernel/devices/terminal.s index 56351cb..8afec0f 100644 --- a/sw/kernel/devices/terminal.s +++ b/sw/kernel/devices/terminal.s @@ -2,6 +2,9 @@ .autoimport +.importzp tmp1, ptr1 + +.import _serial_getc .export _terminal_read, _terminal_write, _terminal_open, _terminal_close .data @@ -10,10 +13,89 @@ terminal_buf: .res 128 .code +; int8_t terminal_read(uint8_t fd, void* buf, uint8_t nbytes); +; Read up to size-1 (127 max) before the enter key is pressed. +; A newline character is automatically added. +; Inputs: int8_t* buf - where input characters are stored +; uint8_t n - number of characters to read (max buf size minux 1) +; Return Value: number of characters read on success, -1 on failure +; Function: Reads keyboard input .proc _terminal_read + cmp #$00 ; Check that nbytes is > 0 and < 128 + beq FAIL + cmp #$80 + bge FAIL + sta tmp1 ; Store nbytes in tmp1 + + jsr pushax ; Check that buf != NULL + cmp #$00 + bne L1 + cpx #$00 + bne L1 + bra FAIL + + ; while i < nbytes, store getc into terminal_buf y +L1: sta ptr1 + stx ptr1+1 + ldy #$00 +LOOP: cpy tmp1 + bge END + jsr _serial_getc + sta terminal_buf,y + + cmp #$0a ; If newline, do something + bne L2 + jsr _serial_putc + bra END + +L2: cmp #$08 ; Handle backspace + bne L3 + lda tmp1 + beq LOOP + lda #$08 + jsr _serial_putc + dey + lda #$00 + sta terminal_buf,y + bra LOOP + +L3: lda terminal_buf,y ; Normal character + sta (tmp1),y + jsr _serial_putc + iny + bra LOOP + +END: phy ; Zero out terminal buffer + ldy #$00 + lda #$00 +L4: sta terminal_buf,y + iny + cpy #$80 + blt L4 + +L5: ply ; End string with NULL + lda #$0a + sta (ptr1),y + iny + cpy #$80 ; But not if we are at max + bge L6 + lda #$00 + sta (ptr1),y + +L6: lda #$00 ; Return - on success + rts + +FAIL: lda #$ff ; return -1 on fail + rts .endproc +; terminal_write +; write characters to the terminal +; Inputs: int8_t* buf - buffer of characters to write +; uint8_t n - number of characters to write +; Return Value: 0 on success, -1 on failure +; Writes to screen. Only stops after n chars written. .proc _terminal_write .endproc From 597d15e2341f2a99ba8e699584cef4731583599b Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Wed, 29 Nov 2023 17:19:18 -0800 Subject: [PATCH 6/8] Add terminal write as well, use it in kernel --- sw/kernel/devices/terminal.s | 24 ++++++++++++++++++++++-- sw/kernel/kernel.c | 18 ++++++++++++------ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/sw/kernel/devices/terminal.s b/sw/kernel/devices/terminal.s index 8afec0f..ea1f0d0 100644 --- a/sw/kernel/devices/terminal.s +++ b/sw/kernel/devices/terminal.s @@ -27,7 +27,7 @@ terminal_buf: .res 128 bge FAIL sta tmp1 ; Store nbytes in tmp1 - jsr pushax ; Check that buf != NULL + jsr popax ; Check that buf != NULL cmp #$00 bne L1 cpx #$00 @@ -90,14 +90,34 @@ FAIL: lda #$ff ; return -1 on fail rts .endproc -; terminal_write +; int8_t terminal_write(uint8_t fd, const void* buf, uint8_t nbytes); ; write characters to the terminal ; Inputs: int8_t* buf - buffer of characters to write ; uint8_t n - number of characters to write ; Return Value: 0 on success, -1 on failure ; Writes to screen. Only stops after n chars written. +; This seems to not care about null termination? .proc _terminal_write + sta tmp1 ; put nbytes in tmp1 + jsr popax ; check that buf is not null + cmp #$00 + bne L1 + cpx #$00 + bne L1 + bra FAIL +L1: + ldy #$00 +LOOP: lda (ptr1),y ; Loop through buffer and print + jsr _serial_putc + iny + cmp tmp1 + blt LOOP + lda #$00 + rts + +FAIL: lda #$ff ; old code didn't fail, but new code does. + rts .endproc ; terminal_open diff --git a/sw/kernel/kernel.c b/sw/kernel/kernel.c index 6c67395..bbdc685 100644 --- a/sw/kernel/kernel.c +++ b/sw/kernel/kernel.c @@ -1,10 +1,14 @@ #include +#include + #include "devices/interrupt_controller.h" #include "interrupts/interrupt.h" #include "devices/mapper.h" #include "devices/rtc.h" #include "devices/serial.h" +#include "devices/terminal.h" + void handle_rtc_interrupt() { // cputs("In IRQ interrupt!\n"); @@ -13,9 +17,9 @@ void handle_rtc_interrupt() { asm volatile ("rti"); } -int main() { +char buf[128]; - uint8_t c; +int main() { cputs("Kernel\n"); @@ -40,11 +44,13 @@ int main() { serial_puts("Hello from serial!\n"); + terminal_open(NULL); + terminal_write(0, "Terminal Write\n", 15); + while(1) { - c = serial_getc(); - serial_puts("Got a character!: "); - serial_putc(c); - serial_putc('\n'); + terminal_read(0, buf, 128); + terminal_write(0, "Got: ", 5); + terminal_write(0, buf, strlen(buf)); } return 0; From a169b30028041816ce46ff821b16a04940aad5c6 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Thu, 30 Nov 2023 23:57:58 -0800 Subject: [PATCH 7/8] Fix not saving to ptr1 and comparing y --- sw/kernel/devices/terminal.s | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sw/kernel/devices/terminal.s b/sw/kernel/devices/terminal.s index ea1f0d0..4245a33 100644 --- a/sw/kernel/devices/terminal.s +++ b/sw/kernel/devices/terminal.s @@ -106,12 +106,13 @@ FAIL: lda #$ff ; return -1 on fail cpx #$00 bne L1 bra FAIL -L1: +L1: sta ptr1 + stx ptr1+1 ldy #$00 LOOP: lda (ptr1),y ; Loop through buffer and print jsr _serial_putc iny - cmp tmp1 + cpy tmp1 blt LOOP lda #$00 rts From 32c82044a7adb876b5ab53951afb09f1200aa3c4 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Fri, 1 Dec 2023 00:56:16 -0800 Subject: [PATCH 8/8] Fix more bugs --- sw/kernel/devices/serial.s | 2 +- sw/kernel/devices/terminal.s | 7 ++++--- sw/kernel/kernel.c | 17 ++++++++++------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/sw/kernel/devices/serial.s b/sw/kernel/devices/serial.s index 89b60c8..fe4f024 100644 --- a/sw/kernel/devices/serial.s +++ b/sw/kernel/devices/serial.s @@ -85,7 +85,7 @@ L1: rts ldy #$00 ; initialize y to 0 L1: lda (ptr1),y ; load character from string beq L2 ; Quit if NULL - jsr _uart_txb_block ; send character (does not change y or ptr1) + jsr _serial_putc ; send character (does not change y or ptr1) iny ; increment y bne L1 ; If Y == 0, increment high byte of pointer inc ptr1+1 diff --git a/sw/kernel/devices/terminal.s b/sw/kernel/devices/terminal.s index 4245a33..0604719 100644 --- a/sw/kernel/devices/terminal.s +++ b/sw/kernel/devices/terminal.s @@ -23,7 +23,7 @@ terminal_buf: .res 128 .proc _terminal_read cmp #$00 ; Check that nbytes is > 0 and < 128 beq FAIL - cmp #$80 + cmp #$81 bge FAIL sta tmp1 ; Store nbytes in tmp1 @@ -44,8 +44,9 @@ LOOP: cpy tmp1 jsr _serial_getc sta terminal_buf,y - cmp #$0a ; If newline, do something + cmp #$0d ; If newline, do something bne L2 + lda #$0a ; hacky serial, we want $0a, not $0d jsr _serial_putc bra END @@ -61,7 +62,7 @@ L2: cmp #$08 ; Handle backspace bra LOOP L3: lda terminal_buf,y ; Normal character - sta (tmp1),y + sta (ptr1),y jsr _serial_putc iny bra LOOP diff --git a/sw/kernel/kernel.c b/sw/kernel/kernel.c index bbdc685..035f0f1 100644 --- a/sw/kernel/kernel.c +++ b/sw/kernel/kernel.c @@ -20,26 +20,25 @@ void handle_rtc_interrupt() { char buf[128]; int main() { - cputs("Kernel\n"); - cputs("Init Mapper\n"); + // cputs("Init Mapper\n"); init_mapper(); - cputs("Initialize Interrupts\n"); + // cputs("Initialize Interrupts\n"); init_interrupts(); - cputs("Initialize Interrupt Controller\n"); + // cputs("Initialize Interrupt Controller\n"); init_interrupt_controller(); - cputs("Initialize RTC\n"); + // cputs("Initialize RTC\n"); init_rtc(); register_irq(&handle_rtc_interrupt, 0); asm volatile("cli"); - cputs("Initialize Serial\n"); + // cputs("Initialize Serial\n"); serial_init(); serial_puts("Hello from serial!\n"); @@ -48,9 +47,13 @@ int main() { terminal_write(0, "Terminal Write\n", 15); while(1) { - terminal_read(0, buf, 128); + if (terminal_read(0, buf, 128)) { + cprintf("Fail\n"); + break; + } terminal_write(0, "Got: ", 5); terminal_write(0, buf, strlen(buf)); + terminal_write(0, "\n", 1); } return 0;