Add mdview markdown viewer, reorganize tests/examples and libc layout
- Split tests/ (libc feature tests) and examples/ (real apps); shared
app.mk in repo root, was examples/example.mk
- libc/io/* split into libc/{conio,env,errno,file,mouse,string,sys,
time,video}/ — clearer module boundaries
- New examples/mdview/: markdown viewer (Phases 1-5 + light nested
lists). Headers (H1-H4), HR, ulist/olist/quote with nesting via
leading spaces, fenced code blocks, inline emphasis (bold/italic/
underscore/code), wrap/unwrap mode with soft wrap (F2), horizontal
pan (← →) with '>' truncation indicator
- libc additions: scroll() in conio (ESTEX SCROLL), strlwr/strupr,
gets() test
- Makefile updates across tests/ for the new shared app.mk path
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
# Build banked.exe — HUGE memory mode (small + banked code in W3).
|
||||
#
|
||||
# Layout:
|
||||
# CODE/HOME at 0x4100 (W1), DATA at 0x8000 (W2), banks at 0x{N}C000 (W3).
|
||||
# crt0_banked.s loads N banks from the .EXE before calling main.
|
||||
|
||||
PROJ_ROOT := $(abspath $(CURDIR)/../..)
|
||||
EXAMPLE := banked
|
||||
MEMORY := huge
|
||||
EXTRA_FLAGS := --bank 1=bank1.c --bank 2=bank2.c
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
@@ -0,0 +1,17 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sprinter.h>
|
||||
|
||||
void bank1_func(int x) __banked
|
||||
{
|
||||
(void)x;
|
||||
puts("BANK1: hello from a banked function!");
|
||||
puts("BANK1: window 3 phys page = ");
|
||||
hex8(_io_page_w3); /* should be BANK1's phys page */
|
||||
putchar('\n');
|
||||
putchar('1');
|
||||
putchar('=');
|
||||
putchar('0' + (x / 10) % 10);
|
||||
putchar('0' + x % 10);
|
||||
putchar('\n');
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sprinter.h>
|
||||
|
||||
void bank2_func(int x) __banked
|
||||
{
|
||||
(void)x;
|
||||
puts("BANK2: hello from the second bank!");
|
||||
puts("BANK2: window 3 phys page = ");
|
||||
hex8(_io_page_w3); /* should be BANK2's phys page */
|
||||
putchar('\n');
|
||||
putchar('2');
|
||||
putchar('=');
|
||||
putchar('0' + (x / 100) % 10);
|
||||
putchar('0' + (x / 10) % 10);
|
||||
putchar('0' + x % 10);
|
||||
putchar('\n');
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sprinter.h>
|
||||
|
||||
/* crt0_banked.s reads this constant to know how many banks to load. */
|
||||
const uint8_t n_banks = 2;
|
||||
|
||||
void bank1_func(int x) __banked;
|
||||
void bank2_func(int x) __banked;
|
||||
|
||||
extern uint8_t bank_pages[]; /* filled by crt0_banked.s */
|
||||
|
||||
static void show_w3(const char *who)
|
||||
{
|
||||
puts(who);
|
||||
hex8(_io_page_w3); /* current physical page mapped in window 3 */
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("HOME: program start.");
|
||||
#ifdef DEBUG_RT
|
||||
printf("HOME: w2_self_allocated = %u\n", w2_self_allocated);
|
||||
#endif
|
||||
show_w3("HOME: window 3 phys page = ");
|
||||
|
||||
puts("HOME: bank_pages[1] (BANK1 phys) = ");
|
||||
hex8(bank_pages[1]);
|
||||
putchar('\n');
|
||||
puts("HOME: bank_pages[2] (BANK2 phys) = ");
|
||||
hex8(bank_pages[2]);
|
||||
putchar('\n');
|
||||
|
||||
puts("HOME: calling bank1_func(42)...");
|
||||
bank1_func(42);
|
||||
show_w3("HOME: back, window 3 phys = ");
|
||||
|
||||
puts("HOME: calling bank2_func(123)...");
|
||||
bank2_func(123);
|
||||
show_w3("HOME: back, window 3 phys = ");
|
||||
|
||||
puts("HOME: done.");
|
||||
puts("Press any key to exit...");
|
||||
(void)getchar();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user