Kernel 0.94

This commit is contained in:
Rémy GIBERT 2020-02-16 21:45:16 +01:00
parent 10732cb5ce
commit fe193891d1
23 changed files with 686 additions and 663 deletions

View File

@ -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 <newline> 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

Binary file not shown.

View File

@ -260,8 +260,8 @@ Ctrl.CR lda #C.CR
>INCW.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

View File

@ -88,8 +88,9 @@ DumpDev >LDYA L.MSG0
dey
dex
bpl .2
>PUSHB Index
>PUSHEA.G DEV.DIB
lda Index
>SYSCALL GetDevStatus
bcc .6

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
*--------------------------------------

View File

@ -1,8 +1,6 @@
NEW
AUTO 3,1
*--------------------------------------
AUXPIPE .EQ 1
*--------------------------------------
ZPKERNEL .EQ $0
*--------------------------------------
ZPPtr1 .EQ ZPKERNEL

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
*--------------------------------------

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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