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) */
.export outstringhex
.export outnewline
.export outcharhex
+ .export outxa
.import outchar
.import _kernel_flag
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
; exported symbols
.export start
+ .export copycommon
; imported symbols
.import init_early
.import __COMMONMEM_LOAD__, __COMMONMEM_RUN__, __COMMONMEM_SIZE__
.importzp ptr1, ptr2, tmp1
-
; startup code @0
.code
.include "zeropage.inc"
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
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
; 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
/*
- * NC100 RD PCMCIA driver
- *
+ * ROMdisc hack for testing
*/
#include <kernel.h>
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;
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;
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);
}
#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;
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();
}
#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
void platform_idle(void)
{
+ irqflags_t flags = di();
+ tty_poll();
+ irqrestore(flags);
}
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)
.import _unix_syscall
.import _platform_interrupt
.import _kernel_flag
+ .import copycommon
.include "kernel.def"
.include "../kernel02.def"
; 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
.import _runticks
.import _inint
.import outstring
+ .import outxa
.import outcharhex
.include "kernel.def"
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
.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