From fa380abbd373826252eb991a675f1a27aca9ff1e Mon Sep 17 00:00:00 2001 From: Jacques Gagnon Date: Tue, 5 Jun 2018 23:00:00 -0400 Subject: [PATCH] Support 1 player 2 controllers control style GoldenEye and Perfect Dark got a control style using two controllers as a way to get dual analog sticks. Since the adaptor is now interrupt base it's quite easy now to answer another poll on another pin. This duplicate the mapping of the C buttons (as analog) and R buttons into second set of buffers for the second controller. The second controller interrupt is only enabled if the adaptor detect at boot that the second port is connected. --- firmware/cube64.asm | 72 +++++++++++++++++++++++++--------- firmware/cube64.inc | 4 ++ firmware/n64gc_comm.inc | 49 ++++++++++++++--------- hardware/cube64.pdf | Bin 16499 -> 11301 bytes hardware/cube64.sch | 85 +++++++++++++++++++++++++--------------- 5 files changed, 143 insertions(+), 67 deletions(-) diff --git a/firmware/cube64.asm b/firmware/cube64.asm index d4d2f19..7d00738 100644 --- a/firmware/cube64.asm +++ b/firmware/cube64.asm @@ -41,6 +41,8 @@ #define N64_PIN PORTB, 4 #define N64_TRIS TRISB, 4 + #define N64_PIN2 PORTB, 5 + #define N64_TRIS2 TRISB, 5 #define GAMECUBE_PIN PORTA, 4 #define GAMECUBE_TRIS TRISA, 4 #define N64C_PIN PORTA, 2 @@ -51,13 +53,15 @@ io_init macro clrf PORTB, a clrf WPUA, a ; Disable pull-ups. clrf WPUB, a - bsf IOCB, IOCB4, a ; Enable interrupt on N64_PIN. setf TRISA, a setf TRISB, a clrf PORTC, a ; Debug port clrf TRISC, a ; Debug port clrf ANSEL, a ; Set IOs to digital. clrf ANSELH, a + bsf IOCB, IOCB4, a ; Enable interrupt on N64_PIN. + btfsc N64_PIN2, a ; If 2nd port connected, + bsf IOCB, IOCB5, a ; enable interrupt on N64_PIN2. endm else @@ -84,15 +88,17 @@ pll_startup_delay macro org 0x00 goto startup org 0x08 - n64_rx_command_start - call n64_rx_command_end + clrf STKPTR, a + call n64_rx_command call n64_detect_command call n64_reinit goto int_reentry - ;; Variables accessed through Direct Addressing Mode. (Bank 0) - ;; We keep a single copy of those variables. + ;; Variables. cblock 0x00 + n64_status_buffer:0 + n64_status_buffer0:4 + n64_status_buffer1:4 flags flags2 menu_flags @@ -132,14 +138,6 @@ pll_startup_delay macro gamecube_scale:8 ; bytes of gc_scale as it allows using the same macro for both buffers. endc - ;; Variables accessed through Indexed Literal Offset Mode. (Bank 1) - ;; This allows toggling between 2 copies of those variables via FSR2. - cblock 0x00 - n64_status_buffer:0 - n64_status_buffer0:4 - n64_status_buffer1:4 - endc - ;; ******************************************************************************* ;; ****************************************************** Initialization ******* @@ -147,8 +145,7 @@ pll_startup_delay macro startup movlb 0x00 ; Set bank 0 active for non-mirrored data. - movlw 0x01 - movwf FSR2H, a + clrf FSR2H, a clrf FSR2L, a bcf INTCON, GIE, a ; Init interrupts. bsf INTCON, RABIE, a @@ -202,6 +199,7 @@ int_reentry nop bcf INTCON, RABIF, a bsf INTCON, GIEH, a + call gamecube_wait_for_idle main_loop clrwdt call update_rumble_feedback ; Give feedback for remapping operations using the rumble motor. @@ -332,6 +330,11 @@ map_button_to macro virtual, dest_byte, dest_bit btfss STATUS, Z, a goto next bsf n64_status_buffer + dest_byte, dest_bit, a + if dest_byte == 1 && dest_bit == 4 + incf FSR2H, f, a + bsf n64_status_buffer + N64_Z, a + clrf FSR2H, a + endif return next endm @@ -424,6 +427,7 @@ map_axis_to macro virtual, dest_byte endif negf temp2, b ; Two's complement buffer if sign mismatch. assign_greater_abs_value temp2, n64_status_buffer + dest_byte + clrf FSR2H, a return next endm @@ -514,6 +518,12 @@ n64_translate_restart clrf n64_status_buffer + 1, a clrf n64_status_buffer + 2, a clrf n64_status_buffer + 3, a + incf FSR2H, f, a + clrf n64_status_buffer + 0, a ; Start out with everything zeroed... + clrf n64_status_buffer + 1, a + clrf n64_status_buffer + 2, a + clrf n64_status_buffer + 3, a + clrf FSR2H, a bsf FLAG_NO_VIRTUAL_BTNS map_button_from GC_A, BTN_A @@ -592,6 +602,13 @@ set_virtual_axis map_axis_to BTN_LJ_RIGHT, N64_JOYSTICK_X map_axis_to BTN_LJ_DOWN, N64_JOYSTICK_Y map_axis_to BTN_LJ_UP, N64_JOYSTICK_Y + + incf FSR2H, f, a + map_axis_to BTN_RJ_LEFT, N64_JOYSTICK_X + map_axis_to BTN_RJ_RIGHT, N64_JOYSTICK_X + map_axis_to BTN_RJ_DOWN, N64_JOYSTICK_Y + map_axis_to BTN_RJ_UP, N64_JOYSTICK_Y + clrf FSR2H, a return ;; This is called by remap_virtual_button to convert a virtual button code, @@ -1091,16 +1108,19 @@ update_slot_empty_timer n64_reinit clrf FSR1H, a + clrf FSR2H, a btg FSR2L, 2, a bsf N64C_TRIS, a bcf FLAG_AXIS bcf FLAG_LAYOUT_MODIFIER - call gamecube_wait_for_idle + bcf FLAG_CTRL2 return ;; Service commands coming in from the N64 n64_detect_command + btfsc FLAG_CTRL2 + bra n64_detect_base_cmd ifndef DBG_TRACE btfsc FLAG_BYPASS_MODE @@ -1136,6 +1156,7 @@ endif bsf N64C_TRIS, a ; Reset bypass bus state. +n64_detect_base_cmd movf n64_command, w, b ; Check for both identity cmd (0x00 & 0xFF) at the same time. btfss STATUS, Z, a comf n64_command, w, b @@ -1337,6 +1358,8 @@ n64_send_id movwf n64_id_buffer + 0, b clrf n64_id_buffer + 1, b movff n64_slot_status, n64_id_buffer + 2 + btfsc FLAG_CTRL2 + clrf n64_id_buffer + 2, b movlw n64_id_buffer ; Transmit the ID buffer movwf FSR1L, a @@ -1359,19 +1382,32 @@ keep_waiting_for_idle ;; been left high by a read-modify-write operation elsewhere. ;; For controller response we allways need an 2us stop bit. n64_tx - wait .55 + wait .53 + btfsc FLAG_CTRL2 + bra n64_tx2 bsf N64_TRIS, a bcf N64_PIN, a n64gc_tx_buffer N64_TRIS, 1 +n64_tx2 + bsf N64_TRIS2, a + bcf N64_PIN2, a + n64gc_tx_buffer N64_TRIS2, 1 + n64_rx_bus n64gc_rx_buffer N64_PIN, bus_byte_count, 0 n64_rx_address n64gc_rx_buffer N64_PIN, byte_count, 0 -n64_rx_command_end +n64_rx_command + btfsc N64_PIN, a + bra n64_rx_command2 + n64_rx_command_start 1 n64_bus_copy N64_PIN, N64C_TRIS, byte_count, 0, 0 +n64_rx_command2 + n64_rx_command_start 0 + n64gc_rx_buffer N64_PIN2, byte_count, 0 ;; ******************************************************************************* diff --git a/firmware/cube64.inc b/firmware/cube64.inc index 6745307..30c2b4f 100644 --- a/firmware/cube64.inc +++ b/firmware/cube64.inc @@ -45,6 +45,10 @@ #define BIT_LAYOUT_MODIFIER 0x02 #define FLAG_LAYOUT_MODIFIER flags2, 1, b + ;; Flag for N64 CTRL2. + #define BIT_CTRL2 0x04 + #define FLAG_CTRL2 flags2, 2, b + ;; Set when we are waiting for item selection in the top config menu. #define BIT_TOP_CONFIG_MENU 0x01 #define FLAG_TOP_CONFIG_MENU menu_flags, 0, b diff --git a/firmware/n64gc_comm.inc b/firmware/n64gc_comm.inc index 7fad2fe..acb0cf1 100644 --- a/firmware/n64gc_comm.inc +++ b/firmware/n64gc_comm.inc @@ -398,32 +398,49 @@ not_last_bit ; 1.6250us ;; We get late into the first bit around 0.4 us. Use the spare cycle to init ;; pretty much everything. -n64_rx_command_start macro - wait .11 ; 0.3750us We get into the interrupt at around 0.4 us. +n64_rx_command_start macro ctrl1 + wait .5 ; 0.6875us We get into the interrupt at around 0.4 us. + clrf FSR2H, a ; 1.0000us Point to buffers on bank 0. bsf GAMECUBE_TRIS ; 1.0625us - bcf N64C_PIN ; 1.1250us Finish secondary port setup. - bcf N64C_TRIS ; 1.1875us *0.0000us Copy's next bit falling edge. - wait .3 ; 1.2500us - clrf FSR1H, a ; 1.4375us - movlw n64_command ; 1.5000us - movwf FSR1L, a ; 1.5625us - btg FSR2L, 2, a ; 1.6250us Use last good regs copy. - clrf STKPTR, a ; 1.6875us + if ctrl1 + bcf N64C_PIN ; 1.1250us Finish secondary port setup. + bcf N64C_TRIS ; 1.1875us *0.0000us Copy's next bit falling edge. + else + bsf FLAG_CTRL2 ; 1.1250us 2nd controller poll. + incf FSR2H, f, a ; 1.1875us Point to buffers on bank 1. + endif + wait .4 ; 1.2500us + clrf FSR1H, a ; 1.5000us + movlw n64_command ; 1.5625us + movwf FSR1L, a ; 1.6250us + btg FSR2L, 2, a ; 1.6875us Use last good regs copy. movlw high crc_large_table ; 1.7500us Load CRC table high address byte movwf TBLPTRH, a ; 1.8125us with spare time. rlcf INDF1, f, a ; 1.8750us Make room for the new bit. bcf INDF1, 0, a ; 1.9375us Assume it's 0 to begin with. - btfsc N64_PIN ; 2.0000us Sample the incoming bit. + if ctrl1 + btfsc N64_PIN ; 2.0000us Sample the incoming bit. + else + btfsc N64_PIN2 ; 2.0000us Sample the incoming bit. + endif bsf INDF1, 0, a ; 2.0625us - btfsc INDF1, 0, a ; 2.1250us - bsf N64C_TRIS ; 2.1875us *1.0000us Copy's 'one bit' rising edge. + if ctrl1 + btfsc INDF1, 0, a ; 2.1250us + bsf N64C_TRIS ; 2.1875us *1.0000us Copy's 'one bit' rising edge. + else + wait .2 ; 2.1250us + endif movlw 7 ; 2.2500us We just did first bit, 7 remaining. movwf bit_count, b ; 2.3125us movlw .1 ; 2.3750us movwf byte_count, b ; 2.4375us movf PORTA, w, a ; 2.5000us movf PORTB, w, a ; 2.5625us - btfss N64_PIN ; 2.6250us Wait for the data line to go back high. + if ctrl1 + btfss N64_PIN ; 2.6250us Wait for the data line to go back high. + else + btfss N64_PIN2 + endif bra $-2 ; 2.6875us endm @@ -473,10 +490,6 @@ bit_loop ifdef DBG_TRACE movff INDF1, PORTC endif - ;; Following controller stop bit, got back waiting for host command right away. - ;; Some games may send us another read/write within les than 400 us. Polling - ;; the GameCube controller and the adaptor mapping work can take up to 500 us. - ;; We would then miss a command from the host and the transfer would fail. endif return ; 2.2500us diff --git a/hardware/cube64.pdf b/hardware/cube64.pdf index 697dfe7251d0ad469ac8ce096c938a7f5d8caf6a..8bb265aad1960384949545382965167f1302946d 100644 GIT binary patch delta 9591 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 S69@(g3k%`0vB_&H;Qj|vx0kd4 delta 14770 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 T 48870 49840 9 10 1 0 0 0 1 J2, facing socket -T 48980 52340 9 10 1 0 0 0 1 +T 48980 52940 9 10 1 0 0 0 1 J1, facing plug A 49600 50880 600 137 267 3 0 0 0 -1 -1 L 49160 51290 50030 51290 3 0 0 0 -1 -1 @@ -98,20 +93,20 @@ T 49570 50610 9 10 1 0 0 0 1 T 49800 50610 9 10 1 0 0 0 1 6 V 49600 50880 673 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -V 49580 53380 673 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -A 49580 53380 568 331 238 3 0 0 0 -1 -1 -L 49080 53100 50080 53100 3 0 0 0 -1 -1 -V 49240 53330 139 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -V 49240 53330 92 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -V 49900 53330 139 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -V 49900 53330 92 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -V 49570 53330 139 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -V 49570 53330 92 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 -T 49200 53550 9 10 1 0 0 0 1 +V 49580 53980 673 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +A 49580 53980 568 331 238 3 0 0 0 -1 -1 +L 49080 53700 50080 53700 3 0 0 0 -1 -1 +V 49240 53930 139 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +V 49240 53930 92 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +V 49900 53930 139 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +V 49900 53930 92 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +V 49570 53930 139 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +V 49570 53930 92 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 +T 49200 54150 9 10 1 0 0 0 1 3 -T 49530 53550 9 10 1 0 0 0 1 +T 49530 54150 9 10 1 0 0 0 1 2 -T 49890 53550 9 10 1 0 0 0 1 +T 49890 54150 9 10 1 0 0 0 1 1 T 57500 45100 9 10 1 0 0 0 1 Gamecube controller to N64 console adaptor @@ -973,7 +968,35 @@ value=1k N 60800 51700 61000 51700 4 N 59900 51700 59700 51700 4 N 58000 51000 58900 51000 4 -N 58900 51000 58900 55000 4 -N 58900 55000 54300 55000 4 -N 54300 55000 54300 53400 4 -N 52400 53400 54300 53400 4 +N 58900 51000 58900 55100 4 +N 58900 55100 54300 55100 4 +N 54000 53800 55000 53800 4 +C 50700 52500 1 0 0 connector3-1.sym +{ +T 50700 53600 5 10 1 1 0 0 1 +refdes=J5 +} +T 51400 53400 9 10 1 0 0 0 1 ++3.3v (Red) +T 51400 53100 9 10 1 0 0 0 1 +DATA (White) +T 51400 52800 9 10 1 0 0 0 1 +GND (Black) +T 50700 52050 9 10 1 0 0 0 2 +Nintendo 64 plug #2 +(Optional) +N 52400 54900 54000 54900 4 +N 52900 54900 52900 55100 4 +N 54000 53800 54000 54900 4 +N 52400 53300 52900 53300 4 +N 52900 53300 52900 54900 4 +N 58000 50600 59300 50600 4 +N 59300 50600 59300 55500 4 +N 53700 55500 59300 55500 4 +N 52400 54600 54300 54600 4 +N 54300 54600 54300 55100 4 +N 53700 53000 53700 55500 4 +N 53700 53000 52400 53000 4 +N 52400 54300 53200 54300 4 +N 53200 54300 53200 52700 4 +N 53200 52700 52400 52700 4