diff --git a/libsrc/cbm/seekdir.c b/libsrc/cbm/seekdir.c index 3ae206b4e..8ccfadb96 100644 --- a/libsrc/cbm/seekdir.c +++ b/libsrc/cbm/seekdir.c @@ -1,5 +1,6 @@ /* -** Ullrich von Bassewitz, 2012-06-03. Based on code by Groepaz. +** 2012-06-03, Ullrich von Bassewitz. Based on code by Groepaz. +** 2014-07-16, Greg King */ #include @@ -15,8 +16,10 @@ void __fastcall__ seekdir (register DIR* dir, long offs) unsigned char count; unsigned char buf[128]; - /* Make sure we have a reasonable value for offs */ - if (offs > 0x1000) { + /* Make sure that we have a reasonable value for offs. We reject + ** negative numbers by converting them to (very high) unsigned values. + */ + if ((unsigned long)offs > 0x1000uL) { errno = EINVAL; return; } @@ -32,15 +35,15 @@ void __fastcall__ seekdir (register DIR* dir, long offs) } /* Skip until we've reached the target offset in the directory */ - o = dir->off = offs; + o = dir->off = (unsigned)offs; while (o) { /* Determine size of next chunk to read */ - if (o > sizeof (buf)) { + if (o > sizeof (buf)) { count = sizeof (buf); o -= sizeof (buf); } else { - count = offs; + count = (unsigned char)o; o = 0; } diff --git a/libsrc/cbm/syschdir.s b/libsrc/cbm/syschdir.s index 9361d56f0..a4a83cd21 100644 --- a/libsrc/cbm/syschdir.s +++ b/libsrc/cbm/syschdir.s @@ -1,5 +1,6 @@ ; -; Oliver Schmidt, 2012-10-16 +; 2012-10-16, Oliver Schmidt +; 2014-07-16, Greg King ; ; unsigned char __fastcall__ _syschdir (const char* name); ; @@ -39,18 +40,14 @@ ; Multiply first digit by 10 - ldx #8 -@L0: asl - asl tmp1 - bcc @L1 - clc - adc #10 -@L1: dex - bne @L0 + txa + asl a ; * 2 + asl a ; * 4, carry cleared + adc tmp1 ; * 5 + asl a ; * 10, carry cleared ; Add second digit to product - clc adc tmp2 tax @@ -80,7 +77,8 @@ done: rts .endproc ;-------------------------------------------------------------------------- -; getdigit +; getdigit -- Converts PetSCII to binary. +; Sets carry if the character is outside of '0'-'9'. .proc getdigit