TITLE 'FULLTRK7' STL 'Dan S. Emrick, 12/03/2009' * FULLTRK8 - Changed re-written R.RDB code from * subroutine to inline code * FULLTRK7 - R.RDB re-written to delete checksum * generation and speed up fetch of data * and hole-detect information. * * FULLTK6 - include detection of index hole with * each byte read. Delete checksum calculation * from our version of R.RDB and insert hole detect * * FULLTRK6 - uses a version of WIH taken from SYINIT * to start track reads on sector zero; * copies a track at a time (3200 bytes) to * a PC via serial port. * Modified from IMAGEH17.ASM * * Transfer to PC is by serial interface using port * 340Q. This configuration use 19,200 BPS transfer * to a program running under Linux on the PC. XTEXT HOSDEF XTEXT DOLLAR XTEXT ASCII D.VEC EQU 040130A DP.DC EQU 177Q UP.ST EQU 175Q XTEXT EDVEC .TICCNT EQU 040033A D.XITA EQU 040110A D.DVCTL EQU 040242A "real" device control byte D.DLYMO EQU 040243A D.DLYHS EQU 040244A D.TT EQU 040240A D.TS EQU 040241A *R.RDB EQU 036044A WNH EQU 036271A WHD EQU 036235A .CTL2FL EQU 040066A OP2.CTL EQU 362Q B4MHZ EQU 010H AIO.UNI EQU 041061A SBC.DE EQU 122355A INI.BC EQU 242355A S.OMAX EQU 040324 DF.MO EQU 020Q DF.DI EQU 040Q DF.ST EQU 100Q DF.TO EQU 002Q MI.CPI EQU 376Q MODD EQU 340Q MODS EQU MODD+5 MTBE EQU 020H transmitter ready flag * Baud rate divisor B300 EQU 001200A B1200 EQU 000140A B4800 EQU 000030A B9600 EQU 000014A B19200 EQU 000006A B38400 EQU 000003A *BAUD EQU B9600 BAUD EQU B19200 ERR.SFT EQU 'S' ERR.FMT EQU 'F' ORG 042200A START.1 EQU * LDA D.DVCTL STA T.DVCTL LHLD D.XITA SHLD L.XITA SET.MTR EQU * * first 2 instructions turns off the soft sectored controller * in the development machine. XRA A OUT 175Q de-activate Persom ZFD controller? MVI A,40 track count limit STA TRK.LIM XRA A STA TGT.TRK set target track MVI A,3 force SY3: STA AIO.UNI CALL D.SDP CALL D.STZ also puts zero in D.TRKPT * Loop begins here. The "force SY3:" is repeated for each track. * Will test in the future to see if this is still required. SET.DEV EQU * MVI A,3 force SY3: STA AIO.UNI CALL D.SDP HEDSTL EQU * wait for head to settle LDA D.DLYHS ANA A JNZ HEDSTL CALL D.STS delays to be sure head settle CALL D.STS CALL D.STS * MVI A,1 * CALL D.UDLY PUSH H LHLD L.XITA SHLD D.DLYMO keep the motor on POP H CALL GET.TRK go get a track's worth JNC SEND.IT send to PC CALL $TYPTX DB NL,'Error exit' DB ENL JMP EXIT. SEND.IT EQU * CALL $TYPTX DB NL,'Preparing to transmit.' DB ENL LHLD BYT.CNT bytes to send PUSH H POP B LXI H,COUNT MVI A,5 CALL $UDD CALL $TYPTX DB NL,'Sending ' COUNT DB ' bytes to PC.' DB ENL LHLD BYT.CNT LXI D,BUFFER PUTLOOP EQU * LDAX D get byte CALL SER.OUT send it INX D inc pointer DCX H decrement count MOV A,H ORA L JNZ PUTLOOP loop if not done CALL $TYPTX DB NL,'Track transfer to PC complete.' DB ENL LDA TGT.TRK this track number INR A increment to next track STA TGT.TRK PUSH B MOV B,A LDA TRK.LIM CMP B POP B JNZ SET.DEV JMP EXIT. SER.OUT EQU * PUSH PSW RE.TST CALL MOTEST JZ RE.TST MVI A,15 delay ??? CALL D.UDLY POP PSW OUT MODD RET MOTEST EQU * IN MODS get USART status ANI MTBE mask for USART ready RET GET.TRK EQU * LXI H,BUFFER where data is going SHLD BUF.PTR initialize the pointer CALL SET.TRK set track JC TRK.ERR EI CALL MTR.ON ensure motor stays on (necessary ?) MVI A,20 CALL D.UDLY * CALL D.STS skip to start of a sector CALL T.WIH locate index hole JC EXIT. CALL WHD wait for 1st sector hole * CALL WNH wait for it to pass DI GET.HS EQU * get header and sector * Will start reading just after sector hole and read 3200 bytes * in order to capture all data LHLD BUF.PTR PUSH B LXI B,3200 over track's length twice READ.S1 EQU * fetch data and hole detect (was R.RDB) IN UP.ST get disk status flags RAR JNC READ.S1 IN UP.DP get data MOV M,A INX H IN DP.DC get hole detect MOV M,A INX H DCX B MOV A,B ORA C JNZ READ.S1 SHLD BUF.PTR got all our bytes POP B LHLD BUF.PTR LXI D,BUFFER start of buffer DW SBC.DE SHLD BYT.CNT bytes to send XRA A clear accumulator EI restor interrupts RET SET.TRK EQU * LDA TGT.TRK STA D.TT CALL D.SDT use SY.DVD to seek track ST.2 PUSH B show user what track we're on PUSH H LDA TGT.TRK MOV C,A MVI B,0 LXI H,T.NUM MVI A,2 CALL $UDD POP H POP B CALL $TYPTX DB NL,' On track ' T.NUM DB ' .',ENL XRA A RET MTR.ON EQU * turn on motor LDA DEV.SEL ORI DF.MO STA D.DVCTL save control byte OUT DP.DC RET MTR.OFF EQU * turn off motor and deselect drive LDA D.DVCTL ANI 377Q-DF.MO-016Q mask away drive select and motor on STA D.DVCTL OUT DP.DC RET * Come here to restore console and exit CC.XIT EQU * CALL $TYPTX DB NL,'Control-C exit or abort',ENL DB ENL EXIT. EQU * MVI B,80 MVI C,-1 MVI A,3 SCALL .CONSL restore 80 char screen width MVI B,203Q BS, no case map, map BKSP, term. proc. tab MVI C,-1 MVI A,1 SCALL .CONSL LDA T.DVCTL STA D.DVCTL CALL MTR.OFF XRA A OUT MODD+4 reset *OUT2 (DCD) RETX EQU * Restore 4 MHz operation LDA .CTL2FL MOV H,A LDA HOLD ORA H STA .CTL2FL RST 1 XRA A SCALL .EXIT H.NFND EQU * POP PSW STC RET TRK.ERR CALL $TYPTX DB NL,'Set Track Error.' DB ENL JMP EXIT. XTEXT WIH * Data area followed by initialization code that is later overwritten HOLD DB 0 HL.HOLD DB 0,0 L.XITA DB 0,0 BYT.CNT DB 0,0 TRK.LIM DB 0 DEV.SEL DB 0 T.DVCTL DB 0 C.HRDW DB 0 C.BYTE DB 0 console status byte TGT.TRK DB 0 BUF.PTR DB 0,0 BUFFER EQU * * Initialization code; overwritten later START EQU * set up control-C exit MVI A,3 LXI H,CC.XIT SCALL .CTLC MVI A,3 MVI C,0 SCALL .CONSL STA C.BYTE MVI A,3 MVI B,-1 MVI C,-1 SCALL .CONSL MVI A,1 MVI C,0 SCALL .CONSL STA C.HRDW MVI A,0 MVI B,1 MVI C,1 SCALL .CONSL set character mode LXI H,-1 SCALL .SETTOP LXI D,S.OMAX DW SBC.DE LXI D,-10 DAD D SHLD MAXMEM SCALL .SETTOP LHLD MAXMEM show user top of memory MVI A,6 MOV B,H MOV C,L LXI H,HIMEM CALL $UDD LXI H,HIMEM CALL $TYPTX DB 12Q DB 'High memory limit established - ' HIMEM DB '000000',ENL LXI H,BUFFER MOV B,H MOV C,L MVI A,6 LXI H,BUFADD CALL $UDD CALL $TYPTX DB 'Buffer address = ' BUFADD DB '000000',ENL LHLD MAXMEM LXI D,BUFFER DW SBC.DE MVI A,6 MOV B,H MOV C,L LXI H,BUFSPC CALL $UDD CALL $TYPTX DB 'Available buffer size - ' BUFSPC DB '000000',ENL ** Set up USART for serial output LDA .CTL2FL turn off 2ms interrput ANI 11111101B STA .CTL2FL OUT OP2.CTL MVI A,20Q SET LOOPBACK OUT MODD+4 MVI A,200Q DIVISOR LOCK ACCESS OUT MODD+3 MVI A,#BAUD SET LSB OF DIVISOR OUT MODD MVI A,BAUD/256 SET MSB OF DIVISOR OUT MODD+1 MVI A,07H 8 bit words, No Parity, 2 SB OUT MODD+3 MVI A,0 OUT MODD+1 no interrupts IN MODD CLEAR RECEIVER XRA A OUT MODD+4 LOOPBACK OFF MVI A,8 set *OUT2 -> DCD OUT MODD+4 LOOPBACK OFF ** End USART setup SET2MHZ EQU * disk access must run at 2 MHz LDA .CTL2FL GET CONTROL BYTE VALUE ANI B4MHZ STA HOLD SAVE CPU SPEED BIT LDA .CTL2FL GET CONTROL BYTE AGAIN ANI -1-B4MHZ BE SURE 4 MHZ OFF STA .CTL2FL PUT IT BACK RST 1 FORCE CLOCK INTERRUPT LHLD HL.HOLD GET HL BACK JMP START.1 SET.ERR EQU * CALL $TYPTX DB '.SETTOP error' DB ENL JMP CC.XIT MAXMEM DB 0,0 DB 0,'FULLTRK6.ABS, 11/12/2009, 6:50 PM',0 DB 0,'FULLTR6.ABS, 11/28/2009, 5:35 PM',0 DB 0,'FULLTRK7.ABS, 12/03/2009, 7:30 PM',0 DB 0,'FULLTRK8.ABS, 12/05/2009, 9:30 AM',0 END START