-CSRCS = devlpr.c devtty.c devfd.c devdw.c
+CSRCS = devlpr.c devtty.c devfd.c
CSRCS += devices.c main.c libc.c
+DSRCS = ../dev/devdw.c
+
ASRCS = p6809.s crt0.s drivewire.s
ASRCS += tricks.s commonmem.s usermem_sam.s floppy.s
AOBJS = $(ASRCS:.s=$(BINEXT))
OBJS = $(COBJS) $(AOBJS)
+CROSS_CCOPTS += -I../dev/
+
JUNK = $(CSRCS:.c=.o) $(ASRCS:.s=.o) \
d64_1.decb d64_1.rom d64_2.rom cart1.rom cart2.rom
$(COBJS): %$(BINEXT): %.c
$(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG2) -c $<
+$(DOBJS): %$(BINEXT): ../dev/%.c
+ $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG2) -c $<
+
$(AOBJS): %$(BINEXT): %.s
$(CROSS_AS) $(ASOPTS) $< -o $*.o
+++ /dev/null
-#include <kernel.h>
-#include <kdata.h>
-#include <printf.h>
-#include <devdw.h>
-
-#define MAX_DW 4 /* can be 255 */
-
-#define DW_READ 0
-#define DW_WRITE 1
-
-static uint8_t dw_tab[MAX_DW];
-
-/*
- * Block device glue for DriveWire
- *
- * DriveWire uses 256 byte sector transfers
- */
-
-static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
-{
- blkno_t block;
- uint16_t dptr;
- int ct = 0;
- int tries;
- uint8_t err;
- uint8_t *driveptr = dw_tab + minor;
- uint8_t cmd[5];
- irqflags_t irq;
-
- if(rawflag)
- goto bad2;
-
- dptr = (uint16_t)udata.u_buf->bf_data;
- block = udata.u_buf->bf_blk;
-
-// kprintf("Issue command: drive %d\n", minor);
- /* maybe mimicking floppy driver more than needed? */
- cmd[0] = is_read ? DW_READ : DW_WRITE;
- cmd[1] = block >> 7; /* 2 sectors per block */
- cmd[2] = (block << 1) & 0xFF;
- cmd[3] = dptr >> 8;
- cmd[4] = dptr & 0xFF;
- *driveptr = minor; /* pass minor (drive number) through here for now */
-
- while (ct < 2) {
- for (tries = 0; tries < 4 ; tries++) {
- // kprintf("dw_operation on block %d ct %d\n", block, ct);
- irq = di(); /* for now block interrupts for whole operation */
- err = dw_operation(cmd, driveptr);
- irqrestore(irq);
- if (err == 0)
- break;
- if (tries > 1)
- dw_reset(driveptr);
- }
- /* FIXME: should we try the other half and then bail out ? */
- if (tries == 3)
- goto bad;
- cmd[3]++; /* Move on 256 bytes in the buffer */
- cmd[2]++; /* Next sector for 2nd block */
- ct++;
- }
- return 1;
-bad:
- kprintf("dw%d: error %x\n", minor, err);
-bad2:
- udata.u_error = EIO;
- return -1;
-}
-
-/* FIXME: for bit-banger transport (not Becker) we should set up
- the PIA at some point too */
-
-int dw_open(uint8_t minor, uint16_t flag)
-{
- if(minor >= MAX_DW) {
- udata.u_error = ENODEV;
- return -1;
- }
- return 0;
-}
-
-int dw_read(uint8_t minor, uint8_t rawflag, uint8_t flag)
-{
- return dw_transfer(minor, true, rawflag);
-}
-
-int dw_write(uint8_t minor, uint8_t rawflag, uint8_t flag)
-{
- return dw_transfer(minor, false, rawflag);
-}
-
+++ /dev/null
-#ifndef __DEVDW_DOT_H__
-#define __DEVDW_DOT_H__
-
-/* public interface */
-int dw_read(uint8_t minor, uint8_t rawflag, uint8_t flag);
-int dw_write(uint8_t minor, uint8_t rawflag, uint8_t flag);
-int dw_open(uint8_t minor, uint16_t flag);
-
-/* low level interface */
-uint8_t dw_reset(uint8_t *drive);
-uint8_t dw_operation(uint8_t *cmd, uint8_t *drive);
-
-#endif /* __DEVDW_DOT_H__ */
-