*       Stephen Tobias

*       Code Placed in EEPROM
*       Initialisation
Temp    EQU     $0AFF

MODE    EQU     $0B
MISC    EQU     $13
PEAR    EQU     $0A
FEELCK  EQU     $F4
INITEE  EQU     $12
PWCLK   EQU     $40
PWPOL   EQU     $41
PWEN    EQU     $42
PWPRES  EQU     $43
PWSCAL0 EQU     $44
PWSCNT0 EQU     $45
PWSCAL1 EQU     $46
PWSCNT1 EQU     $47
PWPER0  EQU     $4C
PWPER1  EQU     $4D
PWPER2  EQU     $4E
PWPER3  EQU     $4F
PWDTY0  EQU     $50
PWDTY1  EQU     $51
PWDTY2  EQU     $52
PWDTY3  EQU     $53


BIT0    EQU     %00000001
BIT1    EQU     %00000010
BIT2    EQU     %00000100
BIT3    EQU     %00001000
BIT4    EQU     %00010000
BIT5    EQU     %00100000
BIT6    EQU     %01000000
BIT7    EQU     %10000000

        ORG     $0D00

Start   LDS     #$0C00

*       Clear COP
        CLR     $016

*       Mode -> Expanded Narrow
*       & Port E Assignment
*               PEAR
        LDAA    #%00000100
*               MODE
        LDAB    #%10111000

*       First write is ignored
        STD     PEAR

*       Second is not
        STAB    MODE

        BSR     InitSCI

        LDX     #Prmt
        BSR     OutStr

        BSR     InChar

*       If not 'y' Skip to Main
        CMPA    CharY
        BNE     SMain

*       Enable Flash EEPROM (Upper memory)
        LDAA    #%01000011
        STAA    MISC

*	Move 7 bytes
	LDD	#$0007
	LDX	#EEMV
	LDY	#$1000

	JSR	SMCopy

*	Move EEPROM?
	LDX	#Prmt2
	BSR	OutStr

	BSR	InChar

*	If not 'y' jump to DeBug12
	CMPA	CharY
	BNE	EDebug

*       Jump to RAM, then Debug12
        JMP     $1000

EDebug	JMP	$F703

*************************************************
*       Skip to MCopy or Main
*************************************************
SMCopy  LBRA    MCopy
SMain   LBRA    Main

SC0BD   EQU     $C0
SC0CR1  EQU     $C2
SC0CR2  EQU     $C3
SC0SR1  EQU     $C4
SC0DR   EQU     $C7

EOS     EQU     $04
CR      EQU     $0D
LF      EQU     $0A

Prmt    FCB     CR,LF
        FCB     "Enter DeBug12? "
        FCB     EOS

CharY   FCB     "y"

Prmt2	FCB	CR,LF
	FCB	"Move EEPROM? "
	FCB	EOS

***************************************************
*       Initalise SCI
***************************************************
InitSCI PSHD

*       Set baud to 9600
        LDD     #$34
        STD     SC0BD

        LDAA    #$00
        STAA    SC0CR1
        LDAA    #$0C
        STAA    SC0CR2

        PULD
        RTS

***************************************************
*       Send out a Byte (in A)
***************************************************
OutChar PSHD

Here0   LDAB    SC0SR1
        ANDB    #%10000000
        BEQ     Here0

*       Send out Data
        STAA    SC0DR

*       Wait for Transmit Complete

        PULD
        RTS

***************************************************
*       Send out a string
***************************************************
OutStr  PSHA
        PSHX

Here1   LDAA    0,X
        CMPA    #EOS

        BEQ     DoneStr
        BSR     OutChar

        INX
        BRA     Here1

DoneStr PULX
        PULA
        RTS

***************************************************
*       Gets a byte from SCI (returned in A)
***************************************************
InChar  LDAA    SC0SR1
        ANDA    #%00100000
        BEQ     InChar

        LDAA    SC0DR

        RTS


***************************************************
*       ASCIIHx
*       Converts ASCII to a Hex number
*       Number in A and returned in A
***************************************************

ASCIIHx PSHB

*       Transfer A to B (for comparision)
        TAB

*       Mask 1st half
        ANDA    #%00001111

*       if it was below 40 it was a number
        CMPB    #40
        BLT     DneHex2

        ADDA    #$09

DneHex2 PULB
        RTS


***************************************************
*       ASCII2
*       Converts 2 ASCII chars to a normal byte
*       B-> lower 4 bits, A->upper 4 bits (in A)
***************************************************

ASCII2  PSHA
        TBA

