Reply 120 of 151, by Marco Pistella
@LSS10999 (updated TEST0.ZIP)
@LSS10999 (updated TEST0.ZIP)
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
Gigabyte GA-P67-DS3-B3, Core i7-2600K @4,5GHz, 8GB DDR3, 128GB SSD, GTX970(GF7900GT), SB Audigy + YMF724F + DreamBlaster combo + LPC2ISA
Marco Pistella wrote on 2026-05-04, 18:00:@LSS10999 (updated TEST0.ZIP)
With this version, on my RTX A4000 system it fails with message "Fail 4F06h".
So it failed on Step 2).
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.
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.
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)
.386CODE SEGMENT PARA PUBLIC USE16 'CODE'ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODEORG 100hstart_code:mov ds: word ptr [msg_pointer],OFFSET dos_message_01push 0C000hpop esxor si,sicmp es: word ptr [si],0AA55hjne exit_scankeyadd si,2hmovzx ax,es: byte ptr [si]cmp al,80hja exit_scankeymov ds: word ptr [msg_pointer],OFFSET dos_message_02shl ax,9hsub ax,7hloop_bios_scankey:inc sicmp es: dword ptr [si],2469FDB9hje exit_scankeydec axjne loop_bios_scankeymov ds: word ptr [msg_pointer],OFFSET dos_message_03exit_scankey:mov ah,9hmov dx,ds: word ptr [msg_pointer]int 21hmov ax,4C00hint 21hmsg_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 ENDSEND start_code
Marco Pistella wrote on 2026-05-05, 05:30:SCANKEY — Nvidia firmware unlock key detection […]
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.
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.
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.
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 TSRNEWAX.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
.386CODE SEGMENT PARA PUBLIC USE16 'CODE'ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODEORG 100hstart_code:jmp installnew_int_10:or ah,ahjne continue_int_10_0and cs: byte ptr [status_flag_0],0FEhjmp go_int_10continue_int_10_0:cmp ax,4F17hjne continue_int_10_1cmp bx,'MP'jne continue_int_10_1push cspop esmov ax,4Fhiretcontinue_int_10_1:cmp ax,4F0Ahjne continue_int_10_2mov ax,14Fhiretcontinue_int_10_2:cmp ax,4F02hjne continue_int_10_3mov cs: word ptr [vesa_mode],bxpushfcall cs: dword ptr [old_int_10_off]cmp ax,4Fhjne fail_open_vesa_modepushadpush dspush espush cspop dspush cspop esmov ax,4F01hmov cx,ds: word ptr [vesa_mode]and cx,1FFhmov di,OFFSET vesa_buffer_func_1int 10hcmp ax,4Fhjne fail_vesa_infomov ax,ds: word ptr [di + 10h]mov ds: word ptr [byte_per_scanline],axcmp ds: byte ptr [di + 1Bh],4hje ok_vesa_modecmp ds: byte ptr [di + 1Bh],6hjne fail_vesa_infook_vesa_mode:mov al,ds: byte ptr [di + 19h]shr al,3hmov ds: byte ptr [byte_per_pixel],alor ds: byte ptr [status_flag_0],1hmov ds: word ptr [start_x],0h
mov ds: word ptr [start_y],0hpop espop dspopadiretfail_vesa_info:pop espop dspopadfail_open_vesa_mode:and cs: byte ptr [status_flag_0],0FEhiretcontinue_int_10_3:cmp ax,4F06hjne continue_int_10_4test cs: byte ptr [status_flag_0],1hje continue_int_10_4pushfcall cs: dword ptr [old_int_10_off]cmp ax,4Fhjne no_set_scanlinemov cs: word ptr [byte_per_scanline],bxno_set_scanline:iretcontinue_int_10_4:cmp ax,4F07hjne go_int_10test cs: byte ptr [status_flag_0],1hje no_start_routineor bh,bhjne no_start_routinecmp bl,1hjne test_set_addressmov cx,cs: word ptr [start_x]mov dx,cs: word ptr [start_y]mov ax,4Fhirettest_set_address:or bl,blje set_start_addresscmp bl,80hjne no_start_routinepush dxmov dx,3DAhvretrace_off:in al,dxtest al,8hjne vretrace_offvretrace_on:in al,dxtest al,8hje vretrace_onpop dxset_start_address:pushamov ax,cs: word ptr [byte_per_scanline]shr ax,2hmul dxmov bx,cxand bl,7hshr cx,2hadd ax,cxadc dx,0hor dx,dxjne extra_vga_addressxchg ax,cxmov dx,3D4hmov al,0Dhout dx,alinc dxmov al,clout dx,aldec dxmov al,0Chout dx,alinc dxmov al,chout dx,alpopamov cs: word ptr [start_x],cxmov cs: word ptr [start_y],dxmov ax,4Fhiretextra_vga_address:popano_start_routine:mov ax,14Fhiretgo_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 0hstart_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_1mov ah,9hint 21hmov si,OFFSET void_buffercall Get_Argslodsbmov ds: word ptr [dos_message],OFFSET dos_message_3or al,alje go_installcmp al,1hjne exit_to_dosmov si,ds: word ptr [si]lodswcmp ds: byte ptr [si],0hjne exit_to_dosand ah,0DFhcmp ax,'U/'jne exit_to_dosmov ds: word ptr [dos_message],OFFSET dos_message_4mov ax,4F17hmov bx,'MP'int 10hcmp ax,4Fhjne exit_to_dosmov ds: word ptr [dos_message],OFFSET dos_message_5push 0hpop fsmov eax,fs: dword ptr [10h * 4h]cmp eax,es: dword ptr [new_int_10_off]jne exit_to_dosmov ah,49hint 21hjc exit_to_doslds dx,es: dword ptr [old_int_10_off]mov ax,2510hint 21hpush cspop dsmov ds: word ptr [dos_message],OFFSET dos_message_6exit_to_dos:mov dx,ds: word ptr [dos_message]mov ah,9hint 21hmov ax,4C00hint 21hgo_install:mov ds: word ptr [dos_message],OFFSET dos_message_7mov ax,4F17hmov bx,'MP'int 10hcmp ax,4Fhje exit_to_dospush 0hpop fspush fs: dword ptr [10h * 4h]pop ds: dword ptr [old_int_10_off]mov dx,OFFSET new_int_10mov ds: word ptr [new_int_10_off],dxmov ds: word ptr [new_int_10_seg],dsmov ax,2510hint 21hmov ah,9hmov dx,OFFSET dos_message_8int 21hmov dx,OFFSET install + 0Fhint 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:;#############################################################################pushaxor bx,bxpush siinc simov di,81hmovzx cx,ds: byte ptr [di-1h]or cl,clje exit_get_argsmov al,' 'another_arg:rep scasbje exit_get_argsinc bxmov ds: word ptr [si],didec ds: word ptr [si]inc siinc sirepne scasbjne set_final_stringmov ds: byte ptr [di-1h],chjmp another_argset_final_string:mov ds: byte ptr [di],chexit_get_args:pop simov ds: byte ptr [si],blpoparetdos_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 ENDSEND start_code
Marco Pistella wrote on 2026-05-05, 12:28:NEWAX 0.1 alpha — 4F07h TSR for Nvidia Kepler/Maxwell/Pascal (VGA mode) […]
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.
Tested on my GTX650 Bios version 80.07.35.00.60
Double buffering worked at 640x400.
No crashes. (I only tested with X-Vesa)
Updated NEWAX 0.2
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.
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.
.386CODE SEGMENT PARA PUBLIC USE16 'CODE'ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODEORG 100hstart_code:mov ah,9hmov dx,OFFSET dos_message_00int 21hmov ds: word ptr [msg_pointer],OFFSET dos_message_01push 0C000hpop esxor si,sicmp es: word ptr [si],0AA55hjne exit_unladd si,2hmovzx dx,es: byte ptr [si]cmp dl,80hja exit_unlshl dx,9hmov ds: word ptr [bios_size],dxmov si,OFFSET mem_data_1mov ds: word ptr [msg_pointer],OFFSET dos_message_02call Get_Mem_Pointerjc exit_unlmov dx,OFFSET dos_message_03mov ah,9hint 21hmov ax,dicall Write_Addressmov dx,OFFSET dos_message_08mov ah,9hint 21hmov di,es: word ptr [di - 4h]mov ax,dimov ds: word ptr [offset_bar_reg],axcall Write_Addressmov dx,OFFSET dos_message_09mov ah,9hint 21hmov ax,es: word ptr [di]call Write_Addressmov dx,ds: word ptr [bios_size]mov si,OFFSET mem_data_2mov ds: word ptr [msg_pointer],OFFSET dos_message_04call Get_Mem_Pointerjc exit_unlmov dx,OFFSET dos_message_05mov ah,9hint 21hxchg ax,dimov ds: word ptr [iret_address],axcall Write_Addressmov dx,ds: word ptr [bios_size]mov si,OFFSET mem_data_3
mov ds: word ptr [msg_pointer],OFFSET dos_message_06call Get_Mem_Pointerjc exit_unlmov dx,OFFSET dos_message_07mov ah,9hint 21hmov bx,es: word ptr [di + 13h]lea ax,ds: word ptr [bx + di + 15h]mov ds: word ptr [unlock_address],axcall Write_Addressmov ah,9hmov dx,OFFSET dos_message_10int 21h; Start Nvidia Unlockmov dx,3C4hin al,dxmov ah,almov dl,0CEhin al,dxmov ds: word ptr [nvidia_save_1],axmov dx,3D4hin al,dxmov ah,almov al,3Fhinc dxin al,dxxchg al,ahmov ds: word ptr [nvidia_save_2],axmov al,57hout dx,aldec dxmov di,ds: word ptr [offset_bar_reg]mov dx,es: word ptr [di]mov eax,2469FDB9hout dx,eaxadd dx,4hmov eax,1hout dx,eaxpushfpush cspush OFFSET entry_pointpush ds: word ptr [iret_address]push espush ds: word ptr [unlock_address]retfentry_point:mov ah,9hmov dx,OFFSET dos_message_11int 21hmov ax,4C00hint 21hexit_unl:mov ah,9hmov dx,ds: word ptr [msg_pointer]int 21hmov ax,4C00hint 21h;#############################################################################; AX = Address to writeWrite_Address:;#############################################################################pushamov bx,axmov dx,OFFSET address_datamov di,dxadd di,3hloop_address_data:and al,0Fhadd al,'0'cmp al,'9'jbe ok_char_addressadd al,'A' - '9' - 1hok_char_address:mov ds: byte ptr [di],alshr bx,4hmov ax,bxdec dicmp di,dxjae loop_address_datamov ah,9hint 21hpoparet;#############################################################################; 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;#############################################################################pushamovzx cx,ds: byte ptr [si]sub dx,cxlea bp,ds: word ptr [si + 1h]xor bx,bxnext_byte_search:mov si,bpmov di,bxmovzx cx,ds: byte ptr [si - 1h]repe cmpsbje found_meminc bxcmp bx,dxjbe next_byte_searchpopastcretfound_mem:mov bp,spmov ss: word ptr [bp],bxpopaclcretdos_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,24hmem_data_2:DB 1h,0CFhmem_data_3:DB 13h,75h,10h,81h,0FBh,8Fh,4h,74h,0Dh,80h,0FBh,95h,75h,5h,80h,0FFh,2h,7Ch,3h,0E8haddress_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 ENDSEND start_code
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
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.
Marco Pistella wrote on 2026-05-07, 13:24:Thanks, that's a clean result and a useful data point. […]
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
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
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.