; step4.ASM
; Version: 0       Date: 07. July 1998
; Copyright (C) 1998/99  Georg Ziegler

; NMRA-DCC decoder for stepper motor with 2 coil based on PIC12C509
; 14 speed step mode (internal 30) and two internal speed curves
; no programming implemented, only short fixed adresses
; Max 2000 U/min - SPDTAB and Z2TAB in SPEED.XLS worksheet
; 4 I/O Ports used for stepper

;    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 2 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, write to the Free Software
;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

;    Contact :
;    Georg Ziegler
;    Zwehrener Weg 23a
;    34121 Kassel
;    g.zi@gmx.de
;--------------------------------------------------------------------
	LIST	P=12C509, R=DEC
	INCLUDE <P12C509.INC>
	 __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_ON & _IntRC_OSC 
;--------------------------------------------------------------------
; 0AAA AAAA  01DL SSSS -> Lok Adress Direction Light & Speed
; 0AAA AAAA  100D DDDD -> Lok Function F1-F4 & FL
; 0AAA AAAA  1011 DDDD -> Lok Function F5-F8
; 0000 0000            -> Broadcast Adress for all Lok Decoder

; 10AA AAAA  1AAA CDDD -> 9 Bit Accessory on/off F1-F8 
; 1011 1111  1000 CDDD -> Broadcast Command for all Accessory Decoder

; 1111 1111  0000 0000 -> Idle Packet for all Decoder

ADDR	EQU	03		; 10AA AAAA 

DELAY	EQU	0x20		; 255-

INDF	EQU	0x00		; indirekte Adressierung
tmr0	EQU	0x01
PC	EQU	0x02
STATUS	EQU	0x03		; Status Register
FSR	EQU	0x04		;
OSCCAL	EQU	0x05
GPIO	EQU	0x06		; Register definitions
PRE	EQU	0x07		; Preample 12 BIT
BT1	EQU	0x08
BT2	EQU	0x09
BT3	EQU	0x0A
BT4	EQU	0x0B
BT5	EQU	0x0C	
BT6	EQU	0x0D
HI	EQU	0x0E
LO	EQU	0x0F

ZL	EQU	0x10
ZH	EQU	0x11

Z1	EQU	0x10
Z2	EQU	0x11
IST	EQU	0x12
SOLL	EQU	0x13
BEFEHL	EQU	0x14
FUNK	EQU	0x15
Z1LOG	EQU	0x16
Z2LOG	EQU	0x17
LASTGP	EQU	0x18

CARRY	EQU	0
ZERO	EQU	2
SEITE	EQU	5
DIR	EQU	5
POL	EQU	6
ROMPAGE	EQU	5

	ORG     1		; Reset Vector

;--------------------------------------------------------------------

Init	MOVWF	OSCCAL		; write calibration value

	MOVLW	00101000b	; GP3 & GP5 Input
	TRIS	GPIO		; tristate port GPIO

	MOVLW	PRE		; Pointer für indirekte Adressierung
	MOVWF	FSR		;

	MOVLW	10000111b	; no wakeup, pullup, T0 int., lowtohigh, T0, 1:256
	OPTION

	MOVLW	1		; Z1 auf 1 setzen, damit
	MOVWF	Z1		; STEPPER nicht aufgerufen wird
	MOVWF	Z2		;
	
	CLRF	IST		;0
	CLRF	SOLL		;0
	CLRF	BEFEHL		;0
	CLRF	FUNK		;0

	CLRWDT			; WatchDog Timer zurücksetzen
	CLRF	GPIO

;--------------------------------------------------------------------
;	GOTO	START		; Überspringt Routine, nur zum TEST
;next	call	INLO
;	call	STEP		; nur zum TEST
;	goto	next		; nur zum TEST

;--------------------------------------------------------------------
; Positive oder Negative Bits auf der Schiene?

	CLRF	ZL
	CLRF	ZH
	MOVLW	0xF0

BEGIN	BTFSS	GPIO,3		;
	GOTO	BEGIN		;
BEGIN1	BTFSC	GPIO,3		;
	GOTO	BEGIN1		;

