VOGONS


Reply 120 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie

@LSS10999 (updated TEST0.ZIP)

The attachment test0.zip is no longer available

Reply 121 of 152, by RayeR

User metadata
Rank Oldbie
Rank
Oldbie

Good work. Is the unlock key different for every GPU type (e.g. 960, 970) of wider family (all 9xx)? But it seems it shouldn't be hard to find it in disassembly according to your code pattern...
BTW If I remember well, the resident part of video BIOS doesn't fuly ocupy the whole segment C000-CFFF but the rom is smaller so there would be enough space to place the code (don't understand why they removed it when not 100% full). But I think this VGAs has some obstruction against vBIOS modding like some signing so not that easly like it was before (eg. on GF7xxxGT)....

just for completess pixel shift test works on my EVGA GTX 970 (GM204 rev. A1), BIOS 84.04.84.00.70, PCI ID 10DE:13C2

Last edited by RayeR on 2026-05-05, 14:21. Edited 2 times in total.

Gigabyte GA-P67-DS3-B3, Core i7-2600K @4,5GHz, 8GB DDR3, 128GB SSD, GTX970(GF7900GT), SB Audigy + YMF724F + DreamBlaster combo + LPC2ISA

Reply 122 of 152, by LSS10999

User metadata
Rank Oldbie
Rank
Oldbie
Marco Pistella wrote on 2026-05-04, 18:00:

@LSS10999 (updated TEST0.ZIP)

The attachment test0.zip is no longer available

With this version, on my RTX A4000 system it fails with message "Fail 4F06h".
So it failed on Step 2).

Reply 123 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie
LSS10999 wrote on 2026-05-05, 03:52:

With this version, on my RTX A4000 ...[CUT]

Thank you for the report.

This confirms that on RTX-generation cards the situation
is worse than on Kepler/Maxwell: not only 4F07h but also
4F06h has been removed. Both functions return 014Fh
immediately without doing anything.

This means that for Ampere and newer, a complete
reimplementation of both 4F06h and 4F07h would be
required in the TSR — a significantly more complex
undertaking than what is needed for Kepler/Maxwell where
4F06h still works correctly.

For now the TSR project is focused on Kepler/Maxwell/Pascal
where 4F06h is functional and only 4F07h needs to be
reimplemented. RTX support would require a separate
effort at a later stage.

Reply 124 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie
RayeR wrote on 2026-05-04, 18:58:

Good work. Is the unloc ... [CUT]

Good observations, thank you.

Regarding the unlock key: I do not yet know whether
2469FDB9h is family-wide or card-specific. The GT210
is a very different architecture from Kepler/Maxwell,
so the key may well differ. Tracing the BIOS on a
GTX 960 or GTX 970 using the same pattern would answer
this quickly.

On finding the key in disassembly: in principle the
pattern is recognizable, but tracing code inside a
ROM is not straightforward — you cannot simply set
a breakpoint in read-only memory. The approach I used
was a modified version of FASTBIOS.SYS, originally
developed by Tseng Labs in 1992, which copies the ROM
into RAM — at that point standard breakpoints become
possible. Not exactly a trivial setup.

On the ROM space: you are correct that the resident
BIOS does not fill the entire C000-CFFFh segment on
these cards. Why the function was removed rather than
simply left in place is unclear — deliberate policy
rather than space constraints seems the most likely
explanation.

On vBIOS signing: yes, direct ROM patching is not a
viable path on these cards. The TSR approach intercepts
INT 10h in RAM and does not touch the ROM, which avoids
the signing issue entirely.

Reply 125 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie

SCANKEY — Nvidia firmware unlock key detection

While tracing the GT210 BIOS I found an unlock key
(2469FDB9h) used in the 4F07h implementation. I have
tested it on three cards:

- GT210: key found, 4F07h fully implemented
- GT550Ti: key found, 4F07h fully implemented
- GT740 (Kepler): key found, but 4F07h deliberately
removed (two instructions: mov ax,014Fh / ret)

The key being present on the GT740 despite the function
being removed suggests it may be a family-wide constant
rather than a card-specific value. To confirm this I
need results from as many Nvidia cards as possible —
particularly Kepler, Maxwell and Pascal generations.

I have written a small utility (SCANKEY.COM, source
included) that scans the video BIOS ROM at C000h for
the key and reports whether it is found or not. It is
read-only and does not modify anything.

How it works:
1) Verifies the BIOS signature (AA55h) at C000h
2) Determines the ROM size from the header
3) Scans the entire ROM for the 32-bit value 2469FDB9h
4) Reports "Key found" or "Key not found"

