diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index cbf7931d..89c5da88 100644 --- a/Source/HBIOS/tms.asm +++ b/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 ;==================================================================================================