mirror of https://github.com/cc65/cc65.git
Compare commits
22 Commits
0faf13c98f
...
2b1aea79fc
Author | SHA1 | Date |
---|---|---|
Colin Leroy-Mira | 2b1aea79fc | |
Colin Leroy-Mira | 793aa48a49 | |
Colin Leroy-Mira | a823d90082 | |
mrdudz | b993d88339 | |
Bob Andrews | 25967e65b5 | |
Bob Andrews | a372ead4de | |
Bob Andrews | 081d18f7d7 | |
Bob Andrews | a293920fb3 | |
Bob Andrews | 60c75bdb54 | |
Sven Michael Klose | 1fe12f112e | |
Sven Michael Klose | a887b29ffb | |
acqn | 731f349b24 | |
acqn | 98767741ce | |
acqn | 9b2d27d1e1 | |
acqn | 23aa562094 | |
Bob Andrews | 5c3ff714ae | |
Sven Michael Klose | 294b034920 | |
Stefan | ab0eb4fe58 | |
Stefan | 8d4946b3f4 | |
Sven Michael Klose | 3a7bd53956 | |
Sven Michael Klose | 8173c850fd | |
Carlo Bramini | b04d79b1da |
|
@ -15,7 +15,7 @@ CPU_ISET_4510 = $0400
|
|||
CPU_NONE = CPU_ISET_NONE
|
||||
CPU_6502 = CPU_ISET_6502
|
||||
CPU_6502X = CPU_ISET_6502|CPU_ISET_6502X
|
||||
CPU_6502DTV = CPU_ISET_6502|CPU_ISET_6502X|CPU_ISET_6502DTV
|
||||
CPU_6502DTV = CPU_ISET_6502|CPU_ISET_6502DTV
|
||||
CPU_65SC02 = CPU_ISET_6502|CPU_ISET_65SC02
|
||||
CPU_65C02 = CPU_ISET_6502|CPU_ISET_65SC02|CPU_ISET_65C02
|
||||
CPU_65816 = CPU_ISET_6502|CPU_ISET_65SC02|CPU_ISET_65816
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
# Assembly program configuration for expanded VICs (>= +8K).
|
||||
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $1201;
|
||||
}
|
||||
SYMBOLS {
|
||||
__LOADADDR__: type = import;
|
||||
}
|
||||
MEMORY {
|
||||
ZP: file = "", start = $0002, size = $001A, define = yes;
|
||||
LOADADDR: file = %O, start = %S - 2, size = $0002;
|
||||
MAIN: file = %O, start = %S, size = $8000 - %S;
|
||||
}
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp, optional = yes;
|
||||
LOADADDR: load = LOADADDR, type = ro;
|
||||
CODE: load = MAIN, type = ro;
|
||||
RODATA: load = MAIN, type = ro;
|
||||
DATA: load = MAIN, type = rw;
|
||||
BSS: load = MAIN, type = bss, optional = yes, define = yes;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
# Assembly program configuration for expanded VICs (+3K only).
|
||||
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $0401;
|
||||
}
|
||||
SYMBOLS {
|
||||
__LOADADDR__: type = import;
|
||||
}
|
||||
MEMORY {
|
||||
ZP: file = "", start = $0002, size = $001A, define = yes;
|
||||
LOADADDR: file = %O, start = %S - 2, size = $0002;
|
||||
MAIN: file = %O, start = %S, size = $1E00 - %S;
|
||||
}
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp, optional = yes;
|
||||
LOADADDR: load = LOADADDR, type = ro;
|
||||
CODE: load = MAIN, type = ro;
|
||||
RODATA: load = MAIN, type = ro;
|
||||
DATA: load = MAIN, type = rw;
|
||||
BSS: load = MAIN, type = bss, optional = yes, define = yes;
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
# Assembly program configuration for unexpanded VICs.
|
||||
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $1001;
|
||||
}
|
||||
|
@ -7,7 +9,7 @@ SYMBOLS {
|
|||
MEMORY {
|
||||
ZP: file = "", start = $0002, size = $001A, define = yes;
|
||||
LOADADDR: file = %O, start = %S - 2, size = $0002;
|
||||
MAIN: file = %O, start = %S, size = $0DF3 - %S;
|
||||
MAIN: file = %O, start = %S, size = $1E00 - %S;
|
||||
}
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp, optional = yes;
|
||||
|
|
|
@ -780,6 +780,7 @@ communication, see also <tt>testcode/lib/ser-test.c</tt>.
|
|||
<item><ref id="strqtok" name="strqtok">
|
||||
<item><ref id="strrchr" name="strrchr">
|
||||
<item><ref id="strspn" name="strspn">
|
||||
<item><ref id="strcasestr" name="strcasestr">
|
||||
<item><ref id="strstr" name="strstr">
|
||||
<item><ref id="strtok" name="strtok">
|
||||
<item><ref id="strxfrm" name="strxfrm">
|
||||
|
@ -7899,22 +7900,47 @@ be used in presence of a prototype.
|
|||
</quote>
|
||||
|
||||
|
||||
<sect1>strstr<label id="strstr"><p>
|
||||
<sect1>strcasestr<label id="strcasestr"><p>
|
||||
|
||||
<quote>
|
||||
<descrip>
|
||||
<tag/Function/Find a substring.
|
||||
<tag/Function/Find a substring, case-insensitive.
|
||||
<tag/Header/<tt/<ref id="string.h" name="string.h">/
|
||||
<tag/Declaration/<tt/char* __fastcall__ strstr (const char* str, const char* substr);/
|
||||
<tag/Description/<tt/strstr/ searches for the first occurrence of the string
|
||||
<tt/substr/ within <tt/str/. If found, it returns a pointer to the copy,
|
||||
otherwise it returns <tt/NULL/.
|
||||
<tag/Declaration/<tt/char* __fastcall__ strcasestr (const char* str, const char* substr);/
|
||||
<tag/Description/<tt/strcasestr/ searches for the first occurrence of the string
|
||||
<tt/substr/ within <tt/str/. If found, it returns a pointer to the start of the
|
||||
match in <tt/str/, otherwise it returns <tt/NULL/.
|
||||
<tag/Notes/<itemize>
|
||||
<item>The function is only available as fastcall function, so it may only
|
||||
be used in presence of a prototype.
|
||||
</itemize>
|
||||
<tag/Availability/ISO 9899
|
||||
<tag/See also/
|
||||
<ref id="strstr" name="strstr">,
|
||||
<ref id="strcspn" name="strcspn">,
|
||||
<ref id="strspn" name="strspn">
|
||||
<tag/Example/None.
|
||||
</descrip>
|
||||
</quote>
|
||||
|
||||
|
||||
<sect1>strstr<label id="strstr"><p>
|
||||
|
||||
<quote>
|
||||
<descrip>
|
||||
<tag/Function/Find a substring, case-sensitive.
|
||||
<tag/Header/<tt/<ref id="string.h" name="string.h">/
|
||||
<tag/Declaration/<tt/char* __fastcall__ strstr (const char* str, const char* substr);/
|
||||
<tag/Description/<tt/strstr/ searches for the first occurrence of the string
|
||||
<tt/substr/ within <tt/str/. If found, it returns a pointer to the start of the
|
||||
match in <tt/str/, otherwise it returns <tt/NULL/.
|
||||
<tag/Notes/<itemize>
|
||||
<item>The function is only available as fastcall function, so it may only
|
||||
be used in presence of a prototype.
|
||||
</itemize>
|
||||
<tag/Availability/ISO 9899
|
||||
<tag/See also/
|
||||
<ref id="strcasestr" name="strcasestr">,
|
||||
<ref id="strcspn" name="strcspn">,
|
||||
<ref id="strspn" name="strspn">
|
||||
<tag/Example/None.
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
;
|
||||
; Ullrich von Bassewitz, 11.12.1998
|
||||
;
|
||||
; char* strcasestr (const char* haystack, const char* needle);
|
||||
;
|
||||
|
||||
.export _strcasestr
|
||||
.import popptr1, return0, tolowerdirect
|
||||
.importzp ptr1, ptr2, ptr3, ptr4, tmp1, tmp2, tmp3, tmp4
|
||||
.include "ctype.inc"
|
||||
|
||||
.segment "LOWCODE"
|
||||
|
||||
_strcasestr:
|
||||
sta ptr2 ; Save needle
|
||||
stx ptr2+1
|
||||
sta ptr4 ; Setup temp copy for later
|
||||
|
||||
jsr popptr1 ; Get haystack to ptr1
|
||||
|
||||
; If needle is empty, return haystack
|
||||
|
||||
; ldy #$00 Y=0 guaranteed by popptr1
|
||||
lda (ptr2),y ; Get first byte of needle
|
||||
beq @Found ; Needle is empty --> we're done
|
||||
|
||||
; Search for the beginning of the string (this is not an optimal search
|
||||
; strategy [in fact, it's pretty dumb], but it's simple to implement).
|
||||
|
||||
jsr tolowerdirect ; Lowercase
|
||||
sta tmp1 ; Save start of needle
|
||||
@L1: lda (ptr1),y ; Get next char from haystack
|
||||
beq @NotFound ; Jump if end
|
||||
|
||||
jsr tolowerdirect ; Lowercase
|
||||
cmp tmp1 ; Start of needle found?
|
||||
beq @L2 ; Jump if so
|
||||
iny ; Next char
|
||||
bne @L1
|
||||
inc ptr1+1 ; Bump high byte
|
||||
bne @L1 ; Branch always
|
||||
|
||||
; We found the start of needle in haystack
|
||||
|
||||
@L2: tya ; Get offset
|
||||
clc
|
||||
adc ptr1
|
||||
sta ptr1 ; Make ptr1 point to start
|
||||
bcc @L3
|
||||
inc ptr1+1
|
||||
|
||||
; ptr1 points to the start of needle in haystack now. Setup temporary pointers for the
|
||||
; search. The low byte of ptr4 is already set.
|
||||
|
||||
@L3: sta ptr3
|
||||
lda ptr1+1
|
||||
sta ptr3+1
|
||||
lda ptr2+1
|
||||
sta ptr4+1
|
||||
ldy #1 ; First char is identical, so start on second
|
||||
|
||||
; Do the compare
|
||||
|
||||
@L4: lda (ptr4),y ; Get char from needle
|
||||
beq @Found ; Jump if end of needle (-> found)
|
||||
|
||||
jsr tolowerdirect ; Lowercase
|
||||
sta tmp2
|
||||
|
||||
lda (ptr3),y ; Compare with haystack
|
||||
|
||||
jsr tolowerdirect ; Lowercase
|
||||
cmp tmp2
|
||||
bne @L5 ; Jump if not equal
|
||||
iny ; Next char
|
||||
bne @L4
|
||||
inc ptr3+1
|
||||
inc ptr4+1 ; Bump hi byte of pointers
|
||||
bne @L4 ; Next char (branch always)
|
||||
|
||||
; The strings did not compare equal, search next start of needle
|
||||
|
||||
@L5: ldy #1 ; Start after this char
|
||||
bne @L1 ; Branch always
|
||||
|
||||
; We found the start of needle
|
||||
|
||||
@Found: lda ptr1
|
||||
ldx ptr1+1
|
||||
rts
|
||||
|
||||
; We reached end of haystack without finding needle
|
||||
|
||||
@NotFound:
|
||||
jmp return0 ; return NULL
|
|
@ -4,20 +4,11 @@
|
|||
; char* strstr (const char* haystack, const char* needle);
|
||||
;
|
||||
|
||||
.export _strstr, _strcasestr
|
||||
.import popptr1, return0, tolowerdirect
|
||||
.importzp ptr1, ptr2, ptr3, ptr4, tmp1, tmp2
|
||||
|
||||
maybe_lower: ; Lowercase char in A if needed
|
||||
jmp tolowerdirect ; patched on entry with either JMP or RTS
|
||||
.export _strstr
|
||||
.import popptr1
|
||||
.importzp ptr1, ptr2, ptr3, ptr4, tmp1
|
||||
|
||||
_strstr:
|
||||
ldy #$60 ; RTS
|
||||
bne :+
|
||||
_strcasestr:
|
||||
ldy #$4C ; JMP absolute
|
||||
: sty maybe_lower
|
||||
|
||||
sta ptr2 ; Save needle
|
||||
stx ptr2+1
|
||||
sta ptr4 ; Setup temp copy for later
|
||||
|
@ -33,12 +24,9 @@ _strcasestr:
|
|||
; Search for the beginning of the string (this is not an optimal search
|
||||
; strategy [in fact, it's pretty dumb], but it's simple to implement).
|
||||
|
||||
jsr maybe_lower ; Lowercase if needed
|
||||
sta tmp1 ; Save start of needle
|
||||
@L1: lda (ptr1),y ; Get next char from haystack
|
||||
beq @NotFound ; Jump if end
|
||||
|
||||
jsr maybe_lower ; Lowercase if needed
|
||||
cmp tmp1 ; Start of needle found?
|
||||
beq @L2 ; Jump if so
|
||||
iny ; Next char
|
||||
|
@ -55,7 +43,7 @@ _strcasestr:
|
|||
bcc @L3
|
||||
inc ptr1+1
|
||||
|
||||
; ptr1 points to the start of needle in haystack now. Setup temporary pointers for the
|
||||
; ptr1 points to the start of needle now. Setup temporary pointers for the
|
||||
; search. The low byte of ptr4 is already set.
|
||||
|
||||
@L3: sta ptr3
|
||||
|
@ -69,14 +57,7 @@ _strcasestr:
|
|||
|
||||
@L4: lda (ptr4),y ; Get char from needle
|
||||
beq @Found ; Jump if end of needle (-> found)
|
||||
|
||||
jsr maybe_lower ; Lowercase if needed
|
||||
sta tmp2
|
||||
|
||||
lda (ptr3),y ; Compare with haystack
|
||||
|
||||
jsr maybe_lower ; Lowercase if needed
|
||||
cmp tmp2
|
||||
cmp (ptr3),y ; Compare with haystack
|
||||
bne @L5 ; Jump if not equal
|
||||
iny ; Next char
|
||||
bne @L4
|
||||
|
@ -98,4 +79,6 @@ _strcasestr:
|
|||
; We reached end of haystack without finding needle
|
||||
|
||||
@NotFound:
|
||||
jmp return0 ; return NULL
|
||||
lda #$00 ; return NULL
|
||||
tax
|
||||
rts
|
||||
|
|
|
@ -9,11 +9,21 @@
|
|||
.import __MAIN_START__
|
||||
.import startup
|
||||
|
||||
.macpack cpu
|
||||
|
||||
.segment "EXEHDR"
|
||||
|
||||
.byte $73, $69, $6D, $36, $35 ; 'sim65'
|
||||
.byte 2 ; header version
|
||||
.byte .defined(__SIM65C02__) ; CPU type
|
||||
.if (.cpu .bitand ::CPU_ISET_6502X)
|
||||
.byte 2
|
||||
.elseif (.cpu .bitand ::CPU_ISET_65C02)
|
||||
.byte 1
|
||||
.elseif (.cpu .bitand ::CPU_ISET_6502)
|
||||
.byte 0
|
||||
.else
|
||||
.error Unknow CPU type.
|
||||
.endif
|
||||
.byte sp ; sp address
|
||||
.addr __MAIN_START__ ; load address
|
||||
.addr startup ; reset address
|
||||
|
|
1048
src/cc65/declare.c
1048
src/cc65/declare.c
File diff suppressed because it is too large
Load Diff
|
@ -3272,7 +3272,7 @@ static void parsesub (ExprDesc* Expr)
|
|||
/* The right hand side is constant. Check left hand side. */
|
||||
if (ED_IsQuasiConst (Expr)) {
|
||||
/* We can't do all 'ptr1 - ptr2' constantly at the moment */
|
||||
if (Expr->Sym == Expr2.Sym) {
|
||||
if (ED_GetLoc (Expr) == ED_GetLoc (&Expr2) && Expr->Sym == Expr2.Sym) {
|
||||
Expr->IVal = (Expr->IVal - Expr2.IVal) / rscale;
|
||||
/* Get rid of unneeded flags etc. */
|
||||
ED_MakeConstAbsInt (Expr, Expr->IVal);
|
||||
|
|
|
@ -231,9 +231,11 @@ static int findToken (const char * const *tokenTbl, const char *token)
|
|||
/* takes as input table of tokens and token, returns position in table or -1 if not found */
|
||||
int i;
|
||||
|
||||
for (i = 0; tokenTbl[i][0]; i++) {
|
||||
if (strcmp (tokenTbl[i], token) == 0) {
|
||||
return i;
|
||||
if (token != NULL) {
|
||||
for (i = 0; tokenTbl[i][0]; i++) {
|
||||
if (strcmp (tokenTbl[i], token) == 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
2703
src/sim65/6502.c
2703
src/sim65/6502.c
File diff suppressed because it is too large
Load Diff
|
@ -47,7 +47,8 @@
|
|||
/* Supported CPUs */
|
||||
typedef enum CPUType {
|
||||
CPU_6502,
|
||||
CPU_65C02
|
||||
CPU_65C02,
|
||||
CPU_6502X
|
||||
} CPUType;
|
||||
|
||||
/* Current CPU */
|
||||
|
|
|
@ -177,10 +177,16 @@ static unsigned char ReadProgramFile (void)
|
|||
|
||||
/* Get the CPU type from the file header */
|
||||
if ((Val = fgetc(F)) != EOF) {
|
||||
if (Val != CPU_6502 && Val != CPU_65C02) {
|
||||
switch (Val) {
|
||||
case CPU_6502:
|
||||
case CPU_65C02:
|
||||
case CPU_6502X:
|
||||
CPU = Val;
|
||||
break;
|
||||
|
||||
default:
|
||||
Error ("'%s': Invalid CPU type", ProgramFile);
|
||||
}
|
||||
CPU = Val;
|
||||
}
|
||||
|
||||
/* Get the address of sp from the file header */
|
||||
|
|
|
@ -12,23 +12,25 @@ endif
|
|||
|
||||
WORKDIR = ../testwrk/asm
|
||||
|
||||
SUBDIRS = cpudetect opcodes listing val err misc
|
||||
|
||||
.PHONY: all continue mostlyclean clean
|
||||
|
||||
all: mostlyclean continue
|
||||
|
||||
define CALL_template
|
||||
continue: mostlyclean
|
||||
@$(MAKE) -C cpudetect all
|
||||
@$(MAKE) -C opcodes all
|
||||
@$(MAKE) -C listing all
|
||||
@$(MAKE) -C val all
|
||||
@$(MAKE) -C err all
|
||||
@$(MAKE) -C misc all
|
||||
|
||||
continue::
|
||||
@$(MAKE) -C $1 all
|
||||
|
||||
mostlyclean::
|
||||
@$(MAKE) -C $1 clean
|
||||
|
||||
endef
|
||||
|
||||
$(foreach subdir,$(SUBDIRS),$(eval $(call CALL_template,$(subdir))))
|
||||
mostlyclean:
|
||||
@$(MAKE) -C cpudetect clean
|
||||
@$(MAKE) -C opcodes clean
|
||||
@$(MAKE) -C listing clean
|
||||
@$(MAKE) -C val clean
|
||||
@$(MAKE) -C err clean
|
||||
@$(MAKE) -C misc clean
|
||||
|
||||
clean: mostlyclean
|
||||
@$(call RMDIR,$(WORKDIR))
|
||||
|
|
Loading…
Reference in New Issue