Please report:
- Card model and generation
- BIOS ROM version if available
- Result (Key found / Key not found)

The attachment SCANKEY.ZIP is no longer available
	.386
CODE SEGMENT PARA PUBLIC USE16 'CODE'
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 100h

start_code:
mov ds: word ptr [msg_pointer],OFFSET dos_message_01
push 0C000h
pop es
xor si,si
cmp es: word ptr [si],0AA55h
jne exit_scankey
add si,2h
movzx ax,es: byte ptr [si]
cmp al,80h
ja exit_scankey
mov ds: word ptr [msg_pointer],OFFSET dos_message_02
shl ax,9h
sub ax,7h
loop_bios_scankey:
inc si
cmp es: dword ptr [si],2469FDB9h
je exit_scankey
dec ax
jne loop_bios_scankey
mov ds: word ptr [msg_pointer],OFFSET dos_message_03
exit_scankey:
mov ah,9h
mov dx,ds: word ptr [msg_pointer]
int 21h
mov ax,4C00h
int 21h

msg_pointer:
DW ?
dos_message_01:
DB 'Invalid VGA BIOS',0Dh,0Ah,'$'
dos_message_02:
DB 'Key found',0Dh,0Ah,'$'
dos_message_03:
DB 'Key not found',0Dh,0Ah,'$'

CODE ENDS
END start_code

Reply 126 of 152, by Falcosoft

User metadata
Rank l33t
Rank
l33t
Marco Pistella wrote on 2026-05-05, 05:30:
SCANKEY — Nvidia firmware unlock key detection […]
Show full quote

SCANKEY — Nvidia firmware unlock key detection

While tracing the GT210 BIOS I found an unlock key
(2469FDB9h) used in the 4F07h implementation. I have
tested it on three cards:

- GT210: key found, 4F07h fully implemented
- GT550Ti: key found, 4F07h fully implemented
- GT740 (Kepler): key found, but 4F07h deliberately
removed (two instructions: mov ax,014Fh / ret)

The key being present on the GT740 despite the function
being removed suggests it may be a family-wide constant
rather than a card-specific value. To confirm this I
need results from as many Nvidia cards as possible —
particularly Kepler, Maxwell and Pascal generations.

I have written a small utility (SCANKEY.COM, source
included) that scans the video BIOS ROM at C000h for
the key and reports whether it is found or not. It is
read-only and does not modify anything.

How it works:
1) Verifies the BIOS signature (AA55h) at C000h
2) Determines the ROM size from the header
3) Scans the entire ROM for the 32-bit value 2469FDB9h
4) Reports "Key found" or "Key not found"

Please report:
- Card model and generation
- BIOS ROM version if available
- Result (Key found / Key not found)

Geforce GTX 960 - BIOS version: 84.06.0D.00.6E
PCI\VEN_10DE&DEV_1401&SUBSYS_36901458&REV_A1
Key found.

Website, Youtube
Falcosoft Soundfont Midi Player + Munt VSTi + BassMidi VSTi
VST Midi Driver Midi Mapper
x86 microarchitecture benchmark (MandelX)

Reply 127 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie
Falcosoft wrote on 2026-05-05, 05:51:

Geforce GTX 960 - BIOS version: 84. ...[CUT]

Thank you — GTX 960 (Maxwell) confirmed: key present.

Three cards tested so far across three different
generations:

- GT210 (Tesla): key found, 4F07h implemented
- GT550Ti (Fermi): key found, 4F07h implemented
- GT740 (Kepler): key found, 4F07h removed
- GTX 960 (Maxwell): key found, 4F07h removed

The key being present on all four cards despite the
function being removed on Kepler and Maxwell strongly
suggests it is a family-wide firmware constant rather
than a card-specific value. Combined with the CRTC
indices 3Fh and 80h setup sequence, this gives a
consistent picture across generations.

More results from Pascal and later generations would
be welcome to complete the picture.

---

A clarification on how the key was found: I did not
take it from any documentation, reserved or otherwise,
nor from any existing source. I found it by tracing
the GT210 BIOS for the first time, following the
execution of the 4F07h routine instruction by
instruction until the unlock sequence appeared in
the code stream.

The first trace was the hard part — no shortcuts,
no prior knowledge of where to look. Once the key
and the surrounding code pattern were identified,
subsequent traces on other cards became straightforward:
FASTBIOS.SYS copies the ROM to RAM, a breakpoint at
the right location, and the sequence is immediately
visible.

The SCANKEY utility automates the search for anyone
who wants to verify without going through the full
tracing process.

