From ea144535e5126a3ce85ff74efbdab61821c80ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 27 Jul 2018 15:34:34 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Docs/KERNEL.md | 51 ++++++++++++-- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/A2osX.I.txt | 2 + SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.STDIO.txt | 146 ++++++++++++++++++++++++++------------- 6 files changed, 146 insertions(+), 55 deletions(-) diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index b596369e..9a581091 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -174,7 +174,7 @@ Load a file in memory PUSHW = AUXTYPE (Handled by.... PUSHB = TYPE ... PUSHB = MODE ... - PUSHW = PATH ...FOpen) + LDYA = PATH ...FOpen) **Out:** Y,A = File Length X = hMem of Loaded File @@ -531,7 +531,10 @@ Write Str to StdOut, appends '\r\n' ## C `int puts ( const char * str );` **In:** -Y,A : str + +## ASM +`>LDYAI str` +`>SYSCALL puts` **Out:** CC = success @@ -539,10 +542,13 @@ CC = success Write Str to FILE ## C -`int fputs ( const char * str, hFILE stream );` +`int fputs (hFILE stream, const char * str );` + +## ASM **In:** -PUSHB : hFILE -Y,A: str +`>PUSHW str` +`lda stream` +`>SYSCALL fputs` **Out:** CC = success @@ -613,6 +619,25 @@ Modifiers for len and padding : + %2f : '3.14' +# FGetS +read bytes from stream into the array +pointed to by s, until n-1 bytes are read, or a is read and +transferred to s, or an end-of-file condition is encountered. The +string is then terminated with a null byte. + +## C +`char *fgets(hFILE stream, char * s, int n);` + +## ASM +**In:** +`>PUSHW n` +`>PUSHW s` +`lda hFILE` +`>SYSCALL fgets` +**Out:** + Y,A: s +CC = success + # GetChar Get char from StdIn **In:** @@ -651,6 +676,7 @@ Read formatted data from string + %U : dword + %h : HEX byte + %H : HEX word ++ %s : string `>PUSHW ptr` `...` @@ -729,11 +755,21 @@ Write bytes to file Y,A = Bytes Written # FFlush + +## C +int fflush(hFILE stream); + +## ASM **In:** A = hFILE # FSeek Set the file-position indicator for hFILE + +## C +`int fseek(hFILE stream, long offset, int whence);` + +## ASM **In:** PUSHW = Ptr to Offset (DWORD) PUSHB = From @@ -751,6 +787,11 @@ Test the end-of-file indicator for hFILE # FTell Return the current value of the file-position indicator + +## C +`long ftell(hFILE stream);` + +## ASM **In:** PUSHW = Ptr to Offset (DWORD) PUSHB = hFILE diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index b638fc2e320656ac6d9498a49a62fecb9356c3f4..d0d697ec704f470eb48c95e0711a0f52088b778c 100644 GIT binary patch delta 6503 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 Hhiv!{^d`C{ delta 6379 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

?Hst;Y6xu!akyco zoAGFIdarnYqFJ8sEOOObuFsQJ&u z+y@hAWg+u`zI~#5QTkhm= z_i#_m^rdmP{jJBlXUPsKBS1{KTg2VOX0CW|*Ncz09(R5#caTE9?Wa;H+@mvn>h;`Z zKk8Y=q=sVIM67^@moZM+zDZ}?ey_SckihMmyz(B1yqx8|&Fw=C_c7bVfys{lokU;V z$EZ}PQ^C@PxU{43gDYjKBYCR6zBd&q?q?obo<7xgvo)e6ygTGfxT||=5P!ZgG*B5kFa3Zot~eE{4pxN%ZU%Rta-Z#}>A10UTd*4UXeC@^4`^ z@qSkw+aG?i$$4!8!y(rx6~CJ;fUxHoHcT?UK)_b-W^+ZxQOl}G18;Y+HSm=v#@cp-Z95`rJ0fm764G-d)ER*$ zpK{4!Xh57ok_@v^i9)hio`Y}g(Yb;)|AT=1aLi-S_fNr-ZAwX-azUFitWCMFM;ZRa FzW_T-L=OM} diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 62ced5a49b13d1c718e0763ffe0851a1e23ba0a9..a41950ad2506fa87f296513b5ab45522f3fba4ce 100644 GIT binary patch delta 14971 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 delta 14401 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 K.IOBuf * ## C * `int puts ( const char * str );` * **In:** -* Y,A : str +* ## ASM +* `>LDYAI str` +* `>SYSCALL puts` * **Out:** * CC = success *\-------------------------------------- @@ -71,19 +73,28 @@ K.PutS >STYA K.S.IOCTL+S.IOCTL.BUFPTR * Write Str to FILE * ## C * `int fputs (hFILE stream, const char * str );` +* ## ASM * **In:** -* PUSHB : hFILE -* Y,A: str +* `>PUSHW str` +* `lda stream` +* `>SYSCALL fputs` * **Out:** * CC = success *\-------------------------------------- -K.FPutS >STYA K.S.IOCTL+S.IOCTL.BUFPTR - >STYA ZPPtr1 - +K.FPutS pha + >PULLA + sta K.S.IOCTL+S.IOCTL.BUFPTR + sta ZPPtr1 + >PULLA + sta K.S.IOCTL+S.IOCTL.BUFPTR+1 + sta ZPPtr1+1 + + pla K.FPutS.I jsr IO.SELECT - + bcs * + ldy #0 ldx #0 @@ -100,28 +111,6 @@ K.FPutS.I jsr IO.SELECT stx K.S.IOCTL+S.IOCTL.BYTECNT+1 jmp IO.Write.I */-------------------------------------- -* # FGetS -* read bytes from stream into the array -* pointed to by s, until n-1 bytes are read, or a is read and -* transferred to s, or an end-of-file condition is encountered. The -* string is then terminated with a null byte. -* ## C -* `char *fgets(hFILE stream, char * s, int n);` -* ## ASM -* **In:** -* `>PUSHW n` -* `>PUSHW s` -* `lda hFILE` -* `>SYSCALL fgets` -* **Out:** -* Y,A: s -* CC = success -*\-------------------------------------- -K.FGetS - - clc - rts -*/-------------------------------------- * # PrintF/SPrintF/FPrintF * Prints C-Style String * ## C @@ -604,6 +593,67 @@ PrintF.COut phy *-------------------------------------- PrintF.Flush jmp IO.Write.I */-------------------------------------- +* # FGetS +* read bytes from stream into the array +* pointed to by s, until n-1 bytes are read, or a is read and +* transferred to s, or an end-of-file condition is encountered. The +* string is then terminated with a null byte. +* ## C +* `char *fgets(hFILE stream, char * s, int n);` +* ## ASM +* **In:** +* `>PUSHW n` +* `>PUSHW s` +* `lda hFILE` +* `>SYSCALL fgets` +* **Out:** +* Y,A: s +* CC = success +*\-------------------------------------- +K.FGetS pha + >PULLA + sec + sbc #2 + eor #$ff + sta ZPPtr2 !n + >PULLA + sbc #0 + eor #$ff + sta ZPPtr2+1 !n + + >PULLW ZPPtr1 s + pla + jsr IO.SELECT + bcs .9 + + jsr K.GetC.I + bcs .9 + +.1 lda K.IOBuf + cmp #C.CR + beq .8 + + sta (ZPPtr1) + inc ZPPtr1 + bne .2 + inc ZPPtr1+1 + +.2 inc ZPPtr2 + bne .3 + inc ZPPtr2+1 + beq .8 + +.3 jsr IO.READ.I + bcc .1 + +.8 clc + +.9 pha + lda #0 + sta (ZPPtr1) + pla + rts +*/-------------------------------------- * # GetChar * Get char from StdIn * **In:** @@ -625,19 +675,19 @@ K.GetChar ldy #S.PS.hStdIn * **Out:** * CC = success * A = char -*\-------------------------------------- +*\-----------a--------------------------- K.GetC jsr IO.SELECT - bcs .9 + bcs K.GetC.9 - >LDYAI K.IOBuf +K.GetC.I >LDYAI K.IOBuf >STYA K.S.IOCTL+S.IOCTL.BUFPTR lda #1 sta K.S.IOCTL+S.IOCTL.BYTECNT stz K.S.IOCTL+S.IOCTL.BYTECNT+1 jsr IO.READ.I - bcs .9 + bcs K.GetC.9 lda K.IOBuf -.9 rts +K.GetC.9 rts *-------------------------------------- *K.PrintF.PadL .BS 1 *K.PrintF.PadC .BS 1 @@ -675,9 +725,8 @@ BCDBUF .EQ ARG *\-------------------------------------- K.SScanF >STYA ZPPtr2 String to Scan >PULLW ZPPtr1 format - >PULLB K.SScanF.ByteCnt - stz K.SScanF.ByteIdx + stz .5+1 .1 lda (ZPPtr1) End Of format? beq .8 @@ -704,11 +753,12 @@ K.SScanF >STYA ZPPtr2 String to Scan bne .21 inc ZPPtr1+1 -.21 ldx #K.SScanFCNT-K.SScanFTBL-1 +.21 ldx #K.SScanFJMP-K.SScanFTBL-2 .3 cmp K.SScanFTBL,x beq .4 dex + dex bpl .3 .9 jsr .8 @@ -717,35 +767,33 @@ K.SScanF >STYA ZPPtr2 String to Scan rts .4 jsr .5 - bcs .9 + bcs .9 out of Ptr on stack bra .1 .8 lda pStack - clc - adc K.SScanF.ByteCnt ... + sec ByteCnt byte + adc (pStack) ... ByteCnt sta pStack CC .99 rts *-------------------------------------- -.5 ldy K.SScanF.ByteIdx - cpy K.SScanF.ByteCnt +.5 lda #$FF SELF MODIFIED + cmp (pStack) beq .99 CS + tay + iny lda (pStack),y sta ZPPtr3 + iny lda (pStack),y sta ZPPtr3+1 get VAR Ptr - iny - sty K.SScanF.ByteIdx + sty .5+1 jmp (K.SScanFJMP,x) *-------------------------------------- -K.SScanF.ByteCnt .BS 1 -K.SScanF.ByteIdx .BS 1 -*-------------------------------------- -K.SScanFTBL .DA #'i,#'d,#'I,#'D,#'l,#'u,#'h,#'H,#'s -K.SScanFCNT .DA #1, #1, #2, #2, #4, #4, #1, #2 +K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4,#'h,#1,#'H,#2,#'s,#2 K.SScanFJMP .DA K.SScanF.I .DA K.SScanF.D .DA K.SScanF.II