NAM SOFTSEC * INPUT PORTS ASSIGNMENT STATUS EQU $EC00 CONTROLLER STATUS RDDTA EQU $EC01 RECEIVED DATA SECTOR EQU $EC02 SECTOR COUNTER DVSTAT EQU $EC03 DRIVE STATUS RRSRT EQU $EC04 RECEIVER RESTART PULSE MOTON EQU $EC05 MOTOR ON PULSE MOTOFF EQU $EC06 MOTOR OFF PULSE * OUTPUT PORTS ASSIGNMENT SYNC EQU $EC00 SYNC WORD PORT WRTDTA EQU $EC01 WRITE DATA PORT FILL EQU $EC02 FILL WORD PORT DRVSLT EQU $EC03 DRIVE AND TRACK SELECT WRTPLS EQU $EC04 WRITE PULSE * DRIVE STATUS BITS (DVSTAT) WTPBIT EQU $1 WRITE PROTECT BIT TRKBIT EQU $2 TRACK ZERO BIT MTRBIT EQU $4 MOTOR TEST BIT WRTBIT EQU $8 WRITE GATE BIT SECBIT EQU $10 SECTOR PULSE BIT IDXBIT EQU $20 INDEX PULSE BIT * DRIVE LIMITS TRKLMT EQU 34 TRACK LIMIT TRKMSK EQU $3F TRACK MASK SECLMT EQU 10 SECTOR LIMIT * MINIDOS VECTORS RESTOR EQU $8006 SEEK EQU $8009 DELAY EQU $82D6 SPC 1 ORG 0 * SECTOR HEADER TEMPORY STORAGE HEADER EQU * DRV RMB 1 DESIRED DRIVE (MS 2 BITS) TRKSEC EQU * TRK RMB 1 DESIRED TRACK SCTR RMB 1 DESIRED SECTOR BAKLNK RMB 2 BACKWARD LINK FWDLNK RMB 2 FORWARD LINK BYTCNT RMB 1 SECTOR BYTE COUNT ADDRES RMB 2 DATA ADDRESS VECTOR FILTYP RMB 1 FILE TYPE CODE SPC 1 CKSUM RMB 2 CHECKSUM POSTAM RMB 2 POSTAMBLE CRNTRK RMB 5 CRNT TRK AND TRK HISTORY TA RMB 2 CONTINUATION ADDRESS TW RMB 2 ALTERNATE TARGET ADDRESS ITEMP RMB 2 INDEX REGISTER STORAGE RETRY EQU * RETRY COUNTER EXEC RMB 2 PROG STRT ADDRESS TEMP RMB 2 TEMP STORAGE ENDA RMB 2 END ADDRESS PAG ****************************************** * THIS ROUTINE READS ONE TRACK OF A * SOFT-SECTORED MINI-DISKETTE USING * THE PERCOM LFD-400 CONTROLLER. THE * ROUTINE ASSUMES 'FLEX' 2.0 FORMAT * (256 BYTES/SECTOR, 10 SECTORS/TRACK) * IT MUST BE MODIFIED FOR OTHER FORMATS. * * ENTRY CONDITIONS: * X - POINTS TO PARAMETER BLOCK * DRIV,X - CONTAINS DRIVE NUMBER * TRAK,X - CONTAINS TRACK NUMBER * HEDR,X - POINTS TO HEADER BUFFER * BUFR,X - POINTS TO DATA BUFFER * CRCB,X - POINTS TO DATA CRC BUFFER * * EXIT CONDITIONS: * CARRY SET IF ERROR * ERROR CODE IN 'A' * (0) - DISK MISSING * (5) - CRC ERROR * ****************************************** ORG $20 SECCNT RMB 1 PARPTR RMB 2 PARAMETER POINTER HDRPTR RMB 2 HEADER BUFFER POINTER BUFPTR RMB 2 DATA BUFFER POINTER XTEMP RMB 2 TEMPORARY STORAGE FOR X CRCPTR RMB 2 DATA CRC BUFFER POINTER CRCSUM EQU * CRC ACCUMULATOR CRCH RMB 1 CRCL RMB 1 SPC 1 * PARAMETER BLOCK OFFSETS DRIV EQU 0 TRAK EQU 1 HEDR EQU 2 BUFR EQU 4 CRCB EQU 6 SPC 1 * CRC EVALUATOR INITIALIZATION CODES HDRCRC EQU $EF21 ($FFFF[+]$FE) DATCRC EQU $BF84 ($FFFF[+]$FB) SPC 1 SPC 1 ORG $A400 RDSOFT STX PARPTR SAVE PARAMETER POINTER LDAA DRIV,X SET DRIVE RORA RORA RORA STAA DRV LDAA TRAK,X SET TRACK STAA TRK LDAA #$E6 SET SYNC BYTE STAA SYNC JSR SETPTR SET VARIOUS POINTERS JSR DRIVE SELECT DRIVE, TRK, START MOTOR SPC 1 * CHECK IF DISK MISSING, LOCATE INDEX PULSE DRVTST JSR START START MOTOR LDX #0 SET TIME LIMIT (1 SEC) LDAA #SECBIT SECTOR BIT MASK DVTST1 BITA DVSTAT SKIP IF IN INDEX PULSE BNE DVTST2 DEX CHECK TIME LIMIT BNE DVTST1 BRA DVTST3 BRANCH IF TIME LIMIT DVTST2 BITA DVSTAT WAIT FOR INDEX PULSE BEQ RDHDR DEX CHECK TIME LIMIT BNE DVTST2 DVTST3 LDAA #$FF DISK MISSING STAA CRNTRK FLAG DRIVE OFF LINE COMA THIS CLEARS A AND SETS CARRY RTS SPC 1 * READ ADDRESS HEADER RDHDR TST MOTON BUMP MOTOR TIMER LDAB #6 SIX BYTES IN ADDRESS HEADER LDX HDRPTR BSR INPUT STX HDRPTR SPC 1 * READ DATA BLOCK LDAB #0 256 BYTES IN DATA BLOCK LDX BUFPTR BSR INPUT STX BUFPTR SPC 1 * READ DATA CRC LDAB #2 TWO BYTES FOR CRC LDX CRCPTR STORE CRC CODES IN CRC BUFFER BSR INPUT1 STX CRCPTR SPC 1 DEC SECCNT BNE RDHDR GET NEXT SECTOR BRA REVBIT BYPASS INPUT SUBROUTINES SPC 1 INPUT LDAA RRSRT BSR IN SKIP ADDRESS/DATA MARK INPUT1 BSR IN STAA 0,X INX DECB BNE INPUT1 RTS SPC 1 IN LDAA STATUS RORA BCC IN LDAA RDDTA RTS SPC 1 * REVERSE BITS REVBIT LDX HDRPTR STX XTEMP LDX PARPTR LDX HEDR,X BSR REVERS REVERSE HEADER BYTES LDX BUFPTR STX XTEMP LDX PARPTR LDX BUFR,X BSR REVERS REVERSE DATA BYTES LDX CRCPTR STX XTEMP LDX PARPTR LDX CRCB,X BSR REVERS REVERSE CRC BYTES SPC 1 * CHECK CRC JSR SETPTR SET VARIOUS POINTERS * RUN CRC ACROSS HEADER CHKCRC LDX #HDRCRC INITIALIZE CRC ACCUMULATOR STX CRCSUM FOR A HEADER BLOCK LDX HDRPTR LDAB #6 HEADER IS 6 BYTES LONG JSR CALCRC STX HDRPTR LDX CRCSUM BNE CRCERR BRANCH IF CRC ERROR * RUN CRC ACROSS DATA LDX #DATCRC INITIALIZE CRC ACCUMULATOR STX CRCSUM FOR A DATA BLOCK LDX BUFPTR LDAB #0 256 BYTE BLOCK JSR CALCRC STX BUFPTR * COMPARE CRC CODES LDX CRCPTR LDX 0,X CPX CRCSUM BNE CRCERR ERROR LDX CRCPTR BUMP CRC POINTER INX INX STX CRCPTR SPC 1 DEC SECCNT BNE CHKCRC CLRA RTS CRCERR LDAA #5 CRC ERROR CODE SEC RTS SPC 1 REVERS LDAB #8 REV ROL 0,X RORA DEC B BNE REV STAA 0,X INX CPX XTEMP BNE REVERS RTS SPC 1 *SELECT DRIVE, START MOTOR, SEEK TRACK DRIVE LDAA #$C0 DRIVE BITS MASK TAB ANDA DVSTAT GET CURRENT DRIVE # ANDB DRV GET DESIRED DRIVE # CBA COMPARE BNE D0 BRANCH IF NOT SAME LDAA CRNTRK CHECK IF DRIVE IS INITIALIZED COMA BEQ D1 BRANCH IF NOT BRA D2 D0 PSHB PSHB PSHA LDX #CRNTRK LDAA 0,X GET CURRENT TRK PULB FIND PROPER PIDGEON HOLE BSR POS STAA 0,X STORE CURRENT TRK LDX #CRNTRK RETRIEVE TRK FOR NEW DRV PULB BSR POS LDAA 0,X STAA CRNTRK DA LDAA DVSTAT BITA #WRTBIT CHECK WRITE GATE BEQ DA WAIT UNTIL GATE TURNS OFF PULA SELECT NEW DRIVE STAA DRVSLT D1 LDAA CRNTRK CHECK IF DRIVE IS ON LINE COMA BNE D2 BRANCH IF ON LINE JSR RESTOR RESTORE DRIVE D2 BSR START START MOTOR JSR SEEK SEEK TRACK D3 RTS SPC 1 POS CLC ROLB ROLB ROLB P1 INX DECB BPL P1 RTS SPC 1 * START MOTOR (DELAY IF NECESSARY) START LDAA DVSTAT TEST MOTOR BIT BITA #MTRBIT BEQ START1 BRANCH IF ALREADY ON TST MOTON TRIGGER MOTOR ONE-SHOT LDX #1000 SET UP ONE SEC DELAY JSR DELAY START1 TST MOTON RETRIGGER MOTOR RTS SPC 1 * SET UP VARIOUS POINTERS SETPTR LDX PARPTR LDX HEDR,X SET HEADER BUFFER POINTER STX HDRPTR LDX PARPTR SET BUFFER POINTER LDX BUFR,X STX BUFPTR LDX PARPTR SET CRC BUFFER POINTER LDX CRCB,X STX CRCPTR LDAA #SECLMT SET SECTOR COUNT STAA SECCNT RTS SPC 1 ************************************************ * THIS CRC ALGORITHM IS USED TO ACCUMULATE A * CRC CODE ACROSS A MEMORY DATA BLOCK. IN * THIS APPLICATION THE DATA BLOCK IS EITHER * A SECTOR HEADER OR SECTOR DATA READ FROM DISK. * * ENTRY CONDITIONS: * X - POINTS TO DATA TO BE CHECKED * B - CONTAINS BYTE COUNT (0=256) * CRCSUM - MUST BE INITIALIZED WITH PROPER * CODE FOR A HEADER OR DATA BLOCK * EXIT CONDITIONS: * X - POINTS TO NEXT BYTE * CRCSUM - ACCUMULATED CRC CODE * A AND B DESTROYED ************************************************ SPC 1 CALCRC LDAA 0,X GET DATA BYTE PSHB SAVE BYTE COUNT EORA CRCH STAA CRCH LSRA SHIFT RIGHT 4 LSRA LSRA LSRA EORA CRCH GENERATE IJKLMNOP LDAB CRCL SWAP CRC BYTES STAB CRCH STAA CRCL ROLA SHIFT LEFT 4 ROLA ROLA ROLA TAB SAVE MNOPXIJK ROLA SHIFT LEFT 2 ROLA HAVE OPXIJKLM ANDA #$1F SELECT 000IJKLM EORA CRCH STAA CRCH TBA ANDA #$F0 SELECT MNOP0000 EORA CRCH STAA CRCH CRCH DONE ROLB SHIFT LEFT 1 ANDB #$E0 SELECT NOP0000 EORB CRCL STAB CRCL CRCL DONE SPC 1 INX PULB GET BYTE COUNT DECB BNE CALCRC GET NEXT BYTE RTS SPC 1 END