### cassette loadable version of https://github.com/e474/USRSIO ### useful when testing custom sio hardware 30000 REM 30010 REM USRSIO.BAS 30020 REM WRITTEN BY E474 30030 REM 30040 REM BUFFER/STRING SIZES 30050 REM 30060 SECTORSIZE=128 30070 SIOUSRSIZE=26 30080 REM 30090 REM SIO DCB VALUES 30100 REM 30110 DDEVIC=768:REM $300 30120 DUNIT=769:REM $301 30130 DCOMMAND=770:REM $302 30140 DSTATS=771:REM $303 30150 DBUFLO=772:REM $304 30160 DBUFHI=773:REM $305 30170 DTIMLO=774:REM $306 30180 DBYTLO=776:REM $308 30190 DBYTHI=777:REM $309 30200 DAUX1=778:REM $30A 30210 DAUX2=779:REM $30B 30220 REM 30230 REM READ OR WRITE DATA SIO CONSTANTS 30240 REM 30250 RDDATA=64 30260 WRDATA=128 30270 REM 30280 REM DECLARE AND INITIALISE STRING BUFFERS 30290 REM 30300 DIM SECTORDATA$(SECTORSIZE) 30310 DIM SIOUSR$(SIOUSRSIZE) 30320 SECTORDATA$(SECTORSIZE,SECTORSIZE)="A" 30330 REM 30340 REM LOAD ML CODE INTO STRING SIOUSER$ 30350 REM 30360 REM TRAP 30470 30370 REM OPEN #1,4,0,"D1:USRSIO.XEX" 30380 REM 30390 REM READ AND DISCARD 6 BYTE HEADER 30400 REM FOR X=1 TO 6 30410 REM GET #1,TMP 30420 REM NEXT X 30430 FOR X=1 TO SIOUSRSIZE:REM READ ML CODE INTO SIOUSR STRING 30440 READ SIOCODE 30450 SIOUSR$(X)=CHR$(SIOCODE) 30460 NEXT X 30470 REM IF (PEEK(195)=170) THEN PRINT "COULD NOT FIND MACHINE CODE FILE":CLOSE #1:STOP 30480 REM CLOSE #1 30490 REM 30500 REM SETUP SIO DCB FOR READ SECTOR 1, 128 BYTES INTO SECTORDATA$ 30510 REM 30520 POKE DDEVIC,49:REM "D", $31, BUT ASC("D") DOESN'T WORK AS IT RETURNS 68 30530 POKE DUNIT,1 30540 POKE DCOMMAND,ASC("R") 30550 REM POKE DSTATS,64:REM READ DATA 30560 POKE DSTATS,RDDATA 30570 REM 30580 REM CALCULATE LO BYTE, HI BYTE ADDRESS OF DESTINATION STRING (BUFFER) FOR SECTOR DATA 30590 REM 30600 BUFFERHI=INT(ADR(SECTORDATA$)/256) 30610 BUFFERLO=INT(ADR(SECTORDATA$)-(256*BUFFERHI)) 30620 POKE DBUFLO,BUFFERLO 30630 POKE DBUFHI,BUFFERHI 30640 POKE DTIMLO,20 30650 POKE DBYTLO,128:REM SINGLE DENSITY SECTOR OF 128 BYTES 30660 POKE DBYTHI,0 30670 POKE DAUX1,1:REM SECTOR 1 (LO-BYTE) 30680 POKE DAUX2,0:REM SECTOR 1 (HI-BYTE) 30690 ? :? "TESTING USR CODE TO CALL SIO":? 30700 ? "READING SECTOR 1" 30710 SIOSTATUS=USR(ADR(SIOUSR$)) 30720 ? "RETURN CODE = ";SIOSTATUS 30730 REM 30740 REM CALL USRSIO CODE WITH WRONG (NON-ZERO) NUMBER OF ARGUMENTS 30745 ? "CALLING USR CODE WITH AN ARGUMENT" 30750 SIOSTATUS=USR(ADR(SIOUSR$),44):REM WRONG NUMBER OF ARGUMENTS 30760 ? "EXTRA ARG RETURN CODE = ";SIOSTATUS 30770 REM 30780 REM READ SECTORS 718 TO 723 TO S 30790 REM 30800 FOR SECTOR=718 TO 723 30810 POKE DAUX1,INT(SECTOR-(INT(SECTOR/256)*256)) 30820 POKE DAUX2,INT(SECTOR/256) 30830 POKE DSTATS,RDDATA 30840 REM CALL SIO ROUTINE NOW SIO DCB IS SET UP 30850 ? "READING SECTOR ";SECTOR 30860 SIOSTATUS=USR(ADR(SIOUSR$)) 30870 ? "RETURN CODE = ";SIOSTATUS 30880 NEXT SECTOR 30890 END 30900 DATA 104,240,10,10,168,104,136 30910 DATA 208,252,160,200,208,6,32 30920 DATA 89,228,172,3,3,132,212,169 30930 DATA 0,133,213,96