Reply 128 of 152, by EduBat

User metadata
Rank Member
Rank
Member

Hi,
Geforce GTX 650 - BIOS version: 80.07.35.00.60
NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1)
I got KEY FOUND.

Reply 129 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie

NEWAX 0.1 alpha — 4F07h TSR for Nvidia Kepler/Maxwell/Pascal
(VGA mode)

While the reverse engineering of the extended Nvidia CRTC
registers continues, I am releasing the first working version
of NEWAX — a TSR that implements the missing 4F07h function
on Kepler/Maxwell/Pascal cards using standard VGA registers.

What it does:

NEWAX intercepts INT 10h and provides a functional 4F07h
implementation (BL=00h set, BL=01h get, BL=80h set with
vertical retrace synchronization via 3DAh) using standard
VGA CRTC registers 0Ch/0Dh. It also disables 4F0Ah to
force any software using PM/32 to fall back to 4F07h.

Current limitations:

The VGA CRTC registers are 16-bit and dword-aligned, which
limits the addressable framebuffer to approximately 262 KB.
In practice this means the function works correctly up to
640×400 pixels at 8bpp. At higher resolutions or color
depths the TSR returns 014Fh (supported but failed) — the
correct behavior per VBE specification when the address
exceeds the available range.

Double buffering and virtual scrolling work correctly within
these limits for packed pixel and direct color modes at
8/16/32 bpp.

Usage:

NEWAX.COM        — install TSR
NEWAX.COM /U — uninstall from memory

What comes next:

The full VESA implementation requires mapping the extended
Nvidia CRTC registers (indices 3Fh and 80h) and the unlock
sequence. This reverse engineering work is ongoing and is
proving complex — there are many interconnected registers
with different states. I am not making promises on timing,
but progress is being made.

Source code is included as always.

Please report:
- Card model and BIOS version
- Whether double buffering works at 640×400
- Any crashes or unexpected behavior

The attachment NEWAX.ZIP is no longer available
	.386
CODE SEGMENT PARA PUBLIC USE16 'CODE'
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 100h

start_code:
jmp install
new_int_10:
or ah,ah
jne continue_int_10_0
and cs: byte ptr [status_flag_0],0FEh
jmp go_int_10
continue_int_10_0:
cmp ax,4F17h
jne continue_int_10_1
cmp bx,'MP'
jne continue_int_10_1
push cs
pop es
mov ax,4Fh
iret
continue_int_10_1:
cmp ax,4F0Ah
jne continue_int_10_2
mov ax,14Fh
iret
continue_int_10_2:
cmp ax,4F02h
jne continue_int_10_3
mov cs: word ptr [vesa_mode],bx
pushf
call cs: dword ptr [old_int_10_off]
cmp ax,4Fh
jne fail_open_vesa_mode
pushad
push ds
push es
push cs
pop ds
push cs
pop es
mov ax,4F01h
mov cx,ds: word ptr [vesa_mode]
and cx,1FFh
mov di,OFFSET vesa_buffer_func_1
int 10h
cmp ax,4Fh
jne fail_vesa_info
mov ax,ds: word ptr [di + 10h]
mov ds: word ptr [byte_per_scanline],ax
cmp ds: byte ptr [di + 1Bh],4h
je ok_vesa_mode
cmp ds: byte ptr [di + 1Bh],6h
jne fail_vesa_info
ok_vesa_mode:
mov al,ds: byte ptr [di + 19h]
shr al,3h
mov ds: byte ptr [byte_per_pixel],al
or ds: byte ptr [status_flag_0],1h
mov ds: word ptr [start_x],0h
Show last 242 lines
	mov	ds: word ptr [start_y],0h
pop es
pop ds
popad
iret
fail_vesa_info:
pop es
pop ds
popad
fail_open_vesa_mode:
and cs: byte ptr [status_flag_0],0FEh
iret
continue_int_10_3:
cmp ax,4F06h
jne continue_int_10_4
test cs: byte ptr [status_flag_0],1h
je continue_int_10_4
pushf
call cs: dword ptr [old_int_10_off]
cmp ax,4Fh
jne no_set_scanline
mov cs: word ptr [byte_per_scanline],bx
no_set_scanline:
iret
continue_int_10_4:
cmp ax,4F07h
jne go_int_10
test cs: byte ptr [status_flag_0],1h
je no_start_routine
or bh,bh
jne no_start_routine
cmp bl,1h
jne test_set_address
mov cx,cs: word ptr [start_x]
mov dx,cs: word ptr [start_y]
mov ax,4Fh
iret
test_set_address:
or bl,bl
je set_start_address
cmp bl,80h
jne no_start_routine
push dx
mov dx,3DAh
vretrace_off:
in al,dx
test al,8h
jne vretrace_off
vretrace_on:
in al,dx
test al,8h
je vretrace_on
pop dx
set_start_address:
pusha
mov ax,cs: word ptr [byte_per_scanline]
shr ax,2h
mul dx
mov bx,cx
and bl,7h
shr cx,2h
add ax,cx
adc dx,0h
or dx,dx
jne extra_vga_address
xchg ax,cx
mov dx,3D4h
mov al,0Dh
out dx,al
inc dx
mov al,cl
out dx,al
dec dx
mov al,0Ch
out dx,al
inc dx
mov al,ch
out dx,al
popa
mov cs: word ptr [start_x],cx
mov cs: word ptr [start_y],dx
mov ax,4Fh
iret
extra_vga_address:
popa
no_start_routine:
mov ax,14Fh
iret
go_int_10:
jmp cs: dword ptr [old_int_10_off]
old_int_10_off:
DW ?
old_int_10_seg:
DW ?
new_int_10_off:
DW ?
new_int_10_seg:
DW ?
status_flag_0:
DB 0h
start_x:
DW ?
start_y:
DW ?
vesa_mode:
DW ?
byte_per_scanline:
DW ?
byte_per_pixel:
DB ?
vesa_buffer_func_1:
DB 100h DUP (?)
install:
mov dx,OFFSET dos_message_1
mov ah,9h
int 21h
mov si,OFFSET void_buffer
call Get_Args
lodsb
mov ds: word ptr [dos_message],OFFSET dos_message_3
or al,al
je go_install
cmp al,1h
jne exit_to_dos
mov si,ds: word ptr [si]
lodsw
cmp ds: byte ptr [si],0h
jne exit_to_dos
and ah,0DFh
cmp ax,'U/'
jne exit_to_dos
mov ds: word ptr [dos_message],OFFSET dos_message_4
mov ax,4F17h
mov bx,'MP'
int 10h
cmp ax,4Fh
jne exit_to_dos
mov ds: word ptr [dos_message],OFFSET dos_message_5
push 0h
pop fs
mov eax,fs: dword ptr [10h * 4h]
cmp eax,es: dword ptr [new_int_10_off]
jne exit_to_dos
mov ah,49h
int 21h
jc exit_to_dos
lds dx,es: dword ptr [old_int_10_off]
mov ax,2510h
int 21h
push cs
pop ds
mov ds: word ptr [dos_message],OFFSET dos_message_6
exit_to_dos:
mov dx,ds: word ptr [dos_message]
mov ah,9h
int 21h
mov ax,4C00h
int 21h
go_install:
mov ds: word ptr [dos_message],OFFSET dos_message_7
mov ax,4F17h
mov bx,'MP'
int 10h
cmp ax,4Fh
je exit_to_dos
push 0h
pop fs
push fs: dword ptr [10h * 4h]
pop ds: dword ptr [old_int_10_off]
mov dx,OFFSET new_int_10
mov ds: word ptr [new_int_10_off],dx
mov ds: word ptr [new_int_10_seg],ds
mov ax,2510h
int 21h
mov ah,9h
mov dx,OFFSET dos_message_8
int 21h
mov dx,OFFSET install + 0Fh
int 27h

;#############################################################################

; DS:SI = Pointer to the memory area for storing pointers to
; command-line arguments (where the first byte represents
; the argument count)

Get_Args:

;#############################################################################

pusha
xor bx,bx
push si
inc si
mov di,81h
movzx cx,ds: byte ptr [di-1h]
or cl,cl
je exit_get_args
mov al,' '
another_arg:
rep scasb
je exit_get_args
inc bx
mov ds: word ptr [si],di
dec ds: word ptr [si]
inc si
inc si
repne scasb
jne set_final_string
mov ds: byte ptr [di-1h],ch
jmp another_arg
set_final_string:
mov ds: byte ptr [di],ch
exit_get_args:
pop si
mov ds: byte ptr [si],bl
popa
ret

dos_message_1:
DB 'Nvidia kEpler/maxWell/pAscal fiX - NEWAX 0.1(alpha) - VGA mode',0Dh,0Ah,'$'
dos_message_2:
DB 'NEWAX uninstalled from memory',0Dh,0Ah,'$'
dos_message_3:
DB 'Use: NEWAX.COM (install TSR)',0Dh,0Ah,' NEWAX.COM /U (Uninstall from memory',0Dh,0Ah,'$'
dos_message_4:
DB 'NEWAX not installed',0Dh,0Ah,'$'
dos_message_5:
DB 'Can''t uninstall NEWAX',0Dh,0Ah,'$'
dos_message_6:
DB 'NEWAX uninstalled',0Dh,0Ah,'$'
dos_message_7:
DB 'NEWAX already installed',0Dh,0Ah,'$'
dos_message_8:
DB 'NEWAX installed',0Dh,0Ah,'$'
dos_message:
DW ?
void_buffer:

CODE ENDS
END start_code

Reply 130 of 152, by Falcosoft

User metadata
Rank l33t
Rank
l33t
Marco Pistella wrote on 2026-05-05, 12:28:
NEWAX 0.1 alpha — 4F07h TSR for Nvidia Kepler/Maxwell/Pascal (VGA mode) […]
Show full quote

NEWAX 0.1 alpha — 4F07h TSR for Nvidia Kepler/Maxwell/Pascal
(VGA mode)

While the reverse engineering of the extended Nvidia CRTC
registers continues, I am releasing the first working version
of NEWAX — a TSR that implements the missing 4F07h function
on Kepler/Maxwell/Pascal cards using standard VGA registers.

What it does:

NEWAX intercepts INT 10h and provides a functional 4F07h
implementation (BL=00h set, BL=01h get, BL=80h set with
vertical retrace synchronization via 3DAh) using standard
VGA CRTC registers 0Ch/0Dh. It also disables 4F0Ah to
force any software using PM/32 to fall back to 4F07h.

Hi,
Dual page/double buffering works in 640x400x8-bit mode with my GTX 960 and GTX 970. Vertical retrace is also perfect. Virtual resolutions also work to the memory limit.

@Edit:
While the test was successful in X-VESA the same cannot be said about games unfortunately. E.g. Duke Nukem 3D produces very low frame rates and jerky movements when NEWAX is loaded.
Quake 1 is somewhat better but you have to disable vsync with 'VID_WAIT 0' to get playable frame rates in 640x400 when NEWAX is loaded.

Website, Youtube
Falcosoft Soundfont Midi Player + Munt VSTi + BassMidi VSTi
VST Midi Driver Midi Mapper
x86 microarchitecture benchmark (MandelX)

Reply 131 of 152, by EduBat

User metadata
Rank Member
Rank
Member

Tested on my GTX650 Bios version 80.07.35.00.60
Double buffering worked at 640x400.
No crashes. (I only tested with X-Vesa)

Reply 132 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie

Updated NEWAX 0.2

The attachment NEWAX.ZIP is no longer available

Reply 133 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie

Update: NEWAX 0.2 fixes the game compatibility issue.

After debugging Duke Nukem 3D I found the root cause: these games read the NumberOfImagePages field from the VBE ModeInfoBlock to determine how many video pages are available, and optimize their rendering accordingly. On cards without 4F07h support this field typically reports 9 to 15 pages. NEWAX 0.1 left this field untouched — so when a game tried to flip to pages beyond the VGA address range, those pages were displayed incorrectly since 4F07h could not reach them.

NEWAX 0.2 intercepts 4F01h and sets NumberOfImagePages to 1, correctly reflecting what is actually reachable at 640×400. This fixes Duke Nukem 3D and Quake on GT740 and GT1030 — both tested ersonally.

Quake maintains acceptable performance with 2 pages. Duke Nukem 3D shows a performance drop compared to a card with full 4F07h support — expected, since it is optimized for more pages. This may improve with the extended register implementation in a future version of NEWAX, where the full VESA address range would be available — if the reverse engineering of the Nvidia unlock and lock sequences proves feasible. The work is ongoing but complex, and I make no promises on the outcome.

This fix was inspired by Falcosoft's mskvbef7.

Reply 134 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie

UNER v0.1 alpha — Unlock Nvidia Extended Registers — Call for beta testers

Background

While developing NEWAX, a TSR designed to fix several VBE 2.0 implementation issues on Nvidia hardware, specifically the broken 4F07h , it became necessary to understand how the Nvidia VBIOS protects its extended register set and how it unlocks them before executing functions like 4F06h and 4F07h internally.

The investigation started with SCANKEY.COM, a small tool that scans the VGA BIOS ROM for a known 32-bit signature. The signature 2469FDB9h was found in the VBIOS of every Nvidia card tested, from he GeForce GT210 to the GT1050Ti. This constant is written to a card-specific I/O port as the first step of the unlock sequence.

What was found

