mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Merge pull request #653 from b3rendsh/master
hbios/tms: added F18A detection, report device attributes
This commit is contained in:
@@ -8,15 +8,19 @@
|
||||
; UPDATED BY: DAN WERNER -- 2/11/2024 - DUODYNE SUPPORT
|
||||
; UPDATED BY: DAN WERNER -- 11/27/2025 - N8PC SUPPORT
|
||||
; UPDATED BY: DEAN NETHERTON -- 1/7/2026 - ADDED RUNTIME DETECTION OF CHIP TYPE AND VRAM SIZE
|
||||
; UPDATED BY: HENK BERENDS - 1/15/2026 - ADDED F18A FPGA DETECTION AND REPORT VDP_ID IN VDADEV FUNCTION
|
||||
|
||||
;======================================================================
|
||||
;
|
||||
; TODO:
|
||||
; - CAN WE AUTO DETECT TMS VS V99x8 AND THUS AUTO SELECT TMS80COLS AT RUNTIME?
|
||||
; - CAN WE AUTO DETECT TYPE FOR FPGA EMULATED VERSIONS?
|
||||
; - CAN WE SET 40/80 COLUMNS AT RUNTIME BASED ON DETECTED VDP_ID (40:ID=0 80:ID>0)?
|
||||
; - IS THERE A NEED TO DETECT OTHER THAN F18A FPGA? IF YES WHICH ONE(S)?
|
||||
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION?
|
||||
; - IMPLEMENT ALTERNATE DISPLAY MODES?
|
||||
; - IMPLEMENT DYNAMIC READ/WRITE OF CHARACTER BITMAP DATA?
|
||||
; - SET REGISTERS DEPENDING ON TMSMODE AND VDP_ID (USE COLECO OR MSX DEFAULTS)?
|
||||
; - DETECT VRAM SIZES 4KB,16KB AND 32KB
|
||||
; - REPORT OTHER ATTRIBUTES IN VDADEV FUNCTION?
|
||||
;
|
||||
;======================================================================
|
||||
; TMS DRIVER - CONSTANTS
|
||||
@@ -341,7 +345,8 @@ TMS_INIT1:
|
||||
CALL PRTSTRD
|
||||
.TEXT " VDP=$"
|
||||
|
||||
CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, x: VDP ID
|
||||
CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: SUPER V9958, 4:F18A
|
||||
LD (TMS_ATTRIB),A ; SET VDP_ID IN LOW BYTE OF DEVICE ATTRIBUTES
|
||||
|
||||
PUSH AF
|
||||
CALL TMS_CRTINIT ; SETUP THE TMS/V99x8 CHIP REGISTERS
|
||||
@@ -355,8 +360,8 @@ TMS_INIT1:
|
||||
JR NZ, TMS_NOT9918
|
||||
|
||||
CALL PRTSTRD
|
||||
.TEXT "TMS9918 VRAM=16KB INTERRUPT=60HZ$"
|
||||
JR TMS_INIT4
|
||||
.TEXT "TMS9918A$"
|
||||
JR TMS_INIT3
|
||||
|
||||
TMS_NOT9918:
|
||||
DEC A
|
||||
@@ -375,10 +380,19 @@ TMS_NOT9938:
|
||||
JR TMS_INIT2
|
||||
|
||||
TMS_NOTV9958:
|
||||
; ASSUME SUPER V9958
|
||||
DEC A
|
||||
JR NZ, TMS_NOTSV9958
|
||||
|
||||
CALL PRTSTRD
|
||||
.TEXT "SUPER V9958 VRAM=8MB$"
|
||||
JR TMS_INIT3
|
||||
|
||||
TMS_NOTSV9958:
|
||||
; ASSUME F18A
|
||||
CALL PRTSTRD
|
||||
.TEXT "F18A$"
|
||||
JR TMS_INIT3
|
||||
|
||||
|
||||
TMS_INIT2:
|
||||
CALL PRTSTRD
|
||||
@@ -390,14 +404,14 @@ TMS_INIT2:
|
||||
JR NZ, NOT_64K
|
||||
|
||||
PRTS("64KB$")
|
||||
JR TMS_INIT4
|
||||
JR TMS_INIT3
|
||||
|
||||
NOT_64K:
|
||||
DEC A
|
||||
JR NZ, NOT_128K
|
||||
|
||||
PRTS("128KB$")
|
||||
JR TMS_INIT4
|
||||
JR TMS_INIT3
|
||||
|
||||
NOT_128K:
|
||||
PRTS("192KB$")
|
||||
@@ -568,6 +582,7 @@ TMS_VDARES:
|
||||
RET
|
||||
|
||||
TMS_VDADEV:
|
||||
LD BC,(TMS_ATTRIB) ; C := DEVICE ATTRIBUTES: VDP ID (B:= 0,RESERVED)
|
||||
LD D,VDADEV_TMS ; D := DEVICE TYPE
|
||||
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
|
||||
LD H,TMSMODE ; H := MODE
|
||||
@@ -829,13 +844,12 @@ TMS_PROBE:
|
||||
;
|
||||
; ASSUMES INTERRUPTS ARE DISABLED (DI)
|
||||
;
|
||||
; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: Super V9958
|
||||
; F <- z: TMS9918A, nz: other
|
||||
; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: Super V9958, 4: F18A
|
||||
;
|
||||
TMS_GETTYP:
|
||||
; Code sourced from https://map.grauw.nl/sources/vdp_detection.php
|
||||
CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A
|
||||
RET Z ; RETURN 0 FOR TMS9918
|
||||
JR Z,TMS_ISF18A ; IF TMS9918A CHECK FOR F18A VARIANT
|
||||
LD A,1 ; SELECT S#1
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
@@ -868,6 +882,56 @@ TMS_GETTYP:
|
||||
TMS_ISV9938:
|
||||
INC A ; RETURN 1 FOR V9938
|
||||
RET
|
||||
|
||||
TMS_ISF18A:
|
||||
; CHECK FOR F18A FPGA/EMULATOR VARIANT
|
||||
; THE VDP REGISTERS MUST BE (RE)INITIALIZED AFTER THE CHECK
|
||||
; RETURN A <- 0:TMS9918A 4:F18A
|
||||
;
|
||||
; UNLOCK THE F18A: SEND VALUE $1C TO REGISTER 57 TWICE
|
||||
LD A,$1C ; UNLOCK VALUE
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
LD A,57 + 128 ; REGISTER #57
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
LD A,$1C ; UNLOCK VALUE
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
LD A,57 + 128 ; REGISTER #57
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
; GET VDP ID
|
||||
LD A,1 ; SELECT S#1
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
LD A,15 + 128 ; REGISTER #15
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
EZ80_IO
|
||||
IN A,(TMS_CMDREG) ; READ S#1
|
||||
AND 11110000B ; MASK HIGH NIBBLE
|
||||
CP $E0 ; IS IT A F18A?
|
||||
LD A,0 ; SELECT S#0 / NOT F18A
|
||||
PUSH AF
|
||||
; RESTORE STATUS REGISTER S#0 FOR INT HANDLER
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
LD A,15 + 128
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
; RELOCK THE F18A
|
||||
XOR A ; LOCK VALUE
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
LD A,57 + 128 ; REGISTER #57
|
||||
EZ80_IO
|
||||
OUT (TMS_CMDREG),A
|
||||
POP AF
|
||||
RET NZ ; NOT F18A: A=0
|
||||
LD A,4 ; F18A: A=4
|
||||
RET
|
||||
|
||||
;
|
||||
; TEST IF THE VDP IS A TMS9918A.
|
||||
;
|
||||
@@ -1480,6 +1544,8 @@ TMS_BUF .FILL 256,0 ; COPY BUFFER
|
||||
; ANSI-->TMS Color Conversion Table
|
||||
TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F
|
||||
;
|
||||
TMS_ATTRIB .DW 0 ; VDA DEVICE ATTRIBUTES (VDP_ID,VRAM,FREQ)
|
||||
;
|
||||
;==================================================================================================
|
||||
; TMS DRIVER - INSTANCE DATA
|
||||
;==================================================================================================
|
||||
|
||||
Reference in New Issue
Block a user