zx+3: Quic pass over the code to fix the obvious bugs
authorAlan Cox <alan@linux.intel.com>
Fri, 30 Nov 2018 22:33:28 +0000 (22:33 +0000)
committerAlan Cox <alan@linux.intel.com>
Fri, 30 Nov 2018 22:33:28 +0000 (22:33 +0000)
With that done we boot to a shell but the floppy driver doesn't appear to want
to be friends yet.

Kernel/platform-zx+3/Makefile [new file with mode: 0644]
Kernel/platform-zx+3/README
Kernel/platform-zx+3/config.h
Kernel/platform-zx+3/crt0.s
Kernel/platform-zx+3/devtty.c
Kernel/platform-zx+3/fdc765.s
Kernel/platform-zx+3/fuzix.lnk
Kernel/platform-zx+3/loader.s
Kernel/platform-zx+3/main.c
Kernel/platform-zx+3/plus3.s
Kernel/platform-zx+3/zxvideo.s

diff --git a/Kernel/platform-zx+3/Makefile b/Kernel/platform-zx+3/Makefile
new file mode 100644 (file)
index 0000000..946f3f7
--- /dev/null
@@ -0,0 +1,62 @@
+CSRCS = devtty.c devices.c main.c
+CDSRCS = discard.c
+DSRCS = ../dev/devide.c ../dev/blkdev.c ../dev/devfdc765.c ../dev/devsd.c
+DDSRCS = ../dev/devide_discard.c ../dev/mbr.c ../dev/devsd_discard.c
+DZSRCS = ../dev/zx/divide.c ../dev/zx/zxkeyboard.c ../dev/zx/devinput.c ../dev/zx/zxmmc.c
+DDZSRCS =
+ASRCS = crt0.s plus3.s zxvideo.s fdc765.s
+ASRCS += tricks.s commonmem.s
+
+COBJS = $(CSRCS:.c=.rel)
+CDOBJS = $(CDSRCS:.c=.rel)
+AOBJS = $(ASRCS:.s=.rel)
+DOBJS = $(patsubst ../dev/%.c,%.rel, $(DSRCS))
+DDOBJS = $(patsubst ../dev/%.c,%.rel, $(DDSRCS))
+DZOBJS = $(patsubst ../dev/zx/%.c,%.rel, $(DZSRCS))
+DDZOBJS = $(patsubst ../dev/zx/%.c,%.rel, $(DDZSRCS))
+OBJS  = $(COBJS) $(CDOBJS) $(AOBJS) $(DOBJS) $(DDOBJS) $(DZOBJS) $(DDZOBJS)
+
+CROSS_CCOPTS += -I../dev/ -I../dev/zx/
+
+CROSS_CC_SEG3 = --codeseg CODE3
+
+all:   $(OBJS)
+
+$(COBJS): %.rel: %.c
+       $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG3) -c $<
+
+$(CDOBJS): %.rel: %.c
+       $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEGDISC) -c $<
+
+$(DOBJS): %.rel: ../dev/%.c
+       $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG3) -c $<
+
+$(DDOBJS): %.rel: ../dev/%.c
+       $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEGDISC) -c $<
+
+$(DZOBJS): %.rel: ../dev/zx/%.c
+       $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG3) -c $<
+
+$(DDZOBJS): %.rel: ../dev/zx/%.c
+       $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEGDISC) -c $<
+
+$(AOBJS): %.rel: %.s
+       $(CROSS_AS) $(ASOPTS) $<
+
+clean:
+       rm -f $(OBJS) *.lst *.asm *.sym *.rst *.rel core *~ 
+       rm -f loader.tmp loader.ihx loader.bin padding.bin disk.raw
+       rm -rf fuzix.dsk
+
+image:
+       sdasz80 -o loader.s
+       sdldz80 -i loader.rel
+       makebin -s 65536 loader.ihx loader.tmp
+       # Extract the loader itself
+       dd if=loader.tmp bs=512 skip=127 | ../tools/plus3boot >loader.bin
+       # Padding to fill the virtual disk
+       dd if=/dev/zero of=padding.bin bs=512 count=360
+       # Make a disk image to work from
+       cat loader.bin ../fuzix.bin padding.bin >disk.raw
+       # And generate a 40 track plus3 disk from it
+       ../tools/raw2dsk disk.raw fuzix.dsk
\ No newline at end of file
index 8ede4b9..58f4e20 100644 (file)
@@ -6,6 +6,11 @@ The memory mapping on this machine is a bit friendlier but it's still single
 
 This port really shows we need to support parent-first single in memory
 
+Note:
+
+We keep the discard high up below the common because otherwise the packed
+image overlaps itself and the ldir into discard corrupts the image
+
 Memory Model
 
 We use +2A/+3 'special paging mode'. It's special, but limited. Sufficient for
index 5f7ff33..981a537 100644 (file)
@@ -1,5 +1,7 @@
 #define CONFIG_IDE
 #define CONFIG_LARGE_IO_DIRECT         /* We support direct to user I/O */
+#define CONFIG_SD
+#define SD_DRIVE_COUNT 2
 /* Enable to make ^Z dump the inode table for debug */
 #undef CONFIG_IDUMP
 /* Enable to make ^A drop back into the monitor */
index ca9f2a8..0a05f8c 100644 (file)
        ;       Finally the buffers so they can expand
        ;
        .area _BUFFERS
-
-        .area _DISCARD
        ; Somewhere to throw it out of the way
         .area _INITIALIZER
 
+       ;
+       ;       We load these at D800 at the moment, so we avoid the
+       ;       ldir overlap problem as we unpack.
+       ;
+        .area _DISCARD
+
 
         .area _COMMONMEM
        .area _FONT
