0001 0000 ; ALL MP3 CODE IN ONE FILE 0002 0000 ; 0003 0000 ; 0004 0000 ;05252011 0005 0000 ; 0006 0000 ;revision 0.01 0007 0000 ; 0008 0000 ;preset file name "TEST.BIN" gets loaded with the command 0009 0000 ; 0010 0000 ;load stops when there is no data for a $FF loop count 0011 0000 ; 0012 0000 ;tasm -65 -l -b -h mp3.txt mp3d mp3d.lst 0013 0000 ;-h may be eliminated 0014 0000 ; 0015 0000 ; START @ $2000 0016 2000 .org $2000 0017 2000 ; 0018 2000 ;MP3 / Data device in slot 4 for now 0019 2000 ; 0020 2000 ; 0021 2000 ACIA = $C0C0 0022 2000 ACIA_CTRL = ACIA+3 0023 2000 ACIA_CMD = ACIA+2 0024 2000 ACIA_SR = ACIA+1 0025 2000 ACIA_DAT = ACIA 0026 2000 STORAGE = $2100 0027 2000 STOREPTR = $06 0028 2000 COUT = $FDF0 0029 2000 CROUT = $FD8E 0030 2000 ;THIS IS THE INITIALIZATION PART OF THE PROGRAM 0031 2000 ;THAT PROGRAMS THE 6551 TO 9600,N,8,1 0032 2000 ;BRUN THIS PROGRAM WILL INIT THE SERIAL PORT 0033 2000 ; 0034 2000 INIT 0035 2000 A9 00 LDA #$00 ;LOAD LOW ORDER BYTE 0036 2002 85 06 STA STOREPTR 0037 2004 A9 21 LDA #$21 ;LOAD HIGH ORDER BYTE 0038 2006 85 07 STA STOREPTR+1 0039 2008 A9 10 LDA #$10 ;INIT ACIA TO 10=115K 1E=9600 BAUD 0040 200A 8D C3 C0 STA ACIA_CTRL 0041 200D A9 0B LDA #$0B ;NO PARITY ONE STOP BIT 0042 200F 8D C2 C0 STA ACIA_CMD 0043 2012 ;END OF INIT PROCESS RIGHT INTO DOING A DIRECTORY 0044 2012 0045 2012 ;ADIR COMMAND DOES A DIRECTORY OF THE FLASH DRIVE 0046 2012 0047 2012 A2 00 ADIR LDX #$00 ;SET CHARACTER COUNT TO 0 0048 2014 BD D6 20 COMMAND LDA MP3DIR,X ;GET A BYTE FROM THE COMMAND 0049 2017 F0 08 BEQ STARTLOAD ;IF $00 GO GET THE FILE! 0050 2019 20 48 20 JSR ECHO ;GO OUTPUT THE BYTE 0051 201C E8 INX ;INCREASE BYTE COUNT 0052 201D C9 00 CMP #$00 ;IS IT END OF COMMAND? 0053 201F D0 F3 BNE COMMAND ;NO CONTINUE UNTIL FINISHED 0054 2021 ; 0055 2021 ;HERE IS WHERE WE START GETTING DATA 0056 2021 ;IF WE HIT THE END OF THE FILE, PADDING BYTES ARE READ 0057 2021 A2 00 STARTLOAD LDX #$00 0058 2023 A0 00 LDY #$00 ;RESET COUNT TO 0 0059 2025 E0 E9 NEXTCHAR CPX #$E9 ;IS WAIT TOO LONG DONE DIR? 0060 2027 F0 17 BEQ DOCR 0061 2029 AD C1 C0 LDA ACIA_SR ;See if we got an incoming char 0062 202C E8 INX 0063 202D 29 08 AND #$08 ;Test bit 3 0064 202F F0 F4 BEQ NEXTCHAR ;Wait for character 0065 2031 A2 00 LDX #$00 0066 2033 AD C0 C0 LDA ACIA_DAT ;Load char 0067 2036 91 06 STA (STOREPTR),Y ;STORE DATA AT 2100+ 0068 2038 C8 INY ;INCREASE BYTE COUNT 0069 2039 D0 EA BNE NEXTCHAR ;KEEP GOING IF DID NOT WRAP 0070 203B E6 07 INC STOREPTR+1 ;MOVE TO NEXT MEMORY PAGE 0071 203D 4C 25 20 JMP NEXTCHAR ;CONTINUE UNTIL LONG DELAY 0072 2040 20 8E FD DOCR JSR CROUT 0073 2043 A9 0D LDA #$0D ;STORE EXTRA CR TO DETECT 2 CR'S AS END 0074 2045 91 06 STA (STOREPTR),Y ;STORE IT 0075 2047 60 RTS ;RETURN TO APPLESOFT PROMP 0076 2048 8D C0 C0 ECHO STA ACIA_DAT ;SEND DATA 0077 204B AD C1 C0 WAIT LDA ACIA_SR ;LOAD STATUS REGISTER FOR ACIA 0078 204E 29 10 AND #$10 ;MASK BIT 4 0079 2050 F0 F9 BEQ WAIT ;ACIA NOT FINISHED, WAIT 0080 2052 60 RTS ;ALL FINISHED 0081 2053 0082 2053 ;ACHECK2 checks if song is still playing 0083 2053 A2 00 ACHECK2 LDX #$00 0084 2055 A9 FF LDA #$FF 0085 2057 8D 00 21 STA STORAGE 0086 205A A0 00 CONT LDY #$00 ;RESET COUNT TO 0 0087 205C E0 FE CHECKNEXTCHAR CPX #$FE ;IS WAIT TOO LONG DONE DIR? 0088 205E F0 0F BEQ DOCR2 0089 2060 E8 INX 0090 2061 AD C1 C0 LDA ACIA_SR ;See if we got an incoming char 0091 2064 29 08 AND #$08 ;Test bit 3 0092 2066 F0 F4 BEQ CHECKNEXTCHAR ;Wait for character 0093 2068 AD C0 C0 LDA ACIA_DAT ;YES, GET CHARACTER 0094 206B 8D 00 21 STA STORAGE ;STORE DATA AT 2100+ 0095 206E 60 RTS ;GO BACK WITH FILE STILL PLAYING CODE 0096 206F 0097 206F DOCR2 0098 206F A9 00 LDA #$00 ;CODE WITH FILE FINISHED 0099 2071 8D 00 21 STA STORAGE ;STORE IT (WAS STOREPTR) 0100 2074 60 RTS ;RETURN TO APPLESOFT PROGRAM 0101 2075 0102 2075 0103 2075 ;MP3PAUSE COMMAND 0104 2075 ;THIS COMMAND PAUSES PLAYING 0105 2075 0106 2075 MP3PAUSE 0107 2075 A2 00 LDX #$00 0108 2077 BD DB 20 DOPAUSE LDA PAUSE,X 0109 207A F0 07 BEQ RETURN 0110 207C 20 48 20 JSR ECHO 0111 207F E8 INX 0112 2080 4C 77 20 JMP DOPAUSE 0113 2083 60 RETURN RTS ;RETURN TO APPLESOFT PROMPT 0114 2084 0115 2084 0116 2084 ;MP3STOP COMMAND 0117 2084 0118 2084 A2 00 MP3STOP LDX #$00 0119 2086 A0 00 LDY #$00 0120 2088 BD DF 20 READCHAR LDA STOP,X 0121 208B F0 E2 BEQ DOCR2 ;All done, go back and mp3 is stopped 0122 208D 20 48 20 JSR ECHO 0123 2090 E8 INX 0124 2091 D0 F5 BNE READCHAR 0125 2093 AD C1 C0 NEXTCHAR2 LDA ACIA_SR ;See if we got an incoming char 0126 2096 29 08 AND #$08 ;Test bit 3 0127 2098 F0 F9 BEQ NEXTCHAR2 ;Wait for character 0128 209A AD C0 C0 LDA ACIA_DAT ;Load char 0129 209D C0 00 CPY #$00 ;Is this the first character? 0130 209F D0 04 BNE NOTFIRST ;No, so send character 0131 20A1 C8 INY ;Make Y=1 so next time character will print 0132 20A2 4C 93 20 JMP NEXTCHAR2 0133 20A5 09 80 NOTFIRST ORA #$80 0134 20A7 C9 8D CMP #$8D ;Is it a carriage return? 0135 20A9 F0 95 BEQ DOCR ;Yes, do a CR and end 0136 20AB 20 F0 FD JSR COUT ;Send it out 0137 20AE 4C 93 20 JMP NEXTCHAR2 0138 20B1 0139 20B1 0140 20B1 ;MP3PLAY PLAY ALL FILES ON FLASH DRIVE 0141 20B1 0142 20B1 A2 00 MP3PLAY LDX #$00 0143 20B3 BD E4 20 PLAYME LDA PLAYALL,X 0144 20B6 F0 08 BEQ DONEPLAYALL 0145 20B8 20 48 20 JSR ECHO 0146 20BB E8 INX 0147 20BC C9 00 CMP #$00 0148 20BE D0 F3 BNE PLAYME 0149 20C0 60 DONEPLAYALL RTS 0150 20C1 0151 20C1 0152 20C1 0153 20C1 ;APLAY PLAYS A SONG WITH THE PROGRAM PLUGGING IN THE NAME AFTER THE COMMAND 0154 20C1 0155 20C1 A2 00 APLAY LDX #$00 0156 20C3 BD E9 20 LOADSONG LDA PLAY,X 0157 20C6 F0 08 BEQ ENDNAME 0158 20C8 20 48 20 JSR ECHO 0159 20CB E8 INX 0160 20CC C9 00 CMP #$00 0161 20CE D0 F3 BNE LOADSONG 0162 20D0 A0 00 ENDNAME LDY #$00 0163 20D2 20 8E FD JSR CROUT ;NEED TO DO A CR 0164 20D5 60 RTS ;DONE NOW RETURN 0165 20D6 0166 20D6 ;DATA FOR COMMANDS: 0167 20D6 0168 20D6 0169 20D6 4449520D00 MP3DIR .byte "DIR",$0D,$00 0170 20DB 56 50 0D 00 PAUSE .byte "VP",$0D,$00 0171 20DF 5653540D00 STOP .byte "VST",$0D,$00 0172 20E4 5652410D00 PLAYALL .byte "VRA",$0D,$00 0173 20E9 56 50 46 20 PLAY .BYTE "VPF " 0174 20ED 0175 20ED 0176 20ED .end 0177 20ED Label Value Label Value Label Value ------------------ ------------------ ------------------ ACIA C0C0 ACIA_CTRL C0C3 ACIA_CMD C0C2 ACIA_SR C0C1 ACIA_DAT C0C0 ADIR 2012 ACHECK2 2053 APLAY 20C1 COUT FDF0 CROUT FD8E COMMAND 2014 CONT 205A CHECKNEXTCHAR 205C DOCR 2040 DOCR2 206F DOPAUSE 2077 DONEPLAYALL 20C0 ECHO 2048 ENDNAME 20D0 INIT 2000 LOADSONG 20C3 MP3PAUSE 2075 MP3STOP 2084 MP3PLAY 20B1 MP3DIR 20D6 NEXTCHAR 2025 NEXTCHAR2 2093 NOTFIRST 20A5 PLAYME 20B3 PAUSE 20DB PLAYALL 20E4 PLAY 20E9 RETURN 2083 READCHAR 2088 STORAGE 2100 STOREPTR 0006 STARTLOAD 2021 STOP 20DF WAIT 204B ADDR 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ----------------------------------------------------- 2000 A9 00 85 06 A9 21 85 07 A9 10 8D C3 C0 A9 0B 8D 2010 C2 C0 A2 00 BD D6 20 F0 08 20 48 20 E8 C9 00 D0 2020 F3 A2 00 A0 00 E0 E9 F0 17 AD C1 C0 E8 29 08 F0 2030 F4 A2 00 AD C0 C0 91 06 C8 D0 EA E6 07 4C 25 20 2040 20 8E FD A9 0D 91 06 60 8D C0 C0 AD C1 C0 29 10 2050 F0 F9 60 A2 00 A9 FF 8D 00 21 A0 00 E0 FE F0 0F 2060 E8 AD C1 C0 29 08 F0 F4 AD C0 C0 8D 00 21 60 A9 2070 00 8D 00 21 60 A2 00 BD DB 20 F0 07 20 48 20 E8 2080 4C 77 20 60 A2 00 A0 00 BD DF 20 F0 E2 20 48 20 2090 E8 D0 F5 AD C1 C0 29 08 F0 F9 AD C0 C0 C0 00 D0 20A0 04 C8 4C 93 20 09 80 C9 8D F0 95 20 F0 FD 4C 93 20B0 20 A2 00 BD E4 20 F0 08 20 48 20 E8 C9 00 D0 F3 20C0 60 A2 00 BD E9 20 F0 08 20 48 20 E8 C9 00 D0 F3 20D0 A0 00 20 8E FD 60 44 49 52 0D 00 56 50 0D 00 56 20E0 53 54 0D 00 56 52 41 0D 00 56 50 46 20 49 52 0D tasm: Number of errors = 0