このBASICプログラムでは、SCSIバスのID0からID6までスキャンして機器名等を表示します。
ボードを作って初期の頃、X1turboでSPCの操作を確認するために作ったもので、SCSI BIOSの造りはこれがベースになっています。ただ、BIOSでは永久ループにならないよう、各所にタイムアウト処理を仕込みました。BASICでは、いつもで[SHIFT]+[BREAK]で止められるので、そういった対応はしていません。
1000 ' 1010 INIT:CLS:DEFINT A-Z 1020 ' 1030 DIM CDB(12),BUF(512) 1040 TLEN=0 'Transfer Length 1050 SCSIID=7 'X1turbo SCSI ID 1060 ' 1070 PORT=&HF70 'MB89352 BASE Address 1080 BDID=PORT+0:SCTL=PORT+1:SCMD=PORT+2:TMOD=PORT+3:INRS=PORT+4 1090 PSNS=PORT+5:SDGC=PORT+5:SSTS=PORT+6:SERR=PORT+7:PCTL=PORT+8 1100 MBC=PORT+9:DREG=PORT+&HA:TEMP=PORT+&HB 1110 TCH=PORT+&HC:TCM=PORT+&HD:TCL=PORT+&HE 1120 ' 1130 GOTO "MAIN" 1140 ' 1150 ' 1160 LABEL"SETTLEN" 1170 OUT TCH,0 1180 OUT TCM,(TLEN AND &HFF00)\&H100 1190 OUT TCL,TLEN AND &HFF 1200 WAIT PSNS,&B10000000 'Wait REQ Assert 1210 RETURN 1220 ' 1230 LABEL"WAITCC" 1240 WAIT INRS,&HFF:R=INP(INRS) XOR &B10000:OUT INRS,&HFF 1250 RETURN 1260 ' 1270 LABEL"INITSPC" 1280 OUT SCTL,&B10010000 'SPC Reset & Disable 1290 OUT BDID,SCSIID 'X1turbo SCSI ID 1300 OUT SCMD,0 1310 OUT PCTL,0 1320 OUT TEMP,0 1330 OUT TCH,0 1340 OUT TCM,0 1350 OUT TCL,0 1360 OUT SCTL,&B10000 'SPC Enable, Arbitration Enable 1370 RETURN 1380 ' 1390 LABEL"SRST" 1400 OUT INRS,&HFF 1410 OUT SCMD,&B10000 'RST On 1420 OUT SCMD,&B0 'RST Off 1430 RETURN 1440 ' 1450 LABEL"SELECT" 1460 OUT PCTL,&H0 'START Selection Phase 1470 WAIT SSTS,&B11110000,&B11111111 'BusFree待ち 1480 OUT SCTL,(INP(SCTL) OR &B10000) 'Arbitration Enable 1490 OUT TEMP,(INP(BDID) OR 2^TARGET) 1500 OUT TCH,&HF 1510 OUT TCM,&H46 1520 OUT TCL,&H4 1530 OUT INRS,&HFF 'Reset Interrupt 1540 OUT SCMD,&B100000 'Command Code = Select 1550 "WAITCC" 1560 'IF R THEN PRINT"Selection Error[";BIN$(R);"]":GOTO"ERR" 1570 RETURN 1580 ' 1590 LABEL"COMMAND" 1600 "SETTLEN" 1610 IF (INP(PSNS) AND &B111)<>&B10 THEN PRINT"Command Phase Error":GOTO"ERR" 1620 OUT PCTL,&B10 'Set Command Phase 1630 OUT INRS,&HFF 'Reset Interrupt 1640 OUT SCMD,&B10000100 'Command Code = Transfer 1650 FOR X=0 TO TLEN-1 1660 WAIT SSTS,&B10,&B10 'Check FIFO Full 1670 OUT DREG,CDB(X) 1680 NEXT 1690 "WAITCC" 1700 IF R THEN PRINT"Command Tx Error[";BIN$(R);"]":GOTO"ERR" 1710 RETURN 1720 ' 1730 LABEL"DATIN" 1740 "SETTLEN" 1750 IF (INP(PSNS) AND &B111)<>&B1 THEN PRINT"Data In Phase Error":GOTO"ERR" 1760 OUT PCTL,&B1 'Set Data In Phase 1770 OUT INRS,&HFF 'Reset Interrupt 1780 OUT SCMD,&B10000100 'Command Code = Transfer 1790 FOR X=0 TO TLEN-1 1800 WAIT SSTS,&B1,&B1 'Check FIFO Empty 1810 BUF(X)=INP(DREG) 1820 NEXT 1830 "WAITCC" 1840 IF R THEN PRINT"Data In Error[";BIN$(R);"]":GOTO"ERR" 1850 RETURN 1860 ' 1870 LABEL"STSMSG" 1880 WAIT PSNS,&B10000000 'Wait REQ Assert 1890 IF (INP(PSNS) AND &B111)<>&B11 THEN PRINT"Status Phase Error":GOTO"ERR" 1900 OUT PCTL,&B11 'Set Status Phase 1910 OUT SCMD,&B11100100 'Set ACK/REQ 1920 WAIT PSNS,&B10000000,&B10000000 'Wait REQ Negate 1930 STAT=INP(TEMP) 1940 OUT SCMD,&B11000100 'Reset ACK/REQ 1950 WAIT PSNS,&B10000000 'Wait REQ Assert 1960 IF (INP(PSNS) AND &B111)<>&B111 THEN PRINT"Message Phase Error":GOTO"ERR" 1970 OUT PCTL,&B111 'Set Message In Phase 1980 OUT SCMD,&B11100100 'Set ACK/REQ 1990 WAIT PSNS,&B10000000,&B10000000 'Wait REQ Negate 2000 MESG=INP(TEMP) 2010 OUT SCMD,&B11000100 'Reset ACK/REQ 2020 RETURN 2030 ' 2040 LABEL"ERR":PRINT"SCSI ERROR" 2050 BEEP:"INITSPC":"SRST" 2060 END 2070 ' 2080 LABEL"SETCDB" 2090 READ TLEN:FOR R=0 TO TLEN-1:READ CDB(R):NEXT:RETURN 2100 ' 2110 LABEL"TESTUNIT" 2120 DATA 6,0,0,0,0,0,0 'testunit 2130 RESTORE"TESTUNIT" 2140 "SETCDB" 2150 "SELECT" 2160 IF R THEN RETURN 2170 "COMMAND" 2180 "STSMSG" 2190 RETURN 2200 ' 2210 LABEL"INQUIRY" 2220 DATA 6,&h12,0,0,0,36,0 'inquiry 2230 RESTORE"INQUIRY" 2240 "SETCDB" 2250 "SELECT" 2260 "COMMAND" 2270 TLEN=CDB(4) 2280 "DATIN" 2290 "STSMSG" 2300 RETURN 2310 ' 2320 LABEL"DISPDEV" 2330 "INQUIRY" 2340 R$="":FOR R=8 TO 15:R$=R$+CHR$(BUF(R)):NEXT:PRINT R$;" "; 2350 R$="":FOR R=16 TO 31:R$=R$+CHR$(BUF(R)):NEXT:PRINT R$;" "; 2360 R$="":FOR R=32 TO 35:R$=R$+CHR$(BUF(R)):NEXT:PRINT R$;" "; 2370 PRINT "SCSI";HEX$(BUF(2) AND &B111);" "; 2380 ON (BUF(3) AND &B1111)+2 GOTO 2390,2400,2410,2420 2390 PRINT"Nazo ";:GOTO2430 2400 PRINT"SCSI1 ";:GOTO2430 2410 PRINT"CSS ";:GOTO2430 2420 PRINT"SCSI2 ";:GOTO2430 2430 IF (BUF(0) AND &HF)<&HA THEN PRINT DTYPE$(BUF(0) AND &HF); ELSE PRINT"謎"; 2440 PRINT 2450 RETURN 2460 ' 2470 LABEL"NODEV" 2480 PRINT "-------- ";STRING$(16,"-");" ---- ----- ----- -- 未接続 --" 2490 RETURN 2500 ' 2510 LABEL"MAIN" 2520 PRINT"SCSI BUS DEVICE LIST" 2530 RESTORE"MAIN" 2540 FOR R=0 TO 9:READ N$:DTYPE$(R)=N$:NEXT 2550 DATA "ハ-ドディスク","テ-プ","プリンタ","プロセッサ","WONCE","CDROM","スキャナ","光磁気ディスク","メディアチェンジャ","通信" 2560 "INITSPC" 2570 PRINT"--- -------- ---------------- ---- ----- ----- -------------------" 2580 PRINT"No. 製造者 製品名 Rev. 分類" 2590 PRINT"--- -------- ---------------- ---- ----- ----- -------------------" 2600 FOR TARGET=0 TO 6 2610 PRINT"ID";HEX$(TARGET);":"; 2620 COLOR5:CFLASH1:PRINT"接続確認中";STRING$(10,&H1D);:CFLASH0:COLOR7 2630 "TESTUNIT" 2640 IF R=0 THEN GOSUB"DISPDEV" ELSE GOSUB"NODEV" 2650 NEXT 2660 PRINT"ID7:SHARP X1TURBO 0085 SCSI1 CSS プロセッサ" 2670 PRINT"--- -------- ---------------- ---- ----- ----- -------------------"実行すると、次のような表示をします。
ID0はMOドライブ、ID1とID2は変換番長、ID6はCDROMドライブ、そしてオマケのID7。
0 件のコメント:
コメントを投稿