#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
*
int nblock;
int tries;
uint8_t err;
- uint8_t *driveptr = dw_tab + minor;
- uint8_t cmd[6];
- uint8_t page;
+ uint8_t cmd[8];
+ uint16_t page;
irqflags_t irq;
if (rawflag == 0) {
} else if (rawflag == 1) {
if (((uint16_t)udata.u_offset|udata.u_count) & BLKMASK)
goto bad2;
- page = (uint8_t)udata.u_page;
+ page = udata.u_page;
dptr = (uint16_t)udata.u_base;
block = udata.u_offset >> 9;
nblock = udata.u_count >> 8;
} else if (rawflag == 2) {
#ifdef SWAPDEV
- page = (uint8_t)swappage;
+ page = (uint16_t)swappage;
dptr = (uint16_t)swapbase;
nblock = swapcnt >> 8;
block = swapblk;
cmd[2] = (block << 1) & 0xFF;
cmd[3] = dptr >> 8;
cmd[4] = dptr & 0xFF;
- cmd[5] = page;
- *driveptr = minor; /* pass minor (drive number) through here for now */
+ cmd[5] = minor;
+ cmd[6] = page >> 8;
+ cmd[7] = page & 0xFF;
while (nblock--) {
for (tries = 0; tries < 4 ; tries++) {
// kprintf("dw_operation block %d left %d\n", block, nblock);
irq = di(); /* for now block interrupts for whole operation */
- err = dw_operation(cmd, driveptr);
+ err = dw_operation(cmd);
irqrestore(irq);
if (err == 0)
break;
if (tries > 1)
- dw_reset(driveptr);
+ dw_reset();
}
/* FIXME: should we try the other half and then bail out ? */
if (tries == 3)
int dw_open(uint8_t minor, uint16_t flag)
{
used(flag);
- if(minor >= MAX_DW) {
- udata.u_error = ENODEV;
- return -1;
- }
return 0;
}
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);
+uint8_t dw_reset(void);
+uint8_t dw_operation(uint8_t *cmd);
uint16_t dw_transaction( unsigned char *send, uint16_t scnt,
unsigned char *recv, uint16_t rcnt );
_dw_operation:
pshs y
; get parameters from C, X points to cmd packet
- ldy 4,s ; driveptr (dw_tab in .bss so kernel bank)
- ldb ,y ; for now, contains minor = drive number directly
- lda 5,x ; page map
+ lda 7,x ; page map LSB
jsr map_process_a ; same as map_process on nx32
- tfr b,a
+ lda 5,x ; minor = drive number
ldb ,x ; write flag
; buffer location into Y
ldy 3,x
_dw_operation:
pshs y
; get parameters from C, X points to cmd packet
- ldy 4,s ; driveptr
- lda ,y ; for now, contains minor = drive number directly
+ lda 5,x ; minor = drive number
ldb ,x ; write flag
; buffer location into Y
ldy 3,x
_dw_operation:
pshs y
; get parameters from C, X points to cmd packet
- ldy 4,s ; driveptr (dw_tab in .bss so kernel bank)
- ldb ,y ; for now, contains minor = drive number directly
- lda 5,x ; page map
+ lda 7,x ; page map LSB
jsr map_process_a ; same as map_process on nx32
- tfr b,a
+ lda 5,x ; minor = drive number
ldb ,x ; write flag
; buffer location into Y
ldy 3,x
_dw_operation:
pshs y
; get parameters from C, X points to cmd packet
- ldy 4,s ; driveptr
- lda ,y ; for now, contains minor = drive number directly
+ lda 5,x ; minor = drive number
ldb ,x ; write flag
; buffer location into Y
ldy 3,x
_dw_reset:
ret
- ; dw_operation(cmdblock, driveptr)
+ ; dw_operation(cmdblock)
_dw_operation:
pop bc ; return
pop iy ; cmdblock
- pop de ; driveptr
- push de
push iy
push bc
- ld b, 5(iy) ; page map
+ ld b, 7(iy) ; page map LSB
call map_process_a
ld h, 3(iy) ; pointer
ld l, 4(iy)
ld c, 2(iy)
xor a
cp (iy)
- ld a, (de)
+ ld a, 5(iy)
jr nz, is_write
call dw_read_sector
dw_op_ret: