;license:MIT ;(c) 2018-9 by 4am ; ; VidHD support functions ; ;------------------------------------------------------------------------------ ; HasVidHDCard ; detect VidHD card by searching for magic bytes across all slots ; ; in: none ; out: C set if VidHD card found in any slot ; if card was found, X = #$Cn where n is the slot number of the card ; C clear if no VidHD card found ; other flags clobbered ; A/Y clobbered ;------------------------------------------------------------------------------ HasVidHDCard ldx #$C7 @slotLoop stx @byteLoop+2 ldy #$02 @byteLoop lda $FD00, y ; SMC (high byte) cmp @kVidHDMagicBytes, y bne @nextSlot dey bpl @byteLoop @found sec ; found rts @nextSlot dex cpx #$C0 bne @slotLoop ; check for a slot where the Cx00 page is all zeroes ; and the devsel bytes are also all zeroes, which ; indicates that VidHD is probably present but is in ; passive mode because some other card is hogging DMA ldx #$C7 @passiveSlotLoop stx @passiveByteLoop+2 ldy #0 @passiveByteLoop lda $FD00, y ; SMC (high byte) bne @passiveNextSlot dey bne @passiveByteLoop txa and #$0F ; A = $01..$07 asl asl asl asl ; A = $10..$70 ora #$80 ; A = $90..$F0 sta @devselLoop+1 ldy #$0F @devselLoop lda $C0FD, y ; SMC (low byte) bne @passiveNextSlot dey bpl @devselLoop bmi @found ; always branches @passiveNextSlot dex cpx #$C0 bne @passiveSlotLoop clc ; not found rts @kVidHDMagicBytes !byte $24, $EA, $4C