NEW PREFIX /A2OSX.BUILD AUTO 4,1 */-------------------------------------- * # StrToF * Convert String to 40 bits Float * ## In: * PUSHW PTR to EndPtr * PUSHW Source String (C-Sring) * PUSHW PTR to target buffer (5 bytes) * ## Out: * Target buffer filled with a FLOAT (packed) *\-------------------------------------- K.StrToF jsr K.AToF >PULLW ZPPtr3 lda TXTPTR sta (ZPPtr3) ldy #1 lda TXTPTR+1 sta (ZPPtr3),y rts */-------------------------------------- * # AToF * Convert String to 40 bits Float * ## In: * PUSHW Source String (C-Sring) * PUSHW PTR to target buffer (5 Bytes) * ## Out: *\-------------------------------------- K.AToF >PULLW FORPNT Ptr to dst buffer >PULLW TXTPTR Ptr to source string jsr CHARGOT >ROMCALL FIN >ROMCALL GETFAC clc rts */-------------------------------------- * # StrToL * Convert String to 32 bits int * ## In: * PUSHB Base * PUSHW PTR to EndPtr * PUSHW Source String (C-Sring) * PUSHW PTR to target buffer DWORD * ## Out: *\-------------------------------------- K.StrToL sec Signed .HS 90 BCC */-------------------------------------- * # StrToUL * Convert String to 32 bits unsigned int * ## In: * PUSHB Base * PUSHW PTR to EndPtr * PUSHW Source String (C-Sring) * PUSHW PTR to target buffer DWORD * ## Out: *\-------------------------------------- K.StrToUL clc Unsigned jsr MEM.PullP1P2P3 >PULLA Base jsr K.AToL.I bcs K.StrToUL.rts * clc K.StrToUL.Exit adc ZPPtr2 sta (ZPPtr3) lda #0 adc ZPPtr2+1 ldy #1 sta (ZPPtr3),y K.StrToUL.rts rts */-------------------------------------- * # AToL * Convert String to 32 bits int * ## In: * PUSHW Source String (C-Sring) * PUSHW PTR to target buffer DWORD * ## Out: *\-------------------------------------- *STDLIB.32 .BS 4 32 bits max STDLIB.32 .EQ FAC 32 bits max *-------------------------------------- K.AToL jsr MEM.PullP1P2 C-String in Ptr2, Dst buffer in Ptr1 lda #10 base 10 sec signed K.AToL.I jsr STDLIB.Dec2Hex bcs .9 phy Save Count processed ldy #3 .3 lda STDLIB.32,y sta (ZPPtr1),y dey bpl .3 pla * clc .9 rts */-------------------------------------- * # AToI.YA * Convert String to 16 bits int * ## In: * Y,A = Source String (C-String) * ## Out: * Y,A = Int *\-------------------------------------- K.AToI.YA >STYA ZPPtr2 lda #10 base 10 sec signed jsr STDLIB.Dec2Hex bcs .9 >LDYA STDLIB.32 .9 rts *-------------------------------------- * Convert ZPPtr2 to STDLIB.32 *-------------------------------------- STDLIB.Dec2Hex jsr STDLIB.32.Clear ldy #$ff .1 iny lda (ZPPtr2),y beq .8 jsr MEM.IsDigit bcs .8 jsr STDLIB.32.T10 bcs .9 lda (ZPPtr2),y and #$0F * clc adc STDLIB.32 sta STDLIB.32 bcc .1 inc STDLIB.32+1 bne .1 inc STDLIB.32+2 bne .1 inc STDLIB.32+3 bne .1 overflow!!! * sec rts .8 clc .9 rts *-------------------------------------- STDLIB.32.T10 ldx #3 .1 lda STDLIB.32,x save STDLIB.32 for 4+1 pha dex bpl .1 jsr .7 STDLIB.32 * 2 -> STDLIB.32 bcs .9 overflow!!! jsr .7 STDLIB.32 * 4 -> STDLIB.32 bcs .9 overflow!!! phy Save Y, pointing to next char ldx #0 ldy #4 * clc .2 pla STDLIB.32 * 4 + STDLIB.32 -> STDLIB.32 adc STDLIB.32,x sta STDLIB.32,x inx dey bne .2 ply bcs .99 overflow!!! * STDLIB.32 * 10 -> STDLIB.32 .7 asl STDLIB.32 rol STDLIB.32+1 rol STDLIB.32+2 rol STDLIB.32+3 rts if CS, overflow!!! .9 pla discard saved STDLIB.32 pla pla pla .99 rts *-------------------------------------- *-------------------------------------- STDLIB.32.Clear ldx #3 .1 stz STDLIB.32,x dex bpl .1 rts */-------------------------------------- * # RealPath.YA * Return the canonicalized absolute pathname * ## In : * Y,A = Ptr to Relative Filename (C-String) * ## Out : * CC : success * Y,A = Ptr to Full Path (C-String) * X = hMem of Full Path * CS : A = Error Code *\-------------------------------------- K.RealPath.YA >STYA ZPPtr1 ldx #$ff lda (ZPPtr1) beq .1 cmp #'/' full path starting with '/'? beq .3 yes, do not append to current prefix .1 ldy #S.PS.hPREFIX lda (pPs),y jsr K.GetMemPtr.A >STYA ZPPtr2 ldy #$ff .2 iny inx lda (ZPPtr2),y sta K.Buf256,x bne .2 dex .3 ldy #$ff .4 iny inx lda (ZPPtr1),y sta K.Buf256,x bne .4 *-------------------------------------- * X=LEN, K.Buf256 = /dir1../file(/) /x0 dex beq .89 we have '/'....nothing to do... lda K.Buf256,x Skip any / at the end of string.... cmp #'/' bne .5 dex .5 ldy #0 dot counter=0 .6 lda K.Buf256,x cmp #'/' beq .8 cmp #'.' bne .7 iny .HS 2C BIT ABS, skip "LDY #0" .7 ldy #0 not a dot....reset dot counter txa beq .89 dex bra .6 always, should end with a '/' .8 tya beq .80 Y was 0....nothing to do... dey "/." ? bne .9 no.. jsr K.RealPath.RemoveAtX we found "/.", remove,useless.... bra .80 .9 dey "/.." ? bne .90 "/..." ??!!...mmm...syntax error txa we found "/.." beq .90 at the beginning of string...cannot remove /dir/.. jsr K.RealPath.RemoveAtX remove "/.." .10 dex lda K.Buf256,x go to "/dir" cmp #'/' bne .10 jsr K.RealPath.RemoveAtX ...remove "/dir" .80 txa beq .89 Empty path!!! go put back "/" an exit dex bra .5 .89 >LDYAI K.Buf256 jmp K.NewStr.YA .90 lda #K.E.SYN sec rts *-------------------------------------- K.RealPath.RemoveAtX txa X = "/something" tay .1 iny lda K.Buf256,y beq .2 cmp #'/' bne .1 .2 phx .3 lda K.Buf256,y sta K.Buf256,x beq .4 iny inx bne .3 .4 txa bne .8 lda #'/' Make sure we have a least '/' in the buffer sta K.Buf256 stz K.Buf256+1 .8 plx rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STDLIB LOAD /A2OSX.SRC/SYS/KERNEL.S ASM