From 315e23192f46ac27fc887edd2e5af1ded3523be8 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Mon, 12 Jan 2015 11:03:56 +0000 Subject: [PATCH] tgl6502: push further work on the tgl6502 --- Kernel/cpu-6502/cpu.h | 8 ++--- Kernel/lowlevel-6502.s | 17 +++++++++++ Kernel/platform-tgl6502/crt0.s | 49 +++++++++++++++++++++---------- Kernel/platform-tgl6502/devrd.c | 29 ++++++++++++------ Kernel/platform-tgl6502/devtty.c | 14 ++++++++- Kernel/platform-tgl6502/devtty.h | 5 ++-- Kernel/platform-tgl6502/main.c | 9 ++++-- Kernel/platform-tgl6502/tgl6502.s | 5 ++-- Kernel/platform-tgl6502/tricks.s | 6 +++- Kernel/usermem_std-6502.s | 34 ++++++++++++++++++--- 10 files changed, 133 insertions(+), 43 deletions(-) diff --git a/Kernel/cpu-6502/cpu.h b/Kernel/cpu-6502/cpu.h index 16e63707..79f1ce57 100644 --- a/Kernel/cpu-6502/cpu.h +++ b/Kernel/cpu-6502/cpu.h @@ -14,11 +14,11 @@ typedef int16_t susize_t; extern void ei(void); extern irqflags_t di(void); -extern void irqrestore(irqflags_t f); +extern void __fastcall__ irqrestore(irqflags_t f); -extern void *memcpy(void *, void *, size_t); -extern void *memset(void *, int, size_t); -extern size_t strlen(const char *); +extern void * __fastcall__ memcpy(void *, void *, size_t); +extern void * __fastcall__ memset(void *, int, size_t); +extern size_t __fastcall__ strlen(const char *); #define EMAGIC 0x4C /* Header of executable (JMP) */ diff --git a/Kernel/lowlevel-6502.s b/Kernel/lowlevel-6502.s index c48feae8..771d557b 100644 --- a/Kernel/lowlevel-6502.s +++ b/Kernel/lowlevel-6502.s @@ -9,6 +9,7 @@ .export outstringhex .export outnewline .export outcharhex + .export outxa .import outchar .import _kernel_flag @@ -171,11 +172,27 @@ outcharhex: lsr a lsr a lsr a + cmp #9 + bcc deci1 + clc + adc #7 +deci1: clc adc #48 ; ascii zero jsr outchar pla and #$0f + cmp #9 + bcc deci2 + clc + adc #7 +deci2: clc adc #48 jmp outchar + +outxa: pha + txa + jsr outcharhex + pla + jmp outcharhex diff --git a/Kernel/platform-tgl6502/crt0.s b/Kernel/platform-tgl6502/crt0.s index 82d15b86..d02c063d 100644 --- a/Kernel/platform-tgl6502/crt0.s +++ b/Kernel/platform-tgl6502/crt0.s @@ -1,5 +1,6 @@ ; exported symbols .export start + .export copycommon ; imported symbols .import init_early @@ -14,7 +15,6 @@ .import __COMMONMEM_LOAD__, __COMMONMEM_RUN__, __COMMONMEM_SIZE__ .importzp ptr1, ptr2, tmp1 - ; startup code @0 .code .include "zeropage.inc" @@ -55,6 +55,10 @@ start: ; Map ROM at 0x4000-0xFFFF stx $FF90 inx stx $FF91 + lda #$02 + sta $FF8A ; Common for init at 0x0000 + lda #$01 ; Kernel data at 0x4000 + sta $FF8B lda #__COMMONMEM_LOAD__ - sta ptr1+1 - - lda #<__COMMONMEM_RUN__ ; Target pointer - sta ptr2 - lda #>__COMMONMEM_RUN__ - sta ptr2+1 - - ldx #<~__COMMONMEM_SIZE__ - lda #>~__COMMONMEM_SIZE__ ; Use -(__DATASIZE__+1) - sta tmp1 - jsr copyloop + jsr copycommon lda #'x' sta $FF03 @@ -169,6 +160,34 @@ copyloop: ; Done + +; +; This is also used at runtime so split it off as a helper +; +copycommon: + pha + txa + pha + lda #<__COMMONMEM_LOAD__ ; Source pointer + sta ptr1 + lda #>__COMMONMEM_LOAD__ + sta ptr1+1 + + lda #<__COMMONMEM_RUN__ ; Target pointer + sta ptr2 + lda #>__COMMONMEM_RUN__ + sta ptr2+1 + + ldx #<~__COMMONMEM_SIZE__ + lda #>~__COMMONMEM_SIZE__ ; Use -(__DATASIZE__+1) + sta tmp1 + + jsr copyloop + pla + tax + pla + rts + .segment "VECTORS" .addr vector .addr $C000 ; our ROM mapping diff --git a/Kernel/platform-tgl6502/devrd.c b/Kernel/platform-tgl6502/devrd.c index ddbf8b3c..0361428d 100644 --- a/Kernel/platform-tgl6502/devrd.c +++ b/Kernel/platform-tgl6502/devrd.c @@ -1,6 +1,5 @@ /* - * NC100 RD PCMCIA driver - * + * ROMdisc hack for testing */ #include @@ -16,8 +15,12 @@ static int rd_transfer(bool is_read, uint8_t rawflag) int dlen; int ct = 0; int map; + irqflags_t irq; + uint8_t old; + uint16_t romd_roff; + uint8_t romd_rmap; - /* FIXME: raw is broken unless nicely aligned */ + /* RAW won't work yet this is just an initial hack */ if(rawflag) { dlen = udata.u_count; dptr = (uint16_t)udata.u_base; @@ -35,19 +38,29 @@ static int rd_transfer(bool is_read, uint8_t rawflag) block_xfer = 1; map = 0; } - block += 2*320; /* ramdisc starts at 320K in */ - + while (ct < block_xfer) { -/* rd_memcpy(is_read, map, dptr, block); */ + /* Offset of block within an 8K bank (high byte) */ + romd_roff = (block << 9); + /* 8K block we need to select */ + romd_rmap = 0x48 + (block >> 4); + /* Hack for now for testing */ + irq = di(); + old = *(uint8_t *)0xFF91; + *(uint8_t *)0xFF91 = romd_rmap; + if (is_read) + memcpy((void *)dptr, (void *)(0xE000 + romd_roff), 512); + *(uint8_t *)0xFF91 = old; + irqrestore(irq); block++; ct++; + dptr+=512; } return ct; } int rd_open(uint8_t minor, uint16_t flag) { - flag; if(minor != 0) { udata.u_error = ENODEV; return -1; @@ -57,13 +70,11 @@ int rd_open(uint8_t minor, uint16_t flag) int rd_read(uint8_t minor, uint8_t rawflag, uint8_t flag) { - flag;minor; return rd_transfer(true, rawflag); } int rd_write(uint8_t minor, uint8_t rawflag, uint8_t flag) { - flag;minor; return rd_transfer(false, rawflag); } diff --git a/Kernel/platform-tgl6502/devtty.c b/Kernel/platform-tgl6502/devtty.c index a560af0d..9332f894 100644 --- a/Kernel/platform-tgl6502/devtty.c +++ b/Kernel/platform-tgl6502/devtty.c @@ -9,7 +9,7 @@ #undef DEBUG /* UNdefine to delete debug code sequences */ -uint8_t *uart = (uint8_t *)0xFF00; +static volatile uint8_t *uart = (volatile uint8_t *)0xFF00; static char tbuf1[TTYSIZ]; PTY_BUFFERS; @@ -53,8 +53,20 @@ int tty_carrier(uint8_t minor) return 1; } +void tty_poll(void) +{ + uint8_t x; + + x = uart[1] & 4; + if (x) { + x = uart[2]; + tty_inproc(1, x); + } +} + void platform_interrupt(void) { + tty_poll(); timer_interrupt(); } diff --git a/Kernel/platform-tgl6502/devtty.h b/Kernel/platform-tgl6502/devtty.h index 948cc298..da0afba5 100644 --- a/Kernel/platform-tgl6502/devtty.h +++ b/Kernel/platform-tgl6502/devtty.h @@ -1,7 +1,6 @@ #ifndef __DEVTTY_DOT_H__ #define __DEVTTY_DOT_H__ -extern int nc100_tty_open(uint8_t minor, uint16_t flag); -extern int nc100_tty_close(uint8_t minor); -extern void nc100_tty_init(void); +extern void tty_poll(void); + #endif diff --git a/Kernel/platform-tgl6502/main.c b/Kernel/platform-tgl6502/main.c index fe90dedf..db808d3b 100644 --- a/Kernel/platform-tgl6502/main.c +++ b/Kernel/platform-tgl6502/main.c @@ -8,6 +8,9 @@ uint8_t kernel_flag = 0; void platform_idle(void) { + irqflags_t flags = di(); + tty_poll(); + irqrestore(flags); } void do_beep(void) @@ -22,9 +25,9 @@ void do_beep(void) void pagemap_init(void) { /* We treat RAM as 2 48K banks + 16K of kernel data */ - /* 0-3 kernel, 4-9 Bank 0, 10-15 bank 1 */ - pagemap_add(4); - pagemap_add(10); + /* 2-8 proc1, 9-15 proc2, 1 kernel data, 0 spare */ + pagemap_add(9); + pagemap_add(2); } void map_init(void) diff --git a/Kernel/platform-tgl6502/tgl6502.s b/Kernel/platform-tgl6502/tgl6502.s index 6d028e32..a1ba6938 100644 --- a/Kernel/platform-tgl6502/tgl6502.s +++ b/Kernel/platform-tgl6502/tgl6502.s @@ -35,6 +35,7 @@ .import _unix_syscall .import _platform_interrupt .import _kernel_flag + .import copycommon .include "kernel.def" .include "../kernel02.def" @@ -107,9 +108,7 @@ _program_vectors: ; will exit with interrupts off sei ; - ; Fixme: block copy stubs segment as well if 6509. - ; - + jsr copycommon ; our C caller will invoke us with the pointer in x,a ; just pass it on jsr map_process diff --git a/Kernel/platform-tgl6502/tricks.s b/Kernel/platform-tgl6502/tricks.s index d3561a19..d635177a 100644 --- a/Kernel/platform-tgl6502/tricks.s +++ b/Kernel/platform-tgl6502/tricks.s @@ -16,6 +16,7 @@ .import _runticks .import _inint .import outstring + .import outxa .import outcharhex .include "kernel.def" @@ -75,10 +76,13 @@ _switchin: sei sta ptr1 stx ptr1+1 +; jsr outxa ldy #P_TAB__P_PAGE_OFFSET lda (ptr1),y +; pha +; jsr outcharhex +; pla sta $FF8A ; switches zero page, stack memory area - ; ------- No stack ------- ; check u_data->u_ptab matches what we wanted diff --git a/Kernel/usermem_std-6502.s b/Kernel/usermem_std-6502.s index 4a4db30b..d14f686e 100644 --- a/Kernel/usermem_std-6502.s +++ b/Kernel/usermem_std-6502.s @@ -1,15 +1,41 @@ .include "platform/kernel.def" .include "kernel02.def" + .include "platform/zeropage.inc" + + .export __uget, __ugetc, __ugetw, __ugets + .export __uput, __uputc, __uputw, __uzero + + .import map_kernel, map_process_always - .export __uget, __ugetc, __ugetw, __ugets - .export __uput, __uputc, __uputw, __uzero ; ; TO DO: Possibly easier to write them in C with just the _c helpers ; but for speed would be best the block ones are asm. ; +; +; These methods are intended for a 6502. The 6509 will need something +; quite different (and in truth rather more elegant!) +; + .segment "COMMONMEM" + __uget: rts -__ugetc: rts -__ugetw: rts + +__ugetc: sta ptr1 + stx ptr1+1 + jsr map_process_always + ldy #0 + lda (ptr1),y + jmp map_kernel + +__ugetw: sta ptr1 + stx ptr1+1 + jsr map_process_always + ldy #1 + lda (ptr1),y + tax + dey + lda (ptr1),y + jmp map_kernel + __ugets: rts __uput: rts __uputc: rts -- 2.34.1