; ; File generated by cc65 v 2.19 - Git ab8bb268 ; .fopt compiler,"cc65 v 2.19 - Git ab8bb268" .setcpu "6502" .smart on .autoimport on .case on .debuginfo off .importzp sp, sreg, regsave, regbank .importzp tmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4 .macpack longbranch .import _memset .import __setjmp .import _longjmp .import __seterrno .import _isdigit .import _isspace .import _isxdigit .import _tolower .export __scanf .segment "RODATA" _Bits: .byte $01 .byte $02 .byte $04 .byte $08 .byte $10 .byte $20 .byte $40 .byte $80 .segment "BSS" _format: .res 2,$00 _D_: .res 2,$00 _ap: .res 2,$00 _JumpBuf: .res 5,$00 _F: .res 1,$00 _CharCount: .res 2,$00 _C: .res 2,$00 _Width: .res 2,$00 _IntVal: .res 4,$00 _Assignments: .res 2,$00 _IntBytes: .res 1,$00 _Converted: .res 1,$00 _Positive: .res 1,$00 _NoAssign: .res 1,$00 _Invert: .res 1,$00 _CharSet: .res 32,$00 ; --------------------------------------------------------------- ; int __near__ __fastcall__ _scanf (const struct scanfdata *D, const char *format_, unsigned char *ap_) ; --------------------------------------------------------------- .segment "CODE" .proc __scanf: near .segment "CODE" jsr pushax lda regbank+4 ldx regbank+5 jsr pushax ldy #$07 jsr ldaxysp sta _D_ stx _D_+1 ldy #$05 jsr ldaxysp sta _format stx _format+1 ldy #$03 jsr ldaxysp sta _ap stx _ap+1 lda #$00 sta _Converted sta _Assignments sta _Assignments+1 sta _CharCount sta _CharCount+1 lda #<(_JumpBuf) ldx #>(_JumpBuf) jsr __setjmp cmp #$00 jne L0002 L0003: jsr _ReadChar jmp L0022 L0004: lda _F cmp #$25 beq L0007 ldx #$00 lda _F jsr _isspace tax beq L0093 jsr _SkipWhite jmp L0022 L0008: ldx #$00 L0093: lda _F cpx _C+1 jne L0002 cmp _C beq L0003 jmp L0002 L0007: jsr _GetFormat cmp #$25 beq L0008 lda _F cmp #$2A jsr booleq sta _NoAssign lda _NoAssign beq L000E jsr _GetFormat L000E: lda #$FF sta _Width sta _Width+1 ldx #$00 lda _F jsr _isdigit sta M0001 lda M0001 beq L0011 lda #$00 sta _Width sta _Width+1 L0010: lda _Width ldx _Width+1 jsr mulax10 sta ptr1 stx ptr1+1 lda _F and #$0F clc adc ptr1 ldx ptr1+1 bcc L008C inx L008C: sta _Width stx _Width+1 jsr _GetFormat jsr _isdigit tax bne L0010 L0011: lda _Width ora _Width+1 bne L0013 lda #$07 jsr __seterrno jmp L00AF L0013: lda _Width ldx _Width+1 jsr complax sta _Width stx _Width+1 lda #$01 sta _IntBytes lda _F cmp #$4C beq L001E cmp #$68 beq L0017 cmp #$6A beq L0094 cmp #$6C beq L001A cmp #$74 beq L001E cmp #$7A beq L001E jmp L0095 L0017: lda _format+1 sta ptr1+1 lda _format sta ptr1 ldy #$00 lda (ptr1),y cmp #$68 bne L001E sty _IntBytes inc _format bne L001E inc _format+1 jmp L001E L001A: lda _format+1 sta ptr1+1 lda _format sta ptr1 ldy #$00 lda (ptr1),y cmp #$6C bne L0094 inc _format bne L0094 inc _format+1 L0094: lda #$03 sta _IntBytes L001E: jsr _GetFormat L0095: lda _F cmp #$41 jeq L007A cmp #$43 jeq L007A cmp #$45 jeq L007A cmp #$46 jeq L007A cmp #$47 jeq L007A cmp #$53 jeq L007A cmp #$58 beq L0027 cmp #$5B jeq L0047 cmp #$61 jeq L007A cmp #$63 jeq L009A cmp #$64 beq L0023 cmp #$65 jeq L007A cmp #$66 jeq L007A cmp #$67 jeq L007A cmp #$69 beq L0025 cmp #$6E jeq L0074 cmp #$6F beq L0026 cmp #$70 jeq L006D cmp #$73 beq L0029 cmp #$75 beq L0023 cmp #$78 beq L0027 jmp L0084 L0023: lda #$0A jsr _ScanInt jmp L0022 L0025: lda #$00 jsr _ScanInt jmp L0022 L0026: lda #$08 jsr _ScanInt jmp L0022 L0027: lda #$10 jsr _ScanInt jmp L0022 L0029: jsr _SkipWhite jsr _CheckEnd lda #$01 sta _Converted lda _NoAssign bne L002E lda _ap sec sbc #$02 sta _ap bcs L002B dec _ap+1 L002B: ldx _ap+1 jsr ldaxi sta regbank+4 stx regbank+4+1 jmp L002E L0096: lda _NoAssign bne L0034 lda _C ldy #$00 sta (regbank+4),y inc regbank+4 bne L0034 inc regbank+4+1 L0034: jsr _ReadChar L002E: lda _C+1 cmp #$FF bne L00A9 lda _C cmp #$FF beq L0099 L00A9: lda _C ldx _C+1 jsr _isspace cmp #$00 bne L0099 inc _Width bne L0031 inc _Width+1 L0031: lda _Width ora _Width+1 bne L0096 L0099: lda _NoAssign jne L0022 tay sta (regbank+4),y inc _Assignments jne L0022 inc _Assignments+1 jmp L0022 L009A: lda M0001 bne L0039 ldx #$FF lda #$FE sta _Width stx _Width+1 L0039: jsr _CheckEnd lda #$01 sta _Converted lda _NoAssign bne L0045 lda _ap sec sbc #$02 sta _ap bcs L003B dec _ap+1 L003B: ldx _ap+1 jsr ldaxi sta regbank+4 stx regbank+4+1 jmp L003E L003C: jsr _CheckEnd lda _C ldy #$00 sta (regbank+4),y inc regbank+4 bne L0040 inc regbank+4+1 L0040: jsr _ReadChar L003E: inc _Width bne L003F inc _Width+1 L003F: lda _Width ora _Width+1 bne L003C inc _Assignments jne L0022 inc _Assignments+1 jmp L0022 L0043: jsr _CheckEnd jsr _ReadChar L0045: inc _Width bne L0046 inc _Width+1 L0046: lda _Width ora _Width+1 bne L0043 jmp L0022 L0047: lda #>(_CharSet) sta ptr1+1 lda #<(_CharSet) sta ptr1 lda #$00 ldy #$1F L008D: sta (ptr1),y dey bpl L008D jsr _GetFormat cmp #$5E jsr booleq sta _Invert lda _Invert beq L009B jsr _GetFormat L009B: lda _F cmp #$5D bne L009C jmp L0050 L004A: lda _format+1 sta ptr1+1 lda _format sta ptr1 ldy #$00 lda (ptr1),y cmp #$2D bne L0050 lda _F sta M0003 inc _format bne L0051 inc _format+1 L0051: jsr _GetFormat cmp #$00 beq L0054 cmp #$5D bne L0057 L0054: lda M0003 jsr _AddCharToSet lda #$2D jsr _AddCharToSet jmp L009C L0057: lda M0003 jsr _AddCharToSet lda M0003 cmp _F beq L0092 inc M0003 jmp L0057 L0050: lda _F jsr _AddCharToSet L0092: jsr _GetFormat L009C: lda _F beq L00A0 cmp #$5D bne L004A L00A0: lda _F bne L005C lda _format sec sbc #$01 sta _format bcs L005C dec _format+1 L005C: lda _Invert beq L00AC jsr _InvertCharSet lda #$00 L00AC: sta M0002 lda _NoAssign bne L0063 lda _ap sec sbc #$02 sta _ap bcs L0060 dec _ap+1 L0060: ldx _ap+1 jsr ldaxi sta regbank+4 stx regbank+4+1 jmp L0063 L00A1: lda _NoAssign bne L00A2 lda _C ldy #$00 sta (regbank+4),y inc regbank+4 bne L00A2 inc regbank+4+1 L00A2: lda #$01 sta _Converted sta M0002 jsr _ReadChar L0063: jsr _IsCharInSet tax beq L00A5 inc _Width bne L0065 inc _Width+1 L0065: lda _Width ora _Width+1 bne L00A1 L00A5: lda M0002 jeq L0002 lda _NoAssign jne L0022 tay sta (regbank+4),y inc _Assignments jne L0022 inc _Assignments+1 jmp L0022 L006D: jsr _SkipWhite lda _C cmp #$30 jne L0002 lda #$01 sta _Converted jsr _ReadChar lda _C cmp #$58 beq L0070 cmp #$78 bne L0002 L0070: jsr _ReadChar lda #$10 jsr _ReadInt jsr _AssignInt jmp L0022 L0074: lda _CharCount ldx _CharCount+1 jsr pushax lda _C+1 cmp #$FF bne L0076 lda _C cmp #$FF bne L0076 lda #$00 jmp L0077 L0076: lda #$01 L0077: jsr tossuba0 jsr axulong sta _IntVal stx _IntVal+1 ldy sreg sty _IntVal+2 ldy sreg+1 sty _IntVal+3 jsr _AssignInt lda _NoAssign bne L0022 lda _Assignments sec sbc #$01 sta _Assignments bcs L0022 dec _Assignments+1 jmp L0022 L007A: lda #$0D jsr __seterrno jmp L00AF L0084: lda #$07 jsr __seterrno jmp L00AF L0022: jsr _GetFormat tax jne L0004 jmp L0086 L0002: lda _C+1 cmp #$FF bne L0086 lda _C cmp #$FF bne L0086 lda _Converted bne L0086 L00AF: lda #$FF sta _Assignments sta _Assignments+1 L0086: jsr _PushBack lda _Assignments ldx _Assignments+1 pha ldy #$00 lda (sp),y sta regbank+4 iny lda (sp),y sta regbank+5 pla jmp incsp8 .segment "RODATA" M0006: .word $0000 M0009: .word $0000 M000A: .word $0000 M000B: .word $0000 .segment "BSS" M0001: .res 1,$00 M0002: .res 1,$00 M0003: .res 1,$00 .endproc ; --------------------------------------------------------------- ; unsigned int __near__ FindBit (void) ; --------------------------------------------------------------- .segment "CODE" .proc _FindBit: near .segment "CODE" pha lsr a lsr a lsr a tax pla and #$07 tay lda _Bits,y jmp L0001 L0001: rts .endproc ; --------------------------------------------------------------- ; void __near__ __fastcall__ AddCharToSet (unsigned char) ; --------------------------------------------------------------- .segment "CODE" .proc _AddCharToSet: near .segment "CODE" jsr pusha jsr _FindBit ora _CharSet,x sta _CharSet,x jmp incsp1 .endproc ; --------------------------------------------------------------- ; unsigned char __near__ IsCharInSet (void) ; --------------------------------------------------------------- .segment "CODE" .proc _IsCharInSet: near .segment "CODE" lda #$00 ldx _C+1 bne L1 lda _C jsr _FindBit and _CharSet,x L1: ldx #$00 jmp L0001 L0001: rts .endproc ; --------------------------------------------------------------- ; void __near__ InvertCharSet (void) ; --------------------------------------------------------------- .segment "CODE" .proc _InvertCharSet: near .segment "CODE" ldy #$1F L1: lda _CharSet,y eor #$FF sta _CharSet,y dey bpl L1 rts .endproc ; --------------------------------------------------------------- ; void __near__ PushBack (void) ; --------------------------------------------------------------- .segment "CODE" .proc _PushBack: near .segment "CODE" ldx _C+1 bne L0002 lda _C jsr pusha0 lda _D_+1 sta ptr1+1 lda _D_ sta ptr1 ldy #$02 lda (ptr1),y sta jmpvec+1 iny lda (ptr1),y sta jmpvec+2 ldy #$05 lda (ptr1),y tax dey lda (ptr1),y jsr jmpvec lda _CharCount bne L0003 dec _CharCount+1 L0003: dec _CharCount L0002: rts .endproc ; --------------------------------------------------------------- ; void __near__ ReadChar (void) ; --------------------------------------------------------------- .segment "CODE" .proc _ReadChar: near .segment "CODE" lda _D_+1 sta ptr1+1 lda _D_ sta ptr1 ldy #$00 lda (ptr1),y sta jmpvec+1 iny lda (ptr1),y sta jmpvec+2 ldy #$05 lda (ptr1),y tax dey lda (ptr1),y jsr jmpvec sta _C stx _C+1 inx beq L0002 inc _CharCount bne L0002 inc _CharCount+1 L0002: rts .endproc ; --------------------------------------------------------------- ; void __near__ __fastcall__ Error (unsigned char) ; --------------------------------------------------------------- .segment "CODE" .proc _Error: near .segment "CODE" jsr pusha pha lda #<(_JumpBuf) ldx #>(_JumpBuf) jsr pushax pla ldx #>$0000 jmp _longjmp jsr incsp1 rts .endproc ; --------------------------------------------------------------- ; void __near__ CheckEnd (void) ; --------------------------------------------------------------- .segment "CODE" .proc _CheckEnd: near .segment "CODE" ldx _C+1 beq L0002 lda #$02 jmp _Error L0002: rts .endproc ; --------------------------------------------------------------- ; void __near__ SkipWhite (void) ; --------------------------------------------------------------- .segment "CODE" .proc _SkipWhite: near .segment "CODE" jmp L0004 L0002: jsr _ReadChar L0004: lda _C ldx _C+1 jsr _isspace tax bne L0002 rts .endproc ; --------------------------------------------------------------- ; void __near__ ReadSign (void) ; --------------------------------------------------------------- .segment "CODE" .proc _ReadSign: near .segment "CODE" lda _C cmp #'-' bne L0002 sta _Converted jsr _ReadChar lda #$00 beq L0003 L0002: cmp #'+' bne L0004 sta _Converted jsr _ReadChar L0004: lda #$01 L0003: sta _Positive rts .endproc ; --------------------------------------------------------------- ; unsigned char __near__ __fastcall__ HexVal (char C) ; --------------------------------------------------------------- .segment "CODE" .proc _HexVal: near .segment "CODE" jsr pusha ldx #$00 lda (sp,x) jsr _isdigit tax beq L0002 ldx #$00 lda (sp,x) ldy #$30 jmp L0004 L0002: lda (sp,x) jsr _tolower ldx #$00 ldy #$57 L0004: jsr decaxy ldx #$00 jmp incsp1 .endproc ; --------------------------------------------------------------- ; void __near__ __fastcall__ ReadInt (unsigned char Base) ; --------------------------------------------------------------- .segment "CODE" .proc _ReadInt: near .segment "CODE" jsr pusha lda #$00 sta M0002 sta sreg sta sreg+1 sta _IntVal sta _IntVal+1 ldy sreg sty _IntVal+2 ldy sreg+1 sty _IntVal+3 jmp L0004 L000C: inc M0002 lda _IntVal+3 sta sreg+1 lda _IntVal+2 sta sreg ldx _IntVal+1 lda _IntVal jsr pusheax ldy #$04 ldx #$00 lda (sp),y jsr axulong jsr tosmuleax jsr pusheax ldx #$00 lda M0001 jsr axulong jsr tosaddeax sta _IntVal stx _IntVal+1 ldy sreg sty _IntVal+2 ldy sreg+1 sty _IntVal+3 jsr _ReadChar L0004: lda _C ldx _C+1 jsr _isxdigit tax beq L000F inc _Width bne L0006 inc _Width+1 L0006: lda _Width ora _Width+1 beq L000F lda _C jsr _HexVal sta M0001 ldy #$00 cmp (sp),y txa sbc #$00 bcc L000C L000F: lda M0002 bne L0010 lda #$01 jsr _Error L0010: lda #$01 sta _Converted jmp incsp1 .segment "BSS" M0001: .res 1,$00 M0002: .res 1,$00 .endproc ; --------------------------------------------------------------- ; void __near__ AssignInt (void) ; --------------------------------------------------------------- .segment "CODE" .proc _AssignInt: near .segment "CODE" lda _NoAssign bne L0005 lda _ap sec sbc #$02 sta _ap bcs L0003 dec _ap+1 L0003: ldx _ap+1 jsr ldaxi sta ptr1 stx ptr1+1 ldy _IntBytes L0004: lda _IntVal,y sta (ptr1),y dey bpl L0004 inc _Assignments bne L0005 inc _Assignments+1 L0005: rts .endproc ; --------------------------------------------------------------- ; void __near__ __fastcall__ ScanInt (unsigned char Base) ; --------------------------------------------------------------- .segment "CODE" .proc _ScanInt: near .segment "CODE" jsr pusha jsr _SkipWhite jsr _ReadSign ldy #$00 lda (sp),y bne L000E lda _C cmp #$30 bne L000D jsr _ReadChar lda _C cmp #$58 beq L000B cmp #$78 bne L000C L000B: lda #$10 ldy #$00 sta (sp),y lda #$01 sta _Converted jsr _ReadChar jmp L0009 L000C: lda #$08 ldy #$00 sta (sp),y jsr _PushBack ldx #$00 lda #$30 sta _C stx _C+1 jmp L0009 L000D: lda #$0A sta (sp),y L0009: ldy #$00 L000E: lda (sp),y jsr _ReadInt lda _Positive bne L000A lda _IntVal+3 sta sreg+1 lda _IntVal+2 sta sreg ldx _IntVal+1 lda _IntVal jsr negeax sta _IntVal stx _IntVal+1 ldy sreg sty _IntVal+2 ldy sreg+1 sty _IntVal+3 L000A: jsr _AssignInt jmp incsp1 .endproc ; --------------------------------------------------------------- ; char __near__ GetFormat (void) ; --------------------------------------------------------------- .segment "CODE" .proc _GetFormat: near .segment "CODE" lda _format+1 sta regsave+1 lda _format sta regsave inc _format bne L0002 inc _format+1 L0002: ldy #0 lda (regsave),y ldx #>$0000 sta _F rts .endproc