From 3e60ff306493c0e15aeb1b86e6d98a47b0b6a626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 5 Aug 2015 22:38:05 +0200 Subject: [PATCH] Modified 800K SRC disk now bootable, some work in progress... --- A2OSX.BOOT.DSK | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.STARTUP.txt | 4 +- BIN/ASM.S.txt | 331 +++++++++++++++++------------ BIN/EDIT.S.txt | 198 ++++++++++++++++++ BIN/LS.S.txt | 33 ++- BIN/NSCSET.S.txt | 0 BIN/RM.S.txt | 270 ++++++++++++++++++++++++ DRV/CONSOLE.DRV.S.txt | 19 +- DRV/DHGR.DRV.S.txt | 1 - DRV/SSC.DRV.S.txt | 112 +++++----- DRV/UTHERNET2.DRV.S.txt | 454 ++++++++++++++++++++++++++++++++++++++++ LIB/LIBGFX.S.txt | 26 ++- SYS/KERNEL.S.FS.txt | 21 +- SYS/KERNEL.S.MEM.txt | 4 + 15 files changed, 1247 insertions(+), 226 deletions(-) create mode 100644 BIN/NSCSET.S.txt create mode 100644 DRV/UTHERNET2.DRV.S.txt diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index 9a99ed166c967ed6e1b09094ffeff11eddb91882..f01b39b3d2e6813a0e3300a246d567dec584a529 100644 GIT binary patch delta 7289 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 delta 8125 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 delta 28024 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 diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index d903c454..427e2b2a 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -9,14 +9,14 @@ SET ETC=%A2OSX%ETC/ SET LIB=%A2OSX%LIB/ LOAD CONSOLE.DRV EXEC GETTY KBD CON LOGIN -*LOAD SSC.DRV 9600 N 8 1 X +LOAD SSC.DRV 9600 N 8 1 X *EXEC GETTY COM2 COM2 LOGIN *LOAD PPIC.DRV LOAD UTHERNET.DRV 000E3A123456 EXEC TCPIP ETH3 EXEC DHCPCLNT *EXEC TELNETD -*MOUNT TFTP 192.168.1.5:/AO2SX /MNT/A2OSX +*MOUNT TFTP 192.168.1.5:/A2OSX /MNT/A2OSX *MOUNT CIFS 192.168.1.5:/MSSHARE /MNT/MSSHARE LOAD DHGR.DRV LOAD MOUSE.DRV diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 16ebd1d3..d0bec5f8 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -6,10 +6,11 @@ AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/ASM + .TF /A2OSX.BOOT/BIN/ASM *--------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/LIBSTR.I *--------------------------------------- SYM.BLOCK.SIZE .EQ 4096 @@ -19,9 +20,21 @@ ERR.INV.ARGS .EQ 1 ERR.SRC.INV.TYPE .EQ 2 ERR.SRC.TOO.LONG .EQ 3 ERR.SYM.TOO.LARGE .EQ 10 -*--------------------------------------- +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -32,19 +45,20 @@ L.MSG.HELP2 .DA MSG.HELP2 L.MSG.SRCLINE .DA MSG.SRCLINE L.READ.BUFFER .DA READ.BUFFER .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA 0 Data Segment to Allocate *--------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR - ldx #VAR.INIT.END-VAR.INIT -.1 stz VAR.INIT-1,x - dex + ldy #VAR.INIT + lda #0 +.1 sta (pData),y + iny + cpy #VAR.INIT.END bne .1 ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y bne CS.INIT.ARGS >PUSHW L.MSG.HELP1 @@ -58,67 +72,37 @@ CS.INIT >LIBLOADP L.LIBSTR CS.INIT.ARGS >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr1 lda (ZPQuickPtr1) - bne .1 - lda #ERR.INV.ARGS - sec - rts + beq .98 .1 ldy #1 lda (ZPQuickPtr1),y cmp #'/' bne .2 ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >SYSCALL SYS.PStrCpyA - bra CS.INIT.ARGS.OK + bra .3 .2 ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA ldy #S.PS.hPREFIX - lda (pPsContext),y + lda (pPs),y >PUSHA >SYSCALL SYS.PStrCat -CS.INIT.ARGS.OK sta SRC.hFILENAMES - - >SYSCALL SYS.MLIOpenA - bcc CS.INIT.OPEN - sec - rts - -CS.INIT.OPEN sta SRC.hREFNUMS - stx SRC.hBUFFERS - inc SRC.COUNT - lda SRC.hFILENAMES - >SYSCALL SYS.MLIGetFileInfoA +.3 jsr SRC.OPEN bcs .99 - >STYA ZPQuickPtr1 - ldy #1 - lda (ZPQuickPtr1),y - sta SRC.hFILETYPES - cmp #$04 TXT? - bne .1 - >PUSHBI $0D - >PUSHBI $FF - >PUSHB SRC.hREFNUMS - >SYSCALL SYS.MLINewLine - bcs .99 - -.1 cmp #$FA BAS? - bne .98 - - stz bSTOP - stz bCANCEL - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc rts -.98 lda #ERR.SRC.INV.TYPE +.98 lda #ERR.INV.ARGS + sec .99 rts *-------------------------------------- @@ -132,7 +116,7 @@ CS.RUN lda bCANCEL clc rts -.2 jsr CS.RUN.READLINE +.2 jsr SRC.ReadLine bcs .9 >PUSHWI TmpBuffer256 @@ -141,14 +125,142 @@ CS.RUN lda bCANCEL >LIBCALL hLIBSTR,LIBSTR.PRINTF clc .9 rts +*-------------------------------------- +CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .9 + lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .9 + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .1 + lda #$FF + sta bCANCEL + bra .8 +.1 cmp #$13 Ctrl-S + bne .8 + lda bSTOP + eor #$FF + sta bSTOP + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT ldy SRC.INDEX + lda (pData),y + bmi .8 + +.1 clc + adc #SRC.hREFNUMS + tay + lda (pData),y + >SYSCALL SYS.MLICloseA + + ldy SRC.INDEX + lda (pData),y + clc + adc #SRC.hBUFFERS + tay + lda (pData),y + >SYSCALL SYS.FreeMemA + + ldy SRC.INDEX + lda (pData),y + dec + sta (pData),y + bpl .1 + +.8 lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts *--------------------------------------- -CS.RUN.READLINE ldx SRC.COUNT - lda SRC.hFILETYPES-1,x - bmi CS.RUN.READLINE.BIN - jmp CS.RUN.READLINE.TXT +LOAD.ASM.T + clc + rts *--------------------------------------- -CS.RUN.READLINE.BIN >LDYAI 3 LEN + LINENUM - jsr CS.RUN.READLINE.YA +SRC.OPEN sta hFileName + >SYSCALL SYS.MLIOpenA + bcs .99 + + pha + ldy #SRC.INDEX + lda (pData),y + clc + adc #SRC.hREFNUMS + tay + pla + sta (pData),y + ldy #SRC.INDEX + lda (pData),y + clc + adc #SRC.hBUFFERS + tay + txa + sta (pData),y + + lda hFileName + >SYSCALL SYS.MLIGetFileInfoA + bcs .99 + + >STYA ZPQuickPtr1 + ldy #1 + lda (ZPQuickPtr1),y + pha + + ldy #SRC.INDEX + lda (pData),y + clc + adc #SRC.hFILETYPES + tay + pla + sta (pData),y + + cmp #$04 TXT? + bne .1 + + >PUSHBI $0D + >PUSHBI $FF + >PUSHB SRC.hREFNUMS + >SYSCALL SYS.MLINewLine + bcs .99 + +.1 cmp #$FA BAS? + bne .98 + + ldy #SRC.INDEX + lda (pData),y + inc + sta (pData),y + clc + rts + +.98 lda #ERR.SRC.INV.TYPE + +.99 sec + rts +*--------------------------------------- +SRC.ReadLine ldy #SRC.INDEX + lda (pData),y + clc + adc #SRC.hFILETYPES + tay + lda (pData),y + bmi SRC.ReadLine.BIN + jmp SRC.ReadLine.TXT +*--------------------------------------- +SRC.ReadLine.BIN >LDYAI 3 LEN + LINENUM + jsr SRC.ReadLine.YA bcs .9 lda READ.BUFFER+1 @@ -164,7 +276,7 @@ CS.RUN.READLINE.BIN >LDYAI 3 LEN + LINENUM tay lda #0 - jsr CS.RUN.READLINE.YA + jsr SRC.ReadLine.YA bcs .9 ldy #0 @@ -213,79 +325,26 @@ CS.RUN.READLINE.BIN >LDYAI 3 LEN + LINENUM .8 clc .9 rts + .99 lda #ERR.SRC.TOO.LONG sec rts *-------------------------------------- -CS.RUN.READLINE.TXT >LDYAI 256 newline = $0D - jsr CS.RUN.READLINE.YA - bcs .9 - +SRC.ReadLine.TXT clc -.9 rts + rts *-------------------------------------- -CS.RUN.READLINE.YA >PUSHYA +SRC.ReadLine.YA >PUSHYA >PUSHW L.READ.BUFFER - ldx SRC.COUNT - lda SRC.hREFNUMS-1,x + ldy #SRC.INDEX + lda (pData),y + clc + adc #SRC.hREFNUMS + tay + lda (pData),y >PUSHA >SYSCALL SYS.MLIRead rts -*-------------------------------------- -CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? - lda (pEvent),y - ldy #S.PS.hINDEV - cmp (pPsContext),y - bne .9 - lda (pEvent) - and #S.EVT.F.KEY is it a KEY event? - beq .9 - ldy #S.EVT.DATAHI is it an O or SAPPLE key ? - lda (pEvent),y - bne .9 - ldy #S.EVT.DATALO - lda (pEvent),y - cmp #$03 Ctrl-C - bne .1 - lda #$FF - sta bCANCEL - bra .8 -.1 cmp #$13 Ctrl-S - bne .8 - lda bSTOP - eor #$FF - sta bSTOP -.8 >SYSCALL SYS.DestroyEvent - clc - rts -.9 sec - rts -*-------------------------------------- -CS.QUIT ldx SRC.COUNT - beq .1 - - lda SRC.hREFNUMS-1,x - >SYSCALL SYS.MLICloseA - - ldx SRC.COUNT - lda SRC.hFILENAMES-1,x - >SYSCALL SYS.FreeMemA - - ldx SRC.COUNT - lda SRC.hBUFFERS-1,x - >SYSCALL SYS.FreeMemA - - dec SRC.COUNT - bne CS.QUIT - -.1 lda hLIBSTR - >SYSCALL SYS.UnloadLibA - clc - rts -*--------------------------------------- -LOAD.ASM.T - clc - rts *--------------------------------------- SYM.ADD clc @@ -305,6 +364,7 @@ SYM.BLOCK.ALLOC ldx #0 lda #ERR.SYM.TOO.LARGE sec Out of block error rts + .2 phx Save next free block >LDYA SYM.BLOCK.SIZE >SYSCALL SYS.GetMem @@ -341,41 +401,44 @@ T.DIRECTIVES .AS "AS" .AS "TF" .AS "TI" .AS "US" +T.DIRECTIVES.END .EQ * *--------------------------------------- LIBSTR >PSTRING "libstr.o" -MSG.HELP1 >CSTRING "A2OS-Macro Assembler (S-C MASM 2.0 Based)\n" +MSG.HELP1 >CSTRING "A2osX-Macro Assembler (S-C MASM 2.0 Based)\n" MSG.HELP2 >CSTRING "Usage : ASM [type TXT ($04) or S-C/BAS ($FA)]\n" MSG.SRCLINE >CSTRING "%05D-%s\n" -*--------------------------------------- -DS.START -*--------------------------------------- hLIBSTR .BS 1 -bSTOP .BS 1 -bCANCEL .BS 1 +hFileName .BS 1 +READ.BUFFER .BS 256 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START *--------------------------------------- VAR.INIT -SRC.COUNT .BS 1 -SRC.hFILENAMES .BS 8 Store full path to opened SRC files -SRC.hFILETYPES .BS 8 Store file type of opened SRC files +bSTOP .BS 1 +bCANCEL .BS 1 +SRC.INDEX .BS 1 SRC.hREFNUMS .BS 8 Store ref_num of opened files (Main, .INs & .INBs) SRC.hBUFFERS .BS 8 Store hMem to allocated buffers +SRC.hFILETYPES .BS 8 Store file type of opened SRC files + SRC.LINENUM .BS 2 ASM.T.hFILENAME .BS 1 ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx DST.hFILENAME .BS 1 -DST.hFILE .BS 1 +DST.hREFNUM .BS 1 DST.hBUFFER .BS 1 VAR.INIT.END *--------------------------------------- ASM.T.FILENAME .BS 65 PStr ProDOS Max Path Len +1 TARGET.FILENAME .BS 65 PStr ProDOS Max Path Len +1 TARGET.FILETYPE .BS 1 -READ.BUFFER .BS 256 *--------------------------------------- -PASS .BS 1 -ORIGIN .BS 4 32Bits Origin +ASM.PASS .BS 1 +ASM.ORG .BS 4 32Bits Origin SYM.BLOCKS .BS SYM.BLOCK.MAX -DS.END +DS.END .ED *--------------------------------------- MAN SAVE BIN/ASM.S diff --git a/BIN/EDIT.S.txt b/BIN/EDIT.S.txt index e69de29b..59e7eb14 100644 --- a/BIN/EDIT.S.txt +++ b/BIN/EDIT.S.txt @@ -0,0 +1,198 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/BIN/EDIT +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/KERNEL.I + .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/LIBSTR.I +*-------------------------------------- +ZPPTR1 .EQ ZPBIN +ZPPTR2 .EQ ZPBIN+2 +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT + .DA 0 +*-------------------------------------- +CS.INIT lda #0 + ldy #DS.END-DS.START-1 + +.1 sta (pData),y + dey + bpl .1 + + lda #12 + jsr COUT + + ldy #S.PS.hARGS + lda (pPs),y + beq .7 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + + lda (ZPQuickPtr1),y + cmp #'/' + bne .10 + + ldy #S.PS.hARGS + lda (pPs),y + bra .3 + +.10 ldy #S.PS.hARGS + lda (pPs),y + >PUSHA + ldy #S.PS.hPREFIX + lda (pPs),y + >PUSHA + >SYSCALL SYS.PStrCat + +.3 ldy #hFileName + sta (pData),y + + >SYSCALL SYS.LoadFileA + bcs .9 + bra .8 + +.7 >PUSHWI 16 + >PUSHBI 0 + >SYSCALL SYS.GetMem + bcs .9 + >LDYAI 0 + +.8 pha + tya + ldy #FileLen + sta (pData),y + iny + pla + sta (pData),y + txa + ldy #hBuffer + txa + sta (pData),y + + lda (pPs) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc +.9 rts +*-------------------------------------- +CS.RUN ldy #bCANCEL + lda (pData),y + bne .9 + + clc + rts + +.9 sec + rts +*-------------------------------------- +CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .9 + + lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .9 + + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .1 + + lda #$FF + ldy #bCANCEL + sta (pData),y + bra .8 + +.1 + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda #12 + jsr COUT + + clc + rts +*-------------------------------------- +PRBYTE pha + lsr + lsr + lsr + lsr + ora #$B0 + cmp #$BA + bcc .1 + adc #6 +.1 jsr COUT + pla + and #$0F + ora #$B0 + cmp #$BA + bcc COUT + adc #6 + bra COUT +*-------------------------------------- +CROUT lda #13 +*-------------------------------------- +COUT phx + phy + ldx #DEVMGR.COUT + jsr pDevJmp + ply + plx + rts +pDevJmp jmp (pDev) +*-------------------------------------- +CS.END +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +bCANCEL .BS 1 +hFileName .BS 1 +hBuffer .BS 1 +FileLen .BS 2 +xPos .BS 2 +yPos .BS 2 + +DS.END + .ED +*-------------------------------------- +MAN +SAVE BIN/EDIT.S +ASM diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index 8da59e68..a480bd7a 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -54,7 +54,7 @@ CS.INIT >LDYA L.LIBSTR ldy #S.PS.hARGS lda (pPs),y - beq .1 + beq .1 no arg, go get current prefix >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr1 @@ -62,12 +62,12 @@ CS.INIT >LDYA L.LIBSTR beq .1 ldy #1 lda (ZPQuickPtr1),y - cmp #'/' - bne .10 + cmp #'/' full path starting with '/'? + bne .10 no, append to current prefix - ldy #S.PS.hARGS + ldy #S.PS.hARGS yes, get back arg... lda (pPs),y - bra .3 + bra .3 .10 ldy #S.PS.hARGS lda (pPs),y @@ -82,7 +82,28 @@ CS.INIT >LDYA L.LIBSTR .1 ldy #S.PS.hPREFIX lda (pPs),y -.3 >SYSCALL SYS.ListDirInitA +.3 pha + >SYSCALL SYS.CheckPrefixA is it a existing directory? + bcs .4 no, let ListDirInitA extract pattern + + pla + pha + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + tay + lda #'/' + cmp (ZPQuickPtr1),y + beq .31 + iny + sta (ZPQuickPtr1),y + +.31 iny + lda #'*' + sta (ZPQuickPtr1),y + +.4 pla + >SYSCALL SYS.ListDirInitA bcs .9 ldy #hS.LISTDIR sta (pData),y diff --git a/BIN/NSCSET.S.txt b/BIN/NSCSET.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/RM.S.txt b/BIN/RM.S.txt index e69de29b..d8a7121c 100644 --- a/BIN/RM.S.txt +++ b/BIN/RM.S.txt @@ -0,0 +1,270 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/BIN/RM +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/LIBSTR.I +*-------------------------------------- +ZPListDirPTR .EQ ZPBIN +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.FullPath .DA FullPath + .DA 0 +*-------------------------------------- +CS.INIT lda #0 + ldy #DS.END-DS.START-1 +.11 sta (pData),y + dey + bpl .11 + + ldy #S.PS.hARGS + lda (pPs),y + beq .98 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + beq .98 + ldy #1 + lda (ZPQuickPtr1),y + cmp #'/' + bne .10 + + ldy #S.PS.hARGS + lda (pPs),y + bra .3 + +.10 ldy #S.PS.hARGS + lda (pPs),y + >PUSHA + ldy #S.PS.hPREFIX + lda (pPs),y + >PUSHA + >SYSCALL SYS.PStrCat + sta hDIRPATH + +.3 >SYSCALL SYS.ListDirInitA + bcs .99 + ldy #hS.LISTDIR + sta (pData),y + + lda (pPs) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc + rts + +.98 lda #SYSMGR.ERRSYN +.99 sec + rts +*-------------------------------------- +CS.RUN ldy #bCANCEL + lda (pData),y + beq .10 + + sec + rts + +.10 ldy #bSTOP + lda (pData),y + beq .1 + clc +.99 rts + +.1 ldy #hS.LISTDIR + lda (pData),y + >SYSCALL SYS.ListDirNextA + bcs .99 + + pha + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + pha + + and #$0F + sta (ZPQuickPtr1) Adjust Filename len + + pla + and #$F0 + cmp #$F0 Volume ($F) HEADER ? + beq .8 + cmp #$E0 Dir ($E) HEADER ? + beq .8 + + ldy #hS.LISTDIR + lda (pData),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr2 + + ldy #S.LISTDIR.hPATH + lda (ZPQuickPtr2),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr2 + + lda (ZPQuickPtr2) + tax + tay + +.2 lda (ZPQuickPtr2),y + sta FullPath,y + dey + bne .2 + + ldy #0 +.3 inx + iny + lda (ZPQuickPtr1),y + sta FullPath,x + tya + cmp (ZPQuickPtr1) + bne .3 + + stx FullPath + + ldy #0 +.4 iny + lda FullPath,y + jsr COUT + cpy FullPath + bne .4 + + >LDYA L.FullPath + >SYSCALL SYS.MLIDestroyYA + bcc .5 + pha + lda #"[" + jsr COUT + pla + jsr PRBYTE + lda #"]" + jsr COUT + +.5 jsr CROUT + +.8 pla + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .9 + + lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .9 + + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .1 + + lda #$FF + ldy #bCANCEL + sta (pData),y + bra .8 + +.1 cmp #$13 Ctrl-S + bne .8 + + ldy #bSTOP + lda (pData),y + eor #$FF + sta (pData),y + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT ldy #hS.LISTDIR + lda (pData),y + + >SYSCALL SYS.ListDirCloseA + + ldy #hDIRPATH + lda (pData),y + beq .3 + >SYSCALL SYS.FreeMemA + +.3 clc + rts +*-------------------------------------- +PRBYTE pha + lsr + lsr + lsr + lsr + ora #$B0 + cmp #$BA + bcc .1 + adc #6 +.1 jsr COUT + pla + and #$0F + ora #$B0 + cmp #$BA + bcc COUT + adc #6 + bra COUT +*-------------------------------------- +CROUT lda #13 +*-------------------------------------- +COUT phx + phy + ldx #DEVMGR.COUT + jsr pDevJmp + ply + plx + rts +pDevJmp jmp (pDev) +*-------------------------------------- +CS.END +FullPath .BS 64 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +hDIRPATH .BS 1 +hS.LISTDIR .BS 1 +bSTOP .BS 1 +bCANCEL .BS 1 +DS.END + .ED +*-------------------------------------- +MAN +SAVE BIN/RM.S +ASM diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index f2ddf4cd..7902268b 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -105,7 +105,13 @@ IRQ clc *-------------------------------------- * PRIVATE *-------------------------------------- -COUT1 cmp #8 +COUT1 pha + jsr CUROFF + pla + cmp #32 + bcs .80 regular char + + cmp #8 bne .2 ldx CH beq .10 @@ -127,9 +133,16 @@ COUT1 cmp #8 jsr SetCharAtXY rts -.2 cmp #13 +.2 cmp #12 + bne .3 + jmp HOME + +.3 cmp #13 beq CROUT - ora INVFLG + + rts + +.80 ora INVFLG ldx CH ldy CV jsr SetCharAtXY diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt index 47ee3248..41265408 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -106,7 +106,6 @@ OPEN sta SETHIRES txa bne .81 - >DEBUG clc rts *-------------------------------------- diff --git a/DRV/SSC.DRV.S.txt b/DRV/SSC.DRV.S.txt index f5f26e6a..b73621de 100644 --- a/DRV/SSC.DRV.S.txt +++ b/DRV/SSC.DRV.S.txt @@ -6,10 +6,11 @@ AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF DRV/SSC.DRV + .TF /A2OSX.BOOT/DRV/SSC.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I *-------------------------------------- BUF.SIZE .EQ $20 BUF.MASK .EQ $1F @@ -52,35 +53,28 @@ SSC.REG.CMD.RIRQDIS .EQ %00000010 SSC.REG.CMD.DTR .EQ %00000001 SSC.REG.CTL .EQ $C08B W *-------------------------------------- -* Main DRV entry point -* input : -* X = CMD -* 0 : OPEN -* 2 : GETEVENT -* 4 : OUT -* 6 : CLOSE -* 8 : GETINFO -* 10 : IRQ -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld - jmp (.1,x) - .DA CS.END-CS.START + jmp Dev.Detect cld,jmp abs=DRV + .DA #$61 6502,Level 1 (65c02) + .DA #1 DRV Layout Version 1 .DA 0 -.1 .DA OPEN - .DA GETEVENT - .DA OUT - .DA CLOSE - .DA GETINFO -L.IRQ .DA IRQ -L.DEVINFO .DA DEVINFO - .DA 0 end or relocation + .DA CS.END-CS.START Code Length + .DA DEV.HEADER-CS.START Device Header Offset + .DA DRV.CS.START-CS.START Driver Code Offset + .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- -OPEN stz ZPTmpPtr1 +* Relocation Table +*-------------------------------------- +L.MSG.DETECT .DA MSG.DETECT + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect sta hArgs + >LDYA L.MSG.DETECT + >SYSCALL SYS.SysScrPPSTRYA + + stz ZPTmpPtr1 lda #$C1 sta ZPTmpPtr1+1 @@ -108,13 +102,43 @@ OPEN stz ZPTmpPtr1 and #$0F sta DEVSLOT0n ora #$30 - sta DEVNAME+4 + sta DEV.HEADER.NAME+4 asl asl asl asl sta DEVSLOTn0 - + clc + rts +*-------------------------------------- +CS.END +DEVSIG.Offset .HS 05070B0C +DEVSIG.Value .HS 38180131 +DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset +MSG.DETECT >PSTRING "\nApple Super Serial Card Driver." +hArgs .BS 1 +*-------------------------------------- +* Device Header (16 Bytes) +*-------------------------------------- +DEV.HEADER cld + jmp (DRV.CS.START,x) + .DA #S.DEV.F.IRQ+S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR +DEV.HEADER.NAME >PSTRING "COM1" NAME + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +* Driver Code +*-------------------------------------- +DRV.CS.START .DA OPEN + .DA GETEVENT + .DA COUT + .DA CLOSE + .DA GETINFO + .DA IRQ +L.DEVINFO .DA DEVINFO + .DA 0 end or relocation +*-------------------------------------- +OPEN * ldy #SSC.INIT * jsr GoCard ldx DEVSLOTn0 @@ -128,11 +152,6 @@ OPEN stz ZPTmpPtr1 stz OUTBUF.PTR stz OUTBUF.CNT - >PUSHW L.IRQ - >PUSHBI 4 - >SYSCALL SYS.MLIAllocIRQ - bcs * - php sei ldx DEVSLOTn0 @@ -142,25 +161,10 @@ OPEN stz ZPTmpPtr1 lda SSC.REG.STATUS,x clear any IRQ pending plp - ldx #0 - ldy #S.DEV.NAME -.7 lda DEVNAME,x - sta (pDevContext),y - cpx DEVNAME - beq .8 - inx - iny - bne .7 - - lda #S.DEV.F.CHAR+S.DEV.F.OUT+S.DEV.F.EVENT - sta (pDevContext) - .8 clc rts *-------------------------------------- -GETEVENT >PULLW pEvent - - php +GETEVENT php sei lda INBUF.CNT beq .9 @@ -195,7 +199,7 @@ GETEVENT >PULLW pEvent sec rts *-------------------------------------- -OUT php +COUT php sei ldx DEVSLOTn0 @@ -295,11 +299,7 @@ GOCARD sta $CFFF Prevent SSC firmware bug pla jmp (ZPGoCard) *-------------------------------------- -CS.END -DEVSIG.Offset .HS 05070B0C -DEVSIG.Value .HS 38180131 -DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset -DEVNAME >PSTRING "COM0" +DRV.CS.END DEVSLOT0n .BS 1 DEVSLOTCn .BS 1 DEVSLOTn0 .BS 1 @@ -309,7 +309,7 @@ OUTBUF.PTR .BS 1 OUTBUF.CNT .BS 1 INBUF .BS BUF.SIZE OUTBUF .BS BUF.SIZE -DEVINFO .DA #S.DEV.F.CHAR+S.DEV.F.OUT+S.DEV.F.EVENT +DEVINFO .DA #S.DEVINFO.TYPE.CHAR .DA #0 *-------------------------------------- MAN diff --git a/DRV/UTHERNET2.DRV.S.txt b/DRV/UTHERNET2.DRV.S.txt new file mode 100644 index 00000000..edab3662 --- /dev/null +++ b/DRV/UTHERNET2.DRV.S.txt @@ -0,0 +1,454 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/DRV/UTHERNET2.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I +*-------------------------------------- +ZPTmpPTR .EQ ZPDRV +*-------------------------------------- +DEVID .EQ $630E +*-------------------------------------- +* CS8900A IO Registers +*-------------------------------------- +RTDATA .EQ $C080 Receive/Transmit Data (DWORD) +TxCMD .EQ $C084 Transmit Command +TxLength .EQ $C086 Transmission Length +IntStatusQueue .EQ $C088 Interrupt Status Queue +PacketPagePTR .EQ $C08A PacketPage Pointer +PacketPageDATA .EQ $C08C PacketPage Data (DWORD) +*-------------------------------------- +TxCMD.LID .EQ %00000000.00001001 +TxCMD.TxStart5 .EQ %00000000.00000000 00 = start after 5 Bytes +TxCMD.TxStart381 .EQ %00000000.01000000 01 = start after 381 Bytes +TxCMD.TxStart1021 .EQ %00000000.10000000 10 = start after 1021 Bytes +TxCMD.TxStartFULL .EQ %00000000.11000000 11 = start after ENTIRE Frame +TxCMD.Force .EQ %00000001.00000000 +TxCMD.OneColl .EQ %00000010.00000000 +TxCMD.InhibitCRC .EQ %00010000.00000000 +TxCMD.TxPadDis .EQ %00100000.00000000 +*-------------------------------------- +* PacketPage Offsets & Masks +*-------------------------------------- +PP.ID .EQ $0000 Product ID code (RO) +PP.RFBCNT .EQ $0050 Received Frame Byte Counter (RO) +PP.RxCFG .EQ $0102 Receiver Configuration (RW) +PP.RxCFG.LID .EQ %00000000.00000011 +PP.RxCTL .EQ $0104 Receiver Control (RW) +PP.RxCTL.LID .EQ %00000000.00000101 +PP.RxCTL.IAHashA .EQ %00000000.01000000 +PP.RxCTL.PromisA .EQ %00000000.10000000 +PP.RxCTL.RxOKA .EQ %00000001.00000000 +PP.RxCTL.MulticastA .EQ %00000010.00000000 +PP.RxCTL.IA .EQ %00000100.00000000 +PP.RxCTL.BroadcastA .EQ %00001000.00000000 +PP.RxCTL.CRCerrorA .EQ %00010000.00000000 +PP.RxCTL.RuntA .EQ %00100000.00000000 +PP.RxCTL.ExtradataA .EQ %01000000.00000000 +PP.TxCFG .EQ $0106 Transmit Configuration (RW) +PP.TxCMD .EQ $0108 Receiver Control (RW) +PP.BufCFG .EQ $010A +PP.LineCTL .EQ $0112 Line Control (RW) +PP.LineCTL.LID .EQ %00000000.00010011 +PP.LineCTL.SerRxOn .EQ %00000000.01000000 +PP.LineCTL.SerTxOn .EQ %00000000.10000000 +PP.LineCTL.AUIonly .EQ %00000001.00000000 +PP.LineCTL.Auto .EQ %00000010.00000000 +PP.SelfCTL .EQ $0114 Self Control (RW) +PP.SelfCTL.LID .EQ %00000000.00010101 +PP.SelfCTL.RESET .EQ %00000000.01000000 +PP.SelfCTL.SWSuspnd .EQ %00000000.10000000 +PP.SelfCTL.HWSleepE .EQ %00000001.00000000 +PP.SelfCTL.HWStndby .EQ %00000010.00000000 +PP.BufCTL .EQ $0116 +PP.TestCTL .EQ $0118 +PP.TestCTL.LID .EQ %00000000.00011001 +PP.TestCTL.DisLT .EQ %00000000.10000000 +PP.TestCTL.FDX .EQ %01000000.00000000 +PP.ISQ .EQ $0120 +PP.RxEvent .EQ $0124 Receiver Event (RO) +PP.RxEvent.LID .EQ %00000000.00000100 +PP.RxEvent.RxOK .EQ %00000001.00000000 +PP.RxEvent.IA .EQ %00000100.00000000 +PP.RxEvent.Brdcast .EQ %00001000.00000000 +PP.RxEvent.CRCerror .EQ %00010000.00000000 +PP.RxEvent.Runt .EQ %00100000.00000000 +PP.RxEvent.Xtradata .EQ %01000000.00000000 +PP.TxEvent .EQ $0128 Transmitter Event (RO) +PP.TxEvent.LID .EQ %00000000.00001000 +PP.BufEvent .EQ $012C +PP.RxMISS .EQ $0130 +PP.TxCOL .EQ $0132 +PP.LineST .EQ $0134 Line Status (RO) +PP.LineST.LID .EQ %00000000.00010100 +PP.LineST.LinkOK .EQ %00000000.10000000 +PP.LineST.AUI .EQ %00000001.00000000 +PP.LineST.10BT .EQ %00000010.00000000 +PP.LineST.PolOK .EQ %00010000.00000000 +PP.LineST.CRS .EQ %01000000.00000000 +PP.SelfST .EQ $0136 Self Status (RO) +PP.SelfST.INITD .EQ %00000000.10000000 +PP.BusST .EQ $0138 Bus Status (RO) +PP.BusST.LID .EQ %00000000.00011000 +PP.BusST.TxBidErr .EQ %00000000.10000000 +PP.BusST.Rdy4TxNOW .EQ %00000001.00000000 +PP.TDR .EQ $013C +PP.MAC .EQ $0158 MAC Address (RW) +PP.RxStatus .EQ $0400 +PP.RxLength .EQ $0402 +PP.RxFrame .EQ $0404 +PP.TxFrame .EQ $0A00 +*-------------------------------------- +ERRTNOFRAME .EQ 0 +ERRNOBUFFER .EQ 1 +ERRTIMEOUT .EQ 2 +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp Dev.Detect cld,jmp abs=DRV + .DA #$61 6502,Level 1 (65c02) + .DA #1 DRV Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length + .DA DEV.HEADER-CS.START Device Header Offset + .DA DRV.CS.START-CS.START Driver Code Offset + .DA DRV.CS.END-DRV.CS.START Drv Code Length +*-------------------------------------- +* Relocation Table +*-------------------------------------- +L.MSG.DETECT .DA MSG.DETECT + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect sta hArgs + >LDYA L.MSG.DETECT + >SYSCALL SYS.SysScrPPSTRYA + + ldx #$10 +.1 stx DEVSLOTx0 + >LDYAI PP.ID + >STYA PacketPagePTR,x + >LDYA PacketPageDATA,x + cpy #DEVID + bne .2 + cmp /DEVID + beq .3 + +.2 inc DEV.HEADER.NAME+4 + txa + clc + adc #$10 + tax + cpx #$80 + bne .1 + + lda #DEVMGR.ERRNOHW + sec + rts + +.3 lda hARGS + + beq .4 + >SYSCALL SYS.GetMemPtrA + >STYA ZPTmpPTR + jsr DecodeMac + bcc .4 + lda #DEVMGR.ERRNICL + sec + rts + +.4 clc + rts +*-------------------------------------- +DecodeMac lda (ZPTmpPTR) + cmp #12 + bne .9 + + ldy #1 + ldx #0 + +.1 lda (ZPTmpPTR),y + jsr Asc2NibbleA + bcs .9 + + asl + asl + asl + asl + sta MAC,x + + iny + lda (ZPTmpPTR),y + jsr Asc2NibbleA + bcs .9 + + ora MAC,x + sta MAC,x + inx + iny + cpy #13 + bne .1 + + clc + rts + +.9 sec + rts +*-------------------------------------- +Asc2NibbleA cmp #$30 + bcc .9 + cmp #$3A + bcs .1 + and #$0F + clc + rts +.1 cmp #$41 + bcc .9 + cmp #$47 + bcs .9 + sbc #$36 + clc + rts +.9 sec + rts +*-------------------------------------- +CS.END +MSG.DETECT >PSTRING "\nUtherNet II/W5100 Driver." +hArgs .BS 1 +*-------------------------------------- +* Device Header (16 Bytes) +*-------------------------------------- +DEV.HEADER cld + jmp (DRV.CS.START,x) + .DA #S.DEV.F.SHARE+S.DEV.F.EVENT +DEV.HEADER.NAME >PSTRING "ETH1" NAME + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +* Driver Code +*-------------------------------------- +DRV.CS.START .DA OPEN + .DA GETEVENT + .DA $FFFF no COUT + .DA CLOSE + .DA GETINFO + .DA $FFFF no IRQ + .DA SEND +L.DEVINFO .DA DEVINFO + .DA 0 end or relocation +*-------------------------------------- +* input : +* none +* output : +* CC on success +* CS on error +*-------------------------------------- +OPEN jsr Reset + >LDYAI PP.RxCTL + >STYA PacketPagePTR,x + >LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA + >STYA PacketPageDATA,x + + >LDYAI PP.MAC + >STYA PacketPagePTR,x + >LDYA MAC + >STYA PacketPageDATA,x + >LDYAI PP.MAC+2 + >STYA PacketPagePTR,x + >LDYA MAC+2 + >STYA PacketPageDATA,x + >LDYAI PP.MAC+4 + >STYA PacketPagePTR,x + >LDYA MAC+4 + >STYA PacketPageDATA,x + + >LDYAI PP.LineCTL + >STYA PacketPagePTR,x + >LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto + >STYA PacketPageDATA,x + + clc + rts +*-------------------------------------- +* input : +* pEvent +* output : +* CC no event +* CS event +*-------------------------------------- +GETEVENT ldx DEVSLOTx0 + >LDYAI PP.RxEvent + >STYA PacketPagePTR,x + >LDYA PacketPageDATA,x + and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA + bne GETEVENT.RxOK + lda #ERRTNOFRAME + sec + rts +GETEVENT.RxOK + and /PP.RxEvent.Brdcast + beq .10 + lda #$80 +.10 ldy #S.EVT.DATAHI + sta (pEvent),y + >LDYA RTDATA,x discard RxStatus + >LDYA RTDATA,x get RxLength + >STYA FRAMELEN + >PUSHYA + >PUSHBI 0 + >SYSCALL SYS.GetMem + bcs .99 + >STYA ZPTmpPTR + txa + ldy #S.EVT.DATALO + sta (pEvent),y + ldy #S.EVT.DATAW1 + lda FRAMELEN + sta (pEvent),y + iny + lda FRAMELEN+1 + sta (pEvent),y + lda #S.EVT.F.NET+S.EVT.F.hMEM1 + sta (pEvent) + ldy #0 + ldx DEVSLOTx0 + +.1 lda RTDATA,x + sta (ZPTmpPTR),y + iny + bne .2 + inc ZPTmpPTR+1 +.2 jsr DecFrameLen + beq .8 + lda RTDATA+1,x + sta (ZPTmpPTR),y + iny + bne .3 + inc ZPTmpPTR+1 +.3 jsr DecFrameLen + bne .1 +.8 clc + rts + +.99 sec + rts +*-------------------------------------- +CLOSE jsr Reset + clc + rts +*-------------------------------------- +* in: +* out: +* Y,A = BUFFER PTR +* CC on success +* CS on error +*-------------------------------------- +GETINFO >LDYA L.DEVINFO + clc + rts +*-------------------------------------- +* in: +* PULLW = FRAME PTR +* PULLW = FRAME LEN +* out: +* CC on success +* CS on error +*-------------------------------------- +SEND >PULLW ZPTmpPTR + >PULLW FRAMELEN + + ldy #11 Add Src MAC Address + ldx #5 +.10 lda MAC,x + sta (ZPTmpPTR),y + dey + dex + bpl .10 + + ldx DEVSLOTx0 + >LDYAI TxCMD.LID+TxCMD.TxStartFULL + >STYA TxCMD,x + >LDYA FRAMELEN + >STYA TxLength,x + >LDYAI PP.BusST + >STYA PacketPagePTR,x + + ldy #16 +.1 lda PacketPageDATA,x + and #PP.BusST.TxBidErr + bne .9 + lda PacketPageDATA+1,x + and /PP.BusST.Rdy4TxNOW + bne SENDPREADY + bra * + lda #0 +.2 dec + bne .2 + dey + bne .1 + bra * + lda #ERRTIMEOUT + sec + rts +.9 bra * + lda #ERRNOBUFFER + sec + rts + +SENDPREADY ldy #0 +.1 lda (ZPTmpPTR),y + sta RTDATA,x + iny + bne .2 + inc ZPTmpPTR+1 +.2 jsr DecFrameLen + beq .8 +.3 lda (ZPTmpPTR),y + sta RTDATA+1,x + iny + bne .5 + inc ZPTmpPTR+1 +.5 jsr DecFrameLen + bne .1 +.8 clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +Reset ldx DEVSLOTx0 + >LDYAI PP.SelfCTL + >STYA PacketPagePTR,x + >LDYAI PP.SelfCTL.LID+PP.SelfCTL.RESET + >STYA PacketPageDATA,x + rts +*-------------------------------------- +DecFrameLen lda FRAMELEN + bne .1 + lda FRAMELEN+1 + beq .8 + dec FRAMELEN+1 +.1 dec FRAMELEN + lda #1 Make something NZ +.8 rts +*-------------------------------------- +DRV.CS.END +*-------------------------------------- +DEVSLOTx0 .BS 1 +FRAMELEN .BS 2 +*-------------------------------------- +DEVINFO .DA #S.DEVINFO.TYPE.NET +MAC .BS 6 +LINK.STATUS .BS 1 +LINK.SPEED .BS 1 SPEED/DUPLEX +*-------------------------------------- +MAN +SAVE DRV/UTHERNET2.DRV.S +ASM diff --git a/LIB/LIBGFX.S.txt b/LIB/LIBGFX.S.txt index 213391e6..1b9ed133 100644 --- a/LIB/LIBGFX.S.txt +++ b/LIB/LIBGFX.S.txt @@ -12,30 +12,28 @@ AUTO 6 .INB INC/A2OSX.I .INB INC/LIBGFX.I *-------------------------------------- -* Main entry point -* input : -* X = Function -*-------------------------------------- -* Code signature and relocation table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) -.1 .DA LIB.LOAD - .DA LIB.UNLOAD - -*-------------------------------------- + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- +.1 .DA LIB.LOAD + .DA LIB.UNLOAD *-------------------------------------- LIB.LOAD LIB.UNLOAD clc rts +*-------------------------------------- +CS.END MAN SAVE LIB/LIBGFX.S ASM diff --git a/SYS/KERNEL.S.FS.txt b/SYS/KERNEL.S.FS.txt index c7e59c65..e3470674 100644 --- a/SYS/KERNEL.S.FS.txt +++ b/SYS/KERNEL.S.FS.txt @@ -157,12 +157,13 @@ S.LoadFileA jsr S.MLIOpenA * out : * A = hMem of Dir Listing *-------------------------------------- -S.ListDirInitA sta R.AL +S.ListDirInitA +* sta R.AL stz TmpFileName Reset File.Pattern jsr S.GetMemPtrA >STYA R.BX Store path - jsr S.CheckPrefixYA is it a existing directory? - bcc .4 yes, continue with empty pattern +* jsr S.CheckPrefixYA is it a existing directory? +* bcc .4 yes, continue with empty pattern lda (R.BX) no, get pattern at end of full path tay @@ -191,19 +192,19 @@ S.ListDirInitA sta R.AL tya sta (R.BX) remove pattern from path -.4 >LDYA R.BX - jsr S.NewPStrYA - bcs .99 - ldy #S.LISTDIR.hPATH - sta (R.CX),y - - >PUSHWI S.LISTDIR.SIZE get LISTDIR Struct +.4 >PUSHWI S.LISTDIR.SIZE get LISTDIR Struct >PUSHBI S.MEM.F.INIT0 reset all bytes jsr S.GetMem bcs .99 stx R.AH >STYA R.CX Store LISTDIR Struct + >LDYA R.BX + jsr S.NewPStrYA + bcs .99 + ldy #S.LISTDIR.hPATH + sta (R.CX),y + ldy TmpFileName beq .5 diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index b3d7201d..cc1dcb7f 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -380,6 +380,7 @@ S.GetMemByIDA stz ZPMemMgrSPtr+1 * X = hMem *-------------------------------------- S.GetMemByNameA jsr S.GetMemPtrA + bcs * S.GetMemByNameYA >STYA ZPMemMgrTmp1 save BINPATH >LDYAI MemMgr.Table+S.MEM.SIZE @@ -411,6 +412,9 @@ S.GetMemByNameYA bne .2 >LDYA ZPMemMgrSPtr + + bra * + clc rts