110 lines
2.5 KiB
NASM
110 lines
2.5 KiB
NASM
; WonderSwan Internal ROM Stub
|
|
; --------------------------------------
|
|
; Version 1.0
|
|
|
|
; This is a replacement for the internal rom to prevent using/including any copyrighted material.
|
|
; It does nothing, just lauching the cartridge.
|
|
; It may later include a bootsplah.
|
|
|
|
%ifdef WONDERSWAN
|
|
%define ROM_SIZE 4096
|
|
%define ROM_SEG 0FF00h
|
|
%else
|
|
%define ROM_SIZE 8192
|
|
%define ROM_SEG 0FE00h
|
|
%endif
|
|
|
|
; Setup NASM for a 80186
|
|
bits 16
|
|
cpu 186
|
|
|
|
org 0000h
|
|
|
|
%define JUMPER_LOCATION 0000h:0400h
|
|
; ---------------------------------------------------------------------------------------------
|
|
; Boot ROM jumper
|
|
; ---------------------------------------------------------------------------------------------
|
|
; Lock the bootrom
|
|
; Clear a bit of itself
|
|
; Jump to FFFF:FFF0
|
|
;
|
|
; Must be copied to 0000:0400 then jmp 0000:0400
|
|
ram_jumper:
|
|
|
|
; Lock the boot rom away
|
|
IN al, 0A0h
|
|
OR al, 001h ; Bit 0 lock the boot rom
|
|
out 0A0h, al
|
|
|
|
mov ax, cs
|
|
mov es, ax
|
|
mov di, 0400h
|
|
mov cx, (.rm_te_end - ram_jumper)
|
|
xor ax, ax
|
|
xor bx, bx
|
|
.rm_te_end:
|
|
rep stosb
|
|
jmp 0FFFFh:00000h
|
|
ram_jumper_end:
|
|
|
|
_start:
|
|
cli
|
|
cld
|
|
push cs
|
|
pop ds
|
|
|
|
in al, 0A0h
|
|
; Bit 2 - 1 = cart using 16bit data bus
|
|
or al, 004h
|
|
out 0A0h, al
|
|
|
|
xor ax, ax
|
|
mov es, ax
|
|
|
|
; Clear the IRAM
|
|
mov di, 0
|
|
mov cx, 16384
|
|
xor al, al
|
|
rep stosb ; STOSB -> ES:DI
|
|
|
|
; Copy the jumper
|
|
mov si, ram_jumper
|
|
mov cx, (ram_jumper_end - ram_jumper)
|
|
mov di, 0400h
|
|
xor ax, ax
|
|
mov es, ax
|
|
rep movsb ; DS:SI -> ES:DI
|
|
|
|
; Do some register cleanup
|
|
mov al, 0FFh
|
|
out 0C0h, al
|
|
out 0C1h, al
|
|
out 0C2h, al
|
|
xor ax, ax
|
|
xor cx, cx
|
|
xor dx, dx
|
|
mov ds, ax
|
|
mov es, ax
|
|
|
|
; Jump to the jumper!
|
|
jmp JUMPER_LOCATION
|
|
|
|
%ifdef WONDERSWAN
|
|
db "WonderSwan"
|
|
%elifdef WONDERSWANCOLOR
|
|
db "WonderSwan Color"
|
|
%elifdef SWANCRYSTAL
|
|
db "WonderSwan Crystal"
|
|
%else
|
|
%endif
|
|
db " internal ROM Stub for NewOswan (c)2021 986-Studio"
|
|
; Create at the end of the block, add padding if needed
|
|
TIMES (ROM_SIZE - 16) - ($-$$) DB 0FFh
|
|
|
|
jmp ROM_SEG:_start ; 0
|
|
db 00 ; ?? ; 5
|
|
db 0F0h ; Dev ID ; 6
|
|
db 00 ; Min Swan type ; 7
|
|
db 00000100b ; flags ; C
|
|
db 01 ; No RTC ; D
|
|
dw 0FFFFh ; CRC (need to update it after, but as not used by the rom, no need for now) |