TESTL	INCF	ZL		;--				1
	BTFSS	GPIO,3		;				2
	GOTO	TESTL		;__				3-4

	ADDWF	ZL,1		;				4
	BTFSC	STATUS,CARRY	;				5
	GOTO	TESTH1		; L0				6-7
	CLRF	ZH		; L1				7

TESTH	INCF	ZH		;--				1
	BTFSC	GPIO,3		;				2
	GOTO	TESTH		;__				3-4

	ADDWF	ZH,1		;				4
	BTFSC	STATUS,CARRY	;				5
	GOTO	POS		; H0 				6-7
	CLRF	ZL		; H1				7
	GOTO	TESTL		;				8-9
TESTH1	CLRF	ZH		;				9

TESTH2	INCF	ZH		;--				1
	BTFSC	GPIO,3		;				2
	GOTO	TESTH2		;__				3-4

	ADDWF	ZH,1		;				4
	BTFSS	STATUS,CARRY	;				5
	GOTO	POS		; H1				6-7
	CLRF	ZL		; H0				7

TESTL1	INCF	ZL		;--				1
	BTFSS	GPIO,3		;				2
	GOTO	TESTL1		;__				3-4

	ADDWF	ZL,1		;				4
	BTFSS	STATUS,CARRY	;				5
	GOTO	NEG		; L1				6-7
	GOTO	TESTH1		; L0				7-8

POS	BCF	STATUS,POL	;
	GOTO	START		;

NEG	BSF	STATUS,POL	;
	GOTO	START		;

;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

SPDTAB	MOVF	IST,0	;11
	ADDWF	PC	;12
	RETLW	255	;13-14
	RETLW	211	;
	RETLW	3	; 1
	RETLW	20	; 2
	RETLW	44	; 3
	RETLW	71	; 4
	RETLW	96	; 5
	RETLW	119	; 6
	RETLW	39	; 7
	RETLW	90	; 8
	RETLW	125	; 9
	RETLW	149	; 10
	RETLW	168	; 11
	RETLW	182	; 12
	RETLW	193	; 13
	RETLW	201	; 14
	RETLW	208	; 15
	RETLW	214	; 16
	RETLW	218	; 17
	RETLW	222	; 18
	RETLW	226	; 19
	RETLW	229	; 20
	RETLW	231	; 21
	RETLW	233	; 22
	RETLW	235	; 23
	RETLW	237	; 24
	RETLW	238	; 25
	RETLW	239	; 26
	RETLW	240	; 27
	RETLW	241	; 28
	RETLW	242	; 29
	RETLW	243	; 30

Z2TAB	MOVF	IST,0	;18
	ADDWF	PC	;19
	RETLW	255	;20-21
	RETLW	255	;
	RETLW	132	; 1
	RETLW	13	; 2
	RETLW	6	; 3
	RETLW	4	; 4
	RETLW	3	; 5
	RETLW	2	; 6
	RETLW	1	; 7
	RETLW	1	; 8
	RETLW	1	; 9
	RETLW	1	; 10
	RETLW	1	; 11
	RETLW	1	; 12
	RETLW	1	; 13
	RETLW	1	; 14
	RETLW	1	; 15
	RETLW	1	; 16
	RETLW	1	; 17
	RETLW	1	; 18
	RETLW	1	; 19
	RETLW	1	; 20
	RETLW	1	; 21
	RETLW	1	; 22
	RETLW	1	; 23
	RETLW	1	; 24
	RETLW	1	; 25
	RETLW	1	; 26
	RETLW	1	; 27
	RETLW	1	; 28
	RETLW	1	; 29
	RETLW	1	; 30

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

	CLRF	GPIO		; Stepper 29us on		25
