cleanup CIC asm code
This commit is contained in:
parent
b2a02a6081
commit
42082bd2ac
@ -1,8 +1,59 @@
|
||||
#include <p12f629.inc>
|
||||
processor p12f629
|
||||
|
||||
; ---------------------------------------------------------------------
|
||||
; SNES CIC clone for PIC Microcontroller (key mode only)
|
||||
;
|
||||
; Copyright (C) 2010 by Maximilian Rehkopf <otakon@gmx.net>
|
||||
;
|
||||
; 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; version 2 of the License only.
|
||||
;
|
||||
; 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, write to the Free Software
|
||||
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
;
|
||||
; ---------------------------------------------------------------------
|
||||
;
|
||||
; pin configuration: (cartridge pin) [key CIC pin]
|
||||
;
|
||||
; ,---_---.
|
||||
; +5V (27,58) [16] |1 8| GND (5,36) [8]
|
||||
; CIC clk (56) [6] |2 7| CIC data i/o 0 (55) [1]
|
||||
; status out |3 6| CIC data i/o 1 (24) [2]
|
||||
; nc |4 5| CIC slave reset (25) [7]
|
||||
; `-------'
|
||||
;
|
||||
;
|
||||
; status out can be connected to a LED. It indicates:
|
||||
;
|
||||
; state | output
|
||||
; -------------------------+--------------------
|
||||
; OK (normal operation) | high
|
||||
; error (unlock failed) | alternating @~2.5Hz
|
||||
;
|
||||
; memory usage:
|
||||
;
|
||||
; 0x20 buffer for seed calc and transfer
|
||||
; 0x21 - 0x2f seed area (lock seed)
|
||||
; 0x30 buffer for seed calc
|
||||
; 0x31 - 0x3f seed area (key seed; 0x31 filled in by lock)
|
||||
; 0x40 - 0x41 buffer for seed calc
|
||||
; 0x4d buffer for eeprom access
|
||||
; 0x4e loop variable for longwait
|
||||
; 0x4f loop variable for wait
|
||||
;
|
||||
; ---------------------------------------------------------------------
|
||||
|
||||
|
||||
; -----------------------------------------------------------------------
|
||||
__CONFIG _EC_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF; & _BOD_ON & _IESO_ON & _FCMEN_ON
|
||||
__CONFIG _EC_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF
|
||||
|
||||
; -----------------------------------------------------------------------
|
||||
; code memory
|
||||
@ -11,19 +62,19 @@ processor p12f629
|
||||
nop
|
||||
nop
|
||||
goto init
|
||||
;"isr"
|
||||
isr
|
||||
org 0x0004
|
||||
bcf INTCON, 1 ; clear interrupt cause
|
||||
bcf GPIO, 0
|
||||
bcf GPIO, 1
|
||||
bsf GPIO, 4
|
||||
bsf GPIO, 4 ; LED on
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
bsf INTCON, 7 ; re-enable interrupts (for the ISR will replace the main)
|
||||
bsf INTCON, 7 ; re-enable interrupts (ISR will continue as main)
|
||||
goto main
|
||||
init
|
||||
org 0x0010
|
||||
@ -31,7 +82,7 @@ init
|
||||
clrf GPIO
|
||||
movlw 0x07 ; GPIO2..0 are digital I/O (not connected to comparator)
|
||||
movwf CMCON
|
||||
movlw 0x90 ; Enable interrupts + enable INT
|
||||
movlw 0x90 ; global enable interrupts + enable external interrupt
|
||||
movwf INTCON
|
||||
banksel TRISIO
|
||||
movlw 0x2d ; in out in in out in
|
||||
@ -39,15 +90,16 @@ init
|
||||
movlw 0x80 ; 0x00 for pullups
|
||||
movwf OPTION_REG
|
||||
banksel GPIO
|
||||
bsf GPIO, 0x0
|
||||
bsf GPIO, 4 ; LED on
|
||||
idle
|
||||
goto idle ; wait for interrupt from lock
|
||||
|
||||
idle goto idle
|
||||
main
|
||||
banksel TRISIO
|
||||
bsf TRISIO, 0
|
||||
bcf TRISIO, 1
|
||||
banksel GPIO
|
||||
;--------INIT KEY SEED--------
|
||||
; --------INIT LOCK SEED (what the lock sends)--------
|
||||
movlw 0xb
|
||||
movwf 0x21
|
||||
movlw 0x1
|
||||
@ -79,11 +131,11 @@ main
|
||||
movlw 0x8
|
||||
movwf 0x2f
|
||||
|
||||
;--------INIT LOCK SEED--------
|
||||
banksel EEADR
|
||||
clrf EEADR
|
||||
bsf EECON1, RD
|
||||
movf EEDAT, w
|
||||
; --------INIT KEY SEED (what we must send)--------
|
||||
banksel EEADR ; D/F411 and D/F413
|
||||
clrf EEADR ; differ in 2nd seed nibble
|
||||
bsf EECON1, RD ; of key stream,
|
||||
movf EEDAT, w ; restore saved nibble from EEPROM
|
||||
banksel GPIO
|
||||
movwf 0x32
|
||||
movlw 0xa
|
||||
@ -112,13 +164,14 @@ main
|
||||
movlw 0xc
|
||||
movwf 0x3f
|
||||
|
||||
;--------Main loop--------
|
||||
; --------wait for stream ID--------
|
||||
movlw 0xb5
|
||||
call wait
|
||||
clrf 0x31 ; clear lock stream ID
|
||||
|
||||
; --------lock sends stream ID. 15 cycles per bit--------
|
||||
; bsf GPIO, 0
|
||||
; bcf GPIO, 0
|
||||
; bsf GPIO, 0 ; (debug marker)
|
||||
; bcf GPIO, 0 ;
|
||||
btfsc GPIO, 0 ; check stream ID bit
|
||||
bsf 0x31, 3 ; copy to lock seed
|
||||
movlw 0x2 ; wait=3*W+5
|
||||
@ -153,29 +206,15 @@ main
|
||||
bsf TRISIO, 1
|
||||
banksel GPIO
|
||||
nop
|
||||
movlw 0x27 ; "wait" 1
|
||||
call wait ; wait 121
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
movlw 0x22 ; "wait" 1
|
||||
call wait ; wait 107
|
||||
nop
|
||||
nop
|
||||
; --------main loop--------
|
||||
loop
|
||||
movlw 0x1
|
||||
loop0
|
||||
addlw 0x30 ; key stream (what we thought was the lock stream...)
|
||||
addlw 0x30 ; key stream
|
||||
movwf FSR ; store in index reg
|
||||
loop1
|
||||
movf INDF, w ; load seed value
|
||||
@ -183,7 +222,7 @@ loop1
|
||||
bcf 0x20, 1 ; clear bit 1
|
||||
btfsc 0x20, 0 ; copy from bit 0
|
||||
bsf 0x20, 1 ; (if set)
|
||||
bsf 0x20, 4 ; status pin
|
||||
bsf 0x20, 4 ; LED on
|
||||
movf 0x20, w
|
||||
movwf GPIO
|
||||
nop
|
||||
@ -192,10 +231,10 @@ loop1
|
||||
movlw 0x16
|
||||
call wait
|
||||
nop
|
||||
btfsc GPIO, 0
|
||||
goto die
|
||||
btfsc GPIO, 1
|
||||
btfsc GPIO, 0 ; both pins must be low...
|
||||
goto die
|
||||
btfsc GPIO, 1 ; ...when no bit transfer takes place
|
||||
goto die ; if not -> lock cic error state -> die
|
||||
incf FSR, f ; next one
|
||||
movlw 0xf
|
||||
andwf FSR, w
|
||||
@ -227,9 +266,9 @@ swapskip
|
||||
goto loop0
|
||||
goto loop
|
||||
|
||||
;--------mangle--------
|
||||
;this is damn tight because the PIC has no convenient instructions at all
|
||||
;
|
||||
; --------calculate new seeds--------
|
||||
; had to be unrolled because PIC has an inefficient way of handling
|
||||
; indirect access, no post increment, etc.
|
||||
mangle
|
||||
call mangle_lock
|
||||
nop
|
||||
@ -308,7 +347,7 @@ mangle_key_withoutskip
|
||||
movf 0x2e, w ;
|
||||
addlw 0x1 ; inc
|
||||
addwf 0x2f, f ; add to 2f
|
||||
;60
|
||||
|
||||
movf 0x20, w ; restore original 0xf
|
||||
andlw 0xf
|
||||
addlw 0xf
|
||||
@ -385,7 +424,7 @@ mangle_key_withskip
|
||||
movf 0x2e, w ;
|
||||
addlw 0x1 ; inc
|
||||
addwf 0x2f, f ; add to 2f
|
||||
;64
|
||||
|
||||
movf 0x20, w ; restore original 0xf
|
||||
andlw 0xf
|
||||
addlw 0xf
|
||||
@ -613,10 +652,10 @@ die
|
||||
btfsc 0x4d, 0
|
||||
goto die_reg_6
|
||||
die_reg_9
|
||||
movlw 0x9
|
||||
movlw 0x9 ; died with PAL, fall back to NTSC
|
||||
goto die_reg_cont
|
||||
die_reg_6
|
||||
movlw 0x6
|
||||
movlw 0x6 ; died with NTSC, fall back to PAL
|
||||
die_reg_cont
|
||||
banksel EEADR
|
||||
movwf EEDAT
|
||||
@ -639,12 +678,12 @@ die_intloop
|
||||
die_blink
|
||||
clrw
|
||||
call longwait
|
||||
bsf GPIO, 4
|
||||
call longwait
|
||||
bcf GPIO, 4
|
||||
call longwait
|
||||
bsf GPIO, 4
|
||||
goto die_blink
|
||||
; -----------------------------------------------------------------------
|
||||
; eeprom memory
|
||||
DEEPROM CODE
|
||||
de 0x09
|
||||
de 0x09 ; D411 (NTSC)
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user