256 lines
6.9 KiB
ArmAsm
256 lines
6.9 KiB
ArmAsm
;----------------------------------------------------------------
|
|
;BIOS Driver for VDP V9958
|
|
;by Dennis Gunia (07/2024)
|
|
;----------------------------------------------------------------
|
|
|
|
;================================================================
|
|
; I/O registers
|
|
;================================================================
|
|
VDP_REGISTER .EQU 0xE1
|
|
VDP_RAM .EQU 0xE0
|
|
|
|
;================================================================
|
|
; VDP Registers
|
|
;================================================================
|
|
; registers
|
|
VDPR_MODE0 .EQU 0
|
|
VDPR_MODE1 .EQU 1
|
|
VDPR_MODE2 .EQU 8
|
|
VDPR_MODE3 .EQU 9
|
|
VDPR_COLOR .EQU 7
|
|
VDPR_PATNMEBASE .EQU 2
|
|
VDPR_PATGENBASE .EQU 4
|
|
VDPR_COLTBBASE0 .EQU 3
|
|
VDPR_COLTBBASE1 .EQU 10
|
|
; register bits
|
|
TMS_R8_MS .EQU 128 ;Mouse: when set to 1, sets the color bus into input mode and enables mouse. If set to 0, sets color bus into output mode and disables mouse
|
|
TMS_R8_LP .EQU 64 ;Light pen: when set to 1, enables light pen
|
|
TMS_R8_TP .EQU 32 ;Sets the color of code 0 to the color of the palette
|
|
TMS_R8_CB .EQU 16 ;Color bus: when set to 1, sets color bus into input mode. If set to 0, sets color bus into output mode
|
|
TMS_R8_VR .EQU 8 ;If set to 1, VRAM is 64Kx1Bit or 64Kx4bits. If set to 0, VRAM is 16Kx1Bit or 16Kx4Bits
|
|
TMS_R8_SPD .EQU 2 ;if set to 1, sprites are not displayed and related VRAM reads are not performed
|
|
TMS_R8_BW .EQU 1 ;if set to 1, output is grayscale in 32 tones
|
|
; colors
|
|
TmsTransparent .EQU 0
|
|
TmsBlack .EQU 1
|
|
TmsMediumGreen .EQU 2
|
|
TmsLightGreen .EQU 3
|
|
TmsDarkBlue .EQU 4
|
|
TmsLightBlue .EQU 5
|
|
TmsDarkRed .EQU 6
|
|
TmsCyan .EQU 7
|
|
TmsMediumRed .EQU 8
|
|
TmsLightRed .EQU 9
|
|
TmsDarkYellow .EQU 0ah
|
|
TmsLightYellow .EQU 0bh
|
|
TmsDarkGreen .EQU 0ch
|
|
TmsMagenta .EQU 0dh
|
|
TmsGray .EQU 0eh
|
|
TmsWhite .EQU 0fh
|
|
;================================================================
|
|
; I/O access functions
|
|
;================================================================
|
|
|
|
;------------------------------------------------------------------------------
|
|
; set vdp register
|
|
;
|
|
; inputs: a (value), e (register)
|
|
;------------------------------------------------------------------------------
|
|
VDP_SETREG:
|
|
out (VDP_REGISTER), a
|
|
ld a,e
|
|
or 80h
|
|
out (VDP_REGISTER), a
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
; read vdp status register
|
|
;
|
|
; inputs: a (register)
|
|
;------------------------------------------------------------------------------
|
|
VDP_STS:
|
|
out (VDP_RAM),a ;write addr
|
|
ld a,15 + 128
|
|
out (VDP_RAM),a ;selct reg for read
|
|
in a,(VDP_RAM)
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
; set vdp ram pointer for read
|
|
;
|
|
; inputs: ahl (address)
|
|
;------------------------------------------------------------------------------
|
|
VDP_RAMADDR_RD:
|
|
rlc h
|
|
rla
|
|
rlc h
|
|
rla
|
|
srl h
|
|
srl h
|
|
out (VDP_REGISTER),a
|
|
ld a,14 + 128
|
|
out (VDP_REGISTER),a
|
|
ld a,l
|
|
out (VDP_REGISTER),a
|
|
ld a,h
|
|
out (VDP_REGISTER),a
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
; set vdp ram pointer for write
|
|
;
|
|
; inputs: ahl (address)
|
|
;------------------------------------------------------------------------------
|
|
VDP_RAMADDR_WR:
|
|
rlc h
|
|
rla
|
|
rlc h
|
|
rla
|
|
srl h
|
|
srl h
|
|
out (VDP_REGISTER),a
|
|
ld a,14 + 128
|
|
out (VDP_REGISTER),a
|
|
ld a,l
|
|
out (VDP_REGISTER),a
|
|
ld a,h
|
|
or 64
|
|
out (VDP_REGISTER),a
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
; set vdp console color
|
|
;
|
|
; inputs: b (back color), c (front color)
|
|
; destroys: e, af
|
|
;------------------------------------------------------------------------------
|
|
VDP_COLOR:
|
|
ld a,c ;load front color to a
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
or b ;combine back color
|
|
ld e, VDPR_COLOR
|
|
call VDP_SETREG
|
|
; set blink color
|
|
ld e, 12 ; set blink color
|
|
ld a,b ;load front color to a
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
or c ;combine back color
|
|
call VDP_SETREG
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
; copy block of memory to vdp
|
|
;
|
|
; inputs: hl (source in local ram)
|
|
; de (destination in vram)
|
|
; bc (byte counter)
|
|
; destroys: af
|
|
;------------------------------------------------------------------------------
|
|
VDP_LOADRAM:
|
|
;setup address
|
|
push hl
|
|
ex de,hl
|
|
ld a,0
|
|
call VDP_RAMADDR_WR
|
|
pop hl
|
|
_VDP_LOADRAM_LOOP:
|
|
ld a,(hl) ;load byte from system
|
|
inc hl
|
|
out (VDP_RAM),a
|
|
dec bc ;decrement counter
|
|
ld a,b ;check if zero
|
|
or c
|
|
jr nz, _VDP_LOADRAM_LOOP ;if not loop
|
|
ret ;else exit
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
; fill block of memory in vdp
|
|
;
|
|
; inputs: a (value to write)
|
|
; de (destination in vram)
|
|
; bc (byte counter)
|
|
; destroys: hl
|
|
;------------------------------------------------------------------------------
|
|
VDP_FILL:
|
|
push af
|
|
ex de,hl
|
|
call VDP_RAMADDR_WR
|
|
_VDP_FILL_LOOP:
|
|
pop af
|
|
out (VDP_RAM),a
|
|
push af
|
|
dec bc ;decrement counter
|
|
ld a,b ;check if zero
|
|
or c
|
|
jr nz, _VDP_FILL_LOOP ;if not loop
|
|
pop af
|
|
ret
|
|
|
|
|
|
;================================================================
|
|
; Init screen modes
|
|
;================================================================
|
|
VDP_INIT_TEXT2:
|
|
; init vdp (80col text)
|
|
ld e, VDPR_MODE0
|
|
ld a, 00000100b ;TEXT2
|
|
call VDP_SETREG
|
|
ld e, VDPR_MODE1 ;blank screen wit 64K enabled
|
|
ld a, 00001000b
|
|
call VDP_SETREG
|
|
ld e, VDPR_MODE2
|
|
ld a, TMS_R8_SPD
|
|
call VDP_SETREG
|
|
ld e, VDPR_MODE3
|
|
ld a, 00000010b
|
|
call VDP_SETREG
|
|
; set memory layout
|
|
; set pattern name table
|
|
ld e, VDPR_PATNMEBASE
|
|
ld a, 00000011b
|
|
call VDP_SETREG
|
|
ld e, VDPR_PATGENBASE
|
|
ld a, 00000010b
|
|
call VDP_SETREG
|
|
ld e, VDPR_COLTBBASE0
|
|
ld a, 00101111b
|
|
call VDP_SETREG
|
|
ld e, VDPR_COLTBBASE1
|
|
ld a, 00000000b
|
|
call VDP_SETREG
|
|
;enable cpu wait (for fast writes. Required!!!!)
|
|
ld e,25
|
|
ld a,4
|
|
call VDP_SETREG
|
|
;setup cursor:
|
|
ld e, 13 ; set blink rate
|
|
ld a, 0x22
|
|
call VDP_SETREG
|
|
;fill nametable to 0
|
|
ld de, 0x0000
|
|
ld bc, 0x2000
|
|
ld a, 0
|
|
call VDP_FILL
|
|
;load font
|
|
ld hl, [VDP_FONT_6x8_80COL]
|
|
ld bc, 256*8
|
|
ld de, 0x1000
|
|
call VDP_LOADRAM
|
|
;enable screen wit 64K enabled
|
|
ld e, VDPR_MODE1
|
|
ld a, 01010000b
|
|
call VDP_SETREG
|
|
ret
|
|
|
|
;================================================================
|
|
; Fonts
|
|
;================================================================
|
|
VDP_FONT_6x8_80COL:
|
|
.include "font80.s" |