mirror of
https://github.com/mgolombeck/HW-detect.git
synced 2024-12-21 23:29:27 +00:00
Create hw-detect.s
This commit is contained in:
parent
1db49e7e7f
commit
51aec75ce7
860
hw-detect.s
Normal file
860
hw-detect.s
Normal file
@ -0,0 +1,860 @@
|
|||||||
|
********************************
|
||||||
|
* *
|
||||||
|
* Machine Detection *
|
||||||
|
* *
|
||||||
|
* Routines *
|
||||||
|
* *
|
||||||
|
* BY MARC GOLOMBECK *
|
||||||
|
* *
|
||||||
|
* VERSION 1.00 / 26.04.2019 *
|
||||||
|
********************************
|
||||||
|
*
|
||||||
|
DSK detect
|
||||||
|
MX %11
|
||||||
|
ORG $901 ; routine starts at $0901
|
||||||
|
*
|
||||||
|
HOME EQU $FC58 ; CLEAR SCREEN
|
||||||
|
COUT EQU $FDED ; PRINT CHARACTER
|
||||||
|
KYBD EQU $C000 ; READ KEYBOARD
|
||||||
|
STROBE EQU $C010 ; CLEAR KEYBOARD
|
||||||
|
BELL EQU $FBDD ; RING BELL
|
||||||
|
WAIT EQU $FCA8 ; WAIT A BIT
|
||||||
|
PREAD EQU $FB1E ; switch to LORES
|
||||||
|
VERTBLANK EQU $C019 ; vertical blanking -> available only IIe and above
|
||||||
|
MEMCOPY EQU $FE2C ; monitor routine for copying RAM
|
||||||
|
WRITERAM EQU $C081 ; read ROM write RAM - toggle 2 times
|
||||||
|
READROM EQU $C082 ; read ROM no write - toggle 1 time
|
||||||
|
READWRITE EQU $C083 ; read & write RAM - toggle 2 times
|
||||||
|
READRAM EQU $C080 ; read RAM no write - toggle 1 time
|
||||||
|
*
|
||||||
|
bMB EQU $2078 ; MockingBoard available? ($00/No | $01 Yes)
|
||||||
|
bMachine EQU $2079 ; auto detect Apple II machine type
|
||||||
|
bMem EQU $207A ; 128k? ($00 No | $78 Yes)
|
||||||
|
bZC EQU $207B ; ZIPchip installed? ($00/No | $01 Yes)
|
||||||
|
bFC EQU $207C ; FastChip installed? ($00/No | $01 Yes)
|
||||||
|
bLC EQU $207D ; Language Card available? ($00/No | $01 Yes)
|
||||||
|
bMBSlot EQU $207E ; slot of MockingBoard ($01..$07)
|
||||||
|
bRefresh EQU $207F ; byte REFRESH RATE ($00/50Hz | $01/60Hz)
|
||||||
|
b65C02 EQU $20F8 ; byte CPU ($00/6502 | $01/65C02 | $FF/65816)
|
||||||
|
bEmu EQU $20F9 ; emulator detection ($00/No | $01 Yes)
|
||||||
|
*
|
||||||
|
chkMEM EQU $0100 ; adress of AUX mem checking routine
|
||||||
|
dest EQU $F8 ; + $F9
|
||||||
|
MB_ADDRL EQU $06
|
||||||
|
MB_ADDRH EQU $07
|
||||||
|
TICKS EQU $09
|
||||||
|
charFLAG EQU $FF ; only uppercase letters?
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* FastChip constants
|
||||||
|
*
|
||||||
|
FC_UNLOCK EQU $6A ; FastChip unlock value
|
||||||
|
FC_LOCK EQU $A6 ; FastChip lock value
|
||||||
|
FC_LOCK_REG EQU $C06A ; FastChip lock register
|
||||||
|
FC_EN_REG EQU $C06B ; FastChip enable register
|
||||||
|
FC_SPD_REG EQU $C06D ; FastChip speed register
|
||||||
|
*
|
||||||
|
INIT SEI ; just to be sure...
|
||||||
|
JSR DETECTA2 ; get machine type
|
||||||
|
STA $C000 ; 80STOREOFF
|
||||||
|
STA $C008 ; zero Page = Main (+ $FXXX MAIN)
|
||||||
|
*
|
||||||
|
JSR COPYAUX ; copy main program to AUX-memory
|
||||||
|
JSR COPYROM ; copy MONITOR to language card
|
||||||
|
JMP chkMEM ; jump to short routine in Stack for checking AUX MEM size
|
||||||
|
JSR DETECTCPU
|
||||||
|
JSR DETECTREFRESH
|
||||||
|
*
|
||||||
|
JSR DETECTZIP ; detect and disable a ZIPchip
|
||||||
|
JSR DETECTFC ; detect FastChip and set to 1 MHz
|
||||||
|
JSR DETECTEMU ; detect possible emulator first
|
||||||
|
JSR DETECTLC ; can we also detect a language card?
|
||||||
|
JSR MB_DETECT ; detect MB-slot
|
||||||
|
JSR HOME ; clear screen
|
||||||
|
JSR PRTRES ; print detection results on screen
|
||||||
|
*
|
||||||
|
RTS
|
||||||
|
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*************************************************
|
||||||
|
* COPY PROGRAM TO AUX MEMORY *
|
||||||
|
*************************************************
|
||||||
|
*
|
||||||
|
COPYAUX
|
||||||
|
STA $C002 ; read MAIN
|
||||||
|
STA $C005 ; write AUX
|
||||||
|
LDA #$09 ; set start adress HI-byte
|
||||||
|
STA dest+1 ; for page copy
|
||||||
|
LDA #0
|
||||||
|
STA dest ; LO-byte
|
||||||
|
*
|
||||||
|
cpAUXlp2 LDY #0 ; loop over Y
|
||||||
|
cpAUXlp1 LDA (dest),Y ; read from MAIN memory
|
||||||
|
STA (dest),Y ; store to AUX memory at same address!
|
||||||
|
INY
|
||||||
|
BNE cpAUXlp1
|
||||||
|
INC dest+1 ; increase HI-byte +1
|
||||||
|
LDA dest+1 ; must include the MB-playing routine in code copy!
|
||||||
|
CMP #$0d ; HI-Byte = $14? Copy until reaching $13FF!
|
||||||
|
BNE cpAUXlp2 ; no, copy next page
|
||||||
|
STA $C004 ; write MAIN
|
||||||
|
|
||||||
|
LDA #>CODE
|
||||||
|
STA dest+1
|
||||||
|
LDA #<CODE ; -> copy MEM chk routine to Stack area
|
||||||
|
STA dest
|
||||||
|
LDY #0
|
||||||
|
STY bMem ; init result byte
|
||||||
|
cpSTACK LDA (dest),Y
|
||||||
|
STA chkMEM,Y
|
||||||
|
INY
|
||||||
|
CPY #15
|
||||||
|
BNE cpSTACK
|
||||||
|
*
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* copy monitor ROM
|
||||||
|
*
|
||||||
|
COPYROM LDY #$F8 ; copy Monitor-ROM to Language Card
|
||||||
|
STY $3D
|
||||||
|
STY $43
|
||||||
|
LDY #$FF
|
||||||
|
STY $3E
|
||||||
|
STY $3F
|
||||||
|
INY
|
||||||
|
STY $3C
|
||||||
|
STY $42
|
||||||
|
LDA WRITERAM ; toggle Language Card RAM for writing
|
||||||
|
LDA WRITERAM
|
||||||
|
JSR MEMCOPY
|
||||||
|
LDA READROM ; toggle Language Card off
|
||||||
|
RTS
|
||||||
|
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect slot with MockingBoard
|
||||||
|
*
|
||||||
|
MB_DETECT LDA #0
|
||||||
|
STA MB_ADDRL
|
||||||
|
*
|
||||||
|
MB_DET_lp LDA #$07 ; we start in slot 7 ($C7) and go down to 0 ($C0)
|
||||||
|
STA bMBSlot ; slot with MB
|
||||||
|
ORA #$C0 ; make it start with C
|
||||||
|
STA MB_ADDRH
|
||||||
|
LDY #04 ; $CX04
|
||||||
|
LDX #02 ; 2 tries?
|
||||||
|
MB_CHK_CYC LDA (MB_ADDRL),Y ; timer 6522 (Low Order Counter)
|
||||||
|
* ; count down
|
||||||
|
STA TICKS ; 3 cycles
|
||||||
|
LDA (MB_ADDRL),Y ; + 5 cycles EQU 8 cycles
|
||||||
|
* ; between the two accesses to the timer
|
||||||
|
SEC
|
||||||
|
SBC TICKS ; subtract to see if we had 8 cycles (accepted range 7-9)
|
||||||
|
CMP #$f8 ; -8
|
||||||
|
BEQ DEC_X
|
||||||
|
CMP #$F9 ; -7 - range is necessary if FastChip is installed
|
||||||
|
BEQ DEC_X
|
||||||
|
CMP #$F7 ; -9
|
||||||
|
BNE MB_NOT_SLOT
|
||||||
|
DEC_X DEX ; decrement, try one more time
|
||||||
|
BNE MB_CHK_CYC ; loop detection
|
||||||
|
INX ; Mockingboard found (XEQU1)
|
||||||
|
DONE_DET STX bMB ; store result to bMB
|
||||||
|
RTS ; return
|
||||||
|
*
|
||||||
|
MB_NOT_SLOT DEC MB_DET_lp+1 ; decrement the "slot" (self_modify)
|
||||||
|
BNE MB_DET_lp ; loop down to one
|
||||||
|
LDX #00
|
||||||
|
BEQ DONE_DET
|
||||||
|
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect type of Apple 2 computer
|
||||||
|
*
|
||||||
|
DETECTA2
|
||||||
|
LDA #$FF
|
||||||
|
STA charFLAG ; allow lower case output
|
||||||
|
LDA $FBB3
|
||||||
|
CMP #$06 ; IIe/IIc/IIGS = 06
|
||||||
|
BEQ checkII ; if not II ($38) or II+ ($EA)
|
||||||
|
_G22PLUS STA bMachine ; save $38 or $EA as machine byte
|
||||||
|
LDA #%11011111 ; convert lowercase chars to uppercase
|
||||||
|
STA charFLAG
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
checkII LDA $FBC0 ; detect IIc
|
||||||
|
BEQ _G2C ; 0 = IIc / Other = no IIc
|
||||||
|
*
|
||||||
|
SEC ; IIgs or IIe ?
|
||||||
|
JSR $FE1F ; test for GS
|
||||||
|
BCS _G2E ; if carry flag is set -> IIE
|
||||||
|
*
|
||||||
|
LDA #$FF ; IIGS -> $FF
|
||||||
|
STA bMachine
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* condition some IIgs settings
|
||||||
|
*
|
||||||
|
LDA $C036 ; put IIgs in 8-bit-mode
|
||||||
|
AND #$7F
|
||||||
|
STA $C036 ; slow speed
|
||||||
|
*
|
||||||
|
LDA $C034 ;
|
||||||
|
AND #$F0
|
||||||
|
STA $C034 ; black border
|
||||||
|
*
|
||||||
|
LDA $C022
|
||||||
|
AND #$F0 ; bit 0-3 at 0 = background black
|
||||||
|
ORA #$F0 ; bit 7-4 at 1 = text white
|
||||||
|
STA $C022 ; background black/text white
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
_G2E LDA #$7F ; IIE -> $7F
|
||||||
|
STA bMachine
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
_G2C STA bMachine ; IIc -> $00
|
||||||
|
RTS
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect CPU type
|
||||||
|
*
|
||||||
|
DETECTCPU
|
||||||
|
LDA #00
|
||||||
|
BRA _is65C02 ; results in a BRA +4 if 65C02/65816 or NOPs if 6502
|
||||||
|
BEQ _contD ; a 6502 drops through directly to the BEQ here
|
||||||
|
_is65C02 INC A ; 65C02/65816 arrives here
|
||||||
|
* ; some 65816 code here
|
||||||
|
XBA ; .byte $eb, put $01 in B accu -> equals a NOP for 65C02
|
||||||
|
DEC A ; .byte $3a, A=$00 if 65C02
|
||||||
|
XBA ; .byte $eb, get $01 back if 65816
|
||||||
|
INC A ; .byte $1a, make $01/$02
|
||||||
|
_contD STA b65C02
|
||||||
|
RTS
|
||||||
|
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect and disable a ZIPchip
|
||||||
|
*
|
||||||
|
DETECTZIP
|
||||||
|
LDA #$5A ; unlock ZC
|
||||||
|
STA $C05A
|
||||||
|
STA $C05A
|
||||||
|
STA $C05A
|
||||||
|
STA $C05A
|
||||||
|
|
||||||
|
LDX #$00
|
||||||
|
CACHE LDA ALTER,X ; put altering part of the code in the cache!
|
||||||
|
INX
|
||||||
|
BNE CACHE
|
||||||
|
|
||||||
|
ALTER LDA $C05C ; Get the slot delay status
|
||||||
|
EOR #$FF ; Flip it
|
||||||
|
STA $C05C ; Save it
|
||||||
|
CMP $C05C ; Correct?
|
||||||
|
BNE NOZIP ; No, ZIP CHIP not found.
|
||||||
|
|
||||||
|
EOR #$FF ; Get back old status
|
||||||
|
STA $C05C ; Save it
|
||||||
|
CMP $C05C ; Correct?
|
||||||
|
BNE NOZIP ; No, ZIP CHIP not found.
|
||||||
|
|
||||||
|
LDA #$00 ; other value as $5A or $A5
|
||||||
|
STA $C05A ; will disable ZC
|
||||||
|
LDA #$A5 ; lock ZC
|
||||||
|
STA $C05A
|
||||||
|
LDA #01
|
||||||
|
STA bZC
|
||||||
|
RTS
|
||||||
|
|
||||||
|
NOZIP LDA #00
|
||||||
|
STA bZC
|
||||||
|
RTS
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect a FastChip and set speed to 1 MHz
|
||||||
|
*
|
||||||
|
DETECTFC LDA bMachine ; get machine type byte
|
||||||
|
LDX #$00
|
||||||
|
CMP #$7F ; Apple IIe
|
||||||
|
BEQ chk_slot
|
||||||
|
BNE not_found
|
||||||
|
chk_slot LDY #$04 ; loop 4 times
|
||||||
|
LDA #FC_UNLOCK ; load the unlock value
|
||||||
|
unlock_lp STA FC_LOCK_REG ; store in lock register
|
||||||
|
DEY
|
||||||
|
BNE unlock_lp
|
||||||
|
LDA #$00 ; MegaAudio check
|
||||||
|
STA FC_EN_REG ; enable the Fast Chip
|
||||||
|
LDY FC_EN_REG ; bit 7 will be high when enabled
|
||||||
|
CPY #$80
|
||||||
|
BNE not_found
|
||||||
|
found LDA #$80 ; reset speed register
|
||||||
|
STA FC_SPD_REG
|
||||||
|
LDA #$09 ; set FC speed to 1.10 MHz
|
||||||
|
STA FC_SPD_REG ; necessary for correct MB-detection!
|
||||||
|
LDA #FC_LOCK
|
||||||
|
STA FC_LOCK_REG ; lock the registers again
|
||||||
|
LDA #$01
|
||||||
|
STA bFC
|
||||||
|
RTS
|
||||||
|
not_found TXA
|
||||||
|
STA bFC
|
||||||
|
RTS
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect Language Card
|
||||||
|
*
|
||||||
|
DETECTEMU
|
||||||
|
LDA #0
|
||||||
|
STA bEmu ; set value to "real wood"
|
||||||
|
LDX #0 ; read PDL(0)
|
||||||
|
JSR PREAD
|
||||||
|
STY PDL0 ; store value
|
||||||
|
LDX #1 ; read PDL(0)
|
||||||
|
JSR PREAD
|
||||||
|
STY PDL1 ; store value
|
||||||
|
LDX #2 ; read PDL(0)
|
||||||
|
JSR PREAD
|
||||||
|
STY PDL2 ; store value
|
||||||
|
LDX #3 ; read PDL(0)
|
||||||
|
JSR PREAD
|
||||||
|
STY PDL3 ; store value
|
||||||
|
*
|
||||||
|
LDA #0
|
||||||
|
STA PDL0+1
|
||||||
|
STA PDL1+1
|
||||||
|
STA PDL2+1
|
||||||
|
STA PDL3+1
|
||||||
|
|
||||||
|
CLC
|
||||||
|
LDA PDL0 ; adding all read PDL values
|
||||||
|
ADC PDL1 ; emulators mainly return #127 for PDL-read
|
||||||
|
STA PDLsum ; real wood returns 255 if no paddle is connected
|
||||||
|
LDA PDL0+1 ; or anything else (but mostly not 127 for all values)
|
||||||
|
ADC PDL1+1
|
||||||
|
STA PDLsum+1
|
||||||
|
CLC
|
||||||
|
LDA PDLsum ; adding all read PDL values
|
||||||
|
ADC PDL2 ; emulators mainly return #127 for PDL-read
|
||||||
|
STA PDLsum
|
||||||
|
LDA PDLsum+1
|
||||||
|
ADC PDL2+1
|
||||||
|
STA PDLsum+1
|
||||||
|
CLC
|
||||||
|
LDA PDLsum ; adding all read PDL values
|
||||||
|
ADC PDL3 ; emulators mainly return #127 for PDL-read
|
||||||
|
STA PDLsum
|
||||||
|
LDA PDLsum+1
|
||||||
|
ADC PDL3+1
|
||||||
|
STA PDLsum+1
|
||||||
|
|
||||||
|
LDA PDLsum+1
|
||||||
|
CMP #1
|
||||||
|
BEQ Pchk1 ; check for 508 as magic number = 4*127
|
||||||
|
JMP Pchk3
|
||||||
|
Pchk1 LDA PDLsum
|
||||||
|
CMP #252
|
||||||
|
BEQ Pchk2
|
||||||
|
JMP Pchk3
|
||||||
|
Pchk2 ; magic number found
|
||||||
|
INC bEmu ; bEmu = 1
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
Pchk3 LDA PDL0 ; second check if first check fails
|
||||||
|
CMP PDL1 ; PDL(0) = PDL(1)?
|
||||||
|
BEQ Pchk3a ; yes -> check for other two values
|
||||||
|
RTS ; values are different, likely real wood
|
||||||
|
Pchk3a LDA PDL0 ; open gate? (=255) is likely to be real wood here with no joystick connected
|
||||||
|
CMP #255
|
||||||
|
BNE Pchk3b
|
||||||
|
RTS
|
||||||
|
Pchk3b LDA PDL2
|
||||||
|
CMP PDL3
|
||||||
|
BEQ Pchk2 ; assume emulator
|
||||||
|
RTS
|
||||||
|
|
||||||
|
PDL0 DS 2 ; paddle read values
|
||||||
|
PDL1 DS 2
|
||||||
|
PDL2 DS 2
|
||||||
|
PDL3 DS 2
|
||||||
|
PDLsum DS 2
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect Emulator
|
||||||
|
*
|
||||||
|
DETECTLC
|
||||||
|
LDA $C083 ; turn on LC
|
||||||
|
LDA $C083
|
||||||
|
LDA $D000
|
||||||
|
INC $D000
|
||||||
|
|
||||||
|
CMP $D000
|
||||||
|
BEQ noLCARD
|
||||||
|
DEC $D000
|
||||||
|
LDA #1 ; language card positive
|
||||||
|
STA bLC ; -> might be an emulator!
|
||||||
|
JMP exitEMU
|
||||||
|
noLCARD LDA #0
|
||||||
|
STA bLC
|
||||||
|
LDA bEmu ; emulator detected?
|
||||||
|
BNE exitEMU
|
||||||
|
LDA #2 ; can't tell if running in an emulator -> sorry!
|
||||||
|
STA bEmu
|
||||||
|
exitEMU LDA $C081 ; turn off LC
|
||||||
|
RTS
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* detect screen refresh rate
|
||||||
|
*
|
||||||
|
DETECTREFRESH
|
||||||
|
LDA bMachine
|
||||||
|
BEQ Refresh_IIC ; IIc -> another refresh detection method is necessary
|
||||||
|
CMP #$EA
|
||||||
|
BEQ _badguy ; II+ -> no detection possible
|
||||||
|
CMP #$38
|
||||||
|
BEQ _badguy ; II -> no detection possible
|
||||||
|
|
||||||
|
_L1 CMP VERTBLANK ; works with IIGS/IIE
|
||||||
|
BPL _L1 ; wait until the end of the vertical blank
|
||||||
|
|
||||||
|
_L2 CMP VERTBLANK ; synchronizing counting algorithm
|
||||||
|
BMI _L2 ; wait until the end of the complete display -> start of vertical blanking
|
||||||
|
_BP3 INC COUNTREF ; 6 increment counter
|
||||||
|
|
||||||
|
LDX #$09 ; wait for a certain number of cycles
|
||||||
|
_WL3 DEX ;
|
||||||
|
BNE _WL3 ; = 46 cycles
|
||||||
|
; + 6 + 3 + 3 + 4 + 3 = 65 !
|
||||||
|
LDA bMachine ; 3
|
||||||
|
LDA bMachine ; 3
|
||||||
|
CMP VERTBLANK ; 4
|
||||||
|
Bpl _BP3 ; 3 -> repeat and increment counter until VBL is done
|
||||||
|
|
||||||
|
LDA COUNTREF
|
||||||
|
CMP #72 ; >= 72 equals 50 HZ (120*65 cycles of VBL)
|
||||||
|
BCS _GO3
|
||||||
|
LDA #01 ; 60HZ (VBL = 70x65 cycles)
|
||||||
|
JMP _GO4
|
||||||
|
_GO3 LDA #00 ; 50HZ (VBL = 120x65 cycles)
|
||||||
|
_GO4 STA bRefresh
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
_badguy LDA #$FF ; system without VBL-signal is a bad guy
|
||||||
|
STA bRefresh
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
Refresh_IIC ; specific treatment for Apple IIc
|
||||||
|
STA $C070
|
||||||
|
STA $C07F
|
||||||
|
STA $C05B
|
||||||
|
_l1 LDA $C019 ; preparation for the beginning of VBL
|
||||||
|
bpl _l1
|
||||||
|
STA $C070
|
||||||
|
STA $C07F
|
||||||
|
STA $C05B ; enable VBL interrupt
|
||||||
|
|
||||||
|
_BP2 INC COUNTREF ; 6 increment counter
|
||||||
|
|
||||||
|
LDX #$09 ;
|
||||||
|
_WL1 DEX ;
|
||||||
|
BNE _WL1 ; = 46 cycles
|
||||||
|
; + 6 + 6 + 4 + 3 = 65 !
|
||||||
|
NOP
|
||||||
|
NOP
|
||||||
|
NOP ; 3*2 = 6 additional cycles
|
||||||
|
|
||||||
|
LDA $C019 ; waiting for the next VBL to begin
|
||||||
|
bpl _BP2 ; 3 -> wait for vblflag = 1
|
||||||
|
|
||||||
|
STA $C058+2 ; disable VBL int. Contains a complete VBL + one display. Exit on the beginning of
|
||||||
|
LDA COUNTREF ; the next VBL gives = 192+70+(50) = $138 or ($106) hence $38 or $06
|
||||||
|
CMP #$10 ; >= 16 hence 50 HZ
|
||||||
|
BCS _GO1
|
||||||
|
LDA #01 ; 60HZ
|
||||||
|
JMP _GO2
|
||||||
|
_GO1 LDA #00 ; 50HZ
|
||||||
|
_GO2 STA bRefresh
|
||||||
|
RTS
|
||||||
|
COUNTREF DS 1
|
||||||
|
|
||||||
|
|
||||||
|
*==============================================================
|
||||||
|
*
|
||||||
|
* print detection results on screen
|
||||||
|
*
|
||||||
|
PRTRES LDA #0 ; set cursor position
|
||||||
|
STA $25
|
||||||
|
JSR LFEED
|
||||||
|
|
||||||
|
LDA #6 ; HTAB 6
|
||||||
|
STA $24
|
||||||
|
LDX #<T_APPLE
|
||||||
|
LDY #>T_APPLE
|
||||||
|
JSR PRINT
|
||||||
|
JSR LFEED
|
||||||
|
JSR LFEED
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
|
||||||
|
LDX #<T_MACH
|
||||||
|
LDY #>T_MACH
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bMachine
|
||||||
|
BNE comp1 ; //c = $00?
|
||||||
|
LDX #<T_COMP3
|
||||||
|
LDY #>T_COMP3
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1
|
||||||
|
|
||||||
|
comp1 CMP #$7F ; //e?
|
||||||
|
BNE comp2
|
||||||
|
LDX #<T_COMP1
|
||||||
|
LDY #>T_COMP1
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1
|
||||||
|
|
||||||
|
comp2 CMP #$FF ; IIgs?
|
||||||
|
BNE comp3
|
||||||
|
LDX #<T_COMP2
|
||||||
|
LDY #>T_COMP2
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1
|
||||||
|
|
||||||
|
comp3 CMP #$38 ; II?
|
||||||
|
BNE comp4
|
||||||
|
LDX #<T_COMP4
|
||||||
|
LDY #>T_COMP4
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1
|
||||||
|
|
||||||
|
comp4 CMP #$EA ; II?
|
||||||
|
BNE comp5
|
||||||
|
LDX #<T_COMP5
|
||||||
|
LDY #>T_COMP5
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1
|
||||||
|
|
||||||
|
comp5 LDX #<T_COMP6 ; unknown machine
|
||||||
|
LDY #>T_COMP6
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT1
|
||||||
|
JSR LFEED ; print CPU type
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_CPU
|
||||||
|
LDY #>T_CPU
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA b65C02
|
||||||
|
CMP #2 ; 65816 in any machine setting!
|
||||||
|
BEQ _s2_cpu
|
||||||
|
LDA b65C02
|
||||||
|
BEQ _s1_cpu ; 0 (6502)
|
||||||
|
BMI _s2_cpu ; >$7F (65816 or 65C802)
|
||||||
|
LDX #<T_CPU2 ; 1 (65C02)
|
||||||
|
LDY #>T_CPU2
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1a
|
||||||
|
_s1_cpu
|
||||||
|
LDX #<T_CPU1
|
||||||
|
LDY #>T_CPU1
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1a
|
||||||
|
_s2_cpu ; CPU is 65816 or 65C802
|
||||||
|
LDA bMachine
|
||||||
|
CMP #$FF
|
||||||
|
BEQ cpu816 ; is 65816
|
||||||
|
LDX #<T_CPU4 ; is 65C802
|
||||||
|
LDY #>T_CPU4
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1a
|
||||||
|
cpu816
|
||||||
|
LDX #<T_CPU3
|
||||||
|
LDY #>T_CPU3
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT1a JSR LFEED ; output RAM
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_RAM
|
||||||
|
LDY #>T_RAM
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bMem
|
||||||
|
CMP #$78 ; $78 is flag byte for 128k!
|
||||||
|
BNE not128 ; 64 or 48k
|
||||||
|
LDA bMachine ; check for Apple ][ and ][+ -> no 128k supported
|
||||||
|
CMP #$38
|
||||||
|
BEQ not128
|
||||||
|
CMP #$EA
|
||||||
|
BEQ not128
|
||||||
|
|
||||||
|
LDX #<T_128 ; 128k
|
||||||
|
LDY #>T_128
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1b
|
||||||
|
|
||||||
|
not128 LDA bLC
|
||||||
|
BEQ only48
|
||||||
|
LDX #<T_64 ; 64k
|
||||||
|
LDY #>T_64
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT1b
|
||||||
|
|
||||||
|
only48 LDX #<T_48 ; 48k
|
||||||
|
LDY #>T_48
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT1b JSR LFEED ; output Language Card
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_LANG
|
||||||
|
LDY #>T_LANG
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bLC
|
||||||
|
BEQ noLC
|
||||||
|
LDX #<T_YES ; YES
|
||||||
|
LDY #>T_YES
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT2
|
||||||
|
|
||||||
|
noLC LDX #<T_NO ; NO LC
|
||||||
|
LDY #>T_NO
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NEXT2 JSR LFEED ; print refresh rate
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_REFRESH
|
||||||
|
LDY #>T_REFRESH
|
||||||
|
JSR PRINT
|
||||||
|
LDA bRefresh
|
||||||
|
BMI _s2_rate
|
||||||
|
BEQ _s1_rate
|
||||||
|
LDX #<T_RATE2
|
||||||
|
LDY #>T_RATE2
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT3
|
||||||
|
_s1_rate
|
||||||
|
LDX #<T_RATE1
|
||||||
|
LDY #>T_RATE1
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT3
|
||||||
|
_s2_rate
|
||||||
|
LDX #<T_RATE3
|
||||||
|
LDY #>T_RATE3
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT3 JSR LFEED ; output MockingBoard detection results
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_MOCK
|
||||||
|
LDY #>T_MOCK
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bMB
|
||||||
|
BEQ noMB ; no MB detected
|
||||||
|
LDX #<T_SLOT ; slot no
|
||||||
|
LDY #>T_SLOT
|
||||||
|
JSR PRINT
|
||||||
|
LDA bMBSlot ; get slot no and convewrt to ASCII-value
|
||||||
|
CLC
|
||||||
|
ADC #$B0
|
||||||
|
JSR COUT ; output ASCII-value!
|
||||||
|
JMP NEXT4
|
||||||
|
|
||||||
|
noMB LDX #<T_NONE ; no MB!
|
||||||
|
LDY #>T_NONE
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT4 JSR LFEED ; output FastChip detection
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_FC
|
||||||
|
LDY #>T_FC
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bFC
|
||||||
|
BEQ noFC ; no FC detected
|
||||||
|
|
||||||
|
LDX #<T_YES ; FC detected!
|
||||||
|
LDY #>T_YES
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT5
|
||||||
|
|
||||||
|
noFC LDX #<T_NO ; no FC!
|
||||||
|
LDY #>T_NO
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT5 JSR LFEED ; output ZipChip detection result
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_ZC
|
||||||
|
LDY #>T_ZC
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bZC
|
||||||
|
BEQ noZC ; no ZC detected
|
||||||
|
|
||||||
|
LDX #<T_YES ; ZC detected!
|
||||||
|
LDY #>T_YES
|
||||||
|
JSR PRINT
|
||||||
|
JMP NEXT6
|
||||||
|
|
||||||
|
noZC LDX #<T_NO ; no ZC!
|
||||||
|
LDY #>T_NO
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
NEXT6 JSR LFEED ; output Emulator detection
|
||||||
|
JSR LFEED
|
||||||
|
LDA #7 ; HTAB 7
|
||||||
|
STA $24
|
||||||
|
LDX #<T_EMU
|
||||||
|
LDY #>T_EMU
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
LDA bEmu
|
||||||
|
BEQ pnoEmu
|
||||||
|
|
||||||
|
CMP #1
|
||||||
|
BEQ pyesEmu
|
||||||
|
|
||||||
|
LDX #<T_UNCLEAR ; unclear condition
|
||||||
|
LDY #>T_UNCLEAR
|
||||||
|
JSR PRINT
|
||||||
|
JMP prtSHK
|
||||||
|
|
||||||
|
pnoEmu LDX #<T_RATE3 ; no EMU detected!
|
||||||
|
LDY #>T_RATE3
|
||||||
|
JSR PRINT
|
||||||
|
JMP prtSHK
|
||||||
|
|
||||||
|
pyesEmu LDX #<T_POS ; EMU detected!
|
||||||
|
LDY #>T_POS
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
|
||||||
|
prtSHK JSR LFEED ; output copyright notice
|
||||||
|
JSR LFEED
|
||||||
|
JSR LFEED
|
||||||
|
LDA #4 ; HTAB 4
|
||||||
|
STA $24
|
||||||
|
LDX #<T_SHACK
|
||||||
|
LDY #>T_SHACK
|
||||||
|
JSR PRINT
|
||||||
|
|
||||||
|
|
||||||
|
resRTS RTS
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* text output routines
|
||||||
|
*
|
||||||
|
LFEED LDA #$8D ; print a line feed
|
||||||
|
JSR COUT
|
||||||
|
RTS
|
||||||
|
*
|
||||||
|
PRINT ; x = LO-Byte Text, y = HI-Byte Text
|
||||||
|
!zone
|
||||||
|
STX ba+1
|
||||||
|
STY ba+2
|
||||||
|
|
||||||
|
LDX #00
|
||||||
|
ba LDA $1000,X
|
||||||
|
BEQ rtsPRINT
|
||||||
|
CMP #$E1 ; "a" char in lower case range?
|
||||||
|
BCC doCOUT ; no -> direct output
|
||||||
|
CMP #$FB ; "z"
|
||||||
|
BCS doCOUT ; no -> direct output
|
||||||
|
AND charFLAG ; lowercase conversion if necessary
|
||||||
|
doCOUT JSR COUT ; output ASCII on screen
|
||||||
|
INX
|
||||||
|
BNE ba
|
||||||
|
rtsPRINT RTS
|
||||||
|
|
||||||
|
*=============================================================================
|
||||||
|
*
|
||||||
|
* AUX-memory detection code
|
||||||
|
*
|
||||||
|
CODE HEX 8D03C0AD01098D02
|
||||||
|
HEX C08D7A204C1409
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* text output data
|
||||||
|
*
|
||||||
|
T_APPLE ASC "* Hardware Autodetection *"
|
||||||
|
HEX 00
|
||||||
|
T_SHACK ASC "* V.1.00 by 8-BIT-SHACK 2019 *"
|
||||||
|
HEX 00
|
||||||
|
T_MACH ASC "Machine: "
|
||||||
|
HEX 00
|
||||||
|
T_COMP1 ASC "Apple //e"
|
||||||
|
HEX 00
|
||||||
|
T_COMP2 ASC "Apple IIgs"
|
||||||
|
HEX 00
|
||||||
|
T_COMP3 ASC "Apple //c"
|
||||||
|
HEX 00
|
||||||
|
T_COMP4 ASC "Apple ]["
|
||||||
|
HEX 00
|
||||||
|
T_COMP5 ASC "Apple ][+"
|
||||||
|
HEX 00
|
||||||
|
T_COMP6 ASC "Other"
|
||||||
|
HEX 00
|
||||||
|
T_RAM ASC "RAM: "
|
||||||
|
HEX 00
|
||||||
|
T_48 ASC "48kB "
|
||||||
|
HEX 00
|
||||||
|
T_64 ASC "64kB (LC) "
|
||||||
|
HEX 00
|
||||||
|
T_128 ASC ">= 128kB "
|
||||||
|
HEX 00
|
||||||
|
T_MOCK ASC "MockingBoard: "
|
||||||
|
HEX 00
|
||||||
|
T_NONE ASC "None "
|
||||||
|
HEX 00
|
||||||
|
T_SLOT ASC "Slot #"
|
||||||
|
HEX 00
|
||||||
|
T_FC ASC "FastChip: "
|
||||||
|
HEX 00
|
||||||
|
T_YES ASC "Yes"
|
||||||
|
HEX 00
|
||||||
|
T_ZC ASC "ZIPChip: "
|
||||||
|
HEX 00
|
||||||
|
T_NO ASC "No"
|
||||||
|
HEX 00
|
||||||
|
T_CPU ASC "CPU-Type: "
|
||||||
|
HEX 00
|
||||||
|
T_REFRESH ASC "Refresh Rate: "
|
||||||
|
HEX 00
|
||||||
|
T_LANG ASC "Language Card: "
|
||||||
|
HEX 00
|
||||||
|
T_EMU ASC "Emulator: "
|
||||||
|
HEX 00
|
||||||
|
T_CPU1 ASC "6502"
|
||||||
|
HEX 00
|
||||||
|
T_CPU2 ASC "65C02"
|
||||||
|
HEX 00
|
||||||
|
T_CPU3 ASC "65816"
|
||||||
|
HEX 00
|
||||||
|
T_CPU4 ASC "65C802"
|
||||||
|
HEX 00
|
||||||
|
T_RATE1 ASC "50Hz"
|
||||||
|
HEX 00
|
||||||
|
T_RATE2 ASC "60Hz"
|
||||||
|
HEX 00
|
||||||
|
T_RATE3 ASC "Not detected!"
|
||||||
|
HEX 00
|
||||||
|
T_POS ASC "Detected!"
|
||||||
|
HEX 00
|
||||||
|
T_UNCLEAR ASC "Unclear..."
|
||||||
|
HEX 00
|
||||||
|
*
|
||||||
|
* end of file
|
||||||
|
*
|
Loading…
Reference in New Issue
Block a user