tgl6502: push further work on the tgl6502
authorAlan Cox <alan@linux.intel.com>
Mon, 12 Jan 2015 11:03:56 +0000 (11:03 +0000)
committerAlan Cox <alan@linux.intel.com>
Mon, 12 Jan 2015 11:03:56 +0000 (11:03 +0000)
Kernel/cpu-6502/cpu.h
Kernel/lowlevel-6502.s
Kernel/platform-tgl6502/crt0.s
Kernel/platform-tgl6502/devrd.c
Kernel/platform-tgl6502/devtty.c
Kernel/platform-tgl6502/devtty.h
Kernel/platform-tgl6502/main.c
Kernel/platform-tgl6502/tgl6502.s
Kernel/platform-tgl6502/tricks.s
Kernel/usermem_std-6502.s

index 16e6370..79f1ce5 100644 (file)
@@ -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) */
 
index c48feae..771d557 100644 (file)
@@ -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
index 82d15b8..d02c063 100644 (file)
@@ -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 #<kstack_top        ; C stack
                sta sp
@@ -112,22 +116,9 @@ gogogo:
 
                jsr     copyloop
 
-               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
 
+               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
index ddbf8b3..0361428 100644 (file)
@@ -1,6 +1,5 @@
 /* 
- * NC100 RD PCMCIA driver
- *
+ * ROMdisc hack for testing
  */
 
 #include <kernel.h>
@@ -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);
 }
 
index a560af0..9332f89 100644 (file)
@@ -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();
 }
 
index 948cc29..da0afba 100644 (file)
@@ -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
index fe90ded..db808d3 100644 (file)
@@ -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)
index 6d028e3..a1ba693 100644 (file)
@@ -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
index d3561a1..d635177 100644 (file)
@@ -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
index 4a4db30..d14f686 100644 (file)
@@ -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