; ; File generated by cc65 v 2.11.0 ; .fopt compiler,"cc65 v 2.11.0" .setcpu "6502" .smart on .autoimport on .case on .debuginfo on .importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2 .macpack longbranch .dbg file, "mktime.c", 6703, 1068590022 .dbg file, "../../include/limits.h", 2978, 1039954353 .dbg file, "../../include/stdlib.h", 5287, 1122210074 .dbg file, "../../include/time.h", 4812, 1121601586 .import _div .export _mktime .segment "RODATA" _MonthLength: .byte $1F .byte $1C .byte $1F .byte $1E .byte $1F .byte $1E .byte $1F .byte $1F .byte $1E .byte $1F .byte $1E .byte $1F _MonthDays: .word $0000 .word $001F .word $003B .word $005A .word $0078 .word $0097 .word $00B5 .word $00D4 .word $00F3 .word $0111 .word $0130 .word $014E ; --------------------------------------------------------------- ; unsigned long __fastcall__ mktime (register struct tm*) ; --------------------------------------------------------------- .segment "CODE" .proc _mktime .segment "CODE" ; ; { ; .dbg line, "mktime.c", 83 jsr pushax ldy #$00 ldx #$04 jsr regswap2 ; ; register div_t D; ; .dbg line, "mktime.c", 84 jsr decsp4 ldy #$03 L002B: lda regbank-1,x sta (sp),y dey dex bne L002B ; ; if (TM == 0) { ; .dbg line, "mktime.c", 89 jsr decsp4 lda regbank+4 ora regbank+4+1 ; ; goto Error; ; .dbg line, "mktime.c", 91 jeq L002F ; ; D = div (TM->tm_sec, 60); ; .dbg line, "mktime.c", 95 ldy #$01 lda (regbank+4),y tax dey lda (regbank+4),y jsr pushax ldx #$00 lda #$3C jsr _div sta regbank+0 stx regbank+0+1 ldy sreg sty regbank+0+2 ldy sreg+1 sty regbank+0+3 ; ; TM->tm_sec = D.rem; ; .dbg line, "mktime.c", 96 lda regbank+0 ldx regbank+0+1 ldy #$00 sta (regbank+4),y iny txa sta (regbank+4),y ; ; if (TM->tm_min + D.quot < 0) { ; .dbg line, "mktime.c", 99 ldy #$03 lda (regbank+4),y tax dey lda (regbank+4),y clc adc regbank+2 txa adc regbank+2+1 ; ; goto Error; ; .dbg line, "mktime.c", 100 jmi L002F ; ; TM->tm_min += D.quot; ; .dbg line, "mktime.c", 102 lda regbank+4 ldx regbank+4+1 iny jsr ldaxidx clc adc regbank+2 pha txa adc regbank+2+1 tax pla ldy #$02 sta (regbank+4),y iny txa sta (regbank+4),y ; ; D = div (TM->tm_min, 60); ; .dbg line, "mktime.c", 103 tax dey lda (regbank+4),y jsr pushax ldx #$00 lda #$3C jsr _div sta regbank+0 stx regbank+0+1 ldy sreg sty regbank+0+2 ldy sreg+1 sty regbank+0+3 ; ; TM->tm_min = D.rem; ; .dbg line, "mktime.c", 104 lda regbank+0 ldx regbank+0+1 ldy #$02 sta (regbank+4),y iny txa sta (regbank+4),y ; ; if (TM->tm_hour + D.quot < 0) { ; .dbg line, "mktime.c", 107 ldy #$05 lda (regbank+4),y tax dey lda (regbank+4),y clc adc regbank+2 txa adc regbank+2+1 ; ; goto Error; ; .dbg line, "mktime.c", 108 jmi L002F ; ; TM->tm_hour += D.quot; ; .dbg line, "mktime.c", 110 lda regbank+4 ldx regbank+4+1 iny jsr ldaxidx clc adc regbank+2 pha txa adc regbank+2+1 tax pla ldy #$04 sta (regbank+4),y iny txa sta (regbank+4),y ; ; D = div (TM->tm_hour, 24); ; .dbg line, "mktime.c", 111 tax dey lda (regbank+4),y jsr pushax ldx #$00 lda #$18 jsr _div sta regbank+0 stx regbank+0+1 ldy sreg sty regbank+0+2 ldy sreg+1 sty regbank+0+3 ; ; TM->tm_hour = D.rem; ; .dbg line, "mktime.c", 112 lda regbank+0 ldx regbank+0+1 ldy #$04 sta (regbank+4),y iny txa sta (regbank+4),y ; ; if (TM->tm_mday + D.quot < 0) { ; .dbg line, "mktime.c", 115 ldy #$07 lda (regbank+4),y tax dey lda (regbank+4),y clc adc regbank+2 txa adc regbank+2+1 ; ; goto Error; ; .dbg line, "mktime.c", 116 jmi L002F ; ; TM->tm_mday += D.quot; ; .dbg line, "mktime.c", 118 lda regbank+4 ldx regbank+4+1 iny jsr ldaxidx clc adc regbank+2 pha txa adc regbank+2+1 tax pla ldy #$06 sta (regbank+4),y iny txa sta (regbank+4),y ; ; D = div (TM->tm_mon, 12); ; .dbg line, "mktime.c", 126 L004E: ldy #$09 lda (regbank+4),y tax dey lda (regbank+4),y jsr pushax ldx #$00 lda #$0C jsr _div sta regbank+0 stx regbank+0+1 ldy sreg sty regbank+0+2 ldy sreg+1 sty regbank+0+3 ; ; TM->tm_mon = D.rem; ; .dbg line, "mktime.c", 127 lda regbank+0 ldx regbank+0+1 ldy #$08 sta (regbank+4),y iny txa sta (regbank+4),y ; ; if (TM->tm_year + D.quot < 0) { ; .dbg line, "mktime.c", 128 ldy #$0B lda (regbank+4),y tax dey lda (regbank+4),y clc adc regbank+2 txa adc regbank+2+1 ; ; goto Error; ; .dbg line, "mktime.c", 129 jmi L002F ; ; TM->tm_year += D.quot; ; .dbg line, "mktime.c", 131 lda regbank+4 ldx regbank+4+1 iny jsr ldaxidx clc adc regbank+2 pha txa adc regbank+2+1 tax pla ldy #$0A sta (regbank+4),y iny txa sta (regbank+4),y ; ; if (TM->tm_mon == FEBRUARY && IsLeapYear (TM->tm_year + 1900)) { ; .dbg line, "mktime.c", 136 ldy #$09 lda (regbank+4),y tax dey lda (regbank+4),y cpx #$00 bne L005B cmp #$01 bne L005B ldy #$0B lda (regbank+4),y tax dey lda (regbank+4),y clc adc #$6C pha txa adc #$07 tax pla jsr _IsLeapYear tax beq L005B ; ; Max = 29; ; .dbg line, "mktime.c", 137 ldx #$00 lda #$1D ; ; } else { ; .dbg line, "mktime.c", 138 jmp L0096 ; ; Max = MonthLength[TM->tm_mon]; ; .dbg line, "mktime.c", 139 L005B: ldy #$09 lda (regbank+4),y tax dey lda (regbank+4),y clc adc #<(_MonthLength) sta ptr1 txa adc #>(_MonthLength) sta ptr1+1 ldy #$00 ldx #$00 lda (ptr1),y L0096: ldy #$02 jsr staxysp ; ; if (TM->tm_mday > Max) { ; .dbg line, "mktime.c", 141 ldy #$07 lda (regbank+4),y tax dey lda (regbank+4),y jsr pushax ldy #$05 jsr ldaxysp jsr tosicmp bmi L004F beq L004F ; ; if (TM->tm_mon == DECEMBER) { ; .dbg line, "mktime.c", 143 ldy #$09 lda (regbank+4),y tax dey lda (regbank+4),y cpx #$00 bne L0069 cmp #$0B bne L0069 ; ; TM->tm_mon = JANUARY; ; .dbg line, "mktime.c", 144 txa sta (regbank+4),y iny sta (regbank+4),y ; ; ++TM->tm_year; ; .dbg line, "mktime.c", 145 lda regbank+4 ldx regbank+4+1 sta ptr1 stx ptr1+1 iny lda #$01 ; ; } else { ; .dbg line, "mktime.c", 146 jmp L009E ; ; ++TM->tm_mon; ; .dbg line, "mktime.c", 147 L0069: lda regbank+4 ldx regbank+4+1 sta ptr1 stx ptr1+1 lda #$01 L009E: clc adc (ptr1),y sta (ptr1),y pha iny lda #$00 adc (ptr1),y sta (ptr1),y pla ; ; TM->tm_mday -= Max; ; .dbg line, "mktime.c", 149 lda regbank+4 ldx regbank+4+1 jsr pushax ldy #$07 jsr pushwidx ldy #$07 jsr ldaxysp jsr tossubax ldy #$06 jsr staxspidx ; ; } else { ; .dbg line, "mktime.c", 150 jmp L004E ; ; TM->tm_yday = MonthDays[TM->tm_mon] + TM->tm_mday - 1; ; .dbg line, "mktime.c", 159 L004F: lda regbank+4 ldx regbank+4+1 jsr pushax ldy #$09 lda (regbank+4),y tax dey lda (regbank+4),y jsr aslax1 clc adc #<(_MonthDays) tay txa adc #>(_MonthDays) tax tya ldy #$01 jsr ldaxidx sta ptr1 stx ptr1+1 ldy #$07 lda (regbank+4),y tax dey lda (regbank+4),y clc adc ptr1 sta ptr1 txa adc ptr1+1 tax lda ptr1 sec sbc #$01 bcs L0077 dex L0077: ldy #$0E jsr staxspidx ; ; if (TM->tm_mon > FEBRUARY && IsLeapYear (TM->tm_year + 1900)) { ; .dbg line, "mktime.c", 160 ldy #$09 lda (regbank+4),y tax dey lda (regbank+4),y jsr pushax lda #$02 jsr tosgea0 beq L0078 ldy #$0B lda (regbank+4),y tax dey lda (regbank+4),y clc adc #$6C pha txa adc #$07 tax pla jsr _IsLeapYear tax beq L0078 ; ; ++TM->tm_yday; ; .dbg line, "mktime.c", 161 lda regbank+4 ldx regbank+4+1 sta ptr1 stx ptr1+1 ldy #$0E lda #$01 clc adc (ptr1),y sta (ptr1),y iny lda #$00 adc (ptr1),y sta (ptr1),y ; ; DayCount = ((unsigned) (TM->tm_year-70)) * 365U + ; .dbg line, "mktime.c", 169 L0078: ldy #$0B lda (regbank+4),y tax dey lda (regbank+4),y sec sbc #$46 bcs L0082 dex L0082: jsr pushax ldx #$01 lda #$6D jsr tosumulax ; ; (((unsigned) (TM->tm_year-(68+1))) / 4) + ; .dbg line, "mktime.c", 170 jsr pushax ldy #$0B lda (regbank+4),y tax dey lda (regbank+4),y sec sbc #$45 bcs L0087 dex L0087: jsr shrax2 jsr tosaddax ; ; TM->tm_yday; ; .dbg line, "mktime.c", 171 sta ptr1 stx ptr1+1 ldy #$0F lda (regbank+4),y tax dey lda (regbank+4),y clc adc ptr1 sta ptr1 txa adc ptr1+1 tax lda ptr1 ldy #$00 jsr staxysp ; ; TM->tm_wday = (JAN_1_1970 + DayCount) % 7; ; .dbg line, "mktime.c", 174 lda regbank+4 ldx regbank+4+1 jsr pushax ldy #$03 jsr ldaxysp clc adc #$04 bcc L008B inx L008B: jsr pushax lda #$07 jsr tosumoda0 ldy #$0C jsr staxspidx ; ; TM->tm_isdst = 0; ; .dbg line, "mktime.c", 177 lda #$00 ldy #$10 sta (regbank+4),y iny sta (regbank+4),y ; ; return DayCount * 86400UL + ; .dbg line, "mktime.c", 180 ldy #$01 jsr ldaxysp ldy #$00 sty sreg sty sreg+1 jsr pusheax ldx #$51 lda #$01 sta sreg lda #$80 jsr tosumuleax ; ; ((unsigned) TM->tm_hour) * 3600UL + ; .dbg line, "mktime.c", 181 jsr pusheax ldy #$05 lda (regbank+4),y tax dey lda (regbank+4),y ldy #$00 sty sreg sty sreg+1 jsr pusheax ldx #$0E lda #$10 jsr tosumuleax jsr tosaddeax ; ; ((unsigned) TM->tm_min) * 60U + ; .dbg line, "mktime.c", 182 jsr pusheax ldy #$03 lda (regbank+4),y tax dey lda (regbank+4),y jsr pushax lda #$3C jsr tosumula0 ldy #$00 sty sreg sty sreg+1 jsr tosaddeax ; ; ((unsigned) TM->tm_sec); ; .dbg line, "mktime.c", 183 jsr pusheax ldy #$01 lda (regbank+4),y tax dey lda (regbank+4),y sty sreg sty sreg+1 jsr tosaddeax jmp L002A ; ; return (time_t) -1L; ; .dbg line, "mktime.c", 187 L002F: ldx #$FF stx sreg stx sreg+1 txa ; ; } ; .dbg line, "mktime.c", 188 L002A: pha stx tmp1 ldy #$09 ldx #$05 L0093: lda (sp),y sta regbank+0,x dey dex bpl L0093 ldx tmp1 pla ldy #$0A jmp addysp .dbg line .endproc ; --------------------------------------------------------------- ; unsigned char __fastcall__ IsLeapYear (unsigned int) ; --------------------------------------------------------------- .segment "CODE" .proc _IsLeapYear .segment "CODE" ; ; { ; .dbg line, "mktime.c", 72 jsr pushax ; ; return (((Year % 4) == 0) && ((Year % 100) != 0 || (Year % 400) == 0)); ; .dbg line, "mktime.c", 73 ldy #$00 lda (sp),y and #$03 bne L0022 iny jsr ldaxysp jsr pushax lda #$64 jsr tosumoda0 cpx #$00 bne L001E cmp #$00 bne L001E ldy #$03 jsr pushwysp ldx #$01 lda #$90 jsr tosumodax cpx #$00 bne L0022 cmp #$00 beq L001E L0022: ldx #$00 txa jmp incsp2 L001E: ldx #$00 lda #$01 ; ; } ; .dbg line, "mktime.c", 74 jmp incsp2 .dbg line .endproc