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.

593 lines
8.5 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, "strtol.c", 2969, 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 _strtol
; ---------------------------------------------------------------
; long __near__ __fastcall__ strtol (__near__ const unsigned char*, __near__ __near__ unsigned char**, int)
; ---------------------------------------------------------------
.segment "CODE"
.proc _strtol: near
.segment "CODE"
;
; {
;
.dbg line, "strtol.c", 10
jsr pushax
;
; register const char* S = nptr;
;
.dbg line, "strtol.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, "strtol.c", 12
ldx #$00
txa
jsr push0ax
;
; unsigned char Minus = 0;
;
.dbg line, "strtol.c", 13
jsr pusha
;
; unsigned char Ovf = 0;
;
.dbg line, "strtol.c", 14
jsr pusha
;
; unsigned CvtCount = 0;
;
.dbg line, "strtol.c", 15
jsr push0
;
; while (isspace (*S)) {
;
.dbg line, "strtol.c", 22
jsr decsp6
L0009: lda (regbank+4)
tay
lda __ctype,y
and #$60
beq L000A
;
; ++S;
;
.dbg line, "strtol.c", 23
inc regbank+4
bne L0009
inc regbank+4+1
;
; }
;
.dbg line, "strtol.c", 24
bra L0009
;
; switch (*S) {
;
.dbg line, "strtol.c", 27
L000A: lda (regbank+4)
;
; }
;
.dbg line, "strtol.c", 33
cmp #$2B
beq L001F
cmp #$2D
bne L0019
;
; Minus = 1;
;
.dbg line, "strtol.c", 29
lda #$01
ldy #$09
sta (sp),y
;
; ++S;
;
.dbg line, "strtol.c", 32
L001F: inc regbank+4
bne L0019
inc regbank+4+1
;
; if (base == 0) {
;
.dbg line, "strtol.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, "strtol.c", 39
lda (regbank+4)
cmp #$30
bne L0025
;
; ++S;
;
.dbg line, "strtol.c", 40
inc regbank+4
bne L0028
inc regbank+4+1
;
; if (*S == 'x' || *S == 'X') {
;
.dbg line, "strtol.c", 41
L0028: lda (regbank+4)
cmp #$78
beq L002A
lda (regbank+4)
cmp #$58
bne L0029
;
; ++S;
;
.dbg line, "strtol.c", 42
L002A: inc regbank+4
bne L002D
inc regbank+4+1
;
; base = 16;
;
.dbg line, "strtol.c", 43
L002D: tya
;
; } else {
;
.dbg line, "strtol.c", 44
bra L00B0
;
; base = 8;
;
.dbg line, "strtol.c", 45
L0029: lda #$08
ldy #$10
jsr staxysp
;
; } else {
;
.dbg line, "strtol.c", 47
bra L0037
;
; base = 10;
;
.dbg line, "strtol.c", 48
L0025: lda #$0A
L00B0: ldy #$10
jsr staxysp
;
; } else if (base == 16 && *S == '0' && (S[1] == 'x' || S[1] == 'X')) {
;
.dbg line, "strtol.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, "strtol.c", 51
L0038: lda #$02
clc
adc regbank+4
sta regbank+4
bcc L0037
inc regbank+4+1
;
; if (Minus) {
;
.dbg line, "strtol.c", 57
L0037: ldy #$09
lda (sp),y
beq L0043
;
; MaxVal = LONG_MIN;
;
.dbg line, "strtol.c", 58
ldy #$01
lda #$00
sta (sp),y
iny
sta (sp),y
iny
sta (sp),y
lda #$80
;
; } else {
;
.dbg line, "strtol.c", 59
bra L00B1
;
; MaxVal = LONG_MAX;
;
.dbg line, "strtol.c", 60
L0043: ldy #$01
dea
sta (sp),y
iny
sta (sp),y
iny
sta (sp),y
lda #$7F
L00B1: iny
sta (sp),y
;
; MaxDigit = MaxVal % base;
;
.dbg line, "strtol.c", 62
jsr ldeaxysp
jsr pusheax
ldy #$15
lda (sp),y
tax
dey
lda (sp),y
jsr axlong
jsr tosumodeax
sta (sp)
;
; MaxVal /= base;
;
.dbg line, "strtol.c", 63
ldy #$04
jsr ldeaxysp
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, "strtol.c", 69
L004F: lda (regbank+4)
tay
lda __ctype,y
and #$04
beq L0052
;
; DigitVal = *S - '0';
;
.dbg line, "strtol.c", 70
lda (regbank+4)
sec
sbc #$30
;
; } else if (isupper (*S)) {
;
.dbg line, "strtol.c", 71
bra L00B3
L0052: lda (regbank+4)
tay
lda __ctype,y
and #$02
beq L0060
;
; DigitVal = *S - ('A' - 10);
;
.dbg line, "strtol.c", 72
lda (regbank+4)
sec
sbc #$37
;
; } else if (islower (*S)) {
;
.dbg line, "strtol.c", 73
bra L00B3
L0060: lda (regbank+4)
tay
lda __ctype,y
and #$01
jeq L0050
;
; DigitVal = *S - ('a' - 10);
;
.dbg line, "strtol.c", 74
lda (regbank+4)
sec
sbc #$57
L00B3: ldy #$05
sta (sp),y
;
; if (DigitVal >= base) {
;
.dbg line, "strtol.c", 81
lda (sp),y
jsr pusha0
ldy #$13
lda (sp),y
tax
dey
lda (sp),y
jsr tosicmp
;
; break;
;
.dbg line, "strtol.c", 82
bcs L0050
;
; if (Val > MaxVal || (Val == MaxVal && DigitVal > MaxDigit)) {
;
.dbg line, "strtol.c", 86
ldy #$0D
jsr ldeaxysp
jsr pusheax
ldy #$08
jsr ldeaxysp
jsr tosugteax
bne L0081
ldy #$0D
jsr ldeaxysp
jsr pusheax
ldy #$08
jsr ldeaxysp
jsr toseqeax
beq L0080
ldy #$05
lda (sp),y
sec
sbc (sp)
sta tmp1
lda tmp1
beq L0080
bcc L0080
;
; Ovf = 1;
;
.dbg line, "strtol.c", 87
L0081: lda #$01
ldy #$08
sta (sp),y
;
; if (Ovf == 0) {
;
.dbg line, "strtol.c", 91
L0080: ldy #$08
lda (sp),y
bne L0088
;
; Val = (Val * base) + DigitVal;
;
.dbg line, "strtol.c", 92
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, "strtol.c", 93
ldy #$06
ldx #$00
lda #$01
jsr addeqysp
;
; ++S;
;
.dbg line, "strtol.c", 97
L0088: inc regbank+4
jne L004F
inc regbank+4+1
;
; }
;
.dbg line, "strtol.c", 98
jmp L004F
;
; if (endptr) {
;
.dbg line, "strtol.c", 103
L0050: ldy #$13
lda (sp),y
dey
ora (sp),y
beq L0098
;
; if (CvtCount > 0) {
;
.dbg line, "strtol.c", 104
ldy #$07
lda (sp),y
tax
dey
lda (sp),y
cpx #$00
bne L00AF
cmp #$00
beq L0092
;
; *endptr = (char*) S - 1;
;
.dbg line, "strtol.c", 105
L00AF: 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 L0097
dex
L0097: sta (sreg)
ldy #$01
txa
sta (sreg),y
;
; } else {
;
.dbg line, "strtol.c", 106
bra L0098
;
; *endptr = (char*) nptr;
;
.dbg line, "strtol.c", 107
L0092: 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, "strtol.c", 112
L0098: ldy #$08
lda (sp),y
beq L00A5
;
; errno = ERANGE;
;
.dbg line, "strtol.c", 113
jsr __maperrno
ldx #$00
lda #$0F
sta __errno
stz __errno+1
;
; if (Minus) {
;
.dbg line, "strtol.c", 114
ldy #$09
lda (sp),y
beq L00A1
;
; return LONG_MIN;
;
.dbg line, "strtol.c", 115
stz sreg
lda #$80
sta sreg+1
txa
bra L00AA
;
; return LONG_MAX;
;
.dbg line, "strtol.c", 117
L00A1: dex
stx sreg
lda #$7F
sta sreg+1
txa
bra L00AA
;
; if (Minus) {
;
.dbg line, "strtol.c", 122
L00A5: iny
lda (sp),y
beq L00A7
;
; return -(long)Val;
;
.dbg line, "strtol.c", 123
ldy #$0D
jsr ldeaxysp
jsr negeax
bra L00AA
;
; return Val;
;
.dbg line, "strtol.c", 125
L00A7: ldy #$0D
jsr ldeaxysp
;
; }
;
.dbg line, "strtol.c", 127
L00AA: pha
ldy #$0E
lda (sp),y
sta regbank+4
iny
lda (sp),y
sta regbank+5
pla
ldy #$16
jmp addysp
.dbg line
.endproc