PS3 [Release] (based on hyper999’s original ASM logic) PIC12683 Rapidfire Hyper999's PS3 rapid fire V1

vegueta1

Member
[Release] PS3 Rapidfire + Burstfire Mod — Rebuilt & Expanded (PIC12F683)
Original Release Date: 12/6/10
Re-release by: Vegueta1 (based on hyper999's original ASM logic)
Tested on: All PS3 controller models except V4 (currently unavailable to R&D team)
Special Thanks
Huge appreciation to the original development team:
  • geraldrubalcava
  • Hazer
  • modded matt
  • 802chives
  • And especially RDC for his board scans and hardware insights
What's New in This Version
This is a hex is translation and expansion of the original ASM rapidfire mod i left the new asm file on the zip file if u wanna change speed. It's install-proof, legally safe (GPL licensed), and behaviorally identical to the original—with powerful new features:

  • 4 Total Modes: 3 rapidfire speeds, 1 burstfire modes, and OFF
  • LED Blink Feedback: LED blinks 1-4 times to show current mode (OFF = no blink)
  • Safe Open-Drain Output
  • Burstfire Support: Choose 3-shot bursts with pause between bursts
  • Debounce Protection
  • GPL Licensed: Fully open-source and remixable
Mode Overview
Tap the tact switch to toggle modes:

  • Mode 0 – OFF (no LED)
  • Mode 1 – LED solid ON (6sps)
  • Mode 2 – LED blinks 2 (4sps)
  • Mode 3 – LED blinks 3 (8sps)
  • Modes 4-LED blinks 4 (10sps 3 burst shot) ALL YOU NEED IS ALREADY IN ZIP FILE AND IT MAKE HEX FILE WITHOUT ERRORS
⚙️ How to Customize Speeds
To change firing speeds, edit the constants in the source code:
;***** FIRERATES ***************************************************** FIRERATE1 equ .167 ;6 SPS FIRERATE2 equ .250 ;4 SPS FIRERATE3 equ .125 ;8 SPS ; To calculate: 1000 ÷ desired SPS = value to enter ; Example: 1000 ÷ 4 = .250
You can change values from 1 to 255 to suit your needs. Just download the source .ASM file, open it in Notepad, save, and recompile in MPLAB:
  1. Open MPLAB → Project > Quick Build
  2. Program the generated .HEX file into a PIC12F683
  3. Install into your controller
Flashing the Firmware
Pick the method that works best for you:
Option 1 – Any PIC programmer
→ Load .hex → Select PIC12F683 → Click "Program"
Option 2 – Arduino as ISP
→ Connect ICSP pins → Use picprog or external tool to flash
Option 3 – PICkit or MPLAB X / Microchip Studio
→ Select chip → Load .hex → Hit "Write"
⚠️ Important: Make sure your voltage is stable during flashing!
Wiring Guide (PS3 Controller Reference)
  • Red Dot (Vcc): Power to PIC
  • Black Dot (GND): Ground for PIC and tact switch
  • Blue Dot (LED): LED output for mode feedback
  • Pink Dot (R2): Rapidfire output to trigger pad
️ Community Call
We'd love your feedback:
  • Bug reports
  • Game-specific speed recommendations
  • Ideas for future features or remixes
⚠️ Disclaimer
I am not responsible for any damage caused to yourself, your console, or your controller by installing or using this code. Proceed with care and always double-check your wiring and voltage.
If anyone needs help adapting this to their setup, just reply and I'll post it! I'd love to help others expand on this project. Happy modding! ✨.
Asm file just copy the text and compile to make hex file;
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
;
;--------------------------------------------------------------------------
; PIC12F683 analog-safe rapid/burst fire with Mode 4 fix:
; - Mode 4: ISR never sets SHADOW. It sets RISEP (pending rise) after dwell and polls quickly.
; - Main commits any pending rise inside the R1 digital-safe window only.
; - RCOM is analog outside R1 and digital only during R1 (all modes, including Mode 4).
; - FIRERATE1/2/3 behavior unchanged.
; - All decfsz use explicit ,f to avoid Message[305] warnings.
;--------------------------------------------------------------------------
list p=12F683 ; list directive to define processor
#include <p12F683.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; context save
status_temp EQU 0x71 ; context save
TEMP01 EQU 0x20
TEMP02 EQU 0x21
TEMP03 EQU 0x22
COUNTER01 EQU 0x23
FLAGS EQU 0x24
PULSE1 EQU 0x25 ; high-phase counter
DWELL1 EQU 0x26 ; low-phase counter
BURSTCNT EQU 0x27 ; burst shot counter
RISEP EQU 0x28 ; pending rise flag (bit 0 used only)
SHADOW EQU 0x72 ; committed intent (bit1 used)
SHADOW2 EQU 0x73 ; latched for drive (bit1 used)
FREQ EQU 0x74
STATER EQU 0x75
FLASH EQU 0x76
;***** FLASH COUNTER TIME *****
FLASHCNT EQU .50
;***** FIRERATES *****
FIRERATE1 EQU .167 ; 6 sps
FIRERATE2 EQU .250 ; 4 sps
FIRERATE3 EQU .125 ; 8 sps
FIRERATE4 EQU .200 ; 10 sps target (200 * 500us = 100ms)
;***** FLAGS (FLAGS byte) *****
OFF EQU 0 ; rf off
DBN EQU 1
DBN2 EQU 2
BURSTM EQU 3 ; burst mode active
BDONE EQU 4 ; burst completed (inhibit rises)
BURSTNX EQU 5 ; route next press to burst
;***** GPIO *****
BUTTON EQU 4
LED EQU 2
RCOM EQU 1
;***** FLASH *****
ON1 EQU 0
OFF1 EQU 1
ON2 EQU 2
OFF2 EQU 3
ON3 EQU 4
OFF3 EQU 5
ON4 EQU 6
OFF4 EQU 7
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
;**********************************************************************
; Interrupt service (Timer2 @ ~500us)
;**********************************************************************
ORG 0x004
movwf w_temp
movf STATUS, w
movwf status_temp
btfsc FLAGS, OFF
goto Offstate
bcf STATUS, RP0 ; bank 0
; --- High phase countdown (driven by SHADOW) ---
btfss SHADOW, 1
goto DwellRF
nop
decfsz PULSE1, f
goto EndInterupt
Clears
bcf SHADOW, 1
movf FREQ, w
movwf PULSE1
goto EndInterupt2
; --- Low phase handler ---
; Non-burst: legacy immediate rise.
; Mode 4: do NOT set SHADOW here; set RISEP and poll quickly until R1.
DwellRF
decfsz DWELL1, f
goto EndInterupt
; If BURST mode and already done, keep low (full dwell reload)
btfsc FLAGS, BURSTM
btfsc FLAGS, BDONE
goto ReloadFullLow
; Mode 4 path: schedule commit in main
btfsc FLAGS, BURSTM
goto BurstSchedule
; Non-burst (Mode 1/2/3): immediate rise and full low reload
RiseAllowed
bsf SHADOW, 1
movf FREQ, w
movwf DWELL1
goto EndInterupt2
; Mode 4: set pending rise and poll fast (~500us) for next R1 commit
BurstSchedule
; do not schedule if burst is already done
btfsc FLAGS, BDONE
goto PollSoon
bsf RISEP, 0
PollSoon
movlw 0x01
movwf DWELL1
goto EndInterupt2
ReloadFullLow
movf FREQ, w
movwf DWELL1
goto EndInterupt2
Offstate
nop
nop
nop
nop
goto Clears
EndInterupt
nop
nop
nop
nop
EndInterupt2
nop
nop
bcf PIR1, TMR2IF
movf status_temp, w
movwf STATUS
swapf w_temp, f
swapf w_temp, w
retfie
;********************subroutines****************************************
Wait500us
movlw 0x07
movwf TEMP01
movlw 0x12
movwf TEMP02
Loop01
decfsz TEMP01, f ; ~20us loop
goto Loop01
movlw 0x07
movwf TEMP01
decfsz TEMP02, f
goto Loop01 ; ~25us loop
return ; ~478us
FLASHOFF1
bcf GPIO, LED
decfsz COUNTER01, f
return
bcf FLASH, OFF1
bsf FLASH, ON1
return
FLASHON1
bsf GPIO, LED
bcf FLASH, OFF1
movlw FLASHCNT
movwf COUNTER01
return
FLASHOFF2
bcf GPIO, LED
decfsz COUNTER01, f
return
movlw FLASHCNT
movwf COUNTER01
bcf FLASH, OFF2
bsf FLASH, ON2
return
FLASHON2
bsf GPIO, LED
decfsz COUNTER01, f
return
movlw FLASHCNT
movwf COUNTER01
bcf FLASH, ON2
bsf FLASH, OFF1
return
FLASHOFF3
bcf GPIO, LED
decfsz COUNTER01, f
return
movlw FLASHCNT
movwf COUNTER01
bcf FLASH, OFF3
bsf FLASH, ON3
return
FLASHON3
bsf GPIO, LED
decfsz COUNTER01, f
return
movlw FLASHCNT
movwf COUNTER01
bcf FLASH, ON3
bsf FLASH, OFF2
return
; 4-blink pattern for Mode 4
FLASHOFF4
bcf GPIO, LED
decfsz COUNTER01, f
return
movlw FLASHCNT
movwf COUNTER01
bcf FLASH, OFF4
bsf FLASH, ON4
return
FLASHON4
bsf GPIO, LED
decfsz COUNTER01, f
return
movlw FLASHCNT
movwf COUNTER01
bcf FLASH, ON4
bsf FLASH, OFF3
return
; --- Button read / mode cycle ---
; Insert burst between FR3 and OFF without touching STATER timing trick.
Waitup
btfss GPIO, BUTTON
return
; If BURST is armed, consume it and enter Mode 4 now
btfss FLAGS, BURSTNX
goto AdvanceState
; ----- Mode 4 (Burst) -----
movlw FIRERATE4
movwf FREQ
clrf FLASH
bsf FLASH, OFF4 ; 4 blinks then steady
bcf FLAGS, OFF
bsf FLAGS, BURSTM
bcf FLAGS, BDONE
movlw .3
movwf BURSTCNT
bcf FLAGS, BURSTNX
; ANALOG-SAFE BASELINE: prevent wake-up shot and prime counters
bcf SHADOW, 1
bcf SHADOW2, 1
bcf RISEP, 0 ; do NOT arm here
movf FREQ, w
movwf PULSE1
movf FREQ, w
movwf DWELL1
goto Startover
AdvanceState
movlw 0x40
addwf STATER, f ; cyclic change in state manipulates last 2 bits in STATER.
btfsc STATER, 7 ; state 1 or 2
goto Continue01
btfsc STATER, 6
goto State2
State1 ; OFF
clrf FLASH
bcf GPIO, LED
bsf FLAGS, OFF
bcf FLAGS, BURSTM
bcf FLAGS, BDONE
bcf FLAGS, BURSTNX
bcf RISEP, 0
goto Startover
State2
movlw FIRERATE1
movwf FREQ
clrf FLASH
bsf GPIO, LED ; Mode 1 steady ON
bcf FLAGS, OFF
bcf FLAGS, BURSTM
bcf FLAGS, BDONE
bcf FLAGS, BURSTNX
bcf RISEP, 0
goto Startover
Continue01
btfss STATER, 6 ; state 3 or state 4
goto State4
State3
movlw FIRERATE3
movwf FREQ
clrf FLASH
bsf FLASH, OFF3 ; 3 blinks then steady
bcf FLAGS, OFF
bcf FLAGS, BURSTM
bcf FLAGS, BDONE
bsf FLAGS, BURSTNX ; arm burst for next press
bcf RISEP, 0
goto Startover
State4
movlw FIRERATE2
movwf FREQ
clrf FLASH
bsf FLASH, OFF2 ; 2 blinks then steady
bcf FLAGS, OFF
bcf FLAGS, BURSTM
bcf FLAGS, BDONE
bcf FLAGS, BURSTNX
bcf RISEP, 0
goto Startover
Startover
bcf FLAGS, DBN
return
;***********************************************************************
;***********************************************************************
;***********************************************************************
main
bsf STATUS, RP0 ; bank 1
movlw b'111011' ; all ports inputs
movwf TRISIO
movlw 0x02 ; GP1 analog
movwf ANSEL
movlw b'00010000'
movwf WPU ; enable weak pullups
bcf OPTION_REG, 7 ; enable all weak pullups
movlw 0x8F ; Vref on, highest setting
movwf VRCON
bcf STATUS, RP0 ; bank 0
movlw 0x04
movwf CMCON0 ; comparator on
bsf GPIO, 1 ; latch output high
bcf GPIO, LED
clrf FLASH
clrf SHADOW
clrf SHADOW2
clrf FLAGS
clrf STATER
clrf RISEP
bsf FLAGS, OFF
bcf FLAGS, BURSTM
bcf FLAGS, BDONE
bcf FLAGS, BURSTNX
movlw FLASHCNT
movwf COUNTER01
movlw 0x01
movwf T2CON ; timer 2, prescale 1:4, no postscale
bsf STATUS, RP0 ; bank 1
movlw 0x7C
movwf PR2 ; setup 500us hardware interrupt
bsf PIE1, TMR2IE ; enable timer2 interrupt
bcf STATUS, RP0 ; bank 0
bsf T2CON, TMR2ON ; turn on timer2
movlw 0xC0
movwf INTCON
Start
btfss CMCON0, COUT
goto Start ; wait for falling edge of R2
call Wait500us ; skip over R2
; --- R1 SAFE WINDOW: commit any pending Mode 4 rise only here ---
btfss RISEP, 0
goto NoRiseCommit
bsf SHADOW, 1 ; activate rising intent safely in R1
; Count burst shots at commit
decfsz BURSTCNT, f
goto ClearPending
bsf FLAGS, BDONE
ClearPending
bcf RISEP, 0
; ensure next low after this high is full width
movf FREQ, w
movwf DWELL1
NoRiseCommit
; Latch drive intent for this frame
movf SHADOW, w
movwf SHADOW2
nop
nop
nop
nop
nop
nop
nop
nop
; ---- OPEN R1 WINDOW (digital safe) ----
bcf INTCON, GIE
movlw 0x07
movwf CMCON0 ; comparator off
; Set output latch state before direction change
btfsc SHADOW2, 1
bcf GPIO, RCOM ; drive low if firing
btfss SHADOW2, 1
bsf GPIO, RCOM ; otherwise ensure high
bsf STATUS, RP0 ; bank 1
bcf ANSEL, 1 ; make GP1 digital
btfsc SHADOW2, 1
bcf TRISIO, RCOM ; if firing: output
btfss SHADOW2, 1
bsf TRISIO, RCOM ; else: input/high-Z
bcf STATUS, RP0 ; bank 0
bsf INTCON, GIE
call Wait500us ; hold R1
; ---- CLOSE R1 WINDOW (return to analog) ----
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop ; maintain timing
bcf INTCON, GIE
bsf STATUS, RP0 ; bank 1
bsf TRISIO, RCOM ; force input
bsf ANSEL, 1 ; GP1 analog
bcf STATUS, RP0 ; bank 0
movlw 0x04
movwf CMCON0 ; comparator on
bsf INTCON, GIE
; Extended analog settling (PS3)
call Wait500us
call Wait500us
; keep scan spacing (circle)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
call Wait500us
; keep scan spacing (X)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
call Wait500us
; keep scan spacing (square)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
call Wait500us
; keep scan spacing (extra)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bsf STATUS, RP0 ; bank 1
bsf TRISIO, 1 ; force input
bcf STATUS, RP0 ; bank 0
; LED flashing handler
btfsc FLASH, ON1
call FLASHON1
btfsc FLASH, OFF1
call FLASHOFF1
btfsc FLASH, ON2
call FLASHON2
btfsc FLASH, OFF2
call FLASHOFF2
btfsc FLASH, ON3
call FLASHON3
btfsc FLASH, OFF3
call FLASHOFF3
btfsc FLASH, ON4
call FLASHON4
btfsc FLASH, OFF4
call FLASHOFF4
; Button read / debounce
btfss GPIO, BUTTON
bsf FLAGS, DBN
btfsc FLAGS, DBN
call Waitup
bsf GPIO, RCOM ; Relatch RCOM high
movlw 0x04
movwf CMCON0 ; comparator on
goto Start
; initialize eeprom locations
ORG 0x2100
DE 0x00, 0x01, 0x02, 0x03
END
 

Attachments

  • MSU_V35X112Bottom.jpg
    MSU_V35X112Bottom.jpg
    138.6 KB · Views: 49
  • MSU_V2212Bottom.jpg
    MSU_V2212Bottom.jpg
    140 KB · Views: 48
  • MSU_VX3_007Bottom.jpg
    MSU_VX3_007Bottom.jpg
    125 KB · Views: 52
  • MSUPP405.jpg
    MSUPP405.jpg
    130.9 KB · Views: 51
  • MSUPP405Top.jpg
    MSUPP405Top.jpg
    25.1 KB · Views: 52
  • IMG_1397.jpeg
    IMG_1397.jpeg
    1.3 MB · Views: 36
  • IMG_1398.jpeg
    IMG_1398.jpeg
    1.2 MB · Views: 38
  • Schematic.jpg
    Schematic.jpg
    132 KB · Views: 38
  • Hyper999burst.zip
    Hyper999burst.zip
    4.7 KB · Views: 24
Last edited:
im working on add quick scope mod and akimbo rapidfire coming soon!
upload_2025-7-31_1-6-28.png


scrap that version use that new
 
Last edited by a moderator:
PS3 rapid-fire dev will pick back up soon—this time on ESP32 only. I've sunset the PIC12F683 platform to focus on wireless, OTA-ready builds with full analog safety. Just wrapping up the last PS5 tweaks, then I'll shift gears and drop fresh ESP32 firmware for PS3. Appreciate the patience!
 
Last edited:

Similar threads

Back
Top