The VBIOS contains an internal unlock routine whose entry point varies between cards — both in content and in location within the C000h segment. What is consistent across all tested hardware is a 19-byte locator signature immediately preceding it, and the structure of the CALL instruction at the end of that signature from which UNER computes the actual entry point at runtime.

Similarly, the I/O port address for the BAR extended registers is not fixed: it has been found at C000:0120h on some cards and at C000:0129h on others. UNER resolves both addresses dynamically by reading them directly from the VBIOS image, so no hardcoded offsets are involved.

The same 32-bit key constant and the same locator signature have been found across three GPU generations, suggesting Nvidia has maintained this interface unchanged for a considerable time.

How UNER works

UNER operates entirely in real mode and performs the following steps.

It validates the VGA BIOS at C000:0000 by checking the AA55h signature and reads the declared BIOS size.

It then scans the BIOS image for three items in sequence:

- The 32-bit key constant 2469FDB9h (stored as B9 FD 69 24), whose location in the ROM also encodes the address of the I/O port to write it to.

- A single IRET instruction (CFh) anywhere in the C000h segment, used as a trampoline target.

- The 19-byte locator signature; the routine entry point is computed from the relative displacement of the CALL instruction at the end of the signature.

After locating all three, UNER executes the standard unlock prologue: saves the current state of the Sequencer Address register (3C4h), the Graphics Controller Address register (3CEh), and CRTC index 3Fh (3D4h/3D5h); writes 57h to CRTC index 3Fh; then sends 2469FDB9h followed by 00000001h to the card-specific port and port+4.

Control is then transferred to the VBIOS unlock routine using a stack-based IRET trampoline. The stack is constructed so that the routine's own RETN jumps to the IRET found earlier in C000h, and that IRET returns cleanly to UNER with full control of FLAGS. The technique works precisely because UNER does not replicate the routine: it calls each card's own VBIOS routine directly, letting the BIOS handle its own hardware-specific register programming without interference.

On return, the extended registers are accessible for read/write.

Hardware tested

The full sequence — signature scan, trampoline, unlock — has been verified without issues on:

Nvidia GeForce GT210
Nvidia GeForce GT550Ti
Nvidia GeForce GT740
Nvidia GeForce GT1030
Nvidia GeForce GT1050Ti

No card-specific special cases were required. Cards where the signature or the trampoline mechanism behaves differently are exactly what this beta phase is meant to uncover.

Call for beta testers

UNER v0.1 alpha is a standalone DOS COM file. It does not write anything permanently and does not modify the VBIOS. It reports what it finds at each step and indicates whether the unlock sequence ompleted or failed.

If you have Nvidia hardware not in the list above — particularly older cards (pre-7600GT), Quadro or professional series, mobile GPUs, or cards with modified or third-party VBIOS — your test results would be genuinely useful. Cards where UNER reports failure are equally valuable: a failure with a specific error message is useful data.

What to report: card model, BIOS version if known, which step succeeded or failed, and any unexpected behavior. Running under plain DOS or a minimal DOS boot is recommended; behavior under mulators or hypervisors is not meaningful for this purpose.

The attachment UNER.ZIP is no longer available
	.386
CODE SEGMENT PARA PUBLIC USE16 'CODE'
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 100h

start_code:
mov ah,9h
mov dx,OFFSET dos_message_00
int 21h
mov ds: word ptr [msg_pointer],OFFSET dos_message_01
push 0C000h
pop es
xor si,si
cmp es: word ptr [si],0AA55h
jne exit_unl
add si,2h
movzx dx,es: byte ptr [si]
cmp dl,80h
ja exit_unl
shl dx,9h
mov ds: word ptr [bios_size],dx
mov si,OFFSET mem_data_1
mov ds: word ptr [msg_pointer],OFFSET dos_message_02
call Get_Mem_Pointer
jc exit_unl
mov dx,OFFSET dos_message_03
mov ah,9h
int 21h
mov ax,di
call Write_Address

mov dx,OFFSET dos_message_08
mov ah,9h
int 21h

mov di,es: word ptr [di - 4h]
mov ax,di
mov ds: word ptr [offset_bar_reg],ax
call Write_Address

mov dx,OFFSET dos_message_09
mov ah,9h
int 21h

mov ax,es: word ptr [di]
call Write_Address

mov dx,ds: word ptr [bios_size]
mov si,OFFSET mem_data_2
mov ds: word ptr [msg_pointer],OFFSET dos_message_04
call Get_Mem_Pointer
jc exit_unl
mov dx,OFFSET dos_message_05
mov ah,9h
int 21h
xchg ax,di
mov ds: word ptr [iret_address],ax
call Write_Address
mov dx,ds: word ptr [bios_size]
mov si,OFFSET mem_data_3
Show last 184 lines
	mov	ds: word ptr [msg_pointer],OFFSET dos_message_06
