From 026a9cc3dc3aae2dc062ae0db67236da8356c188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 11 Oct 2018 17:23:06 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Docs/KERNEL.md | 313 ++++++++++++++++++++++++--------------- .Docs/LIBBLKDEV.md | 9 +- .Docs/LIBCRYPT.md | 12 +- .Docs/LIBTCPIP.md | 51 ++++--- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/LS.S.txt | 8 +- INC/A2osX.I.txt | 8 +- INC/KERNEL.I.txt | 18 +-- LIB/LIBBLKDEV.S.txt | 6 +- LIB/LIBCRYPT.S.txt | 8 +- LIB/LIBTCPIP.S.ARP.txt | 6 +- LIB/LIBTCPIP.S.DNS.txt | 6 +- LIB/LIBTCPIP.S.SKT.txt | 22 +-- SBIN/SHELL.S.CMD.txt | 9 +- SYS/KERNEL.S.ARG.txt | 2 +- SYS/KERNEL.S.BIN.txt | 4 +- SYS/KERNEL.S.DEV.txt | 62 ++++---- SYS/KERNEL.S.DIRENT.txt | 9 +- SYS/KERNEL.S.ENV.txt | 17 +-- SYS/KERNEL.S.FIO.txt | 6 +- SYS/KERNEL.S.IO.txt | 10 +- SYS/KERNEL.S.IRQ.txt | 17 ++- SYS/KERNEL.S.MATH.txt | 8 +- SYS/KERNEL.S.MEM.txt | 57 ++----- SYS/KERNEL.S.PS.txt | 33 ++++- SYS/KERNEL.S.STAT.txt | 10 +- SYS/KERNEL.S.STDIO.txt | 34 ++--- SYS/KERNEL.S.STDLIB.txt | 12 +- SYS/KERNEL.S.STRING.txt | 24 ++- SYS/KERNEL.S.TIME.txt | 49 +++--- 31 files changed, 457 insertions(+), 373 deletions(-) diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index ad18d3a7..69cc8f09 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -5,7 +5,8 @@ ## ASM **In:** A = argument index. -**Out:** + +## RETURN VALUE CC : success Y,A = PTR To Arg[A] CS : Out Of Bound @@ -15,7 +16,8 @@ CS : Out Of Bound ## ASM **In:** Y,A = PTR to "NAME.DRV [PARAM]" C-String -**Out:** + +## RETURN VALUE none # InsDrv @@ -30,21 +32,22 @@ none `>PUSHW DRV.CS.START` `>LDYA L.SRC` `SYSCALL insdrv` -**Out:** + +## RETURN VALUE Y,A = Ptr to installed driver # GetDevByID -**In:** A = DevID -**Out:** + +## RETURN VALUE CC = OK, CS = ERROR Y,A = FD X = hFD # GetDevByName -**In:** Y,A = Ptr to device name (C-String) -**Out:** + +## RETURN VALUE CC = OK, CS = ERROR Y,A = FD X = DevID @@ -55,11 +58,11 @@ X = DevID `int getdevstatus(short int hFD, S.DIB* dstat);` ## ASM -**In:** `>PUSHWI S.DIB` `lda DevID` `>SYSCALL GetDevStatus` -**Out:** + +## RETURN VALUE # MKDev Create a hDEV @@ -68,10 +71,10 @@ Create a hDEV `hDEV mkdev (S.FD * fd)` ## ASM -**In:** `>LDYA FD.DEV` `>SYSCALL mkdev -**Out:** + +## RETURN VALUE A = hDEV # OpenDir @@ -80,10 +83,10 @@ Create a hDEV `int hDIR opendir (const char * dirpath);` ## ASM -**In:** `>LDYA dirpath` `>SYSCALL opendir` -**Out:** + +## RETURN VALUE CC : success A = hDIR CS : error @@ -95,11 +98,11 @@ Create a hDEV `int readdir (int hDIR, S.DIRENT * dirent);` ## ASM -**In:** `>PUSHW dirent` `lda hDIR` `>SYSCALL readdir` -**Out:** + +## RETURN VALUE CC : success X = hDIRENT Y,A = PTR to S.DIRENT @@ -113,16 +116,17 @@ Create a hDEV `void closedir(hDIR);` ## ASM -**In:** `lda hDIR` `>SYSCALL closedir` -**Out:** + +## RETURN VALUE none, always succeed. # ExpandStr **In:** Y,A = PTR to String to Expand (C-String) -**Out:** + +## RETURN VALUE X = hMem to Expanded String (C-String) Y,A = PTR to Expanded String @@ -139,7 +143,8 @@ And return, if found, the full path to it. `>PUSHWI fullpath` `>PUSHWI searchpath` `>LDYAI filename` -**Out:** + +## RETURN VALUE CC : success DstBuf = FilePath DstStat = S.STAT @@ -155,7 +160,8 @@ Change or add an environment variable, string is 'NAME=VALUE' **In:** `>LDYA string` `>SYSCALL putenv` -**Out:** + +## RETURN VALUE # SetEnv Change or add an environment variable @@ -168,7 +174,8 @@ Change or add an environment variable `>PUSHW value` `>LDYA name` `>SYSCALL setenv` -**Out:** + +## RETURN VALUE # GetEnv searches the environment list to find the environment variable name, @@ -180,8 +187,9 @@ and returns a pointer to the corresponding value string. ## ASM **In:** `>LDYA name` -`>SYSCALL gerenv` -**Out:** +`>SYSCALL getenv` + +## RETURN VALUE CC : Y,A = PTR to VALUE (C-String) CS : not found @@ -195,13 +203,15 @@ Remove an environment variable **In:** `>LDYA name` `>SYSCALL unsetenv` -**Out:** + +## RETURN VALUE # LoadTxtFile Load TXT a file in memory (with ending 0) **In:** Y,A = File Path -**Out:** + +## RETURN VALUE Y,A = File Length (without ending 0) X = hMem of Loaded File @@ -212,7 +222,8 @@ Load a file in memory PUSHB = TYPE ... PUSHB = MODE ... LDYA = PATH ...FOpen) -**Out:** + +## RETURN VALUE Y,A = File Length X = hMem of Loaded File @@ -227,7 +238,8 @@ Change The type of a ProDOS File `>PUSHBI filetype` `>LDYA filepath` `>SYSCALL chtyp` -**Out:** + +## RETURN VALUE # ChMod **In:** @@ -254,7 +266,8 @@ Change The type of a ProDOS File `>PUSHB flags` `>LDYA pathname` `>SYSCALL open` -**Out:** + +## RETURN VALUE A = hFD REG File created on ProDOS : T=TXT,X=$0000 @@ -279,7 +292,8 @@ REG File created on ProDOS : T=TXT,X=$0000 `>PUSHW buf` `lda fd` `>SYSCALL read` -**Out:** + +## RETURN VALUE CC: Y,A = bytes read CS: A = EC @@ -294,7 +308,8 @@ CS: A = EC `>PUSHW buf` `lda fd` `>SYSCALL write` -**Out:** + +## RETURN VALUE CC: Y,A = bytes written CS: A = EC @@ -304,12 +319,12 @@ CS: A = EC `int ioctl(short int hFD, int request, void * param );` ## ASM -**In:** `PUSHWI param` `PUSHBI request` `lda hFD` `>SYSCALL IOCTL` -**Out:** + +## RETURN VALUE Y,A = ... # pipe @@ -318,7 +333,6 @@ CS: A = EC `int pipe(int pipefd[2]);` ## ASM -**In:** # FAdd,FSub,FMult,FDiv,FPwr Return X+Y, X-Y, X*Y, X/Y, X^Y @@ -332,7 +346,8 @@ Return X+Y, X-Y, X*Y, X/Y, X^Y `>SYSCALL fmult` `>SYSCALL fdiv` `>SYSCALL fpwr` -**Out:** + +## RETURN VALUE On stack (float) # Log,Sqr,Exp,Cos,Sin,Tan,ATan @@ -351,7 +366,8 @@ Return Log(x), Sqr(x), E^X, Cos(x), Sin(X), Tan(x), ATan(x) **In:** `>PUSHF x (Float)` `>SYSCALL log` -**Out:** + +## RETURN VALUE On stack (Float) # float @@ -363,7 +379,8 @@ Return 'floated' long ## ASM **In:** `>PUSHL X` (long) -**Out:** + +## RETURN VALUE On stack (float) # lrintf @@ -376,13 +393,14 @@ Return float rounded into a long **In:** `>PUSHF x` `>SYSCALL lrintf` -**Out:** + +## RETURN VALUE On stack (long) # GetMem0 -**In:** Y,A = Size Requested -**Out:** + +## RETURN VALUE CC : success YA = PTR to Mem (ZERO Initialised) * X = hMem @@ -390,9 +408,9 @@ Return float rounded into a long A = EC # GetMem -**In:** Y,A = Size Requested -**Out:** + +## RETURN VALUE CC : success YA = PTR to Mem (Uninitialised) * X = hMem @@ -400,31 +418,31 @@ Return float rounded into a long A = EC # FreeMem -**In:** A = hMem To Free -**Out:** + +## RETURN VALUE none. (X unmodified) # GetMemPtr -**In:** A = hMem -**Out:** + +## RETURN VALUE Y,A = PTR to MemBlock (X unmodified) # GetMemByID -**In:** A = hMem -**Out:** + +## RETURN VALUE Y,A = ZPMemMgrSPtr = PTR to S.MEM (X unmodified) # NewStr Create a new copy of this C-String -**In:** Y,A = Ptr to source C-String -**Out:** + +## RETURN VALUE CC : success Y,A = PTR to String X = hMem (PSTR) @@ -432,62 +450,62 @@ CS : error A = SYS error code # SListGetByID -**In:** PUSHB = hSList PUSHW = KeyID PUSHW = Data Ptr PUSHW = Key Ptr -**Out:** + +## RETURN VALUE X,Y = Next KeyID # SListUpdateByID -**In:** PUSHB = hSList PUSHW = KeyID PUSHW = Data Ptr -**Out:** + +## RETURN VALUE A = Key Length X,Y = KeyID # SListAdd -**In:** PUSHB = hSList PUSHW = Key Ptr PUSHW = Data Ptr -**Out:** + +## RETURN VALUE A = Key Length X,Y = KeyID # SListLookup -**In:** PUSHB = hSList PUSHW = Key Ptr PUSHW = Data Ptr -**Out:** + +## RETURN VALUE A = Key Length X,Y = KeyID # SListNew -**In:** -**Out:** + +## RETURN VALUE A=hSList # SListFree -**In:** A=hSList -**Out:** + +## RETURN VALUE # GetStkObjProp -**In:** A = hObject (AUX Memory) Y = Property Index -**Out:** + +## RETURN VALUE Y,A = Property Value # NewStkObj -**In:** Y,A = Size Requested -**Out:** + +## RETURN VALUE CC : success YA = PTR to Mem (Uninitialised) * X = hMem @@ -495,20 +513,20 @@ CS : error A = EC # FreeStkObj -**In:** A = hMem To Free (AUX Memory) -**Out:** + +## RETURN VALUE none. (X,Y unmodified) # LoadStkObj Load a file in AUX memory (Stock Objects) -**In:** PUSHW = AUXTYPE (Handled by.... PUSHB = TYPE ... PUSHB = MODE ... PUSHW = PATH ...FOpen) -**Out:** + +## RETURN VALUE Y,A = File Length X = hMem of Loaded Object in AUX mem @@ -521,25 +539,43 @@ Load a file in AUX memory (Stock Objects) # CreatePS (Non Blocking) **In:** Y,A = PTR To Cmd Line -**Out:** + +## RETURN VALUE A = Child PSID +# Exec + +## C +`int exec(const char *path, char *const argv[], short int flage);` + +## ASM +`>PUSHB flags` +`>PUSHW argv` +`>LDYAI path` +`>SYSCALL exec` + +## RETURN VALUE +A = Child PSID + # GetMemStat **In:** Y,A = Ptr to 24 bytes buffer -**Out:** + +## RETURN VALUE Buffer filled with memory stats # GetPSStatus **In:** A = PID -**Out:** + +## RETURN VALUE A = Status Byte # GetPSStat **In:** Y,A = Ptr to 24 bytes buffer -**Out:** + +## RETURN VALUE Buffer filled with PS stats # Stat @@ -553,7 +589,8 @@ Return information about a file `>PUSHW statbuf` `>LDYA pathname` `>SYSCALL stat` -**Out:** + +## RETURN VALUE # MKDir create a directory @@ -566,7 +603,8 @@ create a directory `>PUSHW mode` `>LDYA pathname` `>SYSCALL mkdir` -**Out:** + +## RETURN VALUE CC : success CS : error A = EC @@ -584,7 +622,8 @@ Create a special or ordinary file. `>PUSHW mode` `>LDYA pathname` `>SYSCALL mknod` -**Out:** + +## RETURN VALUE CC = OK, CS = ERROR A = hFILE @@ -599,7 +638,8 @@ return a hFILE to a new FIFO `>PUSHW mode` `>LDYA pathname` `>SYSCALL mkfifo` -**Out:** + +## RETURN VALUE CC = OK, CS = ERROR A = hFILE @@ -614,7 +654,8 @@ Print A (char) to hFILE `>PUSHB character` `lda stream` `>SYSCALL fputc` -**Out:** + +## RETURN VALUE CC = success # PutChar @@ -627,7 +668,8 @@ Print A (char) to StdOut **In:** `lda caracter` `>SYSCALL putchar` -**Out:** + +## RETURN VALUE CC = success # PutS @@ -640,7 +682,8 @@ Write Str to StdOut, appends '\r\n' ## ASM `>LDYAI str` `>SYSCALL puts` -**Out:** + +## RETURN VALUE CC = success # FPutS @@ -654,7 +697,8 @@ Write Str to FILE `>PUSHW str` `lda stream` `>SYSCALL fputs` -**Out:** + +## RETURN VALUE CC = success # PrintF/SPrintF/FPrintF @@ -687,7 +731,8 @@ FPrintF : `>PUSHWI format` `lda hFILE` `>SYSCALL fprintf` -**Out:** + +## RETURN VALUE CC : success, Y,A = bytes sent CS : error, A = code from Output Specifiers : @@ -739,7 +784,8 @@ string is then terminated with a null byte. `>PUSHW s` `lda hFILE` `>SYSCALL fgets` -**Out:** + +## RETURN VALUE Y,A: s CC = success @@ -752,7 +798,8 @@ Get char from StdIn ## ASM **In:** `>SYSCALL getchar` -**Out:** + +## RETURN VALUE CC = success A = char @@ -766,7 +813,8 @@ Get char from Node **In:** `lda stream` `>SYSCALL getc` -**Out:** + +## RETURN VALUE CC = success A = char @@ -795,7 +843,8 @@ Read formatted data from string TODO : %10s `>LDYA s` `>SYSCALL sscanf` -**Out:** + +## RETURN VALUE A = Number of arguments filled. # FOpen @@ -825,7 +874,8 @@ TODO: replace flags/ftype/auxtype with mode="w+,t=TYP,x=AUXTYPE" + ,t=123 or t=$ff or t=TXT + ,x=12345 or x=$ffff `>LDYAI filename` -**Out:** + +## RETURN VALUE CC : A = hFILE CS : A = EC @@ -839,7 +889,8 @@ int fclose ( hFILE stream ); **In:** `lda stream` `>SYSCALL fclose` -**Out:** + +## RETURN VALUE # FRead Read bytes from file @@ -853,7 +904,8 @@ int fread (hFILE stream, void * ptr, int count ); `>PUSHW ptr` `lda stream` `>SYSCALL fread` -**Out:** + +## RETURN VALUE Y,A = Bytes Read # FWrite @@ -868,7 +920,8 @@ Write bytes to file `>PUSHW ptr` `lda stream` `>SYSCALL fwrite` -**Out:** + +## RETURN VALUE Y,A = Bytes Written # FFlush @@ -904,7 +957,8 @@ Test the end-of-file indicator for hFILE **In:** `lda stream` `>SYSCALL feof` -**Out:** + +## RETURN VALUE CC : A=0 EOF A =0 NOT EOF @@ -920,7 +974,8 @@ Return the current value of the file-position indicator **In:** `lda stream` `>SYSCALL ftell` -**Out:** + +## RETURN VALUE On stack (long) # Remove @@ -933,7 +988,8 @@ int remove(const char *pathname); **In:** `>LDYA pathname` `>SYSCALL remove` -**Out:** + +## RETURN VALUE # Rename Rename a file @@ -946,7 +1002,8 @@ Rename a file `>PUSHW newpath` `>LDYA oldpath` `>SYSCALL rename` -**Out:** + +## RETURN VALUE # strtof Convert String to 40 bits Float @@ -959,7 +1016,8 @@ Convert String to 40 bits Float `>PUSHWI EndPtr` `>LDYA str` `>SYSCALL strtof` -**Out:** + +## RETURN VALUE On stack (float) # AToF @@ -972,7 +1030,8 @@ Convert String to 40 bits Float **In:** `>LDYA str` `>SYSCALL atof` -**Out:** + +## RETURN VALUE On stack (float) # StrToL/StrToUL @@ -988,7 +1047,8 @@ Convert String to 32 bits (unsigned) int `>PUSHWI EndPtr` `>LDYAI str` `>SYSCALL strtol` -**Out:** + +## RETURN VALUE On stack (long) # atol @@ -1001,7 +1061,8 @@ Convert String to 32 bits long **In:** `>LDYA str` `>SYSCALL atol` -**Out:** + +## RETURN VALUE On stack (long) # atoi @@ -1014,7 +1075,8 @@ Convert String to 16 bits int **In:** `>LDYAI str` `>SYSCALL atoi` -**Out:** + +## RETURN VALUE Y,A = int # RealPath @@ -1027,7 +1089,8 @@ Return the canonicalized absolute pathname **In:** `>LDYA str` `>SYSCALL realpath` -**Out:** + +## RETURN VALUE CC : success Y,A = Ptr to Full Path (C-String) X = hMem of Full Path @@ -1040,10 +1103,10 @@ Returns Length of C-String `int strlen ( char * str);` ## ASM -**In:** `>LDYAI str` `>SYSCALL strlen` -**Out:** + +## RETURN VALUE Y,A = String length # StrCat @@ -1057,7 +1120,8 @@ Concatenate strings `>PUSHWI source` `>LDYAI destination` `>SYSCALL strcat` -**Out:** + +## RETURN VALUE Y,A = destination # StrCpy @@ -1071,7 +1135,8 @@ Copy string `>PUSHWI source` `>LDYAI destination` `>SYSCALL strcpy` -**Out:** + +## RETURN VALUE Y,A = destination # StrMatch @@ -1085,7 +1150,8 @@ Compare a String against pattern (e.g. '*test?.txt') `>PUSHWI pattern` `>LDYAI s` `>SYSCALL strmatch` -**Out:** + +## RETURN VALUE CC : match CS : no match @@ -1101,7 +1167,8 @@ Convert string to UPPERCASE/lowercase `>LDYAI str` `>SYSCALL strupr` `>SYSCALL strlwr` -**Out:** + +## RETURN VALUE Uppercased/lowercased String in Buffer Y,A = str @@ -1116,7 +1183,8 @@ Compare 2 strings `>PUSHWI s2` `>LDYAI s1` `>SYSCALL strcmp` -**Out:** + +## RETURN VALUE CC : match CS : no match CC, Y,A=0 @@ -1133,7 +1201,8 @@ Compare 2 strings, ignoring case `>PUSHWI s2` `>LDYAI s1` `>SYSCALL strcasecmp` -**Out:** + +## RETURN VALUE CC : match CS : no match CC, Y,A=0 @@ -1146,9 +1215,10 @@ Get System Time in Buffer `time_t time (S.TIME* timer);` ## ASM -**In:** -Y,A = PTR to S.TIME -**Out:** +`>LDYA timer` +`>SYSCALL time` + +## RETURN VALUE S.TIME filled with System date/time # PTime2Time @@ -1158,11 +1228,11 @@ S.TIME filled with System date/time `int PTime2Time (long* ptime, S.TIME* timer);` ## ASM -**In :** `>PUSHW timer` `>LDYA ptime` `>SYSCALL PTime2Time` -**Out:** + +## RETURN VALUE # CTime2Time Convert CTime Time To S.TIME @@ -1171,22 +1241,21 @@ S.TIME filled with System date/time `int CTime2Time (long* ctime, S.TIME* timer);` ## ASM -**In :** `>PUSHW timer` `>LDYA ctime` `>SYSCALL CTime2Time` -**Out:** + +## RETURN VALUE # StrFTime ## C Convert S.TIME struct to CSTR -`size_t strftime (char* ptr, size_t maxsize, const char* format, const struct tm* timeptr );` +`size_t strftime (char* ptr, const char* format, const struct S.TIME* timeptr );` ## ASM -**In:** -PUSHW = Dst PTR To CSTR Buf -PUSHW = Src PTR To Format String +`PUSHW timeptr` +`PUSHW format` + %a : Abbreviated weekday name : Thu + %A : Full weekday name : Thursday + %b : Abbreviated month name : Aug @@ -1202,6 +1271,8 @@ PUSHW = Src PTR To Format String + %y : Year, last two digits (00-99) + %Y : Year four digits 2001 -PUSHW = Src PTR To S.Time -**Out:** +`>LDYA ptr` +`>SYSCALL strftime` + +## RETURN VALUE none. always succeed. diff --git a/.Docs/LIBBLKDEV.md b/.Docs/LIBBLKDEV.md index d8cbfa27..bb3b1fba 100644 --- a/.Docs/LIBBLKDEV.md +++ b/.Docs/LIBBLKDEV.md @@ -11,7 +11,8 @@ int getprodoscatsize (short int options, short int catsize, int devsize ); PUSHW = DevSize (in 512b blocks) PUSHB = Catalog Size (in blocks) PUSHB = Options -**Out:** + +## RETURN VALUE X=BlockCount (max 22) Y,A=BufSize (max $4400) @@ -37,7 +38,8 @@ Write a track (16 sectors) PUSHW = Ptr to 16*256 buffer PUSHB = TrackNum * 4 : 0->140+ PUSHB = DSSS0000 -**Out:** + +## RETURN VALUE CC : success CS : A = Error A=0, currently starting/seeking... @@ -48,7 +50,8 @@ Write a track (NIBBLE) PUSHW = Ptr to NIBBLE buffer (0 ended) PUSHB = TrackNum * 4 : 0->140+ PUSHB = DSSS0000 -**Out:** + +## RETURN VALUE CC : success CS : A = Error A=0, currently starting/seeking... diff --git a/.Docs/LIBCRYPT.md b/.Docs/LIBCRYPT.md index 7688fecb..6c723e14 100644 --- a/.Docs/LIBCRYPT.md +++ b/.Docs/LIBCRYPT.md @@ -10,7 +10,8 @@ Return MD5 Hash for input String **In:** `>PUSHW digest` `>LDYA str` -**Out:** + +## RETURN VALUE CC ## MD5Init @@ -21,7 +22,8 @@ Initialize a MD5 computation # ASM **In:** -**Out:** + +## RETURN VALUE A = hMem To S.MD5 ## MD5Update @@ -35,7 +37,8 @@ Add Data to MD5 computation `>PUSHW len` `>PUSHW data` `>LDA.G md5` -**Out:** + +## RETURN VALUE ## MD5Finalize @@ -46,4 +49,5 @@ Add Data to MD5 computation **In:** `>PUSHW digest` `>LDA.G md5` -**Out:** + +## RETURN VALUE diff --git a/.Docs/LIBTCPIP.md b/.Docs/LIBTCPIP.md index 237749f6..d6a882e0 100644 --- a/.Docs/LIBTCPIP.md +++ b/.Docs/LIBTCPIP.md @@ -3,14 +3,16 @@ # ARP.Clear Clear ARP Cache **In:** -**Out:** + +## RETURN VALUE # ARP.Query Query ARP Cache and returns HW address **In:** PUSHW PTR to MAC (to fill) PUSHW PTR to IP -**Out:** + +## RETURN VALUE CC: hit: MAC filled CS: missed @@ -23,20 +25,23 @@ # ARP.GetCache Return a Ptr to ARP Cache Table **In:** -**Out:** + +## RETURN VALUE Y,A = PTR to ARP.CACHE # DNS.Clear Clear DNS Cache **In:** -**Out:** + +## RETURN VALUE # DNS.Query Query DNS for specified host **In:** PUSHW = PTR to IP to fill with cached data * PUSHW = hostname PTR to PSTR -**Out:** + +## RETURN VALUE CC: hit: IP filled with address CS: missed @@ -49,7 +54,8 @@ # DNS.GetCAche Return a Ptr to DNS Cache Table **In:** -**Out:** + +## RETURN VALUE Y,A = PTR to DNS.CACHE # Socket @@ -63,7 +69,8 @@ Create a new socket `>PUSHB protocol` `lda type` `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` -**Out:** + +## RETURN VALUE CC: A = hSOCKET CS: A = EC @@ -78,7 +85,8 @@ bind a name to a socket `>PUSHW addr` `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` -**Out:** + +## RETURN VALUE CC: A = hSOCKET CS: A = EC @@ -93,7 +101,8 @@ Iinitiate a connection on a socket `>PUSHW addr` `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` -**Out:** + +## RETURN VALUE CC: A = hSOCKET CS: A = EC @@ -107,7 +116,8 @@ Listen for connections on a socket **In:** `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.listen` -**Out:** + +## RETURN VALUE CS: A = EC # Accept @@ -120,7 +130,8 @@ Accept a connection on a socket **In:** `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.accept` -**Out:** + +## RETURN VALUE A = hSocket # Shutdown @@ -133,7 +144,8 @@ Close socket **In:** `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.shutdown` -**Out:** + +## RETURN VALUE # Read (STREAM) @@ -146,7 +158,8 @@ Close socket `>PUSHW buf` `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.read` -**Out:** + +## RETURN VALUE CC: Y,A = bytes read CS: A = EC @@ -161,7 +174,8 @@ CS: A = EC `>PUSHW buf` `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.write` -**Out:** + +## RETURN VALUE CC: Y,A = bytes written CS: A = EC @@ -178,7 +192,8 @@ CS: A = EC `>PUSHW addr` (RecvFrom) `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.Recv` -**Out:** + +## RETURN VALUE CC: A = hMem CS: A = EC @@ -197,7 +212,8 @@ CS: A = EC `>PUSHW buf` `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.send` -**Out:** + +## RETURN VALUE CC: Y,A = bytes written CS: A = EC @@ -210,4 +226,5 @@ Get socket table ## ASM **In:** `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.GetTable` -**Out:** + +## RETURN VALUE diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 9aee3c156a6047901304c5b6b49f1f85d95aa3b1..30ddab0adfc440a5cd9bcbe076bfb41eb7484837 100644 GIT binary patch delta 16781 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

