REM >I2C_DecodeTest REM REM An example of using the Teletext Experimenter's Board on RISC OS, in BASIC. REM REM This is the RISC OS BASIC equivalent of the "Decoding" tutorial. REM REM http://danceswithferrets.org/geekblog/?p=1250 REM REM Tested on a Raspberry-Pi running RISC OS 5.23. ON ERROR REPORT:PRINT " at line ";ERL:END device%=&11 dev_write%=device%<<1 dev_read%=(device%<<1)+1 DIM buff% 2048:REM General purpose buffer for preparing data to send, or receiving data DIM regs%(10):REM Our local copy of the SAA's registers DIM reg3%(4) PROCinit PROCgo END : DEF PROCinit LOCAL x% FOR x%=0 TO 9 regs%(x%)=0 NEXT regs%(0)=%10000000 regs%(5)=%11001100 regs%(6)=regs%(5) regs%(7)=%00000111 regs%(8)=%00001000 PROCupdaterangeofregisters(4,7) PROCupdaterangeofregisters(0,1) PROCupdatesingleregister(8) PROCsetpagenumber(1,0,0) PROCsendpagecommands ENDPROC : DEF PROCupdaterangeofregisters(first%,last%) LOCAL x%,c% buff%?0=first% c%=1 FOR x%=first% TO last% buff%?c%=regs%(x%) c%+=1 NEXT SYS "IIC_Control",dev_write%,buff%,c% ENDPROC : DEF PROCupdatesingleregister(reg%) buff%?0=reg% buff%?1=regs%(reg%) SYS "IIC_Control",dev_write%,buff%,2 ENDPROC : DEF PROCsetpagenumber(m%,t%,u%) m%=m% AND 7 t%=t% AND 15 u%=u% AND 15 reg3%(0)=&18 OR m% reg3%(1)=&10 OR t% reg3%(2)=&10 OR u% ENDPROC : DEF PROCsendpagecommands buff%?0=2 buff%?1=0 buff%?2=reg3%(0) buff%?3=reg3%(1) buff%?4=reg3%(2) SYS "IIC_Control",dev_write%,buff%,5 ENDPROC : DEF PROCgo LOCAL in$,c$ REPEAT PRINT "P<3 digits> "; PRINT "H(old) "; PRINT "Z(oom) "; PRINT "D(ownload) "; PRINT "Q(uit)" INPUT in$ c$=LEFT$(in$,1) IF c$="P" THEN PROCparsepage(RIGHT$(in$,LEN(in$)-1)) IF c$="H" THEN PROCtogglehold IF c$="Z" THEN PROCtogglezoom IF c$="D" THEN PROCdownloadpage UNTIL c$="Q" ENDPROC : DEF PROCparsepage(num$) LOCAL m%,t%,u% m%=VAL(MID$(num$,1,1)) t%=VAL(MID$(num$,2,1)) u%=VAL(MID$(num$,3,1)) PROCsetpagenumber(m%,t%,u%) PROCsendpagecommands PRINT "Page: ";m%;t%;u% ENDPROC : DEF PROCtogglehold LOCAL bit% bit%=(reg3%(0) AND 8)>>3 IF bit%>0 THEN REM hold bit is set (which means it's NOT holding) reg3%(0)=reg3%(0) AND %11110111 PRINT "Hold: ON" ELSE REM Hold bit is clear, which means it's holding reg3%(0)=reg3%(0) OR 8 PRINT "Hold: OFF" ENDIF PROCsendpagecommands ENDPROC : DEF PROCtogglezoom LOCAL state% state%=(regs%(7)>>3) AND 3 state%+=1 IF state%=2 THEN state%+=1 state%=state% AND 3 regs%(7)=regs%(7) AND %11100111 regs%(7)=regs%(7) OR (state%<<3) PROCupdatesingleregister(7) PRINT "Zoom: "; IF state%=0 THEN PRINT "OFF" IF state%=1 THEN PRINT "UPPER HALF" IF state%=3 THEN PRINT "LOWER HALF" ENDPROC : DEF PROCdownloadpage LOCAL x%,y%,z%,c% buff%?0=9 buff%?1=0 buff%?2=0 SYS "IIC_Control",dev_write%,buff%,3 SYS "IIC_Control",dev_read%,buff%,40*24 z%=0 FOR y%=1 TO 24 FOR x%=1 TO 40 c%=buff%?z% IF c%>31 AND c%<127 THEN PRINT CHR$(c%); ELSE PRINT "[";~c%;"]"; z%+=1 NEXT PRINT NEXT ENDPROC :