@@ -55,6 +59,8 @@
        .globl s__DATA
        .globl l__DISCARD
        .globl s__DISCARD
+       .globl l__FONT
+       .globl s__FONT
         .globl kstack_top
 
         .globl unix_syscall_entry
@@ -87,6 +93,10 @@ _start:
        ld de, #s__COMMONMEM
        ld bc, #l__COMMONMEM
        ldir
+       ; then the font
+       ld de, #s__FONT
+       ld bc, #l__FONT
+       ldir
        ; then the discard
        ld de, #s__DISCARD
        ld bc, #l__DISCARD
index c81e18f..5e7dc53 100644 (file)
@@ -13,7 +13,7 @@
 char tbuf1[TTYSIZ];
 
 uint8_t vtattr_cap = VTA_INVERSE|VTA_FLASH|VTA_UNDERLINE;
-uint8_t curattr;
+extern uint8_t curattr;
 
 static tcflag_t console_mask[4] = {
        _ISYS,
index e711240..866ab03 100644 (file)
@@ -187,7 +187,7 @@ _fd765_motor_off:
        jp map_kernel
 
 _fd765_motor_on:
-       ld a,#1
+       ld a,#0x08
        ld (diskmotor),a
        ; Take effect
        call map_kernel
index dddbc10..7365680 100644 (file)
@@ -3,6 +3,7 @@
 -l z80
 -b _CODE=0x0100
 -b _COMMONMEM=0xF000
+-b _DISCARD=0xD800
 platform-zx+3/crt0.rel
 platform-zx+3/commonmem.rel
 platform-zx+3/plus3.rel
@@ -40,6 +41,9 @@ platform-zx+3/devtty.rel
 platform-zx+3/devide.rel
 platform-zx+3/devide_discard.rel
 platform-zx+3/divide.rel
+platform-zx+3/devsd.rel
+platform-zx+3/devsd_discard.rel
+platform-zx+3/zxmmc.rel
 platform-zx+3/mbr.rel
 platform-zx+3/blkdev.rel
 platform-zx+3/devinput.rel
index 5eb4550..dbfdb16 100644 (file)
 ;
 start:
        di
+       ld bc,#0x7ffd
+       ld a,#0x08              ; screen on 7
+       out (c),a
 ;
 ;      The boot loader turns the motor off, so turn it back on but wait
 ;      a bit otherwise some 3.5" disks won't boot right
 ;
+
 motor_on:
+       ; Wait for the motor to catch back up - clear the screen !
+       ld bc,#0x7ffd
+       ld a,#0x08              ; screen on 7
+       out (c),a
+       ld hl,#0x4000
+       ld de,#0x4001
+       ld bc,#0x6911
+       xor a
+       ldir
+
+
        ld bc,#0x1ffd
        ld a,#0x0D              ; special paging 4/5/6/3. motor on
        out (c),a
-
-       ; Wait for the motor to catch back up
-       ld bc,#0x3548
-waitm:
-       dec bc
-       ld a,b
-       or c
-       jr nz, waitm
 ;
 ;      Ok now we can try and load stuff
 ;      9 sectors per track and we need to start from 0/2
@@ -132,10 +139,11 @@ load_sector:
 
        ld c,#0xfd              ; low bits of I/O
        ld d,#0x20              ; mask 
-       jp read_wait
+       jp read_begin
 read_loop:
        ld b,#0x3f
        ini
+read_begin:
        ld b,#0x2f
 read_wait:
        in a,(c)
index 00230ec..997812c 100644 (file)
@@ -56,7 +56,7 @@ struct blkbuf *bufpool_end = bufpool + NBUFS;
  */
 void platform_discard(void)
 {
-       uint16_t discard_size = 0xC000U - (uint16_t)bufpool_end;
+       uint16_t discard_size = ((uint16_t)&udata) - (uint16_t)bufpool_end;
        bufptr bp = bufpool_end;
 
        discard_size /= sizeof(struct blkbuf);
index 65ef348..f571c20 100644 (file)
@@ -112,7 +112,8 @@ init_hardware:
                                ; video bank 7
        out (c),a               ; and we should have special mapping
                                ; already by now        
-
+       xor a
+       out (0xFE),a            ; black border
         ; screen initialization
        call _vtinit
 
@@ -124,7 +125,7 @@ init_hardware:
         .area _COMMONMEM
 
 _program_early_vectors:
-       call map_process
+       call map_process_always
        call set_vectors
        call map_kernel
 set_vectors:
@@ -168,7 +169,7 @@ map_for_swap:
 map_process_always:
 map_process_always_di:
        push af
-       ld a,#0x5                       ; 4 5 6 3
+       ld a,#0x1                       ; 0 1 2 3
        jr map_a_pop
 ;
 ;      Save and switch to kernel
@@ -182,9 +183,9 @@ map_kernel_di:
 map_kernel:
 map_kernel_restore:
        push af
+       ld a,#0x05                      ; 4 5 6 3
 map_a_pop:
        push bc
-       ld a,#0x01                      ; 0/1/2/3
        ld (current_map),a
        ld bc,(diskmotor)
        or c
@@ -202,7 +203,6 @@ map_video:
 map_restore:
        push af
         ld a, (map_store)
-       ld (current_map),a
        jr map_a_pop
 
 ;
index 250ec83..e418b2c 100644 (file)
        .globl _curattr
        .globl _vtattr
 
+       .globl map_video
+       .globl map_kernel
+
        ; Build the video library as the only driver
 
 ZXVID_ONLY     .equ    1
 
+.macro VIDEO_MAP
+       call map_video
+.endm
+
+.macro VIDEO_UNMAP
+       call map_kernel
+.endm
+
         .area _COMMONMEM
 
        .include "../dev/zx/video.s"