You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
542 lines
7.9 KiB
ArmAsm
542 lines
7.9 KiB
ArmAsm
;
|
|
; File generated by cc65 v 2.13.3
|
|
;
|
|
.fopt compiler,"cc65 v 2.13.3"
|
|
.setcpu "65C02"
|
|
.smart on
|
|
.autoimport on
|
|
.case on
|
|
.debuginfo on
|
|
.importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
|
|
.macpack longbranch
|
|
.dbg file, "strtoul.c", 2843, 1667622315
|
|
.dbg file, "../../include/limits.h", 2978, 1667622315
|
|
.dbg file, "../../include/ctype.h", 7770, 1667622315
|
|
.dbg file, "../../include/errno.h", 3647, 1667622315
|
|
.dbg file, "../../include/stdlib.h", 5578, 1667622315
|
|
.import __ctype
|
|
.import __maperrno
|
|
.import __errno
|
|
.export _strtoul
|
|
|
|
; ---------------------------------------------------------------
|
|
; unsigned long __near__ __fastcall__ strtoul (__near__ const unsigned char*, __near__ __near__ unsigned char**, int)
|
|
; ---------------------------------------------------------------
|
|
|
|
.segment "CODE"
|
|
|
|
.proc _strtoul: near
|
|
|
|
.segment "CODE"
|
|
|
|
;
|
|
; {
|
|
;
|
|
.dbg line, "strtoul.c", 10
|
|
jsr pushax
|
|
;
|
|
; register const char* S = nptr;
|
|
;
|
|
.dbg line, "strtoul.c", 11
|
|
lda regbank+4
|
|
ldx regbank+5
|
|
jsr pushax
|
|
ldy #$07
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
sta regbank+4
|
|
stx regbank+4+1
|
|
;
|
|
; unsigned long Val = 0;
|
|
;
|
|
.dbg line, "strtoul.c", 12
|
|
ldx #$00
|
|
txa
|
|
jsr push0ax
|
|
;
|
|
; unsigned char Minus = 0;
|
|
;
|
|
.dbg line, "strtoul.c", 13
|
|
jsr pusha
|
|
;
|
|
; unsigned char Ovf = 0;
|
|
;
|
|
.dbg line, "strtoul.c", 14
|
|
jsr pusha
|
|
;
|
|
; unsigned CvtCount = 0;
|
|
;
|
|
.dbg line, "strtoul.c", 15
|
|
jsr push0
|
|
;
|
|
; while (isspace (*S)) {
|
|
;
|
|
.dbg line, "strtoul.c", 22
|
|
jsr decsp6
|
|
L0009: lda (regbank+4)
|
|
tay
|
|
lda __ctype,y
|
|
and #$60
|
|
beq L000A
|
|
;
|
|
; ++S;
|
|
;
|
|
.dbg line, "strtoul.c", 23
|
|
inc regbank+4
|
|
bne L0009
|
|
inc regbank+4+1
|
|
;
|
|
; }
|
|
;
|
|
.dbg line, "strtoul.c", 24
|
|
bra L0009
|
|
;
|
|
; switch (*S) {
|
|
;
|
|
.dbg line, "strtoul.c", 27
|
|
L000A: lda (regbank+4)
|
|
;
|
|
; }
|
|
;
|
|
.dbg line, "strtoul.c", 33
|
|
cmp #$2B
|
|
beq L001F
|
|
cmp #$2D
|
|
bne L0019
|
|
;
|
|
; Minus = 1;
|
|
;
|
|
.dbg line, "strtoul.c", 29
|
|
lda #$01
|
|
ldy #$09
|
|
sta (sp),y
|
|
;
|
|
; ++S;
|
|
;
|
|
.dbg line, "strtoul.c", 32
|
|
L001F: inc regbank+4
|
|
bne L0019
|
|
inc regbank+4+1
|
|
;
|
|
; if (base == 0) {
|
|
;
|
|
.dbg line, "strtoul.c", 38
|
|
L0019: ldy #$11
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
cpx #$00
|
|
bne L0022
|
|
cmp #$00
|
|
bne L0022
|
|
;
|
|
; if (*S == '0') {
|
|
;
|
|
.dbg line, "strtoul.c", 39
|
|
lda (regbank+4)
|
|
cmp #$30
|
|
bne L0025
|
|
;
|
|
; ++S;
|
|
;
|
|
.dbg line, "strtoul.c", 40
|
|
inc regbank+4
|
|
bne L0028
|
|
inc regbank+4+1
|
|
;
|
|
; if (*S == 'x' || *S == 'X') {
|
|
;
|
|
.dbg line, "strtoul.c", 41
|
|
L0028: lda (regbank+4)
|
|
cmp #$78
|
|
beq L002A
|
|
lda (regbank+4)
|
|
cmp #$58
|
|
bne L0029
|
|
;
|
|
; ++S;
|
|
;
|
|
.dbg line, "strtoul.c", 42
|
|
L002A: inc regbank+4
|
|
bne L002D
|
|
inc regbank+4+1
|
|
;
|
|
; base = 16;
|
|
;
|
|
.dbg line, "strtoul.c", 43
|
|
L002D: tya
|
|
;
|
|
; } else {
|
|
;
|
|
.dbg line, "strtoul.c", 44
|
|
bra L00A2
|
|
;
|
|
; base = 8;
|
|
;
|
|
.dbg line, "strtoul.c", 45
|
|
L0029: lda #$08
|
|
ldy #$10
|
|
jsr staxysp
|
|
;
|
|
; } else {
|
|
;
|
|
.dbg line, "strtoul.c", 47
|
|
bra L0037
|
|
;
|
|
; base = 10;
|
|
;
|
|
.dbg line, "strtoul.c", 48
|
|
L0025: lda #$0A
|
|
L00A2: ldy #$10
|
|
jsr staxysp
|
|
;
|
|
; } else if (base == 16 && *S == '0' && (S[1] == 'x' || S[1] == 'X')) {
|
|
;
|
|
.dbg line, "strtoul.c", 50
|
|
bra L0037
|
|
L0022: iny
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
cpx #$00
|
|
bne L0037
|
|
cmp #$10
|
|
bne L0037
|
|
lda (regbank+4)
|
|
cmp #$30
|
|
bne L0037
|
|
ldy #$01
|
|
lda (regbank+4),y
|
|
cmp #$78
|
|
beq L0038
|
|
lda (regbank+4),y
|
|
cmp #$58
|
|
bne L0037
|
|
;
|
|
; S += 2;
|
|
;
|
|
.dbg line, "strtoul.c", 51
|
|
L0038: lda #$02
|
|
clc
|
|
adc regbank+4
|
|
sta regbank+4
|
|
bcc L0037
|
|
inc regbank+4+1
|
|
;
|
|
; MaxDigit = ULONG_MAX % base;
|
|
;
|
|
.dbg line, "strtoul.c", 57
|
|
L0037: ldx #$FF
|
|
stx sreg
|
|
stx sreg+1
|
|
txa
|
|
jsr pusheax
|
|
ldy #$15
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
jsr axlong
|
|
jsr tosumodeax
|
|
sta (sp)
|
|
;
|
|
; MaxVal = ULONG_MAX / base;
|
|
;
|
|
.dbg line, "strtoul.c", 58
|
|
ldx #$FF
|
|
stx sreg
|
|
stx sreg+1
|
|
txa
|
|
jsr pusheax
|
|
ldy #$15
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
jsr axlong
|
|
jsr tosudiveax
|
|
ldy #$01
|
|
jsr steaxysp
|
|
;
|
|
; if (isdigit (*S)) {
|
|
;
|
|
.dbg line, "strtoul.c", 64
|
|
L0047: lda (regbank+4)
|
|
tay
|
|
lda __ctype,y
|
|
and #$04
|
|
beq L004A
|
|
;
|
|
; DigitVal = *S - '0';
|
|
;
|
|
.dbg line, "strtoul.c", 65
|
|
lda (regbank+4)
|
|
sec
|
|
sbc #$30
|
|
;
|
|
; } else if (isupper (*S)) {
|
|
;
|
|
.dbg line, "strtoul.c", 66
|
|
bra L00A4
|
|
L004A: lda (regbank+4)
|
|
tay
|
|
lda __ctype,y
|
|
and #$02
|
|
beq L0058
|
|
;
|
|
; DigitVal = *S - ('A' - 10);
|
|
;
|
|
.dbg line, "strtoul.c", 67
|
|
lda (regbank+4)
|
|
sec
|
|
sbc #$37
|
|
;
|
|
; } else if (islower (*S)) {
|
|
;
|
|
.dbg line, "strtoul.c", 68
|
|
bra L00A4
|
|
L0058: lda (regbank+4)
|
|
tay
|
|
lda __ctype,y
|
|
and #$01
|
|
jeq L0048
|
|
;
|
|
; DigitVal = *S - ('a' - 10);
|
|
;
|
|
.dbg line, "strtoul.c", 69
|
|
lda (regbank+4)
|
|
sec
|
|
sbc #$57
|
|
L00A4: ldy #$05
|
|
sta (sp),y
|
|
;
|
|
; if (DigitVal >= base) {
|
|
;
|
|
.dbg line, "strtoul.c", 76
|
|
lda (sp),y
|
|
jsr pusha0
|
|
ldy #$13
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
jsr tosicmp
|
|
;
|
|
; break;
|
|
;
|
|
.dbg line, "strtoul.c", 77
|
|
bcs L0048
|
|
;
|
|
; if (Val > MaxVal || (Val == MaxVal && DigitVal > MaxDigit)) {
|
|
;
|
|
.dbg line, "strtoul.c", 81
|
|
ldy #$0D
|
|
jsr ldeaxysp
|
|
jsr pusheax
|
|
ldy #$08
|
|
jsr ldeaxysp
|
|
jsr tosugteax
|
|
bne L0079
|
|
ldy #$0D
|
|
jsr ldeaxysp
|
|
jsr pusheax
|
|
ldy #$08
|
|
jsr ldeaxysp
|
|
jsr toseqeax
|
|
beq L0078
|
|
ldy #$05
|
|
lda (sp),y
|
|
sec
|
|
sbc (sp)
|
|
sta tmp1
|
|
lda tmp1
|
|
beq L0078
|
|
bcc L0078
|
|
;
|
|
; Ovf = 1;
|
|
;
|
|
.dbg line, "strtoul.c", 82
|
|
L0079: lda #$01
|
|
ldy #$08
|
|
sta (sp),y
|
|
;
|
|
; if (Ovf == 0) {
|
|
;
|
|
.dbg line, "strtoul.c", 86
|
|
L0078: ldy #$08
|
|
lda (sp),y
|
|
bne L0080
|
|
;
|
|
; Val = (Val * base) + DigitVal;
|
|
;
|
|
.dbg line, "strtoul.c", 87
|
|
ldy #$0D
|
|
jsr ldeaxysp
|
|
jsr pusheax
|
|
ldy #$15
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
jsr axlong
|
|
jsr tosumuleax
|
|
jsr pusheax
|
|
ldy #$09
|
|
ldx #$00
|
|
lda (sp),y
|
|
jsr tosadd0ax
|
|
ldy #$0A
|
|
jsr steaxysp
|
|
;
|
|
; ++CvtCount;
|
|
;
|
|
.dbg line, "strtoul.c", 88
|
|
ldy #$06
|
|
ldx #$00
|
|
lda #$01
|
|
jsr addeqysp
|
|
;
|
|
; ++S;
|
|
;
|
|
.dbg line, "strtoul.c", 92
|
|
L0080: inc regbank+4
|
|
jne L0047
|
|
inc regbank+4+1
|
|
;
|
|
; }
|
|
;
|
|
.dbg line, "strtoul.c", 93
|
|
jmp L0047
|
|
;
|
|
; if (endptr) {
|
|
;
|
|
.dbg line, "strtoul.c", 98
|
|
L0048: ldy #$13
|
|
lda (sp),y
|
|
dey
|
|
ora (sp),y
|
|
beq L0090
|
|
;
|
|
; if (CvtCount > 0) {
|
|
;
|
|
.dbg line, "strtoul.c", 99
|
|
ldy #$07
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
cpx #$00
|
|
bne L00A1
|
|
cmp #$00
|
|
beq L008A
|
|
;
|
|
; *endptr = (char*) S - 1;
|
|
;
|
|
.dbg line, "strtoul.c", 100
|
|
L00A1: ldy #$13
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
sta sreg
|
|
stx sreg+1
|
|
lda regbank+4
|
|
ldx regbank+4+1
|
|
sec
|
|
sbc #$01
|
|
bcs L008F
|
|
dex
|
|
L008F: sta (sreg)
|
|
ldy #$01
|
|
txa
|
|
sta (sreg),y
|
|
;
|
|
; } else {
|
|
;
|
|
.dbg line, "strtoul.c", 101
|
|
bra L0090
|
|
;
|
|
; *endptr = (char*) nptr;
|
|
;
|
|
.dbg line, "strtoul.c", 102
|
|
L008A: ldy #$13
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
jsr pushax
|
|
ldy #$17
|
|
lda (sp),y
|
|
tax
|
|
dey
|
|
lda (sp),y
|
|
ldy #$00
|
|
jsr staxspidx
|
|
;
|
|
; if (Ovf) {
|
|
;
|
|
.dbg line, "strtoul.c", 107
|
|
L0090: ldy #$08
|
|
lda (sp),y
|
|
beq L0093
|
|
;
|
|
; errno = ERANGE;
|
|
;
|
|
.dbg line, "strtoul.c", 108
|
|
jsr __maperrno
|
|
lda #$0F
|
|
sta __errno
|
|
stz __errno+1
|
|
;
|
|
; return ULONG_MAX;
|
|
;
|
|
.dbg line, "strtoul.c", 109
|
|
ldx #$FF
|
|
stx sreg
|
|
stx sreg+1
|
|
txa
|
|
bra L009D
|
|
;
|
|
; if (Minus) {
|
|
;
|
|
.dbg line, "strtoul.c", 113
|
|
L0093: iny
|
|
lda (sp),y
|
|
beq L009A
|
|
;
|
|
; return (unsigned long) -(long)Val;
|
|
;
|
|
.dbg line, "strtoul.c", 114
|
|
ldy #$0D
|
|
jsr ldeaxysp
|
|
jsr negeax
|
|
bra L009D
|
|
;
|
|
; return Val;
|
|
;
|
|
.dbg line, "strtoul.c", 116
|
|
L009A: ldy #$0D
|
|
jsr ldeaxysp
|
|
;
|
|
; }
|
|
;
|
|
.dbg line, "strtoul.c", 118
|
|
L009D: pha
|
|
ldy #$0E
|
|
lda (sp),y
|
|
sta regbank+4
|
|
iny
|
|
lda (sp),y
|
|
sta regbank+5
|
|
pla
|
|
ldy #$16
|
|
jmp addysp
|
|
.dbg line
|
|
|
|
.endproc
|
|
|