This is my second attempt at a data transferring program.
I wrote a program so that you can transfer files from the 3DS to the PC over the internet without the need of a webcam or an auxiliary cable. It's also significantly faster than those methods.
Basically, it works by encoding your SmileBASIC program into an image that it draws to the screen, and then you take a screenshot of it using Miiverse (Home button->Miiverse icon). You then download the screenshot onto your PC by accessing your Miiverse page and then load the screenshot into the PC version of the program and it will convert it back into the SmileBASIC program.
Each screenshot holds up to 3 kilobytes of data. If your program is bigger than 3 kilobytes, it will give you more screenshots. So if it's 9 kilobytes big, the program will give you 3 individual images to take screenshots of.
On the PC end of the program, as long as your screenshots are in the correct order, you can open multiple screenshots at once and it will combine it back into a single file. (You'll know if you got them out of order because they'll appear to be gibberish.)
The actual program on the 3DS is less than 3 kilobytes, so if I were to try and send that file it would give me this:
That's an example of what the images look like. If you plug that into the PC end of the program you will get the code for the SmileBASIC end.
This is the output:
Why does each screenshot hold 3 kilobytes of information? Why not more? Mainly because Miiverse uses lossy compression, so I had to come up with a way to encode the images that wouldn't get lost when the image gets compressed. I basically reused the code I used for the webcam one, where it uses an R, G, B color sequence, each change representing 1 bit, and I made the colors 2x2 boxes so they wouldn't bleed together together too much when compressed. So, if each 2x2 box is a bit, and the 3DS screen is 400x240 res, then that's enough room for 24,000 boxes, meaning 24,000 bits, meaning 3 kilobytes.
Here's the actual SmileBASIC program page.
Here's the link for the PC end.
I hope this hasn't already been done before.
The 3DS end is coded in, obviously, SmileBASIC, and the PC end is coded in JavaScript and is compatible with Windows, Mac, and Linux (tested on Debian 8.2 and Windows 10).
Spoiler
ACLS
'SOME VARIABLES
BLK=RGB(0,0,0)
W=RGB(255,255,255)
R=RGB(255,0,0)
G=RGB(0,255,0)
B=RGB(0,0,255)
TX=0
TY=0
'READ TXT FILE LIST
DIM FILELIST$[100]
FILES "TXT:",FILELIST$
'LIST FILES REMOVING ASTERISKS
COLOR 15
PRINT "Pick a file to transfer:"
FOR I=0 TO LEN(FILELIST$)-1
IF MID$(FILELIST$[I],0,1)=="*" THEN
FILELIST$[I]=MID$(FILELIST$[I],1,LEN(FILELIST$[I])-1)
ENDIF
PRINT " "+FILELIST$[I]
NEXT
'UP/DOWN TO MOVE ARROW AND SELECT FILE W/ (A)
SEL=0
WHILE BUTTON()!=16
IF SEL>0 THEN
LOCATE 1,1+SEL-1
PRINT " "
ENDIF
LOCATE 1,1+SEL
PRINT ">"
LOCATE 1,1+SEL+1
PRINT " "
IF BUTTON()==1 THEN SEL=SEL-1
IF BUTTON()==2 THEN SEL=SEL+1
IF SEL<0 THEN SEL=0
IF SEL>LEN(FILELIST$)-1 THEN
SEL=LEN(FILELIST$)-1
ENDIF
WAIT 5
WEND
CLS
IN$=FILELIST$[SEL]
'LOAD TEXT FILE AND CONVERT IT TO INT ARRAY
LOAD "TXT:"+IN$, FALSE OUT TEXT$
DIM OUT_ARRAY[LEN(TEXT$)]
FOR I=0 TO LEN(TEXT$)-1
OUT_ARRAY[I]=ASC(MID$(TEXT$,I,1))
NEXT
PREV=W
'DISPLAY COLOR SEQUENCE
FOR II=0 TO LEN(OUT_ARRAY)-1
IN=OUT_ARRAY[II]
GOSUB @TOBIN
IN$=OUT$
GOSUB @COLOROUT
NEXT
WAIT 15
WHILE BUTTON()!=16:WEND
'FINISH/END PROGRAM
GCLS
CLS
COLOR 15
END
'INT TO BINARY STRING
'IN: IN
'OUT: OUT$
@TOBIN
OUT$=""
FOR I=0 TO 7
OUT$=STR$(IN MOD 2)+OUT$
IN=(IN-(IN MOD 2))/2
NEXT
RETURN
'DISPLAY COLOR SEQUENCE FOR BINARY STRING
'IN: IN$
'OUT: <VOID>
@COLOROUT
FOR I=0 TO LEN(IN$)-1
BIT=VAL(MID$(IN$,I,1))
'COLOR CODE TRANSFER PROTOCOL (CCTP1)
COL=0
IF BIT==0 THEN
IF PREV==R THEN COL=G
IF PREV==G THEN COL=R
IF PREV==B THEN COL=R
IF PREV==W THEN COL=G
ENDIF
IF BIT==1 THEN
IF PREV==R THEN COL=B
IF PREV==G THEN COL=B
IF PREV==B THEN COL=G
IF PREV==W THEN COL=B
ENDIF
GCOLOR COL
GPSET TX+1,TY
GPSET TX,TY+1
GPSET TX+1,TY+1
GPSET TX,TY
TX=TX+2
IF TX>400-2 THEN
TX=0
TY=TY+2
ENDIF
IF TY>240-2 THEN
WHILE BUTTON()!=16
IF BUTTON()==32 THEN
ACLS
END
ENDIF
WEND
GCLS
TX=0
TY=0
ENDIF
PREV=COL
NEXT
RETURN