*       Convert B first
        BSR     ASCIIHx
        TAB

        PULA

*       Convert A next
        BSR     ASCIIHx

*       Move A to upper 4 bits
        LSLA
        LSLA
        LSLA
        LSLA

*       Add A & B
        ABA

        RTS

***************************************************
*       GetDBt
*       Gets 2 Chars from SCI
*       First in A, 2nd in B
***************************************************
GetDBt  BSR     InChar
        PSHA
        BSR     InChar
        TAB
        PULA
        RTS

***************************************************
*       Loader
*       Loads a .S19 file
***************************************************
Loader  PSHD
        PSHX

*       Look for the begining of an S record
LookS   BSR     InChar
        CMPA    CharS
        BNE     LookS

*       If it is an S0 ignore it
        BSR     InChar
        CMPA    #$30
        BEQ     LookS

*       If it is a S9 End
        CMPA    #$39
        BEQ     LoadDn

*       If not a 1 look for another S1
        CMPA    #$31
        BNE     LookS

*       Get Legnth
        BSR     GetDBt
        BSR     ASCII2
        STAA    Temp

*       Get Record Loc Hi
        BSR     GetDBt
        BSR     ASCII2

*       Save record in X
        CLRB
        XGDX

*       Get Record Loc Lo
        BSR     GetDBt
        BSR     ASCII2

*       Add to X
        TAB
        ABX

*       Decriment temp twice
        DEC     Temp
        DEC     Temp

*       Look to see if done yet
NextBt  LDAA    Temp
        CMPA    #$01
        BEQ     LookS

*       Get Data & save
        BSR     GetDBt
        BSR     ASCII2

WAgain  TAB
	STAA    0,X

        CMPA	0,X
        BNE     WAgain

        DEC     Temp
        INX
        BRA     NextBt

LoadDn  PULX
        PULD
        RTS

CharS   FCB     "S"

***************************************************
*       MCopy
*       Copies memory from X to Y
*       Number of bytes in D
***************************************************
MCopy   MOVB    1,X+,1,Y+
        DBNE    D,MCopy
        RTS

****************************************************
*	PWM Init
****************************************************
InitPWM	PSHD

*       No concentration, slowest clock
        LDAA    #%00111111
        STAA    PWCLK

*       Clk S1&S0, and duty is high, not low
        LDAA    #%11111111
        STAA    PWPOL

*       Prescaler of 3, S0 = CLKA / (3 * 2) = (8MHz / 128)/ 6 = 10.4 kHz
        LDAA    #$03
        STAA    PWSCAL0
        STAA    PWSCAL1

*       Load Period of 254
*       10.416 kHz / 254 ~ 41 Hz
        LDAA    #$FE
        STAA    PWPER0
        STAA    PWPER1
        STAA    PWPER2
        STAA    PWPER3

*       Duty = 5%   = one side   = $2
*       Duty = 7.5% = center     = $A
*       Duty = 10%  = other side = $12
        LDAA    #$0A
        STAA    PWDTY0
        STAA    PWDTY1
        STAA    PWDTY2
        STAA    PWDTY3

*       Enable PWM 1 -> 4
        LDAA    #%00001111
        STAA    PWEN

        PULD
        RTS

***************************************************
*       Long Branches to Subs
***************************************************

SOutChar LBRA   OutChar
SOutStr  LBRA   OutStr
SInChar  LBRA   InChar
SLoader	 LBRA	Loader

***************************************************
*       Main
***************************************************

Main    LDS     #$0C00

*       Disable Flash EEPROM (Upper memory)
        LDAA    #%01000000
        STAA    MISC

STest   LDX     #Str0
        BSR     SOutStr
        BSR     SInChar

        LDX     #Str1
        BSR     SOutStr
        BSR     SOutChar

        STAA    $4000
        STAA    $8000

        LDAA    $4000
        BSR     SOutChar

        LDAA    $8000
        BSR     SOutChar

        CMPA    CharY
        BEQ     J800

        BRA     STest

*       jump to 800
J800   	JMP     $800

Str0    FCB     CR,LF
        FCB     "Enter a Char: "
        FCB     EOS

STR1    FCB     CR,LF
        FCB     "Entered: "
        FCB     EOS
***************************************************
*	Moves EEPROM to FD00
***************************************************

*	Move EEPROM
EEMV	LDAA	#%11110001
	STAA	INITEE

*       Jump to RAM, then DeBug12
        JMP     $F703

TestP	LDS	#$3000
TestP0	STAA	$2000
	LDAA	$2000
	CMPA	$2000
	PSHA
	PULA
	BRA	TestP0