call Get_Mem_Pointer
jc exit_unl
mov dx,OFFSET dos_message_07
mov ah,9h
int 21h
mov bx,es: word ptr [di + 13h]
lea ax,ds: word ptr [bx + di + 15h]
mov ds: word ptr [unlock_address],ax
call Write_Address

mov ah,9h
mov dx,OFFSET dos_message_10
int 21h

; Start Nvidia Unlock

mov dx,3C4h
in al,dx
mov ah,al
mov dl,0CEh
in al,dx
mov ds: word ptr [nvidia_save_1],ax

mov dx,3D4h
in al,dx
mov ah,al
mov al,3Fh
inc dx
in al,dx
xchg al,ah
mov ds: word ptr [nvidia_save_2],ax
mov al,57h
out dx,al
dec dx

mov di,ds: word ptr [offset_bar_reg]
mov dx,es: word ptr [di]
mov eax,2469FDB9h
out dx,eax
add dx,4h
mov eax,1h
out dx,eax

pushf
push cs
push OFFSET entry_point
push ds: word ptr [iret_address]
push es
push ds: word ptr [unlock_address]
retf
entry_point:

mov ah,9h
mov dx,OFFSET dos_message_11
int 21h

mov ax,4C00h
int 21h
exit_unl:
mov ah,9h
mov dx,ds: word ptr [msg_pointer]
int 21h
mov ax,4C00h
int 21h

;#############################################################################

; AX = Address to write

Write_Address:

;#############################################################################

pusha
mov bx,ax
mov dx,OFFSET address_data
mov di,dx
add di,3h
loop_address_data:
and al,0Fh
add al,'0'
cmp al,'9'
jbe ok_char_address
add al,'A' - '9' - 1h
ok_char_address:
mov ds: byte ptr [di],al
shr bx,4h
mov ax,bx
dec di
cmp di,dx
jae loop_address_data
mov ah,9h
int 21h
popa
ret

;#############################################################################

; ES = Segment to search
; DX = Search range in bytes (starting from 0h)
; DS:SI = Pointer to the search byte sequence (where the first byte is the length)

Get_Mem_Pointer:

; CARRY = 0 -> ES:DI = Pointer to search sequence
; CARRY = 1 -> Not found

;#############################################################################

pusha
movzx cx,ds: byte ptr [si]
sub dx,cx
lea bp,ds: word ptr [si + 1h]
xor bx,bx
next_byte_search:
mov si,bp
mov di,bx
movzx cx,ds: byte ptr [si - 1h]
repe cmpsb
je found_mem
inc bx
cmp bx,dx
jbe next_byte_search
popa
stc
ret
found_mem:
mov bp,sp
mov ss: word ptr [bp],bx
popa
clc
ret

dos_message_00:
DB 'UNER - Unlock Nvidia Extended Regs - V0.1 (alpha)',0Dh,0Ah,'$'
dos_message_01:
DB 'Invalid VGA BIOS',0Dh,0Ah,'$'
dos_message_02:
DB 'Nvidia Key not found',0Dh,0Ah,'$'
dos_message_03:
DB 'Nvidia Key found at: C000:$'
dos_message_04:
DB 'IRET not found',0Dh,0Ah,'$'
dos_message_05:
DB 'IRET found at: C000:$'
dos_message_06:
DB 'Nvidia unlock routine not found',0Dh,0Ah,'$'
dos_message_07:
DB 'Nvidia unlock routine found at: C000:$'
dos_message_08:
DB 'Nvidia offset bar regs at: C000:$'
dos_message_09:
DB 'Nvidia Bar regs at: $'
dos_message_10:
DB 'Start Nvidia unlock ...$'
dos_message_11:
DB ' complete',0Dh,0Ah,'$'
mem_data_1:
DB 4h,0B9h,0FDh,69h,24h
mem_data_2:
DB 1h,0CFh
mem_data_3:
DB 13h,75h,10h,81h,0FBh,8Fh,4h,74h,0Dh,80h,0FBh,95h,75h,5h,80h,0FFh,2h,7Ch,3h,0E8h
address_data:
DB ' ',0Dh,0Ah,'$'
msg_pointer:
DW ?
bios_size:
DW ?
iret_address:
DW ?
unlock_address:
DW ?
offset_bar_reg:
DW ?
nvidia_save_1:
DW ?
nvidia_save_2:
DW ?

