Browse Source

Merge pull request #653 from b3rendsh/master

hbios/tms: added F18A detection, report device attributes
pull/654/head
Wayne Warthen 2 weeks ago
committed by GitHub
parent
commit
3fe68d3f9a
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 88
      Source/HBIOS/tms.asm

88
Source/HBIOS/tms.asm

@ -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
;==================================================================================================

Loading…
Cancel
Save