fixed vdp init
authorJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 4 Jan 2024 03:05:04 +0000 (05:05 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 4 Jan 2024 03:05:04 +0000 (05:05 +0200)
Makefile
src/debug.c
src/hwregs.h
src/main.c
src/vdp.S

index 7ad74b6..3c55c8f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,6 @@ CFLAGS = -m68000 -ffreestanding -fno-builtin -fcommon $(warn) $(dbg) $(opt) $(de
 CPPFLAGS = $(def)
 ASFLAGS = -m68000 $(inc)
 LDFLAGS = -T megadrive.ld -print-gc-sections
-#                -L/usr/lib/gcc-cross/m68k-linux-gnu/11 -lgcc
 
 Z80AS = vasmz80_oldstyle
 Z80ASFLAGS = -Fvobj
index 05f0cd9..4616177 100644 (file)
@@ -104,8 +104,7 @@ struct frame {
 
 void exc_dump(unsigned int num, struct frame *frm)
 {
-       dbg_setcursor(0, 0);
-       printf("num addr: %x\n", &num);
+       dbg_setcursor(1, 1);
 
        if(num < sizeof exc_str / sizeof *exc_str) {
                printf("Exception %xh: %s\n", num, exc_str[num]);
@@ -115,5 +114,4 @@ void exc_dump(unsigned int num, struct frame *frm)
 
        printf("status: %x\n", frm->status);
        printf("pc: %x\n", frm->pc);
-       printf("fmt: %x / vector: %x\n", frm->fmtoffs >> 12, frm->fmtoffs & 0xfff);
 }
index 8e21f25..4455811 100644 (file)
 #define VDP_CRAM_DMA   0xc0000080
 #define VDP_VSRAM_DMA  0x40000090
 
+#define VDP_RGB(r, g, b) \
+       (((uint16_t)(r) & 0xe) | \
+        (((uint16_t)(g) & 0xe) << 4) | \
+        (((uint16_t)(b) & 0xe) << 8))
+
+
 #ifndef ASM
 #include <stdint.h>
 
index c404fd1..8550c67 100644 (file)
@@ -22,9 +22,9 @@ int main(void)
        dna_init();
 
        for(;;) {
-               dbg_setcursor(32, 0);
+               dbg_setcursor(30, 0);
                for(i=0; i<4; i++) {
-                       printf("%x\n", (unsigned int)dbgval[i]);
+                       printf("%08x\n", (unsigned int)dbgval[i]);
                }
                spr_begin();
 
index 5727a56..990a3ef 100644 (file)
--- a/src/vdp.S
+++ b/src/vdp.S
@@ -1,20 +1,15 @@
        .text
 
-#define ASM
 #include "hwregs.h"
 
        .globl vdp_init
 vdp_init:
        movea.l #def_reg_tab, %a0
-       move.w #0, %d1
-0:     move.w %d1, %d0
-       lsl.w #8, %d0
+       moveq #14, %d1
+0:     move.w (%a0)+, %d0
        or.w #0x8000, %d0
-       move.b (%a0)+, %d0
        move.w %d0, VDP_CTL_PORT        | VDP_CTL = 0x8000 | (reg << 8) | val
-       add.w #1, %d1
-       cmp.w def_reg_tab_size, %d1
-       bne.s 0b
+       dbra %d1, 0b
 
        | clear vram
        movea.l #VDP_DATA_PORT, %a0
@@ -55,8 +50,9 @@ setup_addr:
        .globl vdp_setcolor
 vdp_setcolor:
        move.l 4(%sp), %d0      | palette number
-       lsl.l #5, %d0
+       lsl.l #4, %d0
        add.l 8(%sp), %d0       | add index
+       lsl.l #1, %d0
        move.l #VDP_CRAM, %d1
        bsr setup_addr
        move.w 22(%sp), %d0     | blue
@@ -68,30 +64,26 @@ vdp_setcolor:
        move.w %d0, VDP_DATA_PORT
        rts
 
-       .data
+       .section .rodata
 def_reg_tab:
-       .byte VDP_M1_INIT                       | 0: mode 1
-       .byte VDP_M2_INIT + VDP_M2_DISP         | 1: mode 2
-       .byte VDP_NA_ADDR(0xc000)               | 2: scroll A nametable addr.
-       .byte 0                                 | 3: window nametable addr.
-       .byte VDP_NB_ADDR(0xd000)               | 4: scroll B nametable addr.
-       .byte VDP_SPRTAB_ADDR(0xe000)           | 5: sprite table addr.
-       .byte 0
-       .byte 0                                 | 7: bg color
-       .byte 0, 0
-       .byte 0                                 | 10: horiz. interrupt interval
-       .byte 0                                 | 11: mode 3
-       .byte VDP_M4_H40                        | 12: mode 4
-       .byte VDP_HSTAB_ADDR(0xf000)            | 13: hscroll table addr.
-       .byte 0
-       .byte 2                                 | 15: autoincrement 2 bytes
-       .byte VDP_SCR_H64                       | 16: scroll size (64x32)
-       .byte 0, 0                              | 17,18: win x/y pos
-       .byte 0, 0, 0, 0, 0                     | 19-23: DMA regs
-def_reg_tab_end:
-       .align 2
-def_reg_tab_size:
-       .word def_reg_tab_end - def_reg_tab
+       .byte VDP_REG_MODE1, VDP_M1_INIT                | 0: mode 1
+       .byte VDP_REG_MODE2, VDP_M2_INIT + VDP_M2_DISP  | 1: mode 2
+       .byte VDP_REG_NAMEA, VDP_NA_ADDR(0xc000)        | 2: scroll A nametable addr.
+       .byte VDP_REG_NAMEW, 0                          | 3: window nametable addr.
+       .byte VDP_REG_NAMEB, VDP_NB_ADDR(0xd000)        | 4: scroll B nametable addr.
+       .byte VDP_REG_SPR, VDP_SPRTAB_ADDR(0xe000)      | 5: sprite table addr.
+       .byte VDP_REG_BGCOL, 0                          | 7: bg color
+       .byte VDP_REG_HINTR, 0                          | 10: horiz. interrupt interval
+       .byte VDP_REG_MODE3, 0                          | 11: mode 3
+       .byte VDP_REG_MODE4, VDP_M4_H40                 | 12: mode 4
+       .byte VDP_REG_HSCROLL, VDP_HSTAB_ADDR(0xf000)   | 13: hscroll table addr.
+       .byte VDP_REG_AUTOINC, 2                        | 15: autoincrement 2 bytes
+       .byte VDP_REG_SCROLLSZ, VDP_SCR_H64             | 16: scroll size (64x32)
+       .byte VDP_REG_WINX, 0, VDP_REG_WINY, 0          | 17,18: win x/y pos
+       | zeroing the DMA registers at this point causes the real machine to
+       | hang, so skip them.
+       |.byte VDP_REG_DMACNTL, 0, VDP_REG_DMACNTH, 0   | 19-23: DMA regs
+       |.byte VDP_REG_DMASRCL, 0, VDP_REG_DMASRCM, 0, VDP_REG_DMASRCH, 0       
 
        
 | vi:ft=gas68k: