From: Robin Krens Date: Tue, 7 Jun 2022 19:55:39 +0000 (+0200) Subject: refactor: use for ia86-elf-gcc toolchain + linker file X-Git-Url: https://robinkrens.nl/gitweb/?p=swan-dev;a=commitdiff_plain;h=b0e61a103125d4eee18c802d4b5612d13722c564 refactor: use for ia86-elf-gcc toolchain + linker file - use of gas style assembly in entry.S - copy to RAM func - jump to C - main.c tests for .bss (global) and .data data - makefile changes for toolchain - added swan.ld linker file to make layout sections easier --- diff --git a/Makefile b/Makefile index de9a494..f949274 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,39 @@ -# simple makefile -INC=./inc -CC=bcc -LD=ld86 -AS=nasm -MED=mednafen - -#$(LD) -M src/*.o - -# -d delete headers -# -s strip symbols -all: - $(LD) -T0x0 -D0xF000 src/*.o -d -s -o test.wsc - -# use -x to for -ffreestanding -c-files: - $(CC) -0 -c src/*.c -I$(INC) -init: - $(AS) -fas86 src/*.s -i $(INC) +# +# makefile for swan-sdk +# -add: - cp test.wsc tools/ - cd tools && ./romheader +OUT = test.wsc +CC = ia16-elf-gcc +LD = ia16-elf-ld +ODIR = obj +ADIR = objs +SDIR = src +INC = -Iinc -run: - $(MED) tools/test.wsc +CFLAGS = -march=v30 -ffreestanding # use NEC v30 chip -clean: - rm -rf src/*.o test.wsc +_OBJS = entry.o main.o # todo: make sure entry is forced as entry point for linker + +OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS)) + +LDFILE = swan.ld + + +$(ODIR)/%.o: $(SDIR)/%.c + $(CC) -c $(INC) -o $@ $< $(CFLAGS) +$(ODIR)/entry.o: $(SDIR)/entry.S + $(CC) -c $(INC) -o $@ $< $(CFLAGS) +$(OUT): $(OBJS) + $(LD) -T $(LDFILE) $^ -o $(OUT) + +add: + ./romheader +run: + mednafen test.wsc + +.PHONY: clean + +clean: + rm -f $(ODIR)/*.o $(OUT) diff --git a/romheader b/romheader new file mode 100755 index 0000000..19a4baf Binary files /dev/null and b/romheader differ diff --git a/src/entry.S b/src/entry.S new file mode 100644 index 0000000..e1393e5 --- /dev/null +++ b/src/entry.S @@ -0,0 +1,54 @@ +# File : entry.S +# Author : Robin Krens +# Date : 07.06.2022 +# Last Modified Date: 07.06.2022 +# Last Modified By : Robin Krens + +.org 0 +.code16 + +.extern main +.extern _stext +.extern _etext +.extern _sdata +.extern _edata +.global _start + +_start: + # reset flags and registers + cli + cld + xor %ax,%ax + mov %ax,%bx + mov %ax,%bp + mov %ax,%ss + + # set stack pointer for wonderswan + # color + mov $0xFE00 - 2,%ax + mov %ax,%sp + +copy_to_ram: + mov $_etext, %ax + # set data segment to ROM bank + mov $0x2000, %bx + mov %bx, %ds + mov %ax, %si + mov $_sdata, %bx + mov %bx, %di + # calculate size + mov $_edata, %ax + mov $_sdata, %bx + sub %bx, %ax + mov %ax, %cx + rep movsb + # reset data segment to RAM + xor %ax, %ax + mov %ax, %ds + + # jump to C + call main + + # should not be here +loop: nop + jmp loop diff --git a/src/init.s b/src/init.s deleted file mode 100644 index cb1bb03..0000000 --- a/src/init.s +++ /dev/null @@ -1,222 +0,0 @@ - -%include "WonderSwan.inc" - -extern _main -extern _test_copy -extern __etext -extern __seg1DL -extern __seg1DH -extern __edata -extern __end - -MYSEGMENT equ 0xF000 -USER_RAM equ 0x1000 - -; Set Maps and Sprite Table at the end of first part of ram -fgmap equ WSC_TILE_BANK1-MAP_SIZE -bgmap equ fgmap-MAP_SIZE -sprtable equ bgmap-SPR_TABLE_SIZE - - - cpu 186 - bits 16 - - ;PADDING 15 ; Pad 15 Sections - - section .text - - ;ORG 0x0000 - -..start: - cli ; Disable Interrupts - cld ; Offset in Increment mode - - xor ax,ax ; Clear all registers - mov bx,ax - mov cx,ax - mov dx,ax - mov si,ax - mov di,ax - mov ds,ax ; Clear Segments - mov es,ax - - mov bp,ax ; Setup stack - mov ss,ax - mov sp,WS_STACK - - in al,IO_HARDWARE_TYPE ; Check Wonderswan Mono/Color - test al,WS_COLOR -.mono: jz .mono ; We loop forever if Mono - - mov sp,WSC_STACK ; New stack - - ;call _main - - xor ax,ax ; Clear Ram - mov di,0x100 - mov cx,0x7E80 - rep stosw - - out IO_SRAM_BANK,al - - - ;mov cx, 0x100 - - ; Video Init - in al,IO_VIDEO_MODE - or al,VMODE_16C_CHK | VMODE_CLEANINIT - out IO_VIDEO_MODE,al - - xor ax,ax - - out IO_BG_X,al - out IO_BG_Y,al - out IO_FG_X,al - out IO_FG_Y,al - - out IO_SPR_START,al - out IO_SPR_STOP,al - - mov al,BG_MAP(bgmap) | FG_MAP(fgmap) - out IO_FGBG_MAP,al - - mov al,SPR_TABLE(sprtable) - out IO_SPR_TABLE,al - - in al,IO_LCD_CTRL - or al,LCD_ON - out IO_LCD_CTRL,al - - xor al,al - out IO_LCD_ICONS,al - - ; Setup VBlank Int - mov ax,INT_BASE - out IO_INT_BASE,al - - mov di,INTVEC_VBLANK_START - add di,ax - shl di,2 ; *4 - mov word [es:di],VBlank - mov word [es:di+0x2],MYSEGMENT - - xor ax,ax ; Clear HBL & Timer - out IOw_HBLANK_FREQ,ax - out IO_TIMER_CTRL,al - - dec al ; Ack all Int - out IO_INT_ACK,al - - mov al,INT_VBLANK_START ; Enable VBL Int - out IO_INT_ENABLE,al - - sti ; Enable Interrupts ! - -;-------------------------------- - - ; Set Segments for Copy - mov ax,0x2000 ; ! note, try 0x2000, 0x4000, etc.. - mov ds,ax - xor ax,ax - mov es,ax - - mov si, __seg1DL - mov di, USER_RAM - mov ax, __seg1DH - mov bx, __seg1DL - sub bx, ax - mov cx, ax - rep movsb - ; Make BG - - mov si,TileGfx - mov di,WSC_TILE_BANK1 - mov cx,(TileGfxE-TileGfx)/2 - rep movsw - - ;mov si,TilePal - ;mov di,WSC_PALETTES - ;mov cx,32 - ;rep movsb -;back: - call _main - ;call _main - ;call _test_copy - ;call _test_copy - ;jmp back - - mov ax,BG_CHR(0,0,0,0,0) ; Initial Tile, Pal 0, Bank 0 - mov di,bgmap - mov cx,MAP_TWIDTH*MAP_THEIGHT - rep stosw - - ; Display ! - mov al,BG_ON | FG_ON - out IO_DISPLAY_CTRL,al - -blaat: - jmp blaat - - ; Loop Read Buttons -loop: - mov al,KEYPAD_READ_BUTTONS - out IO_KEYPAD,al - nop - nop - nop - nop - in al,IO_KEYPAD - - test al,PAD_A ; Press A for Audio - jz loop - - call _main - jmp loop - -;****************************************** - -VBlank: - push ax - - mov al,[es:VBLcnt] - inc al - mov [es:VBLcnt],al - and al,3 - jnz .noscroll - - in al,IO_BG_X ; Infinite Scroll - inc al - out IO_BG_X,al - - in al,IO_BG_Y - inc al - out IO_BG_Y,al - -.noscroll: - in al,IO_INT_ACK - or al,INT_VBLANK_START - out IO_INT_ACK,al - - pop ax - iret - -;****************************************** - - align 2 - -TilePal: incbin "gfx/bgtile.pal" -TileGfx: incbin "gfx/bgtile.gfx" -TileGfxE: - -;****************************************** - - ;ROM_HEADER __end, MYSEGMENT, 0x42, RH_WS_COLOR, RH_ROM_8MBITS, RH_NO_SRAM, RH_HORIZONTAL - -;****************************************** - - ;section .bss - - ;start=0x0100 ; Keep space for Int Vectors - -VBLcnt: resb 0 ; Our datas in RAM - diff --git a/src/main.c b/src/main.c index 3763f3c..502d63c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,101 +1,51 @@ -/* #include */ -#include -void outport(c) - unsigned c; -{ -#asm - xor dx, dx - mov dx, ax - shr dx, 8 - out dx, al - ;out 0x15, al -#endasm -} - -static unsigned char data[] = { -0x65, 0x06, 0x67, 0x06, 0x79, 0x07, 0x8c, 0x08, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, -0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f +/* sprite data */ +unsigned char bgtile_gfx[] = { + 0x31, 0x22, 0x31, 0x32, 0x22, 0x31, 0x23, 0x21, 0x13, 0x13, 0x31, 0x32, + 0x32, 0x31, 0x23, 0x12, 0x21, 0x32, 0x13, 0x23, 0x23, 0x13, 0x31, 0x31, + 0x12, 0x32, 0x13, 0x22, 0x23, 0x13, 0x22, 0x13 }; -static unsigned char data2[] = { -0x65, 0x06, 0x67, 0x06, 0x79, 0x07, 0x8c, 0x08, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, -0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f +/* palette data */ +unsigned char bgtile_pal[] = { + 0x65, 0x06, 0x67, 0x06, 0x79, 0x07, 0x8c, 0x08, 0xff, 0x0f, 0xff, 0x0f, + 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, + 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f }; -static unsigned char data3[] = { -0x65, 0x06, 0x67, 0x06, 0x79, 0x07, 0x8c, 0x08, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, -0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f -}; - +/* data */ +unsigned char lol[5] = { 0xAA, 0x2, 0x3, 0x4, 0x5}; +unsigned char lol2[5] = { 0x1, 0x2, 0x3, 0x4, 0x5}; +unsigned char lol3[5] = { 0x1, 0x2, 0x3, 0x4, 0x5}; +#define PALETTE (*(volatile unsigned *)0xFE00) +#define PALETTE_T (volatile unsigned *)0xFE00 +#define SPRITE_T (volatile unsigned *)0x4000 -unsigned short *memcpy(dest, src, cnt) - unsigned short *dest; - unsigned short *src; - int cnt; -{ - - int i; -#asm - ;push ds - ;push es - mov ax, 0x0 - mov ds, ax - xor ax, ax - mov es, ax -#endasm - for (i = 0; i < cnt; ++i) { - *dest++ = *src++; - //*dest++ = 0x66; - } -#asm - ;pop es - ;pop ds - mov ds, 0xF000 -#endasm - return dest; -} - -void test_copy() -{ -#asm - ;mov ds, 0 -#endasm - -// unsigned short dest = 0xFE00; -// unsigned * ptr = dest; -// *ptr++ = 0xDEAD; -// *ptr++ = 0xAAAA; -// *ptr++ = 0xDEAD; - memcpy(0xFE00, 0x1000, 16); -#asm - ;mov ds, 0xF000 -#endasm - //wmemcpy(WSC_PALETTES, 0x2F000, 32); - return; -} +/* bss */ +static unsigned char blaat[100]; -int main() +int main(void) { - unsigned short data_seg = 0xF000; - unsigned short data_ram = 0x1000; - unsigned short rel_ram = data_seg - data_ram; + lol[0] = 0xDD; + lol[1] = 0xDD; - /* dummy */ - memcpy(0x0, 0x0, 0); - - memcpy(0xFE00, data - rel_ram, 16); - //memcpy(0xFE00, data_seg + data, 16); + blaat[0] = 0xEE; + blaat[1] = 0xEE; + blaat[32] = 0xEE; - //while(1) { - // /* outport(0x15EE); */ - // unsigned reg = 0x15; - // unsigned val = 0xEE; - // outport((reg << 8) | val); - - //} + unsigned char * ptr = PALETTE_T; + for (int i = 0; i < sizeof(bgtile_pal); ++i) { + *ptr++ = bgtile_pal[i]; + } + + ptr = SPRITE_T; + for (int i = 0; i < sizeof(bgtile_gfx); ++i) { + *ptr++ = bgtile_gfx[i]; + } + while(1) { + } return 0; } diff --git a/swan.ld b/swan.ld new file mode 100644 index 0000000..e3c7449 --- /dev/null +++ b/swan.ld @@ -0,0 +1,26 @@ +OUTPUT_FORMAT(binary) +ENTRY(_start) +SECTIONS +{ + . = 0x0; + .text : + { + _stext = .; + *(.text); + _etext = .; + } + . = 0x1000; + .data : AT(_etext) + { + _sdata = .; + *(.data); + _edata = .; + *(.bss); + *(.rodata); + } + _heap = ALIGN(4); + /DISCARD/ : + { + *(.eh_frame) + } +}