DECLARE FUNCTION PCICRead% (IOBase%, slotNo%, regOffset%) 'THIS PROGRAM IS DESIGNED TO DUMBLY SET UP A PCMCIA CONTROLLER AND 'TALK ATA TO THE CARD INSTALLED. THIS IS NEEDED IF A CARD LACKS CIS. 'SHOULD WORK WITH INTEL 82365 COMPATIBLE PCMCIA CONTROLLERS 'DEVELOPED ON A COMPAQ 4/50CX RUNNING WINDOWS 95 BUT OPERATING IN DOS MODE 'THE CHIPSET ON THE 4/50CX IS A VLSI VL82C146, EACH CHIP CONTROLS JUST ONE 'PCMCIA SOCKET. 'ON THE COMPAQ 4/50CX, LOWER SOCKET IS INDEX REG 3E0 AND OFFSET 0 (SLOT 0) 'ON THE COMPAQ 4/50CX, UPPER SOCKET IS INDEX REG 3E4 AND OFFSET 80 (SLOT 2) DECLARE SUB PCICWrite (IOBase%, slotNo%, regOffset%, wrData%) 'PCMCIA REGS PCICBASE% = &H3E0 DATAREG = PCICBASE% + 1 'SLOT NUMBER WITHIN THE PCIC, USED TO CALCULATE REGISTER OFFSETS PCICSLOT% = 0 'THIS OFFSET WILL GENERALLY BE A MULTIPLE OF 0x40. 'IT IS USED TO SPECIFY THE OFFSET USED INTERNALLY BY THE CONTROLLER ITSELF. OFFSET = &H0 'WHERE TO MAP THE ATA REGISTERS 'IF YOU HAVE A SECONDARY ATA/IDE CONTROLLER, THESE WILL CONFLICT AND 'YOU WILL NEED TO FIND SOMEWHERE ELSE TO PUT THEM. 'PERHAPS SOMETHING LIKE 8170-8177, AND 8376-8377, BUT THIS IS A GUESS 'AND FREE I/O LOCATIONS VARY BY SYSTEM. 'I/O ADDRESSES 400 AND ABOVE MAY NOT WORK DEPENDING ON HOW YOUR PCMCIA 'CONTROLLER IS ATTACHED. 'THE BIG THING IS THAT THE PCMCIA ATA FLASH CARD IS GOING TO AT LEAST 'MINIMALLY DECODE ADDRESS BITS 0-2 AND BIT 9, BUT WHO KNOWS HOW MANY MORE, 'SO YOU DON'T HAVE INFINITE FREEDOM IN WHERE YOU PUT THESE WINDOWS. 'IOCONTROL% = &HBB 'ADD ALL THE WAIT STATES FOR SAFETY, AND BE 16BIT CARD-SELECTED IOCONTROL% = &H33 'FAST MODE, IOCS16 FROM CARD, 16 BIT ACCESS MODE IO0STARTL% = &H70 '170-177 IO0STARTH% = &H1 IO0STOPL% = &H77 IO0STOPH% = &H1 IO1STARTL% = &H76 '376-377 IO1STARTH% = &H3 IO1STOPL% = &H77 IO1STOPH% = &H3 'E000:0000 = 0E0000 '4KiB chunk MEM0STARTL% = &HE0 MEM0STARTH% = &H0 MEM0STOPL% = &HE0 MEM0STOPH% = &H0 MEM0OFFL% = &H20 MEM0OFFH% = &HFF 'wp, attribute memory 'E000:1000 = 0E1000 MEM1STARTL% = &HE1 MEM1STARTH% = &HC0 MEM1STOPL% = &HE1 MEM1STOPH% = &H0 MEM1OFFL% = &H1F MEM1OFFH% = &H3F 'common memory SCREEN 11 WIDTH 80, 60 CLS PRINT "READING SOCKET CONTROLLER ID AND REV" RESULT = PCICRead(PCICBASE%, PCICSLOT%, 0) PRINT "READING SOCKET STATUS" RESULT = PCICRead(PCICBASE%, PCICSLOT%, 1) PRINT "TURNING ON CARD POWER" PCICWrite PCICBASE%, PCICSLOT%, 2, &H11 PRINT "MAKING SURE ADDRESS WINDOWS ARE DISABLED" PCICWrite PCICBASE%, PCICSLOT%, 6, &H20 PRINT "SETTING UP MEMORY WINDOWS" PCICWrite PCICBASE%, PCICSLOT%, &H10, MEM0STARTL% PCICWrite PCICBASE%, PCICSLOT%, &H11, MEM0STARTH% PCICWrite PCICBASE%, PCICSLOT%, &H12, MEM0STOPL% PCICWrite PCICBASE%, PCICSLOT%, &H13, MEM0STOPH% PCICWrite PCICBASE%, PCICSLOT%, &H14, MEM0OFFL% PCICWrite PCICBASE%, PCICSLOT%, &H15, MEM0OFFH% PCICWrite PCICBASE%, PCICSLOT%, &H18, MEM1STARTL% PCICWrite PCICBASE%, PCICSLOT%, &H19, MEM1STARTH% PCICWrite PCICBASE%, PCICSLOT%, &H1A, MEM1STOPL% PCICWrite PCICBASE%, PCICSLOT%, &H1B, MEM1STOPH% PCICWrite PCICBASE%, PCICSLOT%, &H1C, MEM1OFFL% PCICWrite PCICBASE%, PCICSLOT%, &H1D, MEM1OFFH% 'PRINT "SETTING UP IO WINDOWS" 'PCICWrite PCICBASE%, PCICSLOT%, 7, IOCONTROL% 'PCICWrite PCICBASE%, PCICSLOT%, 8, IO0STARTL% 'PCICWrite PCICBASE%, PCICSLOT%, 9, IO0STARTH% 'PCICWrite PCICBASE%, PCICSLOT%, &HA, IO0STOPL% 'PCICWrite PCICBASE%, PCICSLOT%, &HB, IO0STOPH% 'PCICWrite PCICBASE%, PCICSLOT%, &HC, IO1STARTL% 'PCICWrite PCICBASE%, PCICSLOT%, &HD, IO1STARTH% 'PCICWrite PCICBASE%, PCICSLOT%, &HE, IO1STOPL% 'PCICWrite PCICBASE%, PCICSLOT%, &HF, IO1STOPH% PRINT "ENABLING MEMORY WINDOWS" PCICWrite PCICBASE%, PCICSLOT%, 6, &H23 PRINT "ENABLING CARD OUTPUT ENABLE" PCICWrite PCICBASE%, PCICSLOT%, 2, &HB1 SLEEP 1 PRINT "TAKING CARD OUT OF RESET." PCICWrite PCICBASE%, PCICSLOT%, 3, &H4B SLEEP 1 PRINT "READING SOCKET STATUS" RESULT = PCICRead(PCICBASE%, PCICSLOT%, 1) '-------------------------------------------------------------------- 'DEF SEG = &HE000 'FOR I = 0 TO 1 'PRINT "ATT. MEMORY: "; 'FOR J = 0 TO 32 STEP 2 ' PRINT HEX$(PEEK(I * 32 + J)); " "; 'NEXT J 'PRINT 'NEXT I DEF SEG = &HE100 PRINT "RESETTING ATA..." POKE &HE, &H6 'reset ATA devices SLEEP 1 POKE &HE, &H2 'take out of reset PRINT "ATA RESET." SLEEP 1 PRINT "SELECTING ATA DRIVE 0" POKE &H6, &HA0 SLEEP 1 PRINT "ATA STATUS: 0x"; HEX$(PEEK(&H7)) PRINT "ATA ALT STATUS: 0x"; HEX$(PEEK(&HE)) PRINT "ATA IDENTIFY" POKE &H7, &HEC 'IDENTIFY command PRINT "ATA ALT STATUS: 0x"; HEX$(PEEK(&HE)) DO WHILE INT(PEEK(&HE) / 128) <> 0 'wait for not BSY LOOP PRINT "ATA DEVICE NO LONGER BSY, ALT STATUS: 0x"; HEX$(PEEK(&HE)) IF PEEK(&HE) MOD 2 = 1 THEN PRINT "IDENTIFY ERROR": GOTO errorlabel IF INT(PEEK(&HE) / 8) MOD 2 = 0 THEN PRINT "NO DRQ AFTER IDENTIFY": GOTO errorlabel 'DRQ set and IDENTIFY is complete OPEN "IDENTIFY.BIN" FOR OUTPUT AS #1 FOR I = 0 TO 511 PRINT #1, CHR$(PEEK(0)); NEXT I CLOSE #1 'FOR I = 0 TO 31 ' PRINT "IDENTIFY 0x"; HEX$(I); "0: "; ' FOR J = 0 TO 7 ' LOWBYTE& = PEEK(0) ' HIGHBYTE& = PEEK(0) ' PRINT RIGHT$("0000" + HEX$(HIGHBYTE& * 256 + LOWBYTE&), 4); " "; ' NEXT J ' PRINT 'NEXT I PRINT "ATA ALT STATUS: 0x"; HEX$(PEEK(&HE)) IF INT(PEEK(&HE) / 64) MOD 2 <> 1 THEN PRINT "DRIVE NOT READY AFTER IDENTIFY.": GOTO errorlabel GOTO errorlabel OPEN "NTSX06BA.BIN" FOR OUTPUT AS #1 FOR SECTOR& = &H0 TO &H1E8FF LOCATE CSRLIN, 1 PRINT RIGHT$("00" + MID$(STR$(INT(SECTOR& / &H1E8FF * 100)), 2), 3); "% "; PRINT "READ SECTOR 0x"; RIGHT$("0000000" + HEX$(SECTOR&), 7); POKE 2, 1 POKE 3, SECTOR& MOD 256 POKE 4, INT(SECTOR& / 256) MOD 256 POKE 5, INT(SECTOR& / 65536) MOD 256 POKE 6, INT(SECTOR& / 65536 / 256) MOD 16 + &HE0 POKE 7, &H20 'PRINT "ATA ALT STATUS: 0x"; HEX$(PEEK(&HE)) DO WHILE INT(PEEK(&HE) / 128) <> 0 'wait for not BSY LOOP 'PRINT "ATA DEVICE NO LONGER BSY, ALT STATUS: 0x"; HEX$(PEEK(&HE)) IF PEEK(&HE) MOD 2 = 1 THEN PRINT "READ SECTOR ERROR": GOTO errorlabel IF INT(PEEK(&HE) / 8) MOD 2 = 0 THEN PRINT "NO DRQ AFTER READ SECTOR": GOTO errorlabel 'DRQ set and IDENTIFY is complete FOR I = 0 TO 511 PRINT #1, CHR$(PEEK(0)); NEXT I 'PRINT "ATA ALT STATUS: 0x"; HEX$(PEEK(&HE)) IF INT(PEEK(&HE) / 8) MOD 2 = 1 THEN PRINT "DRQ SET BUT TRANSFER SHOULD BE DONE.": GOTO errorlabel IF INT(PEEK(&HE) / 64) MOD 2 <> 1 THEN PRINT "DRIVE NOT READY AFTER SECTOR READ.": GOTO errorlabel NEXT SECTOR& '-------------------------------------------------------------------- errorlabel: CLOSE #1 PRINT "PUTTING CARD IN RESET" PCICWrite PCICBASE%, PCICSLOT%, 3, &H0 PRINT "CARD OUTPUT DISABLE" PCICWrite PCICBASE%, PCICSLOT%, 2, &H10 PRINT "DISABLING IO WINDOWS" PCICWrite PCICBASE%, PCICSLOT%, 6, &H20 PRINT "TURNING OFF CARD POWER" PCICWrite PCICBASE%, PCICSLOT%, 2, &H0 FUNCTION PCICRead% (IOBase%, slotNo%, regOffset%) OUT IOBase%, slotNo% * &H40 + regOffset% RESULT% = INP(IOBase% + 1) PCICRead% = RESULT% PRINT "PCIC 0x"; HEX$(IOBase%); ": slot"; slotNo%; "register 0x"; HEX$(regOffset%); " read 0x"; HEX$(RESULT%) END FUNCTION SUB PCICWrite (IOBase%, slotNo%, regOffset%, wrData%) OUT IOBase%, slotNo% * &H40 + regOffset% OUT IOBase% + 1, wrData% PRINT "PCIC 0x"; HEX$(IOBase%); ": slot"; slotNo%; "register 0x"; HEX$(regOffset%); " written with 0x"; HEX$(wrData%) END SUB