Changes

Jump to: navigation, search

FPGAmstrad

1,704 bytes added, 11:12, 26 March 2017
/* FDC Basic testbench */
01110001 or 01010001 for drive B, 00000000 on drive A (with US0=0)
ST3
READID.BAS : 10 OUT &FB7F,&X01001010:PRINT"(0 MF" 20 OUT &FB7F,&X00000000:PRINT"HD US1 US0)" 30 PRINT BIN$(INP(&FB7F),8):PRINT"ST0" 40 PRINT BIN$(INP(&FB7F),8):PRINT"ST1" 50 PRINT BIN$(INP(&FB7F),8):PRINT"ST2" 60 PRINT BIN$(INP(&FB7F),8):PRINT"C" 70 PRINT BIN$(INP(&FB7F),8):PRINT"H" 80 PRINT HEX$(INP(&FB7F),8):PRINT"R" 90 PRINT BIN$(INP(&FB7F),8):PRINT"N" HD US1 US0) 01001001 ST0 00000000 ST1 00000000 ST2 00000000 C 00000000 H C6 or C1 R 00000010 N
SEEK.BAS :
5 OUT &FA7E,1:PRINT"MOTOR ON":PRINT"GOSUB 520 : MOTOR OFF"
10 PRINT "GOSUB 40 : RECALIBRATE":PRINT "GOSUB 70 : SEEK"
20 PRINT "GOSUB 110 : SENSE_INTERRUPT_STATUS":PRINT "GOSUB 150 : STATUS"
25 PRINT "GOSUB 170 : READ_DATA":PRINT "GOSUB 420 : READ_ID"
30 END
40 OUT &FB7F,&X00000111
150 PRINT BIN$(INP(&FB7E),8)
160 RETURN
170 OUT &FB7F,&X01000110:PRINT"(MT MF SK"
180 OUT &FB7F,&X00000000:PRINT"HD US1 US0)"
190 OUT &FB7F,&X00000000:PRINT"C"
200 OUT &FB7F,&X00000000:PRINT"H"
210 OUT &FB7F,&C1:PRINT"R"
220 OUT &FB7F,&X00000010:PRINT"N"
230 OUT &FB7F,&C1:PRINT"EOT"
240 OUT &FB7F,&X00101010:PRINT"GPL"
250 OUT &FB7F,&X11111111:PRINT"DTL"
260 status%=INP(&FB7E):PRINT BIN$(status%,8):if status%=&X11110000 then 280 else if status%=&X11010000 then 340
270 print"BAD STATUS":goto 260
275 a$=inkey$:if a$="" then 275 else 260
280 for a%=1 to 512
290 print HEX$(INP(&FB7F),2)," (",a%,")"
300 status%=INP(&FB7E):PRINT BIN$(status%,8):if status% <> &X11010000 then 300
310 next a%
320 status%=INP(&FB7E):PRINT BIN$(status%,8):if status% <> &X11010000 then 320
330 a$=inkey$:if a$="" then 330
340 PRINT BIN$(INP(&FB7F),8):PRINT"ST0"
350 PRINT BIN$(INP(&FB7F),8):PRINT"ST1"
360 PRINT BIN$(INP(&FB7F),8):PRINT"ST2"
370 PRINT BIN$(INP(&FB7F),8):PRINT"C"
380 PRINT BIN$(INP(&FB7F),8):PRINT"H"
390 PRINT HEX$(INP(&FB7F),2):PRINT"R"
400 PRINT BIN$(INP(&FB7F),8):PRINT"N"
410 RETURN
420 OUT &FB7F,&X01001010:PRINT"(0 MF"
430 OUT &FB7F,&X00000000:PRINT"HD US1 US0)"
440 PRINT BIN$(INP(&FB7F),8):PRINT"ST0"
450 PRINT BIN$(INP(&FB7F),8):PRINT"ST1"
460 PRINT BIN$(INP(&FB7F),8):PRINT"ST2"
470 PRINT BIN$(INP(&FB7F),8):PRINT"C"
480 PRINT BIN$(INP(&FB7F),8):PRINT"H"
490 PRINT HEX$(INP(&FB7F),2):PRINT"R"
500 PRINT BIN$(INP(&FB7F),8):PRINT"N"
510 RETURN
520 OUT &FA7E,0
530 RETURN
540 GOSUB 420:gosub 170
550 END
 
CAT
RUN
GOSUB 420 // READ_ID
HD US1 US0)
01001001
ST0
00000000
ST1
00000000
ST2
00000000
C
00000000
H
C6 or C1
R
00000010
N
 
READ_ID does run fine in Basic.
 
CAT
RUN
00000000
PCN CURRENT TRACK
 
It seems that looking at STATUS is needed between SEEK and SENSE_INTERRUPT_STATUS. It's said that SENSE_INTERRUPT_STATUS is needed after SEEK.
 
CAT
RUN
GOTO 540
// READ_ID
HD US1 US0)
01001001
ST0
00000000
ST1
00000000
ST2
00000000
C
00000000
H
C6 or C1
R
00000010
N
// READ_DATA
(MT MF SK
HD US1 US0)
C
H
R
N
EOT
GPL
DTL
11010000 // no EXEC sequence...
01001000 // ... due to NOT READY
ST0
00000000
ST1
00000000
ST2
00000000
C
00000000
H
C1
R
00000010
N
 
Too slow to execute a READ_DATA in Basic...
==== perl FDC frame decoder ====
1,200
edits