Path: news.weeg.uiowa.edu!news.uiowa.edu!hobbes.physics.uiowa.edu!zaphod.mps.ohio-state.edu!cs.utexas.edu!sun-barr!ames!decwrl!waikato.ac.nz!comp.vuw.ac.nz!actrix!David.Empson Newsgroups: comp.sys.apple2 Subject: Re: ZipGSX programming... Message-ID: <1993Jan28.103640.24485@actrix.gen.nz> From: David.Empson@bbs.actrix.gen.nz Date: Thu, 28 Jan 1993 10:36:40 GMT Sender: David.Empson@actrix.gen.nz (David Empson) References: Organization: Actrix Information Exchange Lines: 88 In article djshaw01@romulus.spd.louisville.edu (Daniel Shaw) writes: > how does one recognize whether a zip exists in a slot from a program... Well, you can't tell _which_ slot the ZIP is in. It has no I/O locations, ROM or anything else in the slot's space. The slot is used to support the card, provide power, and to access signals that aren't available at the processor (such as DMA). > I noticed in thye cH..'s code that it accesses the annunciators to > turn it on or off....????? it doesn't really make sense...if anyone > knows how.. email or better.. post!!!!...let everyone know how to do > it.. The ZIP uses the same locations as the annunciators to access its registers. However, they aren't accessable at all times. You have to go through a special 'unlock ZIP registers' sequence to access them. While the ZIP is 'unlocked', the annunciators cannot be accessed. After you've finished with the ZIP, you have to 'lock' the registers again to restore annunciator access. I posted a file containing a description of the ZIP registers to comp.binaries.apple2, well over a year ago. Andy McFadden's "ZIPPY" program includes this file (I don't know if Andy used the information to write ZIPPY). I got the details from ZIP, and reworked it into a single page summary. Detecting the ZIP is somewhat of a black art. The best way to identify it (IMO) is to use the following sequence (interrupts should be disabled for security): - Enable the ZIP registers - Save the current 'percentage speed' setting - Change the 'percentage speed' to something else - Read back the 'percentage speed'. If it doesn't match what you wrote, there is no ZIP. - Restore the original percentage speed. - Read it back again. If it doesn't match, there is no ZIP. - Disable the ZIP registers Another possibility would be to verify that other ZIP registers can be read and written. Reading from an annunciator will produce a random value. Unfortunately, the detection sequence will affect the state of the annunciators if there is no ZIP in the system, which may cause problems if you are using them to control external devices (for example, I have an infra-red transmitter connected to AN2, which is affected by accesses to $C05C or $C05D). The following routine will detect the ZIP, returning with A=$00 and carry clear if the ZIP is present, A=$01 and carry set if not. Emulation mode (or 8-bit native mode) is assumed. CHKZIP SEI LDA #$55 ; Unlock the ZIP registers STA $C05A STA $C05A STA $C05A STA $C05A LDA $C05A ; Save the percentage speed AND #$F0 ; Extract the speed bits TAX EOR #$F0 ; Toggle the speed to something else STA $C05D ; Write the percentage speed ORA #$0F ; Set up bits to match CMP $C05A ; Expect speed in top bits, 1111 in bottom bits BNE NOZIP STX $C05D ; Restore the original speed TXA ORA #$0F ; Set up bits to match CMP $C05A ; Expect speed in top bits, 1111 in bottom bits BNE NOZIP LDA #$AA ; Lock the ZIP registers STA $C05A LDA #$00 ; Tests passed: ZIP is present! CLC CLI RTS NOZIP LDA #$01 ; The ZIP is not present SEC CLI RTS -- David Empson Internet: David.Empson@bbs.actrix.gen.nz EMPSON_D@kosmos.wcc.govt.nz Snail mail: P.O. Box 27-103, Wellington, New Zealand