]> git.sur5r.net Git - cc65/commitdiff
Added proper 65sc02, 65ce02 and 4510 detection.
authorMarco van den Heuvel <blackystardust68@yahoo.com>
Tue, 27 Feb 2018 03:19:13 +0000 (19:19 -0800)
committerMarco van den Heuvel <blackystardust68@yahoo.com>
Tue, 27 Feb 2018 03:19:13 +0000 (19:19 -0800)
include/6502.h
libsrc/common/getcpu.s

index 31398e5c10da1774467124f7ed3daaa1a628f897..55083b036f5a47620484455ab64f734adc4b7a3c 100644 (file)
@@ -51,6 +51,8 @@ typedef unsigned size_t;
 #define CPU_65C02       1
 #define CPU_65816       2
 #define CPU_4510        3
+#define CPU_65SC02      4
+#define CPU_65CE02      5
 
 unsigned char getcpu (void);
 /* Detect the CPU the program is running on */
index 1e60a5d39710d633498d37af518f24b3d96a09c3..764e73a84e3d8faf7523347f42c7c18543a6d761 100644 (file)
 ; Subroutine to detect an 816. Returns
 ;
 ;   - carry clear and 0 in A for a NMOS 6502 CPU
-;   - carry set and 1 in A for some CMOS 6502 CPU
+;   - carry set and 1 in A for a 65c02
 ;   - carry set and 2 in A for a 65816
 ;   - carry set and 3 in A for a 4510
+;   - carry set and 4 in A for a 65sc02
+;   - carry set and 5 in A for a 65ce02
 ;
 ; This function uses a $1A opcode which is a INA on the 816 and ignored
 ; (interpreted as a NOP) on a NMOS 6502. There are several CMOS versions
@@ -27,20 +29,40 @@ _getcpu:
         cmp     #1
         bcc     @L9
 
-; This is at least a 65C02, check for a 4510
+; This is at least a 65C02, check for a 65ce02/4510
 
-        .byte   $42,$ea         ; neg on 4510, nop #$ea on 65c02, wdm $ea on 65816
+        .byte   $42,$ea         ; neg on 65ce02/4510, nop #$ea on 65c02, wdm $ea on 65816
         cmp     #1
-        bne     @L8
+        beq     @L6
+
+; check for 4510
+
+        lda     #5              ; CPU_65CE02 constant
+        .byte   $5c             ; map on 4510, aug on 65ce02 (acts like 4 byte nop)
+        lda     #3              ; CPU_4510 constant
+        nop
+        bne     @L9
+
+; check for 65sc02
+
+@L6:    ldy     $f7
+        ldx     #$00
+        stx     $f7
+        .byte   $f7,$f7         ; nop nop on 65sc02, smb7 $f7 on 65c02 and 65816
+        ldx     $f7
+        sty     $f7
+        cpx     #$00
+        bne     @L7
+        lda     #4              ; CPU_65SC02 constant
+        bne     @L9
 
 ; check for 65816; after 4510, because $eb there is row (rotate word)
 
-        xba                     ; .byte $eb, put $01 in B accu
+@L7:    xba                     ; .byte $eb, put $01 in B accu
         dec     a               ; .byte $3a, A=$00 if 65C02
         xba                     ; .byte $eb, get $01 back if 65816
         inc     a               ; .byte $1a, make $01/$02
         .byte $2c               ; bit instruction to skip next command
-@L8:    lda     #3              ; CPU_4510 constant
 @L9:    ldx     #0              ; Load high byte of word
         rts