CODE ENDS
END start_code

Reply 135 of 152, by Falcosoft

User metadata
Rank l33t
Rank
l33t
Marco Pistella wrote on 2026-05-07, 13:03:

UNER v0.1 alpha — Unlock Nvidia Extended Registers — Call for beta testers
...

Geforce GTX 970 - BIOS version: 84.04.84.00.29
PCI\VEN_10DE&DEV_13C2&SUBSYS_31611462&REV_A1

result of 'uner.com >> uner.txt':

UNER - Unlock Nvidia Extended Regs - V0.1 (alpha)
Nvidia Key found at: C000:4016
Nvidia offset bar regs at: C000:0129
Nvidia Bar regs at: E000
IRET found at: C000:054D
Nvidia unlock routine found at: C000:43E2
Start Nvidia unlock ... complete

@Edit:
Geforce 6600 AGP - BIOS version: 05.43.02.75.00
result of 'uner.com >> uner.txt':

UNER - Unlock Nvidia Extended Regs - V0.1 (alpha)
Nvidia Key not found

Last edited by Falcosoft on 2026-05-07, 13:26. Edited 1 time in total.

Website, Youtube
Falcosoft Soundfont Midi Player + Munt VSTi + BassMidi VSTi
VST Midi Driver Midi Mapper
x86 microarchitecture benchmark (MandelX)

Reply 136 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie
Falcosoft wrote on 2026-05-07, 13:14:

Geforce GTX 970 - BIOS version: 8 ... [CUT]

Thanks, that's a clean result and a useful data point.

GTX 970 (GM204) extends confirmed compatibility to high-end Maxwell — previously tested Maxwell was only GT740 (GM107). The BAR at 0129h and port E000h are noted; both fall within the known variant range.

If you have time, any card outside the Maxwell/Kepler/Fermi range would be the next interesting test — particularly anything Turing or newer, or anything pre-Fermi (Tesla-era). Failures are equally welcome.

Reply 137 of 152, by Falcosoft

User metadata
Rank l33t
Rank
l33t
Marco Pistella wrote on 2026-05-07, 13:24:
Thanks, that's a clean result and a useful data point. […]
Show full quote
Falcosoft wrote on 2026-05-07, 13:14:

Geforce GTX 970 - BIOS version: 8 ... [CUT]

Thanks, that's a clean result and a useful data point.

GTX 970 (GM204) extends confirmed compatibility to high-end Maxwell — previously tested Maxwell was only GT740 (GM107). The BAR at 0129h and port E000h are noted; both fall within the known variant range.

If you have time, any card outside the Maxwell/Kepler/Fermi range would be the next interesting test — particularly anything Turing or newer, or anything pre-Fermi (Tesla-era). Failures are equally welcome.

Geforce 6600 AGP - BIOS version: 05.43.02.75.00
result of 'uner.com >> uner.txt':

UNER - Unlock Nvidia Extended Regs - V0.1 (alpha)
Nvidia Key not found

Website, Youtube
Falcosoft Soundfont Midi Player + Munt VSTi + BassMidi VSTi
VST Midi Driver Midi Mapper
x86 microarchitecture benchmark (MandelX)

Reply 138 of 152, by LSS10999

User metadata
Rank Oldbie
Rank
Oldbie

Looks like the unlock key has not changed with Ampere.
Tested UNER with my RTX A4000 and it worked.

RTX A4000 (GA104-A1)
10DE:24B0 - 103C:14AD
BIOS: 94.04.57.00.0B

UNER - Unlock Nvidia Extended Regs - V0.1 (alpha)
Nvidia Key found at: C000:384E
Nvidia offset bar regs at: C000:0102
Nvidia Bar regs at: E000
IRET found at: C000:046B
Nvidia unlock routine found at: C000:3DA2
Start Nvidia unlock ... complete

Reply 139 of 152, by Marco Pistella

User metadata
Rank Newbie
Rank
Newbie
LSS10999 wrote on 2026-05-07, 13:58:

Looks like the unlock key has not ...[CUT]

Thanks — Ampere (GA104) is a significant addition to the confirmed list.

Third BAR variant noted: C000:0102h, alongside the previously known 0120h and 0129h. All three are resolved dynamically so no code changes needed.

The RTX A4000 is particularly relevant for NEWAX since both 4F07h and 4F06h are absent on that card — having a working unlock on Ampere opens the possibility of implementing those functions from cratch rather than just correcting broken ones.

Port E000h matches the GTX 970 result — interesting to see if that holds across the Pascal/Turing/Ampere range consistently.