UZO 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 diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 693d6ec169b0726ee1bf1858c2b2ed5a6d417c26..dcf2f0cc8e1b66c87ed52ec734183467b2e6d520 100644 GIT binary patch delta 33601 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 NL|0xsKFhJ;{{b`OPkjIY diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index 5801662b..decad13e 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -343,8 +343,6 @@ CS.RUN.PUSHDATES lda (ZPFileStat),y beq .1 Month=0.....invalid date/time - >PUSHEA.G TIME.Mod - >PUSHW L.FMT.DateTime lda ZPFileStat clc adc #S.STAT.MTIME @@ -352,14 +350,14 @@ CS.RUN.PUSHDATES lda ZPFileStat+1 adc #0 >PUSHYA + >PUSHW L.FMT.DateTime + >LEA.G TIME.Mod >SYSCALL StrFTime .1 ldy #S.STAT.CTIME+S.TIME.MONTH lda (ZPFileStat),y beq .2 Month=0.....invalid date/time - >PUSHEA.G TIME.Create - >PUSHW L.FMT.DateTime lda ZPFileStat clc adc #S.STAT.CTIME @@ -367,6 +365,8 @@ CS.RUN.PUSHDATES lda ZPFileStat+1 adc #0 >PUSHYA + >PUSHW L.FMT.DateTime + >LEA.G TIME.Create >SYSCALL StrFTime .2 >PUSHEA.G TIME.Mod diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 1912dd5a..f4d6d086 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -5,11 +5,13 @@ AUTO 4,1 K.VER .EQ $5C00 92.0 K.ENV.SIZE .EQ 256 K.PIPE.SIZE .EQ 256 +*-------------------------------------- +K.IRQDEV.MAX .EQ 4 +K.DEV.MAX .EQ 32 +K.NOD.MAX .EQ 32 +K.PS.MAX .EQ 32 K.FLT.MAX .EQ 4 K.EVT.MAX .EQ 4 -K.DEV.MAX .EQ 32 -K.NOD.MAX .EQ 64 -K.PS.MAX .EQ 32 *-------------------------------------- ZPDRV .EQ $20 32 bytes ZPLIB .EQ $40 32 bytes diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt index ba9e7b2b..d31bec11 100644 --- a/INC/KERNEL.I.txt +++ b/INC/KERNEL.I.txt @@ -99,19 +99,15 @@ K.STACKTOP .EQ $03ED XFer !!! down to $3E0 *-------------------------------------- * free $0C00->$17FF = $C00 (3072) Aux *-------------------------------------- -Dev.Table.hFD .EQ $0C00 K.Dev.MAX -Dev.Table.F .EQ $0C20 K.Dev.MAX -Dev.Table.pFDLO .EQ $0C40 K.Dev.MAX -Dev.Table.pFDHI .EQ $0C60 K.Dev.MAX +Dev.Table.hPath .EQ $0C00 K.Dev.MAX +Dev.Table.hFD .EQ $0C20 K.Dev.MAX *-------------------------------------- -* Nod (Opened files) +Nod.Table.hPath .EQ $0C40 K.NOD.MAX +Nod.Table.hFD .EQ $0C60 K.NOD.MAX *-------------------------------------- -Nod.Table.hPath .EQ $0C80 K.NOD.MAX -Nod.Table.hFD .EQ $0CC0 K.NOD.MAX -*-------------------------------------- -PS.Table.hMem .EQ $0D00 K.PS.MAX -PS.Table.PID .EQ $0D20 K.PS.MAX -PS.Table.Stat .EQ $0D40 K.PS.MAX +PS.Table.hMem .EQ $0C80 K.PS.MAX +PS.Table.PID .EQ $0CA0 K.PS.MAX +PS.Table.Stat .EQ $0CC0 K.PS.MAX*2 *-------------------------------------- Evt.Table .EQ $0D60 K.EVT.MAX*S.EVT.SIZE=4*8=32b *-------------------------------------- diff --git a/LIB/LIBBLKDEV.S.txt b/LIB/LIBBLKDEV.S.txt index ae1f2194..bf3743a6 100644 --- a/LIB/LIBBLKDEV.S.txt +++ b/LIB/LIBBLKDEV.S.txt @@ -86,7 +86,7 @@ LIB.UNLOAD clc * PUSHW = DevSize (in 512b blocks) * PUSHB = Catalog Size (in blocks) * PUSHB = Options -* **Out:** +* ## RETURN VALUE * X=BlockCount (max 22) * Y,A=BufSize (max $4400) *\-------------------------------------- @@ -298,7 +298,7 @@ D2TrkR16s * PUSHW = Ptr to 16*256 buffer * PUSHB = TrackNum * 4 : 0->140+ * PUSHB = DSSS0000 -* **Out:** +* ## RETURN VALUE * CC : success * CS : A = Error * A=0, currently starting/seeking... @@ -314,7 +314,7 @@ D2TrkW16s * PUSHW = Ptr to NIBBLE buffer (0 ended) * PUSHB = TrackNum * 4 : 0->140+ * PUSHB = DSSS0000 -* **Out:** +* ## RETURN VALUE * CC : success * CS : A = Error * A=0, currently starting/seeking... diff --git a/LIB/LIBCRYPT.S.txt b/LIB/LIBCRYPT.S.txt index 525bdd37..cbfd4b7c 100644 --- a/LIB/LIBCRYPT.S.txt +++ b/LIB/LIBCRYPT.S.txt @@ -119,7 +119,7 @@ LIB.UNLOAD clc * **In:** * `>PUSHW digest` * `>LDYA str` -* **Out:** +* ## RETURN VALUE * CC *\-------------------------------------- MD5 >STYA ZPDataPtr @@ -149,7 +149,7 @@ MD5 >STYA ZPDataPtr * `HANDLE md5init ();` * # ASM * **In:** -* **Out:** +* ## RETURN VALUE * A = hMem To S.MD5 *\-------------------------------------- MD5Init >LDYAI S.MD5 @@ -186,7 +186,7 @@ MD5Init >LDYAI S.MD5 * `>PUSHW len` * `>PUSHW data` * `>LDA.G md5` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- MD5Update >SYSCALL GetMemPtr get MD5 Context >STYA ZPCtxPtr @@ -272,7 +272,7 @@ MD5Update.I ldy #S.MD5.FINALIZED * **In:** * `>PUSHW digest` * `>LDA.G md5` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- MD5Finalize >PULLA pha diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index ad283b1f..2ffe6649 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -6,7 +6,7 @@ AUTO 4,1 * # ARP.Clear * Clear ARP Cache * **In:** -* **Out:** +* ## RETURN VALUE *\-------------------------------------- ARP.Clear ldx #K.ARPCACHE.SIZE*S.ARPCACHE .1 stz ARP.CACHE-1,x @@ -20,7 +20,7 @@ ARP.Clear ldx #K.ARPCACHE.SIZE*S.ARPCACHE * **In:** * PUSHW PTR to MAC (to fill) * PUSHW PTR to IP -* **Out:** +* ## RETURN VALUE * CC: hit: MAC filled * CS: missed *\-------------------------------------- @@ -90,7 +90,7 @@ ARP.ADD.I sta ARP.TmpCache * # ARP.GetCache * Return a Ptr to ARP Cache Table * **In:** -* **Out:** +* ## RETURN VALUE * Y,A = PTR to ARP.CACHE *\-------------------------------------- ARP.GetCache >LDYA L.ARP.CACHE diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 073135d7..55946718 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -6,7 +6,7 @@ AUTO 4,1 * # DNS.Clear * Clear DNS Cache * **In:** -* **Out:** +* ## RETURN VALUE *\-------------------------------------- DNS.Clear ldx #K.DNSCACHE.SIZE*S.DNSCACHE .1 stz DNS.CACHE-1,x @@ -20,7 +20,7 @@ DNS.Clear ldx #K.DNSCACHE.SIZE*S.DNSCACHE * **In:** * PUSHW = PTR to IP to fill with cached data * PUSHW = hostname PTR to PSTR -* **Out:** +* ## RETURN VALUE * CC: hit: IP filled with address * CS: missed *\-------------------------------------- @@ -221,7 +221,7 @@ DNS.ADD.I sta DNS.TmpCache * # DNS.GetCAche * Return a Ptr to DNS Cache Table * **In:** -* **Out:** +* ## RETURN VALUE * Y,A = PTR to DNS.CACHE *\-------------------------------------- DNS.GetCAche >LDYA L.DNS.CACHE diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 207dbb3b..ecf74de3 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -12,7 +12,7 @@ AUTO 4,1 * `>PUSHB protocol` * `lda type` * `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` -* **Out:** +* ## RETURN VALUE * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- @@ -110,7 +110,7 @@ SKT.Socket.FindFree * `>PUSHW addr` * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` -* **Out:** +* ## RETURN VALUE * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- @@ -150,7 +150,7 @@ SKT.bind >SYSCALL GetMemPtr * `>PUSHW addr` * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` -* **Out:** +* ## RETURN VALUE * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- @@ -239,7 +239,7 @@ SKT.connect.99 rts * **In:** * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.listen` -* **Out:** +* ## RETURN VALUE * CS: A = EC *\-------------------------------------- SKT.listen >SYSCALL GetMemPtr @@ -276,7 +276,7 @@ SKT.listen >SYSCALL GetMemPtr * **In:** * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.accept` -* **Out:** +* ## RETURN VALUE * A = hSocket *\-------------------------------------- SKT.Accept >SYSCALL GetMemPtr @@ -322,7 +322,7 @@ SKT.Accept >SYSCALL GetMemPtr * **In:** * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.shutdown` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- SKT.shutdown >SYSCALL GetMemPtr >STYA ZPPtrSKT @@ -400,7 +400,7 @@ SKT.shutdown >SYSCALL GetMemPtr * `>PUSHW buf` * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.read` -* **Out:** +* ## RETURN VALUE * CC: Y,A = bytes read * CS: A = EC *\-------------------------------------- @@ -451,7 +451,7 @@ SKT.Read >SYSCALL GetMemPtr * `>PUSHW buf` * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.write` -* **Out:** +* ## RETURN VALUE * CC: Y,A = bytes written * CS: A = EC *\-------------------------------------- @@ -505,7 +505,7 @@ SKT.Write >SYSCALL GetMemPtr * `>PUSHW addr` (RecvFrom) * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.Recv` -* **Out:** +* ## RETURN VALUE * CC: A = hMem * CS: A = EC *\-------------------------------------- @@ -613,7 +613,7 @@ SKT.Recv clc * `>PUSHW buf` * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.send` -* **Out:** +* ## RETURN VALUE * CC: Y,A = bytes written * CS: A = EC *\-------------------------------------- @@ -676,7 +676,7 @@ SKT.Send.SEQPACKET * ## ASM * **In:** * `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.GetTable` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- SKT.GetTable >LDYA L.SKT.Table clc diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index 5345ff63..253d73ee 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -210,7 +210,7 @@ Cmd.Exec.EXT.TXT lda #0 Get arg[0] = /PATH/SHELL >SYSCALL GetArg - >PUSHYA + >PUSHYA >LDYA ZPCMDBuf >SYSCALL StrCat @@ -227,7 +227,7 @@ Cmd.Exec.EXT.BIN lda (ZPPTR2) Some ARGS ? beq .1 - + jsr Cmd.Exec.EXT.SEP Add a space.... >PUSHW ZPPTR2 @@ -467,14 +467,15 @@ Cmd.Exec.TIME clc >LEA.G CMD.Time >SYSCALL Time - >PUSHW ZPCMDBuf + >PUSHEA.G CMD.Time + plp bcc .1 >PUSHW L.FMT.DATE bra .2 .1 >PUSHW L.FMT.TIME -.2 >PUSHEA.G CMD.Time +.2 >LDYA ZPCMDBuf >SYSCALL StrFTime >LDYA ZPCMDBuf diff --git a/SYS/KERNEL.S.ARG.txt b/SYS/KERNEL.S.ARG.txt index f47d41de..a8d882e5 100644 --- a/SYS/KERNEL.S.ARG.txt +++ b/SYS/KERNEL.S.ARG.txt @@ -6,7 +6,7 @@ AUTO 4,1 * ## ASM * **In:** * A = argument index. -* **Out:** +* ## RETURN VALUE * CC : success * Y,A = PTR To Arg[A] * CS : Out Of Bound diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index acddbd9d..8c9d9aa1 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -69,7 +69,7 @@ K.UnloadLib pha * ## ASM * **In:** * Y,A = PTR to "NAME.DRV [PARAM]" C-String -* **Out:** +* ## RETURN VALUE * none *\-------------------------------------- K.LoadDrv >STYA .2+1 Save "BIN\0ARGS\0\0" @@ -295,7 +295,7 @@ BIN.hMem .BS 1 * `>PUSHW DRV.CS.START` * `>LDYA L.SRC` * `SYSCALL insdrv` -* **Out:** +* ## RETURN VALUE * Y,A = Ptr to installed driver *\-------------------------------------- K.InsDrv >STYA ZPPtr1 diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 60aaff9e..db46b817 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -3,9 +3,8 @@ PREFIX /A2OSX.BUILD AUTO 4,1 */-------------------------------------- * # GetDevByID -* **In:** * A = DevID -* **Out:** +* ## RETURN VALUE * CC = OK, CS = ERROR * Y,A = FD * X = hFD @@ -15,19 +14,15 @@ K.GetDevByID cmp DevMgr.DevCnt tax lda Dev.Table.hFD,x + beq K.GetDev.NODEV pha - ldy Dev.Table.pFDLO,x - lda Dev.Table.pFDHI,x + jsr K.GetMemPtr plx - -* clc - -.9 rts CC + rts */-------------------------------------- * # GetDevByName -* **In:** * Y,A = Ptr to device name (C-String) -* **Out:** +* ## RETURN VALUE * CC = OK, CS = ERROR * Y,A = FD * X = DevID @@ -36,8 +31,9 @@ K.GetDevByName >STYA ZPPtr1 ldx #0 -.1 ldy Dev.Table.pFDLO,x - lda Dev.Table.pFDHI,x +.1 lda Dev.Table.hFD,x + beq K.GetDev.NODEV + jsr K.GetMemPtr >STYA ZPPtr2 @@ -47,7 +43,7 @@ K.GetDevByName >STYA ZPPtr1 sta ZPPtr3 lda ZPPtr2+1 - adc #0 + adc /S.FD.DEV.NAME sta ZPPtr3+1 ldy #$ff @@ -77,11 +73,10 @@ K.GetDev.9 rts * ## C * `int getdevstatus(short int hFD, S.DIB* dstat);` * ## ASM -* **In:** * `>PUSHWI S.DIB` * `lda DevID` * `>SYSCALL GetDevStatus` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.GetDevStatus jsr K.GetMemPtr >STYA pFD @@ -104,10 +99,9 @@ K.GetDevStatus.I * ## C * `hDEV mkdev (S.FD * fd)` * ## ASM -* **In:** * `>LDYA FD.DEV` * `>SYSCALL mkdev -* **Out:** +* ## RETURN VALUE * A = hDEV *\-------------------------------------- K.MKDev >STYA .1+1 @@ -121,13 +115,9 @@ K.MKDev >STYA .1+1 jsr MEM.GetMem.YAX bcs .99 >STYA pFD - phx + txa ldx DevMgr.DevCnt - sta Dev.Table.pFDHI,x - tya - sta Dev.Table.pFDLO,x - pla sta Dev.Table.hFD,x ldy #S.FD.DEV-1 @@ -145,17 +135,33 @@ K.MKDev >STYA .1+1 jsr K.GetDevStatus.I bcs .99 - lda K.IOBuf - ldx DevMgr.DevCnt - sta Dev.Table.F,x + lda K.IOBuf Get Status byte + bit #S.DIB.S.IRQ + beq .8 - txa - inc DevMgr.DevCnt - rts + ldx #0 + +.2 lda IRQ.Vectors+1,x + beq .3 + inx + inx + cpx #K.IRQDEV.MAX*2 + bne .2 .9 lda #K.E.OOH * sec .99 rts + +.3 lda pFD + sta IRQ.Vectors,x + lda pFD+1 + sta IRQ.Vectors+1,x + +.8 lda DevMgr.DevCnt + inc DevMgr.DevCnt + clc + rts + *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.DEV diff --git a/SYS/KERNEL.S.DIRENT.txt b/SYS/KERNEL.S.DIRENT.txt index 62a91071..d1e76a9a 100644 --- a/SYS/KERNEL.S.DIRENT.txt +++ b/SYS/KERNEL.S.DIRENT.txt @@ -6,10 +6,9 @@ AUTO 4,1 * ## C * `int hDIR opendir (const char * dirpath);` * ## ASM -* **In:** * `>LDYA dirpath` * `>SYSCALL opendir` -* **Out:** +* ## RETURN VALUE * CC : success * A = hDIR * CS : error @@ -68,11 +67,10 @@ K.OpenDir jsr PFT.CheckPathYA * ## C * `int readdir (int hDIR, S.DIRENT * dirent);` * ## ASM -* **In:** * `>PUSHW dirent` * `lda hDIR` * `>SYSCALL readdir` -* **Out:** +* ## RETURN VALUE * CC : success * X = hDIRENT * Y,A = PTR to S.DIRENT @@ -605,10 +603,9 @@ K.ReadDir.ConvertTime * ## C * `void closedir(hDIR);` * ## ASM -* **In:** * `lda hDIR` * `>SYSCALL closedir` -* **Out:** +* ## RETURN VALUE * none, always succeed. *\------------------------------------- *K.CloseDir .EQ K.FClose diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index ef2b8758..5e263fe5 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -5,7 +5,7 @@ AUTO 4,1 * # ExpandStr * **In:** * Y,A = PTR to String to Expand (C-String) -* **Out:** +* ## RETURN VALUE * X = hMem to Expanded String (C-String) * Y,A = PTR to Expanded String *\-------------------------------------- @@ -133,7 +133,7 @@ K.ExpandStr stz .88+1 Reset Intermediate string... * `>PUSHWI fullpath` * `>PUSHWI searchpath` * `>LDYAI filename` -* **Out:** +* ## RETURN VALUE * CC : success * DstBuf = FilePath * DstStat = S.STAT @@ -232,7 +232,7 @@ K.FileSearch.SearchPath .BS 2 * **In:** * `>LDYA string` * `>SYSCALL putenv` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.PutEnv >STYA ZPPtr1 NAME=VALUE @@ -275,10 +275,9 @@ K.PutEnv >STYA ZPPtr1 NAME=VALUE * `>PUSHW value` * `>LDYA name` * `>SYSCALL setenv` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- -K.SetEnv >STYA ZPPtr1 name - >PULLW ZPPtr2 value +K.SetEnv jsr MEM.SPtr1PPtr2 K.SetEnv.I jsr K.UnsetEnv.I @@ -385,8 +384,8 @@ K.SetEnv.I jsr K.UnsetEnv.I * ## ASM * **In:** * `>LDYA name` -* `>SYSCALL gerenv` -* **Out:** +* `>SYSCALL getenv` +* ## RETURN VALUE * CC : Y,A = PTR to VALUE (C-String) * CS : not found *\-------------------------------------- @@ -408,7 +407,7 @@ K.GetEnv >STYA ZPPtr1 * **In:** * `>LDYA name` * `>SYSCALL unsetenv` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.UnsetEnv >STYA ZPPtr1 Store VAR Name K.UnsetEnv.I jsr ENV.FindVarP1 diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index f0c5d0db..f8ad98cc 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -6,7 +6,7 @@ AUTO 4,1 * Load TXT a file in memory (with ending 0) * **In:** * Y,A = File Path -* **Out:** +* ## RETURN VALUE * Y,A = File Length (without ending 0) * X = hMem of Loaded File *\-------------------------------------- @@ -25,7 +25,7 @@ K.LoadTxtFile pha * PUSHB = TYPE ... * PUSHB = MODE ... * LDYA = PATH ...FOpen) -* **Out:** +* ## RETURN VALUE * Y,A = File Length * X = hMem of Loaded File *\-------------------------------------- @@ -121,7 +121,7 @@ FIO.Mem .BS 2 * `>PUSHBI filetype` * `>LDYA filepath` * `>SYSCALL chtyp` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.ChTyp jsr PFT.CheckPathYA jsr STDIO.SetMLIPathYA diff --git a/SYS/KERNEL.S.IO.txt b/SYS/KERNEL.S.IO.txt index 2baf0f6b..adacbdf5 100644 --- a/SYS/KERNEL.S.IO.txt +++ b/SYS/KERNEL.S.IO.txt @@ -10,7 +10,7 @@ AUTO 4,1 * `>PUSHB flags` * `>LDYA pathname` * `>SYSCALL open` -* **Out:** +* ## RETURN VALUE * A = hFD * REG File created on ProDOS : T=TXT,X=$0000 *\-------------------------------------- @@ -238,7 +238,7 @@ IO.CLOSE.PIPE clc * `>PUSHW buf` * `lda fd` * `>SYSCALL read` -* **Out:** +* ## RETURN VALUE * CC: Y,A = bytes read * CS: A = EC *\-------------------------------------- @@ -267,7 +267,7 @@ IO.Read.I lda (pFD) #S.FD.T * `>PUSHW buf` * `lda fd` * `>SYSCALL write` -* **Out:** +* ## RETURN VALUE * CC: Y,A = bytes written * CS: A = EC *\-------------------------------------- @@ -402,12 +402,11 @@ IO.WRITE.PIPE >PULLW K.S.IOCTL+S.IOCTL.BUFPTR * ## C * `int ioctl(short int hFD, int request, void * param );` * ## ASM -* **In:** * `PUSHWI param` * `PUSHBI request` * `lda hFD` * `>SYSCALL IOCTL` -* **Out:** +* ## RETURN VALUE * Y,A = ... *\-------------------------------------- K.IOCTL jsr K.GetMemPtr @@ -440,7 +439,6 @@ K.IOCTL.pDrvJmp jmp (pDrv) * ## C * `int pipe(int pipefd[2]);` * ## ASM -* **In:** *\-------------------------------------- K.Pipe .9 sec diff --git a/SYS/KERNEL.S.IRQ.txt b/SYS/KERNEL.S.IRQ.txt index f79e0f8a..e19d4c14 100644 --- a/SYS/KERNEL.S.IRQ.txt +++ b/SYS/KERNEL.S.IRQ.txt @@ -190,14 +190,12 @@ K.IrqH.Switch inc IRQ.Tick *-------------------------------------- K.IrqH.DEV ldx #0 -.1 lda Dev.Table.F,x - and #S.DIB.S.IRQ - beq .2 +.1 lda IRQ.Vectors+1,x + beq .9 - lda Dev.Table.pFDLO,x - sta $fe - lda Dev.Table.pFDHI,x sta $ff + lda IRQ.Vectors,x + sta $fe ldy #S.FD.DEV.DRVPTR lda ($fe),y @@ -215,15 +213,18 @@ K.IrqH.DEV ldx #0 bcc .8 CC, IRQ cleared by device .2 inx + inx -.3 cpx DevMgr.DevCnt +.3 cpx #K.IRQDEV.MAX*2 bne .1 - sec +.9 sec .8 clv clear V (no task switching) rts *-------------------------------------- +IRQ.Vectors .BS K.IRQDEV.MAX*2 +*-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.IRQ LOAD /A2OSX.SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.MATH.txt b/SYS/KERNEL.S.MATH.txt index e42a72d2..3e7cda10 100644 --- a/SYS/KERNEL.S.MATH.txt +++ b/SYS/KERNEL.S.MATH.txt @@ -13,7 +13,7 @@ AUTO 4,1 * `>SYSCALL fmult` * `>SYSCALL fdiv` * `>SYSCALL fpwr` -* **Out:** +* ## RETURN VALUE * On stack (float) *\-------------------------------------- K.FAdd ldx #ROM.FADD @@ -47,7 +47,7 @@ K.FPwr ldx #ROM.PWR * **In:** * `>PUSHF x (Float)` * `>SYSCALL log` -* **Out:** +* ## RETURN VALUE * On stack (Float) *\-------------------------------------- K.Log ldx #ROM.LOG @@ -77,7 +77,7 @@ K.ATan ldx #ROM.ATAN * ## ASM * **In:** * `>PUSHL X` (long) -* **Out:** +* ## RETURN VALUE * On stack (float) *\-------------------------------------- K.Float ldx #4 @@ -116,7 +116,7 @@ MATH.Go jsr GP.ROMCALL * **In:** * `>PUSHF x` * `>SYSCALL lrintf` -* **Out:** +* ## RETURN VALUE * On stack (long) *\-------------------------------------- K.lrintf jsr MATH.PullFAC diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index a6709a1c..5539896d 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -12,9 +12,8 @@ ZPSListKeyPtr .EQ ZPMEMMGR+12 ZPSListDataPtr .EQ ZPMEMMGR+14 */-------------------------------------- * # GetMem0 -* **In:** * Y,A = Size Requested -* **Out:** +* ## RETURN VALUE * CC : success * YA = PTR to Mem (ZERO Initialised) * X = hMem @@ -25,9 +24,8 @@ K.GetMem0 ldx #S.MEM.F.INIT0 .HS 2C bit abs */-------------------------------------- * # GetMem -* **In:** * Y,A = Size Requested -* **Out:** +* ## RETURN VALUE * CC : success * YA = PTR to Mem (Uninitialised) * X = hMem @@ -233,9 +231,8 @@ Mem.NextSlot lda ZPMemMgrSPtr .8 rts */-------------------------------------- * # FreeMem -* **In:** * A = hMem To Free -* **Out:** +* ## RETURN VALUE * none. * (X unmodified) *\-------------------------------------- @@ -331,9 +328,8 @@ K.FreeMem tay K.FreeMem.ERR .AZ "FreeMem:%H:hMem already freed." */-------------------------------------- * # GetMemPtr -* **In:** * A = hMem -* **Out:** +* ## RETURN VALUE * Y,A = PTR to MemBlock * (X unmodified) *\-------------------------------------- @@ -369,9 +365,8 @@ K.GetMemPtr sta ZPMemMgrSPtr rts */-------------------------------------- * # GetMemByID -* **In:** * A = hMem -* **Out:** +* ## RETURN VALUE * Y,A = ZPMemMgrSPtr = PTR to S.MEM * (X unmodified) *\-------------------------------------- @@ -389,9 +384,8 @@ K.GetMemByID sta ZPMemMgrSPtr */-------------------------------------- * # NewStr * Create a new copy of this C-String -* **In:** * Y,A = Ptr to source C-String -* **Out:** +* ## RETURN VALUE * CC : success * Y,A = PTR to String * X = hMem (PSTR) @@ -441,22 +435,20 @@ K.NewStr >STYA .1+1 .9 rts */-------------------------------------- * # SListGetByID -* **In:** * PUSHB = hSList * PUSHW = KeyID * PUSHW = Data Ptr * PUSHW = Key Ptr -* **Out:** +* ## RETURN VALUE * X,Y = Next KeyID *\-------------------------------------- K.SListGetByID >PULLW ZPSListKeyPtr */-------------------------------------- * # SListUpdateByID -* **In:** * PUSHB = hSList * PUSHW = KeyID * PUSHW = Data Ptr -* **Out:** +* ## RETURN VALUE * A = Key Length * X,Y = KeyID *\-------------------------------------- @@ -466,22 +458,20 @@ K.SListUpdateByID bra K.SListPullH */-------------------------------------- * # SListAdd -* **In:** * PUSHB = hSList * PUSHW = Key Ptr * PUSHW = Data Ptr -* **Out:** +* ## RETURN VALUE * A = Key Length * X,Y = KeyID *\-------------------------------------- K.SListAdd */-------------------------------------- * # SListLookup -* **In:** * PUSHB = hSList * PUSHW = Key Ptr * PUSHW = Data Ptr -* **Out:** +* ## RETURN VALUE * A = Key Length * X,Y = KeyID *\-------------------------------------- @@ -492,16 +482,14 @@ K.SListLookup K.SListPullH >PULLA */-------------------------------------- * # SListNew -* **In:** -* **Out:** +* ## RETURN VALUE * A=hSList *\-------------------------------------- K.SListNew */-------------------------------------- * # SListFree -* **In:** * A=hSList -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.SListFree *-------------------------------------- @@ -513,10 +501,9 @@ K.SListFree rts */-------------------------------------- * # GetStkObjProp -* **In:** * A = hObject (AUX Memory) * Y = Property Index -* **Out:** +* ## RETURN VALUE * Y,A = Property Value *\-------------------------------------- K.GetStkObjProp phy @@ -534,9 +521,8 @@ K.GetStkObjProp phy rts */-------------------------------------- * # NewStkObj -* **In:** * Y,A = Size Requested -* **Out:** +* ## RETURN VALUE * CC : success * YA = PTR to Mem (Uninitialised) * X = hMem @@ -547,9 +533,8 @@ K.NewStkObj ldx #SYS.GetMem .HS 2C BIT ABS */-------------------------------------- * # FreeStkObj -* **In:** * A = hMem To Free (AUX Memory) -* **Out:** +* ## RETURN VALUE * none. * (X,Y unmodified) *\-------------------------------------- @@ -568,12 +553,11 @@ MEM.GoStkObj sta SETREADAUX */-------------------------------------- * # LoadStkObj * Load a file in AUX memory (Stock Objects) -* **In:** * PUSHW = AUXTYPE (Handled by.... * PUSHB = TYPE ... * PUSHB = MODE ... * PUSHW = PATH ...FOpen) -* **Out:** +* ## RETURN VALUE * Y,A = File Length * X = hMem of Loaded Object in AUX mem *\-------------------------------------- @@ -701,15 +685,6 @@ MEM.TXTPTR.GetNext inc TXTPTR+1 .9 rts *-------------------------------------- -MEM.PullP1P2P3 sec - .HS 90 bcc -MEM.PullP1P2 clc - >PULLW ZPPtr1 - >PULLW ZPPtr2 - bcc .9 - >PULLW ZPPtr3 -.9 rts -*-------------------------------------- MEM.SPtr1PPtr2 >STYA ZPPtr1 >PULLW ZPPtr2 rts diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index 2c5880dd..a1ec97e0 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -8,7 +8,7 @@ AUTO 4,1 * # CreatePS (Non Blocking) * **In:** * Y,A = PTR To Cmd Line -* **Out:** +* ## RETURN VALUE * A = Child PSID *\-------------------------------------- K.ExecPSNewEnv ldx #S.PS.F.DUPENV+S.PS.F.HOLD @@ -46,13 +46,26 @@ K.CreatePS ldx #0 *-------------------------------------- PS.Flags .BS 1 PS.CL .BS 2 +*/-------------------------------------- +* # Exec +* ## C +* `int exec(const char *path, char *const argv[], short int flage);` +* ## ASM +* `>PUSHB flags` +* `>PUSHW argv` +* `>LDYAI path` +* `>SYSCALL exec` +* ## RETURN VALUE +* A = Child PSID +*\-------------------------------------- +Exec *-------------------------------------- * PS.CreateChild * in : * out : * A = PSID * we cannot use ZPPtrs1 & 2 -* because of calling K.NewStr.YA & S.DupEnv.A +* because of calling K.NewStr.YA & PS.Dup *-------------------------------------- PS.CreateChild ldx #0 @@ -180,7 +193,7 @@ PS.CmdLine2Args >STYA ZPPtr1 iny bne .1 max 255 -.2 tya +2 for ending 0 for last string, and endig 0 for array +.2 tya +2 for ending 0 for last string, and ending 0 for array clc adc #2 tay @@ -349,6 +362,14 @@ PS.Load jsr BIN.Load Y,A=filename full path * Out: * A = hMem to new ENV *-------------------------------------- +PS.DupArgs +*-------------------------------------- +* PS.DupEnv +* In: +* A = ENV hMem To Duplicate +* Out: +* A = hMem to new ENV +*-------------------------------------- PS.DupEnv jsr K.GetMemPtr >STYA ZPPtr1 @@ -394,7 +415,7 @@ PS.SetMemOwner lda CORE.LastPSID * # GetMemStat * **In:** * Y,A = Ptr to 24 bytes buffer -* **Out:** +* ## RETURN VALUE * Buffer filled with memory stats *\-------------------------------------- K.GetMemStat >STYA ZPMemMgrTmp1 @@ -429,7 +450,7 @@ K.GetMemStat >STYA ZPMemMgrTmp1 * # GetPSStatus * **In:** * A = PID -* **Out:** +* ## RETURN VALUE * A = Status Byte *\-------------------------------------- K.GetPSStatus jsr CORE.GetPSByID @@ -441,7 +462,7 @@ K.GetPSStatus jsr CORE.GetPSByID * # GetPSStat * **In:** * Y,A = Ptr to 24 bytes buffer -* **Out:** +* ## RETURN VALUE * Buffer filled with PS stats *\-------------------------------------- K.GetPSStat >STYA ZPPtr1 diff --git a/SYS/KERNEL.S.STAT.txt b/SYS/KERNEL.S.STAT.txt index ff481c88..5685fec7 100644 --- a/SYS/KERNEL.S.STAT.txt +++ b/SYS/KERNEL.S.STAT.txt @@ -11,7 +11,7 @@ AUTO 4,1 * `>PUSHW statbuf` * `lda hFILE` * `>SYSCALL fstat` -* **Out:** +* ## RETURN VALUE *-------------------------------------- K.FStat jsr PFT.CheckNodeA jsr STDIO.GetHFile @@ -32,7 +32,7 @@ K.FStat jsr PFT.CheckNodeA * `>PUSHW statbuf` * `>LDYA pathname` * `>SYSCALL stat` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.Stat jsr PFT.CheckPathYA K.Stat.I jsr STDIO.SetMLIPathYA @@ -107,7 +107,7 @@ K.Stat.DST .DA #S.STAT.P.TYPE * `>PUSHW mode` * `>LDYA pathname` * `>SYSCALL mkdir` -* **Out:** +* ## RETURN VALUE * CC : success * CS : error * A = EC @@ -144,7 +144,7 @@ K.MKDir.RTS rts * `>PUSHW mode` * `>LDYA pathname` * `>SYSCALL mknod` -* **Out:** +* ## RETURN VALUE * CC = OK, CS = ERROR * A = hFILE *\-------------------------------------- @@ -194,7 +194,7 @@ STAT.MKNOD.PIPE * `>PUSHW mode` * `>LDYA pathname` * `>SYSCALL mkfifo` -* **Out:** +* ## RETURN VALUE * CC = OK, CS = ERROR * A = hFILE *\-------------------------------------- diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 42dc0542..1de57233 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -21,7 +21,7 @@ BCDBUF .EQ ARG * `>PUSHB character` * `lda stream` * `>SYSCALL fputc` -* **Out:** +* ## RETURN VALUE * CC = success *\-------------------------------------- K.FPutC pha @@ -37,7 +37,7 @@ K.FPutC pha * **In:** * `lda caracter` * `>SYSCALL putchar` -* **Out:** +* ## RETURN VALUE * CC = success *\-------------------------------------- K.PutChar sta K.IOBuf @@ -63,7 +63,7 @@ K.PutChar.Y lda #0 * ## ASM * `>LDYAI str` * `>SYSCALL puts` -* **Out:** +* ## RETURN VALUE * CC = success *\-------------------------------------- K.PutS >PUSHYA @@ -92,7 +92,7 @@ K.PutS.RTS rts * `>PUSHW str` * `lda stream` * `>SYSCALL fputs` -* **Out:** +* ## RETURN VALUE * CC = success *\-------------------------------------- K.FPutS jsr STDIO.GetHFile @@ -133,7 +133,7 @@ K.FPutS jsr STDIO.GetHFile * `>PUSHWI format` * `lda hFILE` * `>SYSCALL fprintf` -* **Out:** +* ## RETURN VALUE * CC : success, Y,A = bytes sent * CS : error, A = code from Output * Specifiers : @@ -683,7 +683,7 @@ PrintF.Cnt .BS 2 * `>PUSHW s` * `lda hFILE` * `>SYSCALL fgets` -* **Out:** +* ## RETURN VALUE * Y,A: s * CC = success *\-------------------------------------- @@ -740,7 +740,7 @@ K.FGetS pha save hFILE * ## ASM * **In:** * `>SYSCALL getchar` -* **Out:** +* ## RETURN VALUE * CC = success * A = char *\-------------------------------------- @@ -755,7 +755,7 @@ K.GetChar ldy #S.PS.hStdIn * **In:** * `lda stream` * `>SYSCALL getc` -* **Out:** +* ## RETURN VALUE * CC = success * A = char *\-------------------------------------- @@ -792,7 +792,7 @@ K.GetC.9 rts * TODO : %10s * `>LDYA s` * `>SYSCALL sscanf` -* **Out:** +* ## RETURN VALUE * A = Number of arguments filled. *\-------------------------------------- K.SScanF >STYA ZPPtr2 String to Scan @@ -966,7 +966,7 @@ K.SScanF.Fwd tya Y=char count parsed * + ,t=123 or t=$ff or t=TXT * + ,x=12345 or x=$ffff * `>LDYAI filename` -* **Out:** +* ## RETURN VALUE * CC : A = hFILE * CS : A = EC *\-------------------------------------- @@ -1007,7 +1007,7 @@ K.FOpen.RTS rts * **In:** * `lda stream` * `>SYSCALL fclose` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.FClose jsr PFT.CheckNodeA tax @@ -1036,7 +1036,7 @@ K.FClose.RTS rts * `>PUSHW ptr` * `lda stream` * `>SYSCALL fread` -* **Out:** +* ## RETURN VALUE * Y,A = Bytes Read *\-------------------------------------- K.FRead jsr PFT.CheckNodeA @@ -1055,7 +1055,7 @@ K.FRead jsr PFT.CheckNodeA * `>PUSHW ptr` * `lda stream` * `>SYSCALL fwrite` -* **Out:** +* ## RETURN VALUE * Y,A = Bytes Written *\-------------------------------------- K.FWrite jsr PFT.CheckNodeA @@ -1158,7 +1158,7 @@ K.FSeek jsr PFT.CheckNodeA * **In:** * `lda stream` * `>SYSCALL feof` -* **Out:** +* ## RETURN VALUE * CC : * A=0 EOF * A !=0 NOT EOF @@ -1202,7 +1202,7 @@ K.FEOF.MARK .BS 3 * **In:** * `lda stream` * `>SYSCALL ftell` -* **Out:** +* ## RETURN VALUE * On stack (long) *\-------------------------------------- K.FTell jsr PFT.CheckNodeA @@ -1230,7 +1230,7 @@ K.FTell jsr PFT.CheckNodeA * **In:** * `>LDYA pathname` * `>SYSCALL remove` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.Remove jsr PFT.CheckPathYA jsr STDIO.SetMLIPathYA @@ -1246,7 +1246,7 @@ K.Remove jsr PFT.CheckPathYA * `>PUSHW newpath` * `>LDYA oldpath` * `>SYSCALL rename` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- K.Rename jsr PFT.CheckPathYA jsr STDIO.SetMLIPathYA diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index b24466eb..b787dd7f 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -11,7 +11,7 @@ AUTO 4,1 * `>PUSHWI EndPtr` * `>LDYA str` * `>SYSCALL strtof` -* **Out:** +* ## RETURN VALUE * On stack (float) *\-------------------------------------- K.strtof >STYA TXTPTR Ptr to source string @@ -34,7 +34,7 @@ K.strtof >STYA TXTPTR Ptr to source string * **In:** * `>LDYA str` * `>SYSCALL atof` -* **Out:** +* ## RETURN VALUE * On stack (float) *\-------------------------------------- K.AToF >STYA TXTPTR Ptr to source string @@ -70,7 +70,7 @@ K.AToF.I jsr CHARGOT * `>PUSHWI EndPtr` * `>LDYAI str` * `>SYSCALL strtol` -* **Out:** +* ## RETURN VALUE * On stack (long) *\-------------------------------------- K.StrToL sec Signed @@ -101,7 +101,7 @@ K.StrToUL.rts rts * **In:** * `>LDYA str` * `>SYSCALL atol` -* **Out:** +* ## RETURN VALUE * On stack (long) *\-------------------------------------- *STDLIB.32 .BS 4 32 bits max @@ -136,7 +136,7 @@ K.AToL.I jsr STDLIB.GetDec * **In:** * `>LDYAI str` * `>SYSCALL atoi` -* **Out:** +* ## RETURN VALUE * Y,A = int *\-------------------------------------- K.atoi >STYA ZPPtr2 @@ -286,7 +286,7 @@ STDLIB.32.Clear ldx #3 * **In:** * `>LDYA str` * `>SYSCALL realpath` -* **Out:** +* ## RETURN VALUE * CC : success * Y,A = Ptr to Full Path (C-String) * X = hMem of Full Path diff --git a/SYS/KERNEL.S.STRING.txt b/SYS/KERNEL.S.STRING.txt index e7997c70..98d2dfcb 100644 --- a/SYS/KERNEL.S.STRING.txt +++ b/SYS/KERNEL.S.STRING.txt @@ -7,10 +7,9 @@ AUTO 4,1 * ## C * `int strlen ( char * str);` * ## ASM -* **In:** * `>LDYAI str` * `>SYSCALL strlen` -* **Out:** +* ## RETURN VALUE * Y,A = String length *\-------------------------------------- K.StrLen >STYA ZPPtr1 @@ -38,7 +37,7 @@ K.StrLen >STYA ZPPtr1 * `>PUSHWI source` * `>LDYAI destination` * `>SYSCALL strcat` -* **Out:** +* ## RETURN VALUE * Y,A = destination *\-------------------------------------- K.StrCat sec @@ -53,12 +52,11 @@ K.StrCat sec * `>PUSHWI source` * `>LDYAI destination` * `>SYSCALL strcpy` -* **Out:** +* ## RETURN VALUE * Y,A = destination *\-------------------------------------- K.StrCpy clc - >STYA ZPPtr1 - >PULLW ZPPtr2 + jsr MEM.SPtr1PPtr2 bcc .2 @@ -92,12 +90,11 @@ K.StrCpy clc * `>PUSHWI pattern` * `>LDYAI s` * `>SYSCALL strmatch` -* **Out:** +* ## RETURN VALUE * CC : match * CS : no match *\-------------------------------------- -K.StrMatch >STYA ZPPtr1 s - >PULLW ZPPtr2 pattern +K.StrMatch jsr MEM.SPtr1PPtr2 lda (ZPPtr2) Get pattern 1st byte beq .8 Match always if empty @@ -172,7 +169,7 @@ K.StrMatch >STYA ZPPtr1 s * `>LDYAI str` * `>SYSCALL strupr` * `>SYSCALL strlwr` -* **Out:** +* ## RETURN VALUE * Uppercased/lowercased String in Buffer * Y,A = str *\-------------------------------------- @@ -215,7 +212,7 @@ K.StrLwr ldx #2 * `>PUSHWI s2` * `>LDYAI s1` * `>SYSCALL strcmp` -* **Out:** +* ## RETURN VALUE * CC : match * CS : no match * CC, Y,A=0 @@ -233,15 +230,14 @@ K.StrCmp sec * `>PUSHWI s2` * `>LDYAI s1` * `>SYSCALL strcasecmp` -* **Out:** +* ## RETURN VALUE * CC : match * CS : no match * CC, Y,A=0 * CS, Y,A > 0 or < 0 *\-------------------------------------- K.StrCaseCmp clc - >STYA ZPPtr1 s1 - >PULLW ZPPtr2 s2 + jsr MEM.SPtr1PPtr2 ldy #0 diff --git a/SYS/KERNEL.S.TIME.txt b/SYS/KERNEL.S.TIME.txt index ecc0d2db..e4ea67ef 100644 --- a/SYS/KERNEL.S.TIME.txt +++ b/SYS/KERNEL.S.TIME.txt @@ -14,9 +14,9 @@ DAY0 .EQ 4 day 0 was a thursday * ## C * `time_t time (S.TIME* timer);` * ## ASM -* **In:** -* Y,A = PTR to S.TIME -* **Out:** +* `>LDYA timer` +* `>SYSCALL time` +* ## RETURN VALUE * S.TIME filled with System date/time *\-------------------------------------- K.Time >STYA ZPPtr2 @@ -30,14 +30,12 @@ K.Time >STYA ZPPtr2 * ## C * `int PTime2Time (long* ptime, S.TIME* timer);` * ## ASM -* **In :** * `>PUSHW timer` * `>LDYA ptime` * `>SYSCALL PTime2Time` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- -K.PTime2Time >STYA ZPPtr1 - >PULLW ZPPtr2 +K.PTime2Time jsr MEM.SPtr1PPtr2 TIME.PTime2TimeP1P2 ldy #1 lda (ZPPtr1),y Get Year @@ -165,14 +163,12 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) * ## C * `int CTime2Time (long* ctime, S.TIME* timer);` * ## ASM -* **In :** * `>PUSHW timer` * `>LDYA ctime` * `>SYSCALL CTime2Time` -* **Out:** +* ## RETURN VALUE *\-------------------------------------- -K.CTime2Time >STYA ZPPtr1 - >PULLW ZPPtr2 +K.CTime2Time jsr MEM.SPtr1PPtr2 ldy #3 @@ -393,11 +389,10 @@ K.CTime.Year .BS 1 * # StrFTime * ## C * Convert S.TIME struct to CSTR -* `size_t strftime (char* ptr, size_t maxsize, const char* format, const struct tm* timeptr );` +* `size_t strftime (char* ptr, const char* format, const struct S.TIME* timeptr );` * ## ASM -* **In:** -* PUSHW = Dst PTR To CSTR Buf -* PUSHW = Src PTR To Format String +* `PUSHW timeptr` +* `PUSHW format` * + %a : Abbreviated weekday name : Thu * + %A : Full weekday name : Thursday * + %b : Abbreviated month name : Aug @@ -412,11 +407,13 @@ K.CTime.Year .BS 1 * + %w : Weekday as a decimal number with Sunday as 0 (0-6) * + %y : Year, last two digits (00-99) * + %Y : Year four digits 2001 -* PUSHW = Src PTR To S.Time -* **Out:** +* `>LDYA ptr` +* `>SYSCALL strftime` +* ## RETURN VALUE * none. always succeed. *\-------------------------------------- -K.StrFTime jsr MEM.PullP1P2P3 +K.StrFTime jsr MEM.SPtr1PPtr2 + >PULLW ZPPtr3 timeptr ldy #0 @@ -453,7 +450,7 @@ K.StrFTime jsr MEM.PullP1P2P3 bra .1 .8 lda #0 Terminate C string - sta (ZPPtr3) + sta (ZPPtr1) rts *-------------------------------------- K.StrFTime.TBL .AS "aAbBdHImMpSwyY" @@ -504,7 +501,7 @@ K.StrFTime.BB ldx #15 full Month.... >STYA ZPPtr4 ldy #S.Time.MONTH -K.StrFTime.STR lda (ZPPtr1),y get required S.Time field value +K.StrFTime.STR lda (ZPPtr3),y get required S.Time field value tay beq .9 Illegal value @@ -544,7 +541,7 @@ K.StrFTime.D ldy #S.Time.DAY K.StrFTime.HH ldy #S.Time.HOUR bra K.StrFTime.addDecPtr1Y K.StrFTime.II ldy #S.Time.HOUR - lda (ZPPtr1),y + lda (ZPPtr3),y cmp #12 bcc .1 sbc #12 @@ -554,7 +551,7 @@ K.StrFTime.M ldy #S.Time.MONTH K.StrFTime.MM ldy #S.Time.MINUTE bra K.StrFTime.addDecPtr1Y K.StrFTime.P ldy #S.Time.HOUR - lda (ZPPtr1),y + lda (ZPPtr3),y cmp #12 bcc .1 lda #'p' @@ -572,7 +569,7 @@ K.StrFTime.YY ldy #S.Time.CENTURY K.StrFTime.Y ldy #S.Time.YEAR *-------------------------------------- K.StrFTime.addDecPtr1Y - lda (ZPPtr1),y + lda (ZPPtr3),y K.StrFTime.addDecA stz .2+1 @@ -606,10 +603,10 @@ K.StrFTime.addDecA ora #$30 *-------------------------------------- K.StrFTime.addChar - sta (ZPPtr3) - inc ZPPtr3 + sta (ZPPtr1) + inc ZPPtr1 bne .8 - inc ZPPtr3+1 + inc ZPPtr1+1 .8 rts *-------------------------------------- K.StrFTime.DAY >PSTR "Monday"