However, swapping in again still needs some work...
Note that config.h sets DriveWire disk 1 for swap,
change at will.
Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
tricks.o main.o ../timer.o ../kdata.o devfd.o floppy.o devices.o \
drivewire.o devdw.o \
../devio.o ../filesys.o ../process.o ../inode.o ../syscall_fs.o \
- ../syscall_proc.o ../syscall_other.o ../mm.o \
+ ../syscall_proc.o ../syscall_other.o ../mm.o ../swap.o \
../tty.o ../devsys.o ../usermem.o ../syscall_fs2.o ../syscall_exec16.o \
devlpr.o devtty.o libc.o ../vt.o
../tools/pad256 ../fuzix.bin
#define MAP_SIZE 0x7C00U
#define CONFIG_BANKS 1
/* And swapping */
-#undef SWAPDEV
+#define SWAPDEV 2049 /* DriveWire drive 1 */
+#define SWAP_SIZE 0x80 /* 64K blocks */
+#define SWAPBASE 0x8000 /* We swap the lot in one, include the */
+#define SWAPTOP 0xFF00 /* uarea so its a round number of sectors */
+#define MAX_SWAPS 32
/* Permit large I/O requests to bypass cache and go direct to userspace */
#define CONFIG_LARGE_IO_DIRECT
#define TTYDEV BOOT_TTY /* Device used by kernel for messages, panics */
#define NBUFS 6 /* Number of block buffers */
#define NMOUNTS 2 /* Number of mounts at a time */
+#define swap_map(x) ((uint8_t *)(x))
uint8_t err;
uint8_t *driveptr = dw_tab + minor;
uint8_t cmd[6];
+ uint8_t page;
irqflags_t irq;
- if (rawflag == 0) {
+ if (rawflag == 0) {
+ page = 0;
dptr = (uint16_t)udata.u_buf->bf_data;
block = udata.u_buf->bf_blk;
nblock = 2;
} else if (rawflag == 1) {
if (((uint16_t)udata.u_offset|udata.u_count) & BLKMASK)
goto bad2;
+ page = (uint8_t)udata.u_page;
dptr = (uint16_t)udata.u_base;
block = udata.u_offset >> 9;
nblock = udata.u_count >> 8;
+ } else if (rawflag == 2) {
+ page = (uint8_t)swappage;
+ dptr = (uint16_t)swapbase;
+ nblock = swapcnt >> 8;
+ block = swapblk;
} else
goto bad2;
-
// kprintf("Issue command: drive %d\n", minor);
/* maybe mimicking floppy driver more than needed? */
cmd[0] = is_read ? DW_READ : DW_WRITE;
cmd[2] = (block << 1) & 0xFF;
cmd[3] = dptr >> 8;
cmd[4] = dptr & 0xFF;
- cmd[5] = rawflag;
+ cmd[5] = page;
*driveptr = minor; /* pass minor (drive number) through here for now */
while (nblock--) {
.globl _dw_reset
; imported
- .globl map_process_always
+ .globl map_process_a
.globl map_kernel
.area .common
pshs y
; get parameters from C, X points to cmd packet
ldy 4,s ; driveptr (dw_tab in .bss so kernel bank)
- lda ,y ; for now, contains minor = drive number directly
- ldb 5,x ; rawflag
- pshs b
- beq @nomap
- jsr map_process_always
-@nomap ldb ,x ; write flag
+ ldb ,y ; for now, contains minor = drive number directly
+ lda 5,x ; page map
+ jsr map_process_a ; same as map_process on nx32
+ tfr b,a
+ ldb ,x ; write flag
; buffer location into Y
ldy 3,x
; sector number into X
@done bcs @err
bne @err
ldx #0
-@fin tst ,s+
- beq @ret
- jsr map_kernel
+@fin jsr map_kernel
@ret puls y,pc
@err ldx #0xFFFF
bra @fin
/* map bank 1 last for init, leave 0 for kernel */
for (i = membanks - 1; i > 0; i--)
pagemap_add(i);
+
+#ifdef SWAPDEV
+ for (i = 0; i < MAX_SWAPS; i++)
+ swapmap_add(i);
+#endif
}
void map_init(void)