STEP	INCFSZ	Z1,0		;				26
	GOTO	ISO		;				27-28
	MOVF	Z1LOG,0		;				28
	MOVWF	Z1		;				29
	MOVF	LASTGP,0	;				30
	ANDLW	00000110b	;				31
	BTFSC	BEFEHL,DIR	;				32
	IORLW	00001000b	;				33
	ADDWF	PC		; DIR GP2 GP1			34
	MOVLW	00010010b	;  0   0   0   			35
	GOTO	STEPEND		;				36-37
	MOVLW	00000110b	;  0   0   1
	GOTO	STEPEND		;
	MOVLW	00010001b	;  0   1   0
	GOTO	STEPEND		;
	MOVLW	00000101b	;  0   1   1
	GOTO	STEPEND		;
	MOVLW	00000101b	;  1   0   0
	GOTO	STEPEND		;
	MOVLW	00010001b	;  1   0   1
	GOTO	STEPEND		;
	MOVLW	00000110b	;  1   1   0
	GOTO	STEPEND		;
	MOVLW	00010010b	;  1   1   1
	GOTO	STEPEND		;

STEPEND	NOP			;				38
	MOVWF	LASTGP		;				39
	MOVWF	GPIO		;				40
	RETLW	0		; ****** Ende Stepper ******	41-42


ISO	INCFSZ	tmr0,0		;				29
	GOTO	INC		;				30-31
	MOVLW	DELAY		;				31
	MOVWF	tmr0		;				32
	MOVF	SOLL,0		;				33
	SUBWF	IST,0		;				34
	BTFSC	STATUS,ZERO	;				35
	GOTO	EQUAL		; Geschwindigkeit gleich	36-37
	BTFSC	STATUS,CARRY	;				37
	DECF	IST,1		;				38
	BTFSS	STATUS,CARRY	;				39
	INCF	IST,1		;				40
	RETLW	0		;				41-42

EQUAL	NOP			; 				38
	NOP			;				39
	NOP			;				40
	RETLW	0		;				41-42

INC	MOVF	LASTGP,0	; 				32
	MOVWF	GPIO		;				33
	DECFSZ	Z2,1		;				34
	GOTO	INCEXIT		;				35-36
	INCF	Z1,1		;				36	
	MOVF	Z2LOG,0		;				37
	MOVWF	Z2		;				38
	BTFSC	FUNK,7		;				39
	RLF	Z2,1		; *2				40
	RETLW	0		;				41-42

INCEXIT	NOP			; 				37
	NOP			; 				38
	MOVF	LASTGP,0	; 				39
	MOVWF	GPIO		;				40
	RETLW	0		;				41-42

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INLO	BTFSS	STATUS,POL	;				1
	GOTO	INLO1		; positiv			2-3
	NOP			; negativ			3
	BTFSS	GPIO,3		; ########### input ##########	4
	GOTO	INHI		; 				5-6
	GOTO	LONEXT		;				6-7

INLO1	BTFSC	GPIO,3		; ########### input ##########	4
	GOTO	INHI		; 				5-6
	NOP			;				7
LONEXT	INCF	LO		; LO+1				8

;	CLRF	GPIO		; Stepper 12us on
;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	CALL	SPDTAB		;				9-10
	MOVWF	Z1LOG		;				15
	CALL	Z2TAB		;				16-17
	MOVWF	Z2LOG		;				22
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	CALL	STEP		;				23-24
	GOTO	INLO		; 2 cycles			42-43

;-------------
INHI	MOVF	LO,1		; Zero test			4
	BTFSS	STATUS,ZERO	;				5
	RETLW	0		;				6-7
	INCF	HI		; HI+1				8

;	CLRF	GPIO		; Stepper 12us on
;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	MOVF	IST		;				9
	BTFSC	STATUS,ZERO	; STOP				10
	CLRF	Z1		;				11
	BTFSC	STATUS,ZERO	;				12
	CLRF	LASTGP		;				13
;--------------------------------------
	DECF	BEFEHL,0	;				14
	ANDLW	00001111b	; <- 14 Fahrstufen		15

	BTFSC	STATUS,ZERO	; NOTHALT			16
	CLRF	Z1		;				17
	BTFSC	STATUS,ZERO	;				18
	CLRF	LASTGP		;				19
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	NOP			;				20
	NOP			;				21
	NOP			;				22
	CALL	STEP		;				23-24
	GOTO	INLO		;				42-43

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

START	CLRWDT			;				16
	CLRF	HI		;				17
	CLRF	LO		;				18

	MOVLW	PRE		; Pointer für ind. Adressierung	19
	MOVWF	FSR		;				20

	MOVLW	11		;				21
	MOVWF	PRE		; PRE auf 10 Bit für Preample	22

;-------------
INTEST	CALL	STEP		;				23-24
	CALL	INLO		;				42-43
	MOVF	HI,0		;				8
	ADDWF	LO,1		; HI+LO				9
	MOVLW	4		; ___    < 3			10
	SUBWF	LO,0		; BIT im Carry			11
	CLRF	LO		;				12
	CLRF	HI		;				13
	INCF	HI		;				14
	DECFSZ	PRE,1		; Pre=0?			15
	GOTO	PRETEST		;				16-17
	BTFSC	STATUS,CARRY	; warte auf 0			17
	GOTO	BYTE		; Preample erfüllt!		18-19
	INCF	PRE,1		;				19
	NOP			;				20
PREBACK	GOTO	INTEST		; nächstes Bit			21-22

PRETEST	BTFSS	STATUS,CARRY	;				18
	GOTO	PREBACK		; 				19-20
	GOTO	START22		; Preample nicht erfüllt!	20-21

BYTE	MOVLW	9		; PRE auf 8 Bit für 1.Byte	20
	MOVWF	PRE		;				21
	INCF	FSR,1		; Pointer für ind. Adressierung	22
INTEST1	CALL	STEP		;				23-24
	CALL	INLO		;				42-43
	MOVF	HI,0		;				8
	ADDWF	LO,1		; HI+LO				9
	MOVLW	4		; ___    < 3			10
	SUBWF	LO,0		; BIT im Carry			11
	CLRF	LO		;				12
	CLRF	HI		;				13
	INCF	HI		;				14
	DECFSZ	PRE,1		; Pre=0?			15
	GOTO	NEXT		;				16-17
	BTFSC	STATUS,CARRY	; 9.Bit=0?			17
	GOTO	BYTE		;				18-19
	GOTO	EXOR		; Letztes BIT=1			19-20

NEXT	RLF	INDF,1		; 1.Byte zusammenbauen		18
	NOP			;				19
	NOP			;				20
	GOTO	INTEST1		; nächstes Bit			21-22

;--------------------------------------------------------------------
; Maximal 100 us für Befehle (2x 1Bit in PREAMPLE)

EXOR	NOP			;				21
	NOP			;				22
	CALL	STEP		;				23-24
	MOVLW	6		;				42
	SUBWF	FSR,0		;				43
	BTFSS	STATUS,ZERO	;				1
	GOTO	EXOR3		; 3 BYTE Befehl			2-3
	MOVLW	8		;				3
	SUBWF	FSR,0		;				4
	BTFSC	STATUS,ZERO	;				5
	GOTO	EXOR5		; 5 BYTE Befehl			6-7
	MOVLW	9		;				7
	SUBWF	FSR,0		;				8
	BTFSC	STATUS,ZERO	;				9
	GOTO	EXOR6		; 6 BYTE Befehl			10-11
	GOTO	START13		; 				11-12

;--------------------------------------------------------------------

EXOR3	COMF	BT1,1		; BYTE invertieren		4
	COMF	BT2,1		; BYTE invertieren		5
	COMF	BT3,1		; BYTE invertieren		6
	MOVF	BT1,0		;				7
	XORWF	BT2,0		;				8
	XORWF	BT3,0		;				9
	BTFSS	STATUS,ZERO	; Bytes vollständig angekommen?	10
	GOTO	START13		;				11-12
	MOVF	BT1,0		;				12
	XORLW	ADDR		;				13
	BTFSS	STATUS,ZERO	; Adresse gleich ?		14
	GOTO	BCAST		;				15-16
BCASTBK	BTFSC	BT2,7		; 01DLSSSS			1
	GOTO	FTION		; 1				2-3
	BTFSS	BT2,6		;				3
	GOTO	START6		; 00				4-5
	MOVF	BT2,0		; 01DLSSSS			5-6
	MOVWF	BEFEHL		;				6
	RLF	BT2,0		;				7
	ANDLW	00011110b	;				8
	MOVWF	SOLL		;				9
	NOP			;				10
	NOP			;				11
	NOP			;				12
	NOP			;				13
	NOP			;				14
	NOP			;				15
;vvvvvvvvvvvvvvvvvvvvvvvv Arnold Digital vvvvvvvvvvvvvvvvvvvvvvvvvvvv
;	BTFSS	BT2,4		; 01D>L<SSSS	Arnold Digital	16
;	GOTO	NOLIGHT		;				17-18
;	BTFSC	BT2,5		; 01>D<LSSSS			18
;	GOTO	FLIGHT		;		Front Light	19-20
;	GOTO	BLIGHT		;		 Back Light	20-21
	NOP			;
	NOP			;
	NOP			;
	NOP			;
	NOP			;
;^^^^^^^^^^^^^^^^^^^^^^^^ Arnold Digital ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

FTION	BTFSC	BT2,6		;				4
	GOTO	START7		; 11				5-6
	BTFSC	BT2,5		; 10				6
	GOTO	FTION1		; 101				7-8

	BTFSS	BT2,0		; F0 off			8
	BCF	GPIO,5		;				9
	BTFSC	BT2,0		; F0 on				10
	BSF	GPIO,5		;				11

	BTFSS	BT2,1		; F1 off			12
	BCF	FUNK,7		;				13
	BTFSC	BT2,1		; F1 on				14
	BSF	FUNK,7		;				15

	BTFSS	BT2,4		; 100>L<FFFF			16
	GOTO	NOLIGHT		;				17-18
	BTFSC	BEFEHL,5	; 01>D<LSSSS			18
	GOTO	FLIGHT		;		Front Light	19-20
	GOTO	BLIGHT		;		 Back Light	20-21

FLIGHT	BSF	GPIO,4		;				21
	BCF	GPIO,5		;				22
	CALL	STEP		;				23-24
	GOTO	START1		;				42-43

BLIGHT	BCF	GPIO,4		;				22
	CALL	STEP		;				23-24
	BSF	GPIO,5		;				42-43
	GOTO	START3		;				1-2

NOLIGHT	BCF	GPIO,4		;				19
	BCF	GPIO,5		;				20
	NOP			;				21
	NOP			;				22
	CALL	STEP		;				23-24
	GOTO	START1		;				42-43

;---------
FTION1	BTFSS	BT2,4		;				9
	GOTO	START12		; 1010				10-11
	BTFSC	BT2,0		; 1011FFF>F<	F4-F7		11
	GOTO	FON4		;				12-13
	BCF	GPIO,2		;				13
	GOTO	START		;				14-15

FON4	BSF	GPIO,2		;				14
	GOTO	START17		;				15-16

;---------
BCAST	MOVF	BT1,0		;				17
	XORLW	0		; Broadcast for Lok-Decoder	18
	BTFSS	STATUS,ZERO	; Adresse gleich ?		19
	GOTO	START22		;				20-21
	NOP			;				21
	NOP			;				22
	CALL	STEP		;				23-24
	GOTO	BCASTBK		;				42-43

;--------------------------------------------------------------------

EXOR5	GOTO	START10		;				8-9

;--------------------------------------------------------------------

EXOR6	GOTO	START14		;				12-13

;--------------------------------------------------------------------

START1	NOP			;				1
START2	NOP			;				2
START3	NOP			;				3
START4	NOP			;				4
START5	NOP			;				5
START6	NOP			;				6
START7	NOP			;				7
START8	NOP			;				8
START9	NOP			;				9
START10	NOP			;				10
START11	NOP			;				11
START12	NOP			;				12
START13	NOP			;				13
START14	GOTO	START		;				14-15
START15	NOP			;				15
	NOP			;				16
START17	NOP			;				17
START18	NOP			;				18
START19	NOP			;				19
START20	NOP			;				20
START21	NOP			;				21
START22	NOP			;				22
START23	CALL	STEP		;				23-24
	GOTO	START1		;				42-43

;--------------------------------------------------------------------
	ORG	03FFh
	MOVLW	0x70		; für OSCCAL

	END
