Detekcja CPU6502, CPU65816

Przykład zaczerpnięty z tej strony. Program potrafi zdiagnozować obecność jednego z mikroprocesorów: 6502, 65C02, 65816.

/*

How to detect on which CPU the assembler code is running

(This information is from Draco, the author of SYSINFO 2.0)

You can test on plain 6502-Code if there is a 65c816 CPU, the 16-Bit processor avaible
in some XLs as a turbo-board, avaible. Draco told me how to do this:

First we make sure, whether we are running on NMOS-CPU (6502) or CMOS (65c02,65c816).
I will just show the "official" way which doesn`t uses "illegal opcodes":

*/

 org $2000

 opt c+

DetectCPU

 lda #$99
 clc
 sed
 adc #$01
 cld
 beq DetectCPU_CMOS

DetectCPU_02

 ldx #<_6502
 ldy #>_6502
 jsr $c642

 lda #0
 rts

DetectCPU_CMOS

 lda #0
 rep #%00000010     ;wyzerowanie bitu Z
 bne DetectCPU_C816

DetectCPU_C02

 ldx #<_65c02
 ldy #>_65c02
 jsr $c642

 lda #1
 rts

DetectCPU_C816

 ldx <_65816
 ldy >_65816
 jsr $c642

 lda #$80
 rts

_6502   dta c'6502',$9b
_65c02  dta c'65c02',$9b
_65816  dta c'65816',$9b

Następny przykład detekcji CPU, ogranicza się do określenia obecności mikroprocesora 6502 lub 65816. Program po disasemblacji inaczej wygląda dla 6502, inaczej dla 65816. 6502 rozkaz inc @ uzna za nop, rozkaz xba uzna za sbc #. Dzięki takiej przezroczystości możemy być pewni że program nie wykona żadnej nielegalnej operacji i uczciwie rozpozna właściwy CPU. Pomysłodawcą tego zwięzłego i jakże sprytnego testu jest Ullrich von Bassewitz.

 org $2000

 opt c+                 ; 65816 enabled

 lda #0

 inc @                  ; increment accumulator

 cmp #1
 bcc cpu6502

; ostateczny test na obecnosc 65816

 xba           ; put $01 in B accu
 dec @         ; A=$00 if 65C02
 xba           ; get $01 back if 65816
 inc @         ; make $01/$02

 cmp #2
 bne cpu6502

cpu65816

 ldx <text65816
 ldy >text65816
 jsr $c642
 rts

cpu6502

 ldx <text6502
 ldy >text6502
 jsr $c642
 rts

text6502  dta c'6502',$9b
text65816 dta c'65816',$9b