From fe193891d1935439111bc24fef7fdfd21bea8d86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sun, 16 Feb 2020 21:45:16 +0100 Subject: [PATCH] Kernel 0.94 --- .Docs/KERNEL.md | 404 ++++++++++++++++++++------------------ .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/EDIT.S.CTRL.txt | 8 +- BIN/LSDEV.S.txt | 3 +- BIN/MEM.S.txt | 5 +- BIN/STAT.S.txt | 35 ++-- INC/A2osX.I.txt | 40 ++-- SYS/KERNEL.S.CORE.txt | 18 +- SYS/KERNEL.S.DEF.txt | 2 - SYS/KERNEL.S.DEV.txt | 84 +++++--- SYS/KERNEL.S.DIRENT.txt | 172 +++++----------- SYS/KERNEL.S.GP.txt | 43 ++-- SYS/KERNEL.S.INIT.txt | 13 +- SYS/KERNEL.S.IO.txt | 47 +---- SYS/KERNEL.S.JMP.txt | 24 +-- SYS/KERNEL.S.MATH.txt | 91 +++++---- SYS/KERNEL.S.MEM.txt | 30 +-- SYS/KERNEL.S.PIPE.txt | 35 ++-- SYS/KERNEL.S.SHARED.txt | 22 +++ SYS/KERNEL.S.STAT.txt | 108 +++++++--- SYS/KERNEL.S.STDIO2.S.txt | 152 +++++++------- SYS/KERNEL.S.UNISTD.txt | 7 +- SYS/KERNEL.S.txt | 6 +- 23 files changed, 686 insertions(+), 663 deletions(-) diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index f9b086b5..2236c33b 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -30,8 +30,8 @@ Expand String and convert to StrV List short int arg2argv(char* args, char* argv[]) ## ASM +`>PUSHW args` `>PUSHW argv` -`>LDYA args` `>SYSCALL Arg2ArgV` ## RETURN VALUE @@ -82,11 +82,11 @@ X = hDev # GetDevStatus ## C -`int getdevstatus(short int DevID, S.DIB* dstat);` +`int getdevstatus(short int DevID, S.DIB *dstat);` ## ASM -`>PUSHWI S.DIB` -`lda DevID` +`PUSHB DevID` +`>PUSHW S.DIB` `>SYSCALL GetDevStatus` ## RETURN VALUE @@ -95,23 +95,37 @@ X = hDev Create a hDEV ## C -`hDEV mkdev (S.FD * fd, const char *devname)` +`hDEV mkdev (S.FD *fd, const char *devname)` ## ASM +`>PUSHW fd` `>PUSHW devname` -`>LDYA fd` `>SYSCALL mkdev ## RETURN VALUE A = hDEV +# IOCTL + +## C +`int ioctl(short int DevID, int request, void * param );` + +## ASM +`>PUSHB hDEV` +`>PUSHB request` +`>PUSHW param` +`>SYSCALL IOCTL` + +## RETURN VALUE + Y,A = ... + # OpenDir ## C `int hDIR opendir (const char * dirpath);` ## ASM -`>LDYA dirpath` +`>PUSHW dirpath` `>SYSCALL opendir` ## RETURN VALUE @@ -150,25 +164,10 @@ Create a hDEV ## RETURN VALUE none, always succeed. -# Expand - -## C -`char *expand(const char *str, char *expanded);` - -## ASM -**In:** -`>PUSHW str` -`>PUSHW expanded` -`>SYSCALL expand` - -## RETURN VALUE - Y,A = PTR to Expanded String - X = hMem to Expanded String (C-String) - # SetEnv Change or add an environment variable -## C +## C / CSH `int setenv(const char *name, const char *value);` ## ASM @@ -183,7 +182,7 @@ Change or add an environment variable searches the environment list to find the environment variable name, and returns a pointer to the corresponding value string. -## C +## C / CSH `char *getenv(const char *name, char *value);` ## ASM @@ -199,7 +198,7 @@ and returns a pointer to the corresponding value string. # PutEnv Change or add an environment variable, string is 'NAME=VALUE' -## C +## C / CSH `int putenv(char *string);` ## ASM @@ -212,7 +211,7 @@ Change or add an environment variable, string is 'NAME=VALUE' # UnsetEnv Remove an environment variable -## C +## C / CSH `int unsetenv(const char *name);` ## ASM @@ -222,37 +221,13 @@ Remove an environment variable ## RETURN VALUE -# ChTyp -Change The type of a ProDOS File - -## C -`int chtyp(const char *filepath, const char filetype);` - -## ASM -**In:** -`>PUSHBI filetype` -`>LDYA filepath` -`>SYSCALL chtyp` - -## RETURN VALUE - -# ChOwn -**In:** - PUSHW = mod - PUSHW = PATH - -# ChGrp -**In:** - PUSHW = GID - PUSHW = PATH - # Add32,Sub32,Mul32,IMul32,Div32,IDiv32,Mod32,IMod32,Cmp32,ICmp32 Return X+Y, X-Y, X*Y, X/Y, X mod Y.... ## ASM **In:** -`>PUSHF X (long)` -`>PUSHF Y (long)` +`>PUSHL X (long)` +`>PUSHL Y (long)` `>FPU add32` `...` @@ -323,20 +298,6 @@ Return float rounded into a long ## RETURN VALUE On stack (long) -# IOCTL - -## C -`int ioctl(short int DevID, int request, void * param );` - -## ASM -`PUSHWI param` -`PUSHBI request` -`lda hDEV` -`>SYSCALL IOCTL` - -## RETURN VALUE - Y,A = ... - ## MD5 Return MD5 Hash for input String @@ -439,10 +400,10 @@ Y,A = PTR to MemBlock # LoadStkObj Load a file in AUX memory (Stock Objects) - PUSHW = AUXTYPE (Handled by.... - PUSHB = TYPE ... + PUSHW = PATH (Handled by.... PUSHB = MODE ... - LDYA = PATH ...FOpen) + PUSHB = TYPE ... + PUSHW = AUXTYPE ...FOpen) ## RETURN VALUE Y,A = File Length @@ -465,8 +426,8 @@ Load a file in AUX memory (Stock Objects) # ExecL -## C -`int execl(const char* cmdline, short int flags);` +## C / CSH +`int execl(const char *cmdline, short int flags);` ## ASM `>PUSHW cmdline` @@ -478,12 +439,12 @@ A = Child PSID # ExecV -## C +## C / CSH `int execv(const char* argv[], short int flags);` ## ASM +`>PUSHW argv` `>PUSHB flags` -`>LDYA argv` `>SYSCALL execv` ## RETURN VALUE @@ -492,7 +453,7 @@ A = Child PSID # Fork ## C -`short nt fork();` +`short int fork();` ## ASM `>SYSCALL fork` @@ -696,6 +657,20 @@ A=hSList ## RETURN VALUE +# ChTyp +Change The type of a ProDOS File + +## C +`int chtyp(const char *filepath, short int filetype);` + +## ASM +**In:** +`>PUSHW filepath` +`>PUSHB filetype` +`>SYSCALL chtyp` + +## RETURN VALUE + # Stat Return information about a file @@ -704,8 +679,8 @@ Return information about a file ## ASM **In:** +`>PUSHW pathname` `>PUSHW statbuf` -`>LDYA pathname` `>SYSCALL stat` ## RETURN VALUE @@ -718,8 +693,8 @@ create a directory ## ASM **In:** +`>PUSHW pathname` `>PUSHW mode` -`>LDYA pathname` `>SYSCALL mkdir` ## RETURN VALUE @@ -832,78 +807,6 @@ Write Str to hFILE ## RETURN VALUE CC = success -# PrintF (BLOCKING) - -# FPrintF (BLOCKING) - -# SPrintF -Prints C-Style String - -## C -`int printf ( const char * format, ... );` -`int fprintf ( hFILE stream, const char * format, ... );` -`int sprintf ( char * str, const char * format, ... );` - -## ASM -**In:** -PrintF : (example is for printing Y,A as integer : format="%I", 2 bytes) -`>PUSHYA` #I -`>PUSHBI 2` #bytecount -`...` -`>LDYAI format` -`>SYSCALL printf` -FPrintF : -`>PUSHYA` #I -`>PUSHBI 2` #bytecount -`...` -`>PUSHWI format` -`lda hFILE` -`>SYSCALL fprintf` -SPrintF : -`>PUSHYA` #I -`>PUSHBI 2` #bytecount -`...` -`>PUSHWI format` -`>LDYAI str` -`>SYSCALL sprintf` - -## RETURN VALUE -CC : success, Y,A = bytes sent -CS : error, A = code from Output -Specifiers : -+ %b : pull 1 byte to Print BIN -+ %d : pull 1 byte unsigned DEC 0..255 -+ %D : pull 2 bytes unsigned DEC 0..65535 -+ %u : pull 4 bytes long unsigned DEC 0..4294967295 -+ %e : pull 5 Bytes float (-)1.23456789e+12 -+ %f : pull 5 Bytes float (-)3.1415 -+ %h : pull 1 byte to Print HEX -+ %H : pull 2 bytes to Print HEX -+ %i : pull 1 byte to Print signed DEC -128..127 -+ %I : pull 2 bytes to Print signed DEC -32768..32767 -+ %L : pull 4 bytes signed DEC -2147483648..2147483647 -+ %s : pull 2 bytes ptr to C-Style String -+ %S : pull 2 bytes ptr to P-Style String -+ \b : Print 'BS' (08) -+ \e : Print 'ESC' ($1B,27) -+ \f : Print 'FF' ($0C,12) -+ \n : Print 'LF' ($0A,10) -+ \r : Print 'CR' ($0D,13) -+ \t : Print 'TAB' ($09,09) -+ \v : Print 'VT' ($0B,11) -+ \xHH : Print byte with hexadecimal value HH (1 to 2 digits) -+ \\\\ : Print \ -+ \\% : Print % - -Modifiers for len and padding : -+ %d : '9' '12' -+ %2d : ' 9' '12' -+ %02d : '09' '12' -+ %11s : 'ABCDEFGH ' -+ %011s : 'ABCDEFGH000' -+ %2f : '3.14' - - # fgets (BLOCKING) read bytes from stream into the array pointed to by s, until n-1 bytes are read, or a is read and @@ -953,52 +856,24 @@ Get char from Node CC = success A = char -# SScanF -Read formatted data from string - -## C -`int sscanf ( const char * s, const char * format, ... );` - -## ASM -**In:** -`>PUSHW ptr` -`...` -`>PUSHBI bytecount` -`>PUSHWI format` -+ %i : short int -+ %d : byte -+ %I : int -+ %D : word -+ %L : long int -+ %U : dword -+ %h : HEX byte -+ %H : HEX word -+ %s : string - -TODO : %10s -`>LDYA s` -`>SYSCALL sscanf` - -## RETURN VALUE -A = Number of arguments filled. - # FOpen Open a file ## C -`hFILE fopen ( const char * filename, short int flags, short int ftype, int auxtype );` +`short int fopen ( const char *filename, short int flags, short int ftype, int auxtype );` **In:** ## ASM -`>PUSHWI auxtype` -`>PUSHBI ftype` -`>PUSHBI flags` +`>PUSHW filename` +`>PUSHB flags` + O.RDONLY : if R and exists -> ERROR + O.WRONLY : if W and exists -> CREATE + O.TRUNC : Reset Size To 0 + O.APPEND : Append + O.TEXT : Open/Append in Text mode + O.CREATE : Create if not exists +`>PUSHB ftype` +`>PUSHW auxtype` TODO: replace flags/ftype/auxtype with mode="w+,t=TYP,x=AUXTYPE" + r = O_RDONLY + r+ = O_RDWR @@ -1008,7 +883,6 @@ TODO: replace flags/ftype/auxtype with mode="w+,t=TYP,x=AUXTYPE" + a+ = O_RDWR | O_CREAT | O_APPEND + ,t=123 or t=$ff or t=TXT + ,x=12345 or x=$ffff -`>LDYAI filename` ## RETURN VALUE CC : A = hFILE @@ -1121,7 +995,7 @@ int remove(const char *pathname); ## ASM **In:** -`>LDYA pathname` +`>PUSHW pathname` `>SYSCALL remove` ## RETURN VALUE @@ -1134,12 +1008,134 @@ Rename a file ## ASM **In:** +`>PUSHW oldpath` `>PUSHW newpath` -`>LDYA oldpath` `>SYSCALL rename` ## RETURN VALUE +# PrintF (BLOCKING) + +# FPrintF (BLOCKING) + +# SPrintF +Prints C-Style String + +## C +`int printf ( const char *format, ... );` +`int fprintf ( short int stream, const char *format, ... );` +`int sprintf ( char *str, const char *format, ... );` + +## ASM +**In:** +PrintF : (example is for printing Y,A as integer : format="%I", 2 bytes) +`>PUSHW format` +`>PUSHW i` +`...` +`>PUSHBI 2` #bytecount +`>SYSCALL printf` +FPrintF : +`>PUSHB hFILE` +`>PUSHW format` +`>PUSHW i` +`...` +`>PUSHBI 2` #bytecount +`>SYSCALL fprintf` +SPrintF : +`>PUSHW str` +`>PUSHW format` +`>PUSHW i` +`...` +`>PUSHBI 2` #bytecount +`>SYSCALL sprintf` + +## RETURN VALUE +CC : success, Y,A = bytes sent +CS : error, A = code from Output +Specifiers : ++ %b : pull 1 byte to Print BIN ++ %d : pull 1 byte unsigned DEC 0..255 ++ %D : pull 2 bytes unsigned DEC 0..65535 ++ %u : pull 4 bytes long unsigned DEC 0..4294967295 ++ %e : pull 5 Bytes float (-)1.23456789e+12 ++ %f : pull 5 Bytes float (-)3.1415 ++ %h : pull 1 byte to Print HEX ++ %H : pull 2 bytes to Print HEX ++ %i : pull 1 byte to Print signed DEC -128..127 ++ %I : pull 2 bytes to Print signed DEC -32768..32767 ++ %L : pull 4 bytes signed DEC -2147483648..2147483647 ++ %s : pull 2 bytes ptr to C-Style String ++ %S : pull 2 bytes ptr to P-Style String ++ \b : Print 'BS' (08) ++ \e : Print 'ESC' ($1B,27) ++ \f : Print 'FF' ($0C,12) ++ \n : Print 'LF' ($0A,10) ++ \r : Print 'CR' ($0D,13) ++ \t : Print 'TAB' ($09,09) ++ \v : Print 'VT' ($0B,11) ++ \xHH : Print byte with hexadecimal value HH (1 to 2 digits) ++ \\\\ : Print \ ++ \\% : Print % + +Modifiers for len and padding : ++ %d : '9' '12' ++ %2d : ' 9' '12' ++ %02d : '09' '12' ++ %11s : 'ABCDEFGH ' ++ %011s : 'ABCDEFGH000' ++ %2f : '3.14' + + +# ScanF (BLOCKING) + +# FScanF (BLOCKING) + +# SScanF +Read formatted data from string + +## C +`int scanf(const char *format, ...);` +`int fscanf(short int stream, const char *format, ...);` +`int sscanf ( const char *s, const char *format, ... );` + +## ASM +**In:** +ScanF : +`>PUSHW format` +`>PUSHW ptr` +`...` +`>PUSHB bytecount` +`>SYSCALL scanf` +FScanF : +`>PUSHB stream` +`>PUSHW format` +`>PUSHW ptr` +`...` +`>PUSHB bytecount` +`>SYSCALL fscanf` +SScanF : +`>PUSHW s` +`>PUSHW format` +`>PUSHW ptr` +`...` +`>PUSHB bytecount` +`>SYSCALL sscanf` +Specifiers : ++ %i : short int ++ %d : byte ++ %I : int ++ %D : word ++ %L : long int ++ %U : dword ++ %h : HEX byte ++ %H : HEX word ++ %s : string + +TODO : %10s + +## RETURN VALUE +A = Number of arguments filled. + # strtof Convert String to 40 bits Float @@ -1178,9 +1174,9 @@ Convert String to 32 bits (unsigned) int ## ASM **In:** +`>PUSHW str` +`>PUSHW EndPtr` `>PUSHB Base` -`>PUSHWI EndPtr` -`>LDYAI str` `>SYSCALL strtol` ## RETURN VALUE @@ -1217,13 +1213,13 @@ Convert String to 16 bits int # RealPath Return the canonicalized absolute pathname -## C -`unsigned short int realpath (const char* str, char *resolvedpath);` +## C / CSH +`char *realpath(const char *path, char *resolvedpath);` ## ASM **In:** -`>PUSHWI resolvedpath` -`>LDYA str` +`>PUSHW path` +`>PUSHW resolvedpath` `>SYSCALL realpath` ## RETURN VALUE @@ -1232,6 +1228,20 @@ CC : success X = hMem of Full Path CS : A = Error Code +# Expand + +## C +`char *expand(const char *str, char *expanded);` + +## ASM +`>PUSHW str` +`>PUSHW expanded` +`>SYSCALL expand` + +## RETURN VALUE + Y,A = PTR to Expanded String + X = hMem to Expanded String (C-String) + # StrLen Returns Length of C-String @@ -1440,6 +1450,20 @@ Convert S.TIME struct to CSTR ## RETURN VALUE +# ChOwn + +## C + `short int chown(const char *pathname, short int owner, short int group);` + +## ASM +**In:** +`>PUSHW pathname` +`>PUSHB owner` +`>PUSHB group` +`>SYSCALL chown` + +## RETURN VALUE + # open ## C diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 7ab90b0db9a52c630a73b84e4df54ebd5900e76c..8d703019d7b5024dc8aef780058fc568b0b1bda6 100644 GIT binary patch delta 74304 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

i7>vyJ^ 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 S;J@H!@C*3W@g)7`*#AGvzUBM? delta 70593 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.G FileY >STZ.G CurX - >LDA.G CurY + >LDA.G CurY >CMP.G ViewPortHm1 bne .1 @@ -276,13 +276,13 @@ Ctrl.CR lda #C.CR >PUSHW LineBufPtr >PUSHW L.SEQ.SCROLLCURDN - >LDA.G ScreenH - dec - >PUSHA >LDA.G CurY inc inc >PUSHA + >LDA.G ScreenH + dec + >PUSHA >PUSHBI 2 jsr SCRN.LineBufSprintf .99 bcs .9 diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt index 8108a1f8..46344c38 100644 --- a/BIN/LSDEV.S.txt +++ b/BIN/LSDEV.S.txt @@ -88,8 +88,9 @@ DumpDev >LDYA L.MSG0 dey dex bpl .2 + + >PUSHB Index >PUSHEA.G DEV.DIB - lda Index >SYSCALL GetDevStatus bcc .6 diff --git a/BIN/MEM.S.txt b/BIN/MEM.S.txt index fcbf625e..e2681ca6 100644 --- a/BIN/MEM.S.txt +++ b/BIN/MEM.S.txt @@ -3,13 +3,10 @@ NEW .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/MEM + .TF bin/mem *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I -*-------------------------------------- -PAGELEN .EQ 22 -FOOTERLEN .EQ 8 *-------------------------------------- .DUMMY .OR ZPBIN diff --git a/BIN/STAT.S.txt b/BIN/STAT.S.txt index 38262601..173df051 100644 --- a/BIN/STAT.S.txt +++ b/BIN/STAT.S.txt @@ -15,7 +15,7 @@ NEW ZS.START ArgIndex .BS 1 ArgFile .BS 1 -ZPPTR1 .BS 2 +ZPPtr1 .BS 2 bFormatStr .BS 1 @@ -66,8 +66,8 @@ CS.RUN jsr CS.RUN.CheckOpt bcc .1 -.99 >PUSHBI 0 - >LDYA L.MSG.USAGE +.99 >PUSHW L.MSG.USAGE + >PUSHBI 0 >SYSCALL printf lda #E.SYN sec @@ -80,12 +80,12 @@ CS.RUN sta ArgFile bra .1 -.3 ldx ArgFile +.3 lda ArgFile beq .99 - >PUSHW pData - txa >SYSCALL ArgV + >PUSHYA + >PUSHW pData >SYSCALL Stat bcs .9 @@ -104,26 +104,27 @@ CS.RUN.DUMP lda ArgFile >SYSCALL Realpath bcs CS.RUN.RTS + >STYA ZPPtr1 phx - >PUSHYA + >PUSHW L.MSG.Filename + >PUSHW ZPPtr1 >PUSHBI 2 - >LDYA L.MSG.Filename >SYSCALL printf pla >SYSCALL freemem jsr Mod2CSTR + >PUSHW L.MSG.Mode >PUSHEA.G MOD >PUSHBI 2 - >LDYA L.MSG.Mode >SYSCALL printf - >PUSHL.G StatBuf+S.STAT.BLOCKS - >PUSHL.G StatBuf+S.STAT.SIZE - >PUSHW.G StatBuf+S.STAT.GID + >PUSHW L.MSG.UIDGIDSIZE >PUSHW.G StatBuf+S.STAT.UID + >PUSHW.G StatBuf+S.STAT.GID + >PUSHL.G StatBuf+S.STAT.SIZE + >PUSHL.G StatBuf+S.STAT.BLOCKS >PUSHBI 12 - >LDYA L.MSG.UIDGIDSIZE >SYSCALL printf jsr CS.RUN.PrintAMCTime @@ -205,11 +206,11 @@ CS.RUN.PrintAMCTime >PUSHEA.G StatBuf+S.STAT.CTIME >SYSCALL StrFTime -.8 >PUSHEA.G TIME.Create +.8 >PUSHW L.MSG.AMCTimes + >PUSHEA.G TIME.Create >PUSHEA.G TIME.Mod >PUSHEA.G TIME.Access >PUSHBI 6 - >LDYA L.MSG.AMCTimes >SYSCALL printf rts *-------------------------------------- @@ -268,9 +269,9 @@ MSG.UIDGIDSIZE .AS "UID : %10D\r\n" .AS "GID : %10D\r\n" .AS "Size : %10u\r\n" .AZ "Blocks : %10u\r\n" -MSG.AMCTimes .AS "Accessed : %s\r\n" +MSG.AMCTimes .AS "Created : %s\r\n" .AS "Modified : %s\r\n" - .AZ "Created : %s\r\n" + .AZ "Accessed : %s\r\n" *-------------------------------------- .DUMMY .OR 0 diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index ceebe1ab..451ac556 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -163,7 +163,7 @@ SEEK.CUR .EQ $01 SEEK.END .EQ $02 *-------------------------------------- * A2osX.SYSCALL Functions Indexes -*-------------------------------------- +*--------------------------------------D1 * STAT SYS.ChTyp .EQ $00 SYS.ChMod .EQ $02 @@ -182,8 +182,7 @@ SYS.Open .EQ $16 SYS.Close .EQ $18 SYS.Read .EQ $1A SYS.Write .EQ $1C -* IO -SYS.IOCTL .EQ $1E +* .EQ $1E * STDIO SYS.FPutC .EQ $20 SYS.PutChar .EQ $22 @@ -207,19 +206,20 @@ SYS.Remove .EQ $40 SYS.Rename .EQ $42 * .EQ $44 * .EQ $46 -* DEV -* .EQ $48 -SYS.GetDevByName .EQ $4A -SYS.GetDevStatus .EQ $4C -SYS.MKDev .EQ $4E * STDIO2 -* .EQ $50 +SYS.PrintF .EQ $48 +SYS.FPrintF .EQ $4A +SYS.SPrintF .EQ $4C +SYS.ScanF .EQ $4E + +SYS.FScanF .EQ $50 SYS.SScanF .EQ $52 * .EQ $54 * .EQ $56 -SYS.PrintF .EQ $58 -SYS.SPrintF .EQ $5A -SYS.FPrintF .EQ $5C + +* .EQ $58 +* .EQ $5A +* .EQ $5C * .EQ $5E * .EQ $60 @@ -231,7 +231,7 @@ SYS.FPrintF .EQ $5C * .EQ $6A * .EQ $6C * .EQ $6E -*-------------------------------------- +*--------------------------------------D2 * STDLIB SYS.AToF .EQ $70 SYS.AToI .EQ $72 @@ -250,11 +250,11 @@ SYS.StrUpr .EQ $88 SYS.StrLwr .EQ $8A SYS.StrCmp .EQ $8C SYS.StrCaseCmp .EQ $8E - -* .EQ $90 -* .EQ $92 -* .EQ $94 -* .EQ $96 +* DEV +SYS.GetDevByName .EQ $90 +SYS.GetDevStatus .EQ $92 +SYS.MKDev .EQ $94 +SYS.IOCTL .EQ $96 * BIN SYS.LoadLib .EQ $98 SYS.UnloadLib .EQ $9A @@ -274,7 +274,7 @@ SYS.Shift .EQ $B0 SYS.ArgV .EQ $B2 SYS.ArgVDup .EQ $B4 * .EQ $B6 -*-------------------------------------- +*--------------------------------------E0/AUX * ENV / ENVX SYS.PutEnv .EQ $B8 SYS.SetEnv .EQ $BA @@ -300,7 +300,7 @@ SYS.StrVShift .EQ $D8 SYS.StrVGet .EQ $DA SYS.StrVAdd .EQ $DC * .EQ $DE -*-------------------------------------- +*--------------------------------------E0 * MEM SYS.GetMem .EQ $E0 SYS.Realloc .EQ $E2 diff --git a/SYS/KERNEL.S.CORE.txt b/SYS/KERNEL.S.CORE.txt index 1e43a31e..cc53f0c9 100644 --- a/SYS/KERNEL.S.CORE.txt +++ b/SYS/KERNEL.S.CORE.txt @@ -95,11 +95,11 @@ CORE.Events jsr CORE.GetEvents cmp DevMgr.ASCREEN Same as active screen...nothing to do beq .8 - pha - >PUSHWZ Param + + >PUSHA >PUSHBI IOCTL.CONTROL request - pla - jsr K.IOCTL + >PUSHWZ Param + >SYSCALL2 IOCTL .8 jmp CORE.Run *-------------------------------------- CORE.UpdateParentPS @@ -393,6 +393,16 @@ CORE.PSResume sei inc IRQ.InKernel rti *-------------------------------------- +CORE.VBLState .BS 1 +CORE.IRQMode .BS 1 +CORE.TickPerSec .BS 1 +CORE.TickPer10t .BS 1 +CORE.TickSec .BS 1 +CORE.Tick10t .BS 1 +CORE.CPUStatCnt .DA #100 +CORE.LastPSID .DA #0 +CORE.FSID .BS 1 +*-------------------------------------- CORE.EvtIndex .BS 1 CORE.EvtCount .BS 1 *-------------------------------------- diff --git a/SYS/KERNEL.S.DEF.txt b/SYS/KERNEL.S.DEF.txt index 28927ac3..55b660b0 100644 --- a/SYS/KERNEL.S.DEF.txt +++ b/SYS/KERNEL.S.DEF.txt @@ -1,8 +1,6 @@ NEW AUTO 3,1 *-------------------------------------- -AUXPIPE .EQ 1 -*-------------------------------------- ZPKERNEL .EQ $0 *-------------------------------------- ZPPtr1 .EQ ZPKERNEL diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 2ec04e5a..55277603 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -47,46 +47,38 @@ K.GetDev.9 rts */-------------------------------------- * # GetDevStatus * ## C -* `int getdevstatus(short int DevID, S.DIB* dstat);` +* `int getdevstatus(short int DevID, S.DIB *dstat);` * ## ASM -* `>PUSHWI S.DIB` -* `lda DevID` +* `PUSHB DevID` +* `>PUSHW S.DIB` * `>SYSCALL GetDevStatus` * ## RETURN VALUE *\-------------------------------------- -K.GetDevStatus tax - >PULLW K.S.IOCTL+S.IOCTL.BUFPTR - +K.GetDevStatus >PULLW K.S.IOCTL+S.IOCTL.BUFPTR + >PULLA + tax + lda Dev.Table,x beq K.GetDev.NODEV ldy Dev.Table-1,x >STYA pFD lda #S.IOCTL.STATCODE.GETDIB -K.GetDevStatus.I - sta K.S.IOCTL+S.IOCTL.STATCODE - - ldy #S.FD.DEV.DEVID - lda (pFD),y - sta K.S.IOCTL+S.IOCTL.UNITNUM - - jsr K.IOCTL.GetPDrv - >LDYAI K.S.IOCTL - ldx #IOCTL.STATUS - jmp (pDrv) + jmp SHARED.GetDevStatus */-------------------------------------- * # MKDev * Create a hDEV * ## C -* `hDEV mkdev (S.FD * fd, const char *devname)` +* `hDEV mkdev (S.FD *fd, const char *devname)` * ## ASM +* `>PUSHW fd` * `>PUSHW devname` -* `>LDYA fd` * `>SYSCALL mkdev * ## RETURN VALUE * A = hDEV *\-------------------------------------- -K.MKDev jsr SHARED.SPtr1PPtr2 ptr1=fd, ptr2=name +K.MKDev >PULLW ZPPtr2 ptr2=name + >PULLW ZPPtr1 ptr1=fd ldx DevMgr.DevIdx cpx #K.DEV.MAX*2+1 @@ -135,7 +127,7 @@ K.MKDev jsr SHARED.SPtr1PPtr2 ptr1=fd, ptr2=name >STYA K.S.IOCTL+S.IOCTL.BUFPTR lda #S.IOCTL.STATCODE.STATUS - jsr K.GetDevStatus.I + jsr SHARED.GetDevStatus bcs .99 lda K.IOBuf Get Status byte @@ -156,23 +148,55 @@ K.MKDev jsr SHARED.SPtr1PPtr2 ptr1=fd, ptr2=name * sec .99 rts -.7 ldy #S.FD.DEV.DRVPTR - lda (pFD),y - sta ZPPtr1 - iny - lda (pFD),y - sta ZPPtr1+1 - ldy #IOCTL.IRQ+4 - lda (ZPPtr1),y +.7 ldy #IOCTL.IRQ+4 + lda (pDRV),y sta IRQ.Vectors,x iny - lda (ZPPtr1),y + lda (pDRV),y sta IRQ.Vectors+1,x + .8 lda DevMgr.DevIdx inc DevMgr.DevIdx inc DevMgr.DevIdx * clc rts +*/-------------------------------------- +* # IOCTL +* ## C +* `int ioctl(short int DevID, int request, void * param );` +* ## ASM +* `>PUSHB hDEV` +* `>PUSHB request` +* `>PUSHW param` +* `>SYSCALL IOCTL` +* ## RETURN VALUE +* Y,A = ... +*\-------------------------------------- +K.IOCTL ldy #3 hDev + lda (pStack),y + tax + + lda Dev.Table,x + beq .9 + + ldy Dev.Table-1,x + >STYA pFD + + jsr SHARED.GetPDrv + + ldy #2 request + lda (pStack),y + tax + + >PULLYA param + inc pStack + inc pStack + + jmp (pDrv) + +.9 sec + lda #MLI.E.NODEV + >RET 4 *-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.DEV diff --git a/SYS/KERNEL.S.DIRENT.txt b/SYS/KERNEL.S.DIRENT.txt index c0e58a53..6eaa0f96 100644 --- a/SYS/KERNEL.S.DIRENT.txt +++ b/SYS/KERNEL.S.DIRENT.txt @@ -80,41 +80,24 @@ K.ReadDir.ROOT ldy #S.FD.DIR.FC did we already returned something ? lda (pFD),y bne K.ReadDir.NoMore + stz K.MLI.PARAMS+1 All Volumes >LDYAI K.Buf256 >STYA K.MLI.PARAMS+2 >STYA ZPPtr2 >MLICALL MLIONLINE bcs K.ReadDir.RTS -* pass #1 compute BufSize..... - lda #1 +1 for Ending 0 - sta K.ReadDir.BufSize - stz K.ReadDir.BufSize+1 - stz K.ReadDir.EC - ldy #0 -.1 lda (ZPPtr2),y - and #$0F - beq .2 - inc K.ReadDir.EC increase entry count - sec Add Filelen +1 - adc #S.STAT will ends with CC - adc K.ReadDir.BufSize - sta K.ReadDir.BufSize - bcc .2 - inc K.ReadDir.BufSize+1 - -.2 tya - clc - adc #16 - tay - bcc .1 loop until 256 bytes scanned -* pass #2 Fill Buffer... - jsr K.ReadDir.GetBuf + >LDYAI 16*16+16*S.STAT+1 16 (Vols+Stat) + \0 + jsr K.ReadDir.GetBufYA bcs K.ReadDir.RTS -.3 lda (ZPPtr2) + + lda #16 + sta K.ReadDir.EC + +.1 lda (ZPPtr2) and #$0F - beq .88 + beq .6 tax inc @@ -122,19 +105,21 @@ K.ReadDir.ROOT lda #'/' sta K.MLI.PATH+1 ldy #1 -.4 lda (ZPPtr2),y + +.2 lda (ZPPtr2),y sta K.MLI.PATH+1,y jsr K.ReadDir.AddToBuf iny dex - bne .4 + bne .2 + txa Add ending 0 for C String jsr K.ReadDir.AddToBuf jsr SHARED.ClrStat lda (ZPPtr2) - asl DRIVE in Carry + asl DRIVE in Carry pha lda #0 rol @@ -153,25 +138,29 @@ K.ReadDir.ROOT >MLICALL MLIGETFILEINFO sta K.S.STAT+S.STAT.P.DEVSTATUS - bcs .80 + bcs .3 + >LDYA K.MLI.PARAMS+5 AUXTYPE=TOTAL BLOCKS >STYA K.S.STAT+S.STAT.P.DEVBLOCKS >LDYA K.MLI.PARAMS+8 >STYA K.S.STAT+S.STAT.BLOCKS -.80 jsr K.ReadDir.ADDSTAT - dec K.ReadDir.EC - beq .5 -.88 lda ZPPtr2 +.3 jsr K.ReadDir.AddStat + +.6 lda ZPPtr2 clc adc #16 sta ZPPtr2 - bcc .3 + bcc .7 inc ZPPtr2+1 - bra .3 + +.7 dec K.ReadDir.EC + bne .1 + * lda #0 done by S.MEM.F.INIT0 * sta (ZPPtr4) Ending 0 -.5 ldy #S.FD.DIR.FC + + ldy #S.FD.DIR.FC lda #16 sta (pFD),y Flag that we returned somthing for next time jmp K.ReadDir.EXIT @@ -309,29 +298,23 @@ K.ReadDir.DIR2 jsr K.ReadDir.GetBuf bne .2 jsr K.ReadDir.ADD. - bra .6 + bra .4 .2 cmp #$E0 Dir Header ? bne .3 jsr K.ReadDir.ADD. + jsr SHARED.DirEnt2Stat + jsr K.ReadDir.AddStat jsr K.ReadDir.ADD.. - bra .6 + bra .4 .3 jsr K.ReadDir.AddFNToBuf - jsr SHARED.ClrStat + +.4 jsr SHARED.DirEnt2Stat + jsr K.ReadDir.AddStat - lda (ZPPtr3) - and #$F0 - cmp #$D0 Directory ? - bne .5 - - jsr K.ReadDir.ADDD - bra .6 - -.5 jsr K.ReadDir.ADDF - -.6 lda K.ReadDir.EC decrease global counter... + lda K.ReadDir.EC decrease global counter... sec sbc #1 sta K.ReadDir.EC @@ -380,6 +363,7 @@ K.ReadDir.CLN pha *-------------------------------------- K.ReadDir.GetBuf >LDYA K.ReadDir.BufSize Get a BufSize bytes buffer for storing results +K.ReadDir.GetBufYA jsr K.GetMem0 make sure 0 filled bcs .9 stx K.ReadDir.EXIT+1 @@ -397,80 +381,7 @@ K.ReadDir.ADD.. bne .1 txa - jsr K.ReadDir.AddToBuf Add Ending 0 - jsr SHARED.ClrStat -* ldy #$25 total_blocks -* lda (ZPPtr3),y -* sta K.S.STAT+S.STAT.BLOCKS -* iny -* lda (ZPPtr3),y -* sta K.S.STAT+S.STAT.BLOCKS+1 -*-------------------------------------- -K.ReadDir.ADDD lda #$0F - sta K.S.STAT+S.STAT.P.TYPE - - lda /S.STAT.MODE.DIR - sta K.S.STAT+S.STAT.MODE+1 - bra K.ReadDir.AddAccess -*-------------------------------------- -K.ReadDir.ADDF -* lda /S.STAT.MODE.REG 0 -* sta K.S.STAT+S.STAT.MODE+1 - ldx #ADDF.DST-ADDF.SRC - -.1 ldy ADDF.SRC-1,x - lda (ZPPtr3),y - ldy ADDF.DST-1,x - sta K.S.STAT,y - dex - bne .1 -*-------------------------------------- -K.ReadDir.AddAccess - lda CORE.FSID - sta K.S.STAT+S.STAT.FSID - - ldy #$1E ProDOS Access - lda (ZPPtr3),y - - jsr SHARED.Stat.Access2Mode -*-------------------------------------- -K.ReadDir.AddTime - lda #$18 creation Date/time - clc - adc ZPPtr3 - tay - lda ZPPtr3+1 - adc #0 - >PUSHYA - >PUSHWI K.S.STAT+S.STAT.CTIME - >SYSCALL2 PTime2Time - - lda #$21 mod Date/time - clc - adc ZPPtr3 - tay - lda ZPPtr3+1 - adc #0 - >PUSHYA - >PUSHWI K.S.STAT+S.STAT.MTIME - >SYSCALL2 PTime2Time -*-------------------------------------- -K.ReadDir.AddStat - ldy #0 - -.1 lda K.S.STAT,y - jsr K.ReadDir.AddToBuf - iny - cpy #S.STAT - bne .1 - - rts -*-------------------------------------- -ADDF.SRC .HS 1013141516171f20 -ADDF.DST .DA #S.STAT.P.TYPE - .DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1 - .DA #S.STAT.SIZE,#S.STAT.SIZE+1,#S.STAT.SIZE+2 - .DA #S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1 + jmp K.ReadDir.AddToBuf Add Ending 0 *-------------------------------------- K.ReadDir.AddFNToBuf ldy #$1C version/min_version for lowercase bitmap @@ -528,6 +439,17 @@ K.ReadDir.AddToBuf bne .8 inc ZPPtr4+1 .8 rts +*-------------------------------------- +K.ReadDir.AddStat + ldy #0 + +.1 lda K.S.STAT,y + jsr K.ReadDir.AddToBuf + iny + cpy #S.STAT + bne .1 + + rts */------------------------------------- * # CloseDir * ## C diff --git a/SYS/KERNEL.S.GP.txt b/SYS/KERNEL.S.GP.txt index 0d9d59d6..0ca8c5bc 100644 --- a/SYS/KERNEL.S.GP.txt +++ b/SYS/KERNEL.S.GP.txt @@ -167,19 +167,21 @@ GP.AtkCall.INC inc IRQ.InKernel * Return X+Y, X-Y, X*Y, X/Y, X mod Y.... * ## ASM * **In:** -* `>PUSHF X (long)` -* `>PUSHF Y (long)` +* `>PUSHL X (long)` +* `>PUSHL Y (long)` * `>FPU add32` * `...` * ## RETURN VALUE * On stack (long) *\-------------------------------------- GP.FpuCall dec IRQ.InKernel - jsr .1 + cpx #FPU.FADD + bcs .1 + + jsr MATH32 INT32, direct JMP bra GP.AtkCall.INC -.1 cpx #FPU.FADD - bcc GP.RomCall.JmpX INT32, direct JMP - phx + +.1 phx jsr GP.SetFAC Get float from stack plx cpx #FPU.PWR+1 @@ -238,7 +240,9 @@ GP.RomCall phx stx .8+1 bit RROMBNK1 plx + jsr GP.RomCall.JmpX + .8 ldx #$ff bit $C000,x bit $C000,x @@ -300,20 +304,11 @@ GP.lrintf jsr GP.SetFAC rts *-------------------------------------- -GP.RomCall.JmpX jmp (.1,x) -.1 .DA GP.ADD32 - .DA GP.SUB32 - .DA GP.UMUL32 - .DA GP.IMUL32 - .DA GP.UDIV32 - .DA GP.IDIV32 - .DA GP.UMOD32 - .DA GP.IMOD32 - .DA GP.UCMP32 - .DA GP.ICMP32 +GP.RomCall.JmpX jmp (.1-FPU.FADD,x) +*-------------------------------------- * http://www.txbobsc.com/scsc/scdocumentor/E7A0.html - - .DA $E7C1 FADDT +*-------------------------------------- +.1 .DA $E7C1 FADDT .DA $E7AA FSUBT .DA $E987 FMULTT.1 .DA $EA6B FDIVT+2 @@ -428,16 +423,6 @@ GP.IrqH.Exit stz IRQ.SkipA2osX reset flag sec rts *-------------------------------------- -CORE.VBLState .BS 1 -CORE.IRQMode .BS 1 -CORE.TickPerSec .BS 1 -CORE.TickPer10t .BS 1 -CORE.TickSec .BS 1 -CORE.Tick10t .BS 1 -CORE.CPUStatCnt .DA #100 -CORE.LastPSID .DA #0 -CORE.FSID .BS 1 -*-------------------------------------- IRQ.InKernel .BS 1 IRQ.InLib .BS 1 IRQ.SkipA2osX .BS 1 diff --git a/SYS/KERNEL.S.INIT.txt b/SYS/KERNEL.S.INIT.txt index 624141e2..3ddba225 100644 --- a/SYS/KERNEL.S.INIT.txt +++ b/SYS/KERNEL.S.INIT.txt @@ -109,8 +109,8 @@ Kernel.Init3 sta SETALTZP >STYA pStack sta pLocal+1 + >PUSHWI FD.NULL >PUSHWI FD.NULL.NAME - >LDYAI FD.NULL >SYSCALL2 MKDev jsr SysScrInit @@ -118,7 +118,7 @@ Kernel.Init3 sta SETALTZP >PUSHWI DEV.CONSOLE >PUSHBI O.RDWR >PUSHBI S.FI.T.TXT - >PUSHWZ Aux type + >PUSHWZ Aux type >SYSCALL2 fopen bcs * @@ -307,9 +307,9 @@ SysScrInit >LDYAI Mem.XHiMem jsr SysScrInit.TTYPtrs + >PUSHWI FD.TTY >PUSHWI FD.CONSOLE.NAME - >LDYAI FD.TTY - + >SYSCALL2 MKDev bcs .9 @@ -319,8 +319,9 @@ SysScrInit >LDYAI Mem.XHiMem inc FD.TTY+S.FD.DEV.DEVID inc FD.TTY.NAME+3 jsr SysScrInit.TTYPtrs + + >PUSHWI FD.TTY >PUSHWI FD.TTY.NAME - >LDYAI FD.TTY >SYSCALL2 MKDev plx bcs .9 @@ -754,8 +755,8 @@ DevMgrInit.AddBDev >PUSHBI 6 >SYSCALL2 printf + >PUSHWI FD.BDEV >PUSHWI FD.BDEV.NAME - >LDYAI FD.BDEV >SYSCALL2 MKDev DevMgrInit.AddBDev.RTS rts diff --git a/SYS/KERNEL.S.IO.txt b/SYS/KERNEL.S.IO.txt index cf9e6155..7f4a752f 100644 --- a/SYS/KERNEL.S.IO.txt +++ b/SYS/KERNEL.S.IO.txt @@ -33,10 +33,10 @@ IO.WRITE.REG ldx #MLIWRITE .9 rts *-------------------------------------- IO.OPEN.CDEV -IO.OPEN.BDEV jsr K.IOCTL.GetPDrv +IO.OPEN.BDEV jsr SHARED.GetPDrv ldx #IOCTL.OPEN lda IO.hDev - jsr K.IOCTL.pDrvJmp + jsr SHARED.pDrvJmp bcs .9 lda IO.hDev @@ -55,9 +55,9 @@ IO.WRITE.CDEV ldx #IOCTL.WRITE >PULLW K.S.IOCTL+S.IOCTL.BUFPTR >PULLW K.S.IOCTL+S.IOCTL.BYTECNT - jsr K.IOCTL.GetPDRV + jsr SHARED.GetPDRV >LDYAI K.S.IOCTL - jsr K.IOCTL.pDrvJmp + jsr SHARED.pDrvJmp bcs .9 >LDYA K.S.IOCTL+S.IOCTL.BYTECNT @@ -91,41 +91,6 @@ IO.WRITE.SSOCK ldy #S.FD.SSOCK.WRITE >STYA .1+1 lda IO.hFD .1 jmp $FFFF SELF MODIFIED -*/-------------------------------------- -* # IOCTL -* ## C -* `int ioctl(short int DevID, int request, void * param );` -* ## ASM -* `PUSHWI param` -* `PUSHBI request` -* `lda hDEV` -* `>SYSCALL IOCTL` -* ## RETURN VALUE -* Y,A = ... -*\-------------------------------------- -K.IOCTL tax - lda Dev.Table,x - beq K.IOCTL.9 - - ldy Dev.Table-1,x - >STYA pFD - jsr K.IOCTL.GetPDrv - >PULLA - tax request - >PULLYA param - -K.IOCTL.pDrvJmp jmp (pDrv) -K.IOCTL.9 sec - lda #MLI.E.NODEV - >RET 3 -*-------------------------------------- -K.IOCTL.GetPDrv ldy #S.FD.DEV.DRVPTR - lda (pFD),y - sta pDRV - iny - lda (pFD),y - sta pDRV+1 - rts *-------------------------------------- IO.EOF.REG >MLICALL MLIGETMARK bcs .9 @@ -153,7 +118,7 @@ IO.EOF.REG >MLICALL MLIGETMARK .9 rts *-------------------------------------- IO.EOF.CDEV lda #S.IOCTL.STATCODE.EOF - jmp K.GetDevStatus.I + jmp SHARED.GetDevStatus *-------------------------------------- * X = 0 > REG * X = 1 > DIR @@ -227,8 +192,6 @@ IO.CLOSE.NOD ldx #2 * sec rts *-------------------------------------- -IO.DEV.FIFO .AS "/dev/fifo" -*-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.IO LOAD USR/SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index ad64af20..aad63e78 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -21,7 +21,7 @@ K.SYSCALL .DA K.ChTyp $00 : STAT .DA K.Close .DA K.Read .DA K.Write - .DA K.IOCTL + .DA 0 .DA K.FPutC $20 : STDIO .DA K.PutChar @@ -45,18 +45,18 @@ K.SYSCALL .DA K.ChTyp $00 : STAT .DA K.Rename .DA 0 .DA 0 + .DA K.PrintF + .DA K.FPrintF + .DA K.SPrintF .DA 0 - .DA K.GetDevByName DEV - .DA K.GetDevStatus - .DA K.MKDev - .DA 0 $50 + .DA K.ScanF $50 + .DA K.FScanF .DA K.SScanF .DA 0 .DA 0 - .DA K.PrintF - .DA K.SPrintF - .DA K.FPrintF + .DA 0 + .DA 0 .DA 0 .DA 0 $60 @@ -88,10 +88,10 @@ K.SYSCALL .DA K.ChTyp $00 : STAT .DA K.StrCmp .DA K.StrCaseCmp - .DA 0 $90 - .DA 0 - .DA 0 - .DA 0 + .DA K.GetDevByName $90 : DEV + .DA K.GetDevStatus + .DA K.MKDev + .DA K.IOCTL .DA K.LoadLib BIN .DA K.UnloadLib .DA K.LoadDrv diff --git a/SYS/KERNEL.S.MATH.txt b/SYS/KERNEL.S.MATH.txt index ad6624f5..85bc6763 100644 --- a/SYS/KERNEL.S.MATH.txt +++ b/SYS/KERNEL.S.MATH.txt @@ -1,11 +1,23 @@ NEW AUTO 3,1 *-------------------------------------- -GP.ADD32 clc +MATH32 jmp (.1,x) +.1 .DA MATH32.ADD32 + .DA MATH32.SUB32 + .DA MATH32.UMUL32 + .DA MATH32.IMUL32 + .DA MATH32.UDIV32 + .DA MATH32.IDIV32 + .DA MATH32.UMOD32 + .DA MATH32.IMOD32 + .DA MATH32.UCMP32 + .DA MATH32.ICMP32 +*-------------------------------------- +MATH32.ADD32 clc .HS B0 BCS -GP.SUB32 sec +MATH32.SUB32 sec php - jsr GP.PopACC32 + jsr MATH32.PopACC32 ldy #0 ldx #3 @@ -23,16 +35,18 @@ GP.SUB32 sec iny dex bpl .2 -GP.SUB32.RTS rts + +MATH32.SUB32.RTS + rts *-------------------------------------- * Returns: * ff X < Y * 0 X = Y * 1 X > Y *-------------------------------------- -GP.UCMP32 -GP.ICMP32 jsr GP.SUB32 - jsr GP.PopACC32 A = ACC32+3 (sign) +MATH32.UCMP32 +MATH32.ICMP32 jsr MATH32.SUB32 + jsr MATH32.PopACC32 A = ACC32+3 (sign) tay bmi .2 @@ -46,50 +60,50 @@ GP.ICMP32 jsr GP.SUB32 .2 lda #$ff .8 rts *-------------------------------------- -GP.UMUL32 clc +MATH32.UMUL32 clc .HS B0 BCS -GP.IMUL32 sec +MATH32.IMUL32 sec php - jsr GP.MULDIVMOD.COMMON + jsr MATH32.MULDIVMOD.COMMON jsr MATH.MUL32 plp - bcc GP.SUB32.RTS -GP.RETURN.ITMP + bcc MATH32.SUB32.RTS +MATH32.RETURN.ITMP lda ACC32.Sign eor ARG32.Sign - bpl GP.PutTMP32 - bra GP.PutNotTMP32 + bpl MATH32.PutTMP32 + bra MATH32.PutNotTMP32 *-------------------------------------- -GP.UDIV32 clc +MATH32.UDIV32 clc .HS B0 BCS -GP.IDIV32 sec +MATH32.IDIV32 sec clv - bra GP.DIVMOD -GP.UMOD32 clc + bra MATH32.DIVMOD +MATH32.UMOD32 clc .HS B0 BCS -GP.IMOD32 sec - bit GP.SUB32.RTS $60 +MATH32.IMOD32 sec + bit MATH32.SUB32.RTS $60 -GP.DIVMOD php - jsr GP.MULDIVMOD.COMMON +MATH32.DIVMOD php + jsr MATH32.MULDIVMOD.COMMON jsr MATH.DIVMOD32 plp bcc .3 unsigned - bvs GP.RETURN.ITMP IMOD + bvs MATH32.RETURN.ITMP IMOD lda ACC32.Sign IDIV eor ARG32.Sign - bpl GP.PutARG32 - bra GP.PutNotARG32 + bpl MATH32.PutARG32 + bra MATH32.PutNotARG32 -.3 bvs GP.PutARG32 DIV +.3 bvs MATH32.PutARG32 DIV *-------------------------------------- -GP.PutTMP32 lda #TMP32 MOD +MATH32.PutTMP32 lda #TMP32 MOD .HS 2C BIT ABS *-------------------------------------- -GP.PutARG32 lda #ARG32 +MATH32.PutARG32 lda #ARG32 sta .1+1 ldy #3 .1 lda $ff,y SELF MODIFIED @@ -99,10 +113,12 @@ GP.PutARG32 lda #ARG32 rts *-------------------------------------- -GP.PutNotTMP32 lda #TMP32 +MATH32.PutNotTMP32 + lda #TMP32 .HS 2C BIT ABS *-------------------------------------- -GP.PutNotARG32 lda #ARG32 +MATH32.PutNotARG32 + lda #ARG32 sta .1+1 ldy #0 ldx #3 @@ -117,7 +133,7 @@ GP.PutNotARG32 lda #ARG32 bpl .1 rts *-------------------------------------- -GP.PopACC32 ldy #0 +MATH32.PopACC32 ldy #0 .1 lda (pStack) inc pStack @@ -128,7 +144,7 @@ GP.PopACC32 ldy #0 sta ACC32.Sign rts *-------------------------------------- -GP.GetARG32 ldy #0 +MATH32.GetARG32 ldy #0 .1 lda (pStack),y sta ARG32,y @@ -138,14 +154,15 @@ GP.GetARG32 ldy #0 sta ARG32.Sign -GP.GetARG32.RTS rts +MATH32.GetARG32.RTS + rts *-------------------------------------- -GP.MULDIVMOD.COMMON +MATH32.MULDIVMOD.COMMON php - jsr GP.PopACC32 - jsr GP.GetARG32 + jsr MATH32.PopACC32 + jsr MATH32.GetARG32 plp - bcc GP.GetARG32.RTS + bcc MATH32.GetARG32.RTS jsr MATH.ACC32ABS jmp MATH.ARG32ABS *-------------------------------------- diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index 9c0830a9..2b66aa59 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -323,18 +323,18 @@ MEM.Init0 phx *\-------------------------------------- K.FreeMem.MSG .AZ "FreeMem:hMem=$%h,PID=%d\r\n" *-------------------------------------- -K.FreeMem.ERR phx - phy hMem n Y +K.FreeMem.ERR >PUSHWI K.FreeMem.MSG + + tya hMem n Y + >PUSHA + ldy #S.PS.PID lda (pPS),y >PUSHA - pla - >PUSHA >PUSHBI 2 - >LDYAI K.FreeMem.MSG -.1 ldx #SYS.printf - jsr K.SYSCALL2 - plx + +.1 >SYSCALL2 printf + lda #E.INVH * >DEBUG sec @@ -344,17 +344,21 @@ K.FreeMem tay beq K.FreeMem.ERR Slot=0, reserved by Kernel cmp Mem.LastSlot bcc .10 + bne K.FreeMem.ERR + .10 jsr MEM.GetMemByID X,Y unmodified lda (ZPMemMgrSPtr) In use ? bpl K.FreeMem.ERR jsr MEM.DecRefCnt only one left ? bne .8 no, must be a code segment loaded several times + lda (ZPMemMgrSPtr) and #S.MEM.F.CODE CS: Any BINPATH to discard ? sta (ZPMemMgrSPtr) Mark as FREE beq .1 + ldy #S.MEM.BIN lda (ZPMemMgrSPtr),y jsr MEM.GetMemByID X unmodified @@ -364,16 +368,19 @@ K.FreeMem tay sta (ZPMemMgrSPtr) .1 lda Mem.LastSlot beq .8 + jsr MEM.GetMemByID X unmodified lda (ZPMemMgrSPtr) bmi .8 used, exit .2 dec Mem.LastSlot free! get previous.... beq .80 empty list: go set Mem.Free=Mem.HiMem + lda Mem.LastSlot jsr MEM.GetMemByID X unmodified lda (ZPMemMgrSPtr) bpl .2 free again! loop + ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y set Mem.Free... sta Mem.Free @@ -549,7 +556,8 @@ MEM.Dup jsr K.GetMemPtr .8 txa * clc -.9 rts +.9 +MEM.Dup.RTS rts *-------------------------------------- MEM.CopyToMain clc .HS B0 BCS @@ -561,7 +569,7 @@ MEM.MoveToMain sec sta CLRREADAUX Make sure MAIN !!!! sta CLRWRITEAUX jsr K.GetMem - bcs .9 + bcs MEM.Dup.RTS stx .8+1 Save MAIN hMem >STYA A4L Save MAIN Ptr @@ -582,8 +590,6 @@ MEM.MoveToMain sec .8 ldx #$ff Returns MAIN hMem txa jmp K.GetMemPtr Y,A = Ptr - -.9 rts *-------------------------------------- MEM.MoveToAux stx .1+1 Save MAIN hMem >STYA A2L Save LEN to move diff --git a/SYS/KERNEL.S.PIPE.txt b/SYS/KERNEL.S.PIPE.txt index 3b622be0..d45751a3 100644 --- a/SYS/KERNEL.S.PIPE.txt +++ b/SYS/KERNEL.S.PIPE.txt @@ -29,12 +29,9 @@ IO.CLOSE.PIPE ldy #S.FD.PIPE.S ldy #S.FD.PIPE.hMem lda (pFD),y beq .2 - .DO AUXPIPE=1 - ldx #SYS.FreeStkObj - jsr K.SYSCALL2 - .ELSE - jsr K.FreeMem - .FIN + + >SYSCALL2 FreeStkObj + .2 lda IO.hFD jmp K.FreeMem *-------------------------------------- @@ -76,9 +73,8 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S lda (pFD),y tay - .DO AUXPIPE=1 sta SETWRITEAUX - .FIN + .1 inx bne .2 @@ -105,9 +101,9 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S lda IO.PIPE.BASEH Pipe Buffer Base sta IO.PIPE.DSTBUF+1 bra .1 -.8 .DO AUXPIPE=1 - sta CLRWRITEAUX - .FIN + +.8 sta CLRWRITEAUX + tya ldy #S.FD.PIPE.Head sta (pFD),y @@ -173,9 +169,8 @@ IO.READ.PIPE ldy #S.FD.PIPE.Used+1 ldy #S.FD.PIPE.Tail lda (pFD),y tay - .DO AUXPIPE=1 + sta SETREADAUX - .FIN .1 inx bne .2 @@ -203,10 +198,8 @@ IO.READ.PIPE ldy #S.FD.PIPE.Used+1 sta IO.PIPE.SRCBUF+1 Restore Pipe Buf base bra .1 -.8 .DO AUXPIPE=1 - sta CLRREADAUX - .FIN - +.8 sta CLRREADAUX + tya ldy #S.FD.PIPE.Tail sta (pFD),y @@ -233,13 +226,9 @@ IO.PIPE.GET.BUF lda (pFD),y ldy #S.FD.PIPE.hMem lda (pFD),y + + >SYSCALL2 GetStkObjPtr - .DO AUXPIPE=1 - ldx #SYS.GetStkObjPtr - jsr K.SYSCALL2 - .ELSE - jsr K.GetMemPtr get src buf - .FIN sta IO.PIPE.BASEH Pipe Buffer Base * clc adc IO.PIPE.BUFH diff --git a/SYS/KERNEL.S.SHARED.txt b/SYS/KERNEL.S.SHARED.txt index eb4dfb99..137d0e3c 100644 --- a/SYS/KERNEL.S.SHARED.txt +++ b/SYS/KERNEL.S.SHARED.txt @@ -1,6 +1,28 @@ NEW AUTO 3,1 *-------------------------------------- +SHARED.GetDevStatus + sta K.S.IOCTL+S.IOCTL.STATCODE + + ldy #S.FD.DEV.DEVID + lda (pFD),y + sta K.S.IOCTL+S.IOCTL.UNITNUM + + jsr SHARED.GetPDrv + + >LDYAI K.S.IOCTL + ldx #IOCTL.STATUS +*-------------------------------------- +SHARED.pDrvJmp jmp (pDrv) +*-------------------------------------- +SHARED.GetPDrv ldy #S.FD.DEV.DRVPTR + lda (pFD),y + sta pDRV + iny + lda (pFD),y + sta pDRV+1 + rts +*-------------------------------------- SHARED.GetKeyCharY sta CLRREADAUX lda (ZPSListDataPtr),y diff --git a/SYS/KERNEL.S.STAT.txt b/SYS/KERNEL.S.STAT.txt index 01fcb426..9c2f55f1 100644 --- a/SYS/KERNEL.S.STAT.txt +++ b/SYS/KERNEL.S.STAT.txt @@ -216,7 +216,7 @@ K.MKFIFO >STYA ZPPtr1 pathname buffer bcs K.Stat.Store.RTS ldy #0 -.1 lda IO.DEV.FIFO,y +.1 lda DEV.FIFO,y sta (ZPPtr1),y iny cpy #9 @@ -287,17 +287,15 @@ K.MkNod.I ldx #2 *\-------------------------------------- K.Pipe sta .1+1 SIZE HI - .DO AUXPIPE=1 - ldx #SYS.NewStkObj - jsr K.SYSCALL2.AUX Buffer in AUX mem - .ELSE - jsr K.GetMem - .FIN + >SYSCALL2 NewStkObj bcs .99 + stx .8+1 save PIPE buffer + ldx #2 jsr IO.MkFD bcs .9 + .1 lda #$ff SELF MODIFIED ldy #S.FD.PIPE.Free+1 sta (pFD),y @@ -312,12 +310,9 @@ K.Pipe sta .1+1 SIZE HI rts .9 pha save error code lda .8+1 get back PIPE buffer - .DO AUXPIPE=1 - ldx #SYS.FreeStkObj - jsr K.SYSCALL2.AUX - .ELSE - jsr K.FreeMem - .FIN + + >SYSCALL2 FreeStkObj + pla sec .99 @@ -331,36 +326,69 @@ SHARED.Stat.I jsr SHARED.ClrStat lda K.MLI.PARAMS+S.FI.A jsr SHARED.Stat.Access2Mode - ldx #SHARED.Stat.DST-SHARED.Stat.SRC + ldx #SHARED.GFI.Cnt -.3 ldy SHARED.Stat.SRC-1,x +.3 ldy SHARED.GFI.Src-1,x lda K.MLI.PARAMS,y - ldy SHARED.Stat.DST-1,x + ldy SHARED.Stat.Dst-1,x sta K.S.STAT,y dex bne .3 - >PUSHWI K.MLI.PARAMS+S.FI.CDATE - >PUSHWI K.S.STAT+S.STAT.CTIME - >SYSCALL2 PTime2Time BANK2 + >LDYAI K.MLI.PARAMS+S.FI.CDATE + ldx #S.STAT.CTIME + jsr SHARED.PTime2StatYAX - >PUSHWI K.MLI.PARAMS+S.FI.MDATE - >PUSHWI K.S.STAT+S.STAT.MTIME - >SYSCALL2 PTime2Time BANK2 + >LDYAI K.MLI.PARAMS+S.FI.MDATE + ldx #S.STAT.MTIME + jmp SHARED.PTime2StatYAX +*-------------------------------------- +SHARED.GFI2Stat clc rts *-------------------------------------- SHARED.DirEnt2Stat + jsr SHARED.ClrStat + + lda (ZPPtr3) + and #$F0 + cmp #$D0 Directory ? + bne .1 -* clc -* rts + lda /S.STAT.MODE.DIR + sta K.S.STAT+S.STAT.MODE+1 + +.1 ldx #SHARED.DirEnt.Cnt + +.2 ldy SHARED.DirEnt.Src-1,x + lda (ZPPtr3),y + ldy SHARED.Stat.Dst-1,x + sta K.S.STAT,y + dex + bne .2 + + ldy #$1E ProDOS Access + lda (ZPPtr3),y + + jsr SHARED.Stat.Access2Mode + + lda #$18 creation Date/time + ldx #S.STAT.CTIME + jsr SHARED.PTime2StatAX + + lda #$21 mod Date/time + ldx #S.STAT.MTIME + jmp SHARED.PTime2StatAX *-------------------------------------- SHARED.ClrStat ldx #S.STAT-1 .1 stz K.S.STAT,x dex bpl .1 + + lda CORE.FSID + sta K.S.STAT+S.STAT.FSID rts *-------------------------------------- @@ -397,12 +425,36 @@ SHARED.Stat.Access2Mode rts *-------------------------------------- -SHARED.Stat.SRC .DA #S.FI.T - .DA #S.FI.AUXTYPE,#S.FI.AUXTYPE+1 +SHARED.PTime2StatAX + clc + adc ZPPtr3 + tay + lda ZPPtr3+1 + adc #0 +SHARED.PTime2StatYAX + >PUSHYA + + txa + clc + adc #K.S.STAT + tay + lda /K.S.STAT + adc #0 + >PUSHYA + >SYSCALL2 PTime2Time + rts +*-------------------------------------- +SHARED.GFI.Src .DA #S.FI.T,#S.FI.AUXTYPE,#S.FI.AUXTYPE+1 .DA #S.FI.UBLKS,#S.FI.UBLKS+1 -SHARED.Stat.DST .DA #S.STAT.P.TYPE - .DA #S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1 +SHARED.GFI.Cnt .EQ *-SHARED.GFI.Src +*-------------------------------------- +SHARED.DirEnt.Src + .HS 10.1f20.1314.151617 +SHARED.DirEnt.Cnt .EQ *-SHARED.DirEnt.Src +*-------------------------------------- +SHARED.Stat.Dst .DA #S.STAT.P.TYPE,#S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1 .DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1 + .DA #S.STAT.SIZE,#S.STAT.SIZE+1,#S.STAT.SIZE+2 *-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.STAT diff --git a/SYS/KERNEL.S.STDIO2.S.txt b/SYS/KERNEL.S.STDIO2.S.txt index 2a2c1ac9..e511482a 100644 --- a/SYS/KERNEL.S.STDIO2.S.txt +++ b/SYS/KERNEL.S.STDIO2.S.txt @@ -6,9 +6,9 @@ NEW * # SPrintF * Prints C-Style String * ## C -* `int printf ( const char * format, ... );` -* `int fprintf ( hFILE stream, const char * format, ... );` -* `int sprintf ( char * str, const char * format, ... );` +* `int printf ( const char *format, ... );` +* `int fprintf ( short int stream, const char *format, ... );` +* `int sprintf ( char *str, const char *format, ... );` * ## ASM * **In:** * PrintF : (example is for printing Y,A as integer : format="%I", 2 bytes) @@ -75,35 +75,17 @@ PrintF.hFILE .BS 1 K.PrintF.PadL .EQ FAC+5 K.PrintF.PadC .EQ ARG.SIGN *-------------------------------------- -K.PrintF >LDYAI K.IOBuf - >STYA pIOBuf - ldy #S.PS.hStdOut +K.PrintF ldy #S.PS.hStdOut lda (pPs),y sta PrintF.hFILE - lda (pStack) Bytecount - inc - tay - - lda (pStack),y format LO - sta ZPPtr2 - iny - lda (pStack),y format HI - sta ZPPtr2+1 + clc + jsr STDIO.GetFormat bra K.PrintF.1 *-------------------------------------- -K.FPrintf >LDYAI K.IOBuf - >STYA pIOBuf - lda (pStack) Bytecount - inc - tay - - lda (pStack),y format LO - sta ZPPtr2 - iny - lda (pStack),y format HI - sta ZPPtr2+1 +K.FPrintf clc + jsr STDIO.GetFormat iny lda (pStack),y hFILE @@ -112,22 +94,9 @@ K.FPrintf >LDYAI K.IOBuf bra K.PrintF.1 *-------------------------------------- K.SPrintf stz PrintF.hFILE - lda (pStack) Bytecount - inc - tay - - lda (pStack),y format LO - sta ZPPtr2 - iny - lda (pStack),y format HI - sta ZPPtr2+1 - - iny - lda (pStack),y str LO - sta pIOBuf - iny - lda (pStack),y str HI - sta pIOBuf+1 + + sec Format & buffer + jsr STDIO.GetFormat *-------------------------------------- K.PrintF.1 sty PrintF.Exit.Cnt+1 Total bytes to POP @@ -436,27 +405,38 @@ PrintF.COut phy .9 lda #E.BUF sec PrintF.COut.RTS rts -*-------------------------------------- -K.PrintF.GetFormat - lda (pStack) - sta ZPPtr2 - ldy #1 - lda (pStack),y - sta ZPPtr2+1 - lda pStack - inc - inc - sta pLocal - rts */-------------------------------------- +* # ScanF (BLOCKING) +* # FScanF (BLOCKING) * # SScanF * Read formatted data from string * ## C +* `int scanf(const char *format, ...);` +* `int fscanf(short int stream, const char *format, ...);` * `int sscanf ( const char *s, const char *format, ... );` * ## ASM * **In:** +* ScanF : +* `>PUSHW format` +* `>PUSHW ptr` +* `...` +* `>PUSHB bytecount` +* `>SYSCALL scanf` +* FScanF : +* `>PUSHB stream` +* `>PUSHW format` +* `>PUSHW ptr` +* `...` +* `>PUSHB bytecount` +* `>SYSCALL fscanf` +* SScanF : * `>PUSHW s` * `>PUSHW format` +* `>PUSHW ptr` +* `...` +* `>PUSHB bytecount` +* `>SYSCALL sscanf` +* Specifiers : * + %i : short int * + %d : byte * + %I : int @@ -467,31 +447,33 @@ K.PrintF.GetFormat * + %H : HEX word * + %s : string * TODO : %10s -* `>PUSHW ptr` -* `...` -* `>PUSHB bytecount` -* `>SYSCALL sscanf` * ## RETURN VALUE * A = Number of arguments filled. *\-------------------------------------- -K.SScanF lda (pStack) Bytecount - inc - tay +K.ScanF ldy #S.PS.hStdIn + lda (pPs),y + sta PrintF.hFILE + + clc + jsr STDIO.GetFormat - lda (pStack),y format LO - sta ZPPtr2 - iny - lda (pStack),y format HI - sta ZPPtr2+1 + bra K.SScanF.1 +*-------------------------------------- +K.FScanF clc + jsr STDIO.GetFormat iny - lda (pStack),y str LO - sta ZPPtr1 - iny - lda (pStack),y str HI - sta ZPPtr1+1 + lda (pStack),y hFILE + sta PrintF.hFILE - sty PrintF.Exit.Cnt+1 Total bytes to POP + bra K.SScanF.1 +*-------------------------------------- +K.SScanF stz PrintF.hFILE + + sec Format & buffer + jsr STDIO.GetFormat +*-------------------------------------- +K.SScanF.1 sty PrintF.Exit.Cnt+1 Total bytes to POP .1 jsr SHARED.GetCharPtr2 End Of format? beq .8 @@ -633,6 +615,32 @@ PrintF.LocalGetByte PrintF.LocalGetByte.RTS rts *-------------------------------------- +STDIO.GetFormat bcs .1 + + >LDYAI K.IOBuf + >STYA pIOBuf + +.1 lda (pStack) Bytecount + inc + tay + + lda (pStack),y format LO + sta ZPPtr2 + iny + lda (pStack),y format HI + sta ZPPtr2+1 + + bcc .8 + + iny + lda (pStack),y str LO + sta pIOBuf + iny + lda (pStack),y str HI + sta pIOBuf+1 + +.8 rts +*-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.STDIO2 LOAD USR/SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.UNISTD.txt b/SYS/KERNEL.S.UNISTD.txt index e5d22662..8ea045ef 100644 --- a/SYS/KERNEL.S.UNISTD.txt +++ b/SYS/KERNEL.S.UNISTD.txt @@ -50,7 +50,7 @@ UNISTD.Open ldx #5 /DEV/ bcs IO.OPEN.REG .1 lda K.MLI.PATH,x - cmp IO.DEV.FIFO-1,x + cmp DEV.FIFO-1,x bne IO.OPEN.REG dex bne .1 @@ -59,7 +59,7 @@ UNISTD.Open ldx #5 /DEV/ *-------------------------------------- >LDYAI K.MLI.PATH+6 skip $/DEV/ - jsr K.GetDevByName + >SYSCALL2 GetDevByName bcc .7 ldx #2 .10 lda Nod.Table.hPath-2,x @@ -187,6 +187,7 @@ UNISTD.Close lda (pFD) #S.FD.T * CS: A = EC *\-------------------------------------- K.Read jsr UNISTD.GetPFD + UNISTD.Read lda (pFD) #S.FD.T tax jmp (.1,x) @@ -231,6 +232,8 @@ UNISTD.GetPFD sta IO.hFD >STYA pFD rts *-------------------------------------- +DEV.FIFO .AS "/dev/fifo" STAT,UNISTD +*-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.UNISTD LOAD USR/SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 7b327206..52d565e8 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -71,10 +71,9 @@ A2osX.D1.B .PH $D000 .INB USR/SRC/SYS/KERNEL.S.STAT .INB USR/SRC/SYS/KERNEL.S.DIRENT .INB USR/SRC/SYS/KERNEL.S.UNISTD + .INB USR/SRC/SYS/KERNEL.S.IO .INB USR/SRC/SYS/KERNEL.S.STDIO .INB USR/SRC/SYS/KERNEL.S.STDIO2 - .INB USR/SRC/SYS/KERNEL.S.DEV - .INB USR/SRC/SYS/KERNEL.S.PFT .EP A2osX.D1.S .EQ *-A2osX.D1.B @@ -85,6 +84,7 @@ A2osX.D2.B .PH $D000 .DA #RRAMWRAMBNK2 .INB USR/SRC/SYS/KERNEL.S.STDLIB .INB USR/SRC/SYS/KERNEL.S.STRING + .INB USR/SRC/SYS/KERNEL.S.DEV .INB USR/SRC/SYS/KERNEL.S.BIN .INB USR/SRC/SYS/KERNEL.S.PS .INB USR/SRC/SYS/KERNEL.S.ARG @@ -108,8 +108,8 @@ A2osX.E0.B .PH $E000 .INB USR/SRC/SYS/KERNEL.S.STRV .INB USR/SRC/SYS/KERNEL.S.MEM * go to A2osX.D1 - .INB USR/SRC/SYS/KERNEL.S.IO .INB USR/SRC/SYS/KERNEL.S.PIPE + .INB USR/SRC/SYS/KERNEL.S.PFT DevMgr.Timer .BS 1 DevMgr.ASCREEN .BS 1