; Compact flash player ; ; Copyright (c) K Orton 2011 ; PIC constants W EQU 0 INDF EQU H'0000' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PORTC EQU H'0007' TMR2 EQU H'0011' T2CON EQU H'0012' SSPBUF EQU H'0013' SSPCON EQU H'0014' CCPR2L EQU H'001B' CCP2CN EQU H'001D' TRISA EQU H'0085' TRISB EQU H'0086' TRISC EQU H'0087' PR2 EQU H'0092' ADCON1 EQU H'009F' C EQU 0 Z EQU 2 RP0 EQU 5 TMR2ON EQU 2 SSPEN EQU 5 CFG EQU H'3D32' __CONFIG CFG ; Program constants FLAGS EQU H'0060' WASHP EQU H'0061' FSSEQ EQU H'0062' BTTNS EQU H'0063' STATE EQU H'0064' COUNT EQU H'0065' AUDIO1 EQU H'0066' AUDIO2 EQU H'0067' AUDIO3 EQU H'0068' AUDIO4 EQU H'0069' AUDIO5 EQU H'006A' AUDIO6 EQU H'006B' AUDIO7 EQU H'006C' LBA0 EQU H'006D' LBA1 EQU H'006E' LBA2 EQU H'006F' LBA3 EQU H'0070' BUF0 EQU H'0071' BUF1 EQU H'0072' BUF2 EQU H'0073' BUF3 EQU H'0074' CSYNC EQU 0 CWR EQU 2 CLOAD EQU 4 CCLR EQU 6 CRESET EQU 7 CFFEAT EQU 1 CFSCNT EQU 2 CFSNO EQU 3 CFCYLO EQU 4 CFCYHI EQU 5 CFHEAD EQU 6 CFCMD EQU 7 HEADOR EQU B'11100000' FPLAY EQU 0 FMUTE EQU 1 FPAUSE EQU 2 BREWND EQU 0 BSTOP EQU 1 BPLAY EQU 4 BFFWD EQU 5 ; Output audio sample in display lines macro DAOUT MACRO LOB,HIB,HINIB ; DAOUT = 25~ IF HINIB SWAPF HIB,W ELSE MOVF HIB,W ENDIF XORLW 8 MOVWF SSPBUF CALL DEL4 CALL DEL4 MOVF LOB,W MOVWF SSPBUF CALL DEL4 CALL DEL4 NOP BCF PORTC,CLOAD NOP BSF PORTC,CLOAD ENDM ; Reset ORG 0 MOVLW B'00001000' MOVWF PORTA MOVLW B'10011111' MOVWF PORTC BSF STATUS,RP0 MOVLW B'00110000' MOVWF TRISA CLRF TRISC MOVLW B'00000110' MOVWF ADCON1 CLRF PR2 BCF STATUS,RP0 MOVLW 1 MOVWF CCPR2L MOVLW B'00010000' MOVWF SSPCON BSF T2CON,TMR2ON BSF SSPCON,SSPEN MOVLW B'00001100' MOVWF CCP2CN ; Program initialisation CLRF FLAGS CLRF FSSEQ CLRF STATE MOVLW B'00110011' MOVWF BTTNS ; Main loop L1 CALL FS11L ; Cycle = 249885~ CALL DEL4 CALL FS11L CALL DEL4 CALL FS11L CALL DEL4 CALL FS11L NOP MOVLW 9 MOVWF COUNT L2 NOP CALL FBIL DECFSZ COUNT GOTO L2 MOVLW D'188' MOVWF COUNT CALL FBIL BTFSS FLAGS,FPLAY GOTO L4 NOP L3 NOP CALL DSPL DECFSZ COUNT GOTO L3 GOTO L5 L4 NOP CALL DBLNKL DECFSZ COUNT GOTO L4 NOP NOP L5 CALL FS01L CALL DEL4 CALL FS11L CALL DEL4 CALL FS11L CALL DEL4 CALL FS11L CALL DEL4 CALL FS10L CLRF FSSEQ MOVLW 9 MOVWF COUNT L6 NOP CALL FBIL DECFSZ COUNT GOTO L6 MOVLW D'188' MOVWF COUNT CALL FBIL BTFSS FLAGS,FPLAY GOTO L8 NOP L7 NOP CALL DSPL DECFSZ COUNT GOTO L7 GOTO L1 L8 NOP CALL DBLNKL DECFSZ COUNT GOTO L8 GOTO L1 ; Frame sync processing FSPROC MOVF FSSEQ,W ; CALL FSPROC = 92~ ADDWF PCL GOTO FSPRO0 GOTO FSPRO1 GOTO FSPRO2 GOTO FSPRO3 GOTO FSPRO4 GOTO FSPRO5 GOTO FSPRO6 GOTO FSPRO7 GOTO FSPRO8 FSPRO0 MOVF STATE,W ADDWF PCL GOTO ST0 GOTO ST1 GOTO ST2 GOTO ST3 GOTO ST4 GOTO ST5 GOTO ST6 FSPRO1 BTFSS FLAGS,FPLAY GOTO FSEX10 BSF FLAGS,FMUTE BTFSC BTTNS,BREWND GOTO L9 CLRF BUF0 MOVLW D'236' MOVWF BUF1 MOVLW D'255' MOVWF BUF2 MOVWF BUF3 CALL DEL4 NOP NOP GOTO L12 L9 BTFSC BTTNS,BFFWD GOTO L10 CLRF BUF0 MOVLW D'20' MOVWF BUF1 CLRF BUF2 CLRF BUF3 CALL DEL4 GOTO L12 L10 BTFSC FLAGS,FPAUSE GOTO L11 BCF FLAGS,FMUTE CLRF BUF0 MOVLW 2 MOVWF BUF1 CLRF BUF2 CLRF BUF3 GOTO L12 L11 CLRF BUF0 CLRF BUF1 CLRF BUF2 CLRF BUF3 NOP NOP NOP L12 MOVF BUF0,W ADDWF LBA0 MOVF BUF1,W BTFSC STATUS,C INCFSZ BUF1,W ADDWF LBA1 MOVF BUF2,W BTFSC STATUS,C INCFSZ BUF2,W ADDWF LBA2 MOVF BUF3,W BTFSC STATUS,C INCFSZ BUF3,W ADDWF LBA3 MOVF LBA3,W ANDLW H'F0' BTFSC STATUS,Z GOTO FSEX45 CLRF LBA0 CLRF LBA1 CLRF LBA2 CLRF LBA3 GOTO FSEX50 FSPRO2 NOP NOP NOP FSEX10 NOP NOP FSEX12 NOP FSEX13 NOP NOP NOP FSEX16 CALL DEL4 NOP NOP NOP FSEX23 NOP NOP FSEX25 MOVLW 4 CALL DELAY FSEX45 CALL DEL4 NOP FSEX50 NOP NOP NOP MOVLW 8 CALL DELAY INCF FSSEQ RETURN FSPRO3 BTFSS FLAGS,FPLAY GOTO FSEX10 BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 MOVLW CFSNO MOVWF PORTA MOVF LBA0,W CALL CFWRTE MOVLW CFCYLO MOVWF PORTA MOVF LBA1,W CALL CFWRTE MOVLW CFCYHI MOVWF PORTA MOVF LBA2,W CALL CFWRTE MOVLW CFHEAD MOVWF PORTA MOVF LBA3,W IORLW HEADOR CALL CFWRTE MOVLW CFSCNT MOVWF PORTA MOVLW D'188' CALL CFWRTE MOVLW CFCMD MOVWF PORTA MOVLW H'20' CALL CFWRTE BSF STATUS,RP0 MOVLW H'FF' MOVWF TRISB BCF STATUS,RP0 INCF FSSEQ RETURN FSPRO4 MOVLW 1 BTFSS FLAGS,FPLAY MOVLW 9 MOVWF PORTA GOTO FSEX13 FSPRO5 MOVF PORTA,W ANDLW B'00110000' MOVWF BTTNS MOVLW 2 BTFSS FLAGS,FPLAY MOVLW D'10' MOVWF PORTA GOTO FSEX16 FSPRO6 SWAPF PORTA,W ANDLW B'00000011' IORWF BTTNS GOTO FSEX12 FSPRO7 MOVF LBA0,W MOVWF BUF0 MOVF LBA1,W ADDLW 1 MOVWF BUF1 MOVF LBA2,W BTFSC STATUS,C ADDLW 1 MOVWF BUF2 MOVF LBA3,W BTFSC STATUS,C ADDLW 1 MOVWF BUF3 BCF BUF3,4 GOTO FSEX23 FSPRO8 BTFSS FLAGS,FPLAY GOTO FSEX10 BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 MOVLW CFSNO MOVWF PORTA MOVF BUF0,W CALL CFWRTE MOVLW CFCYLO MOVWF PORTA MOVF BUF1,W CALL CFWRTE MOVLW CFCYHI MOVWF PORTA MOVF BUF2,W CALL CFWRTE MOVLW CFHEAD MOVWF PORTA MOVF BUF3,W IORLW HEADOR CALL CFWRTE MOVLW CFSCNT MOVWF PORTA MOVLW D'188' CALL CFWRTE MOVLW CFCMD MOVWF PORTA MOVLW H'20' CALL CFWRTE BSF STATUS,RP0 MOVLW H'FF' MOVWF TRISB BCF STATUS,RP0 INCF FSSEQ RETURN ; Button state processing ST0 BTFSC BTTNS,BPLAY GOTO STEX15 BCF PORTC,CRESET INCF STATE GOTO STEX18 ST1 BSF PORTC,CRESET INCF STATE GOTO STEX16 ST2 BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 MOVLW CFFEAT MOVWF PORTA MOVLW H'01' CALL CFWRTE MOVLW CFCMD MOVWF PORTA MOVLW H'EF' CALL CFWRTE BSF STATUS,RP0 MOVLW H'FF' MOVWF TRISB BCF STATUS,RP0 INCF STATE GOTO STEX46 ST3 CLRF LBA0 CLRF LBA1 CLRF LBA2 BSF LBA3,4 BSF FLAGS,FPLAY BCF FLAGS,FPAUSE INCF STATE GOTO STEX21 ST4 BTFSS BTTNS,BPLAY GOTO STEX15 INCF STATE GOTO STEX17 ST5 BTFSC BTTNS,BSTOP GOTO L13 BCF FLAGS,FPLAY MOVLW 8 MOVWF PORTA CLRF STATE GOTO STEX20 L13 BTFSC BTTNS,BPLAY GOTO STEX18 MOVLW (1<