From 836ab820af9f5805e77b597f769f0f9562a90bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 10 Dec 2015 19:53:30 +0100 Subject: [PATCH] Kernel rewrite #5, IRQ Handler In Progress... --- A2OSX.BOOT.DSK | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.S.GP.txt | 15 +- A2osX.S.QC.txt | 8 +- A2osX.STARTUP.txt | 4 +- BIN/MEM.S.txt | 44 +---- DRV/CONSOLE.DRV.S.txt | 12 +- DRV/SSC.DRV.S.txt | 194 ++++++---------------- DRV/SSC.I.DRV.S.txt | 372 ++++++++++++++++++++++++++++++++++++++++++ INC/MACROS.I.txt | 3 +- LIB/LIBSTR.S.txt | 35 ++-- SBIN/LOGIN.S.txt | 7 +- SBIN/SHELL.S.txt | 10 +- SYS/KERNEL.S.CIO.txt | 6 + SYS/KERNEL.S.DRV.txt | 9 +- SYS/KERNEL.S.IRQ.txt | 116 +++++++++++++ SYS/KERNEL.S.MLI.txt | 7 +- SYS/KERNEL.S.txt | 3 + 18 files changed, 623 insertions(+), 222 deletions(-) create mode 100644 DRV/SSC.I.DRV.S.txt create mode 100644 SYS/KERNEL.S.IRQ.txt diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index a88e43098038483429083f411925ccdac660c86e..ae03c55043b189467b3ac1cc9ffc667c8a72d75a 100644 GIT binary patch delta 9150 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 delta 9811 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 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 31db6aa4a47729e0e3bd56991a4a76a202197101..8d4cb318456a59c8233350bdca9893f39251d526 100644 GIT binary patch delta 31863 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

  • Pl(mMpV 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 A2osX.QC.Prefix jsr A2osX.QC.PrintAX - >DEBUG + >DEBUGOA bra .3 @@ -86,7 +86,7 @@ A2osX.QC.Start1 sei >LDAXI MSG.STAGE1OK jsr A2osX.QC.PrintAX - >DEBUG + >DEBUGOA jmp (POWERUP) @@ -201,9 +201,7 @@ MSG.KLOADING >PSTRING "Loading Kernel..." MSG.KLOADING.KO >PSTRING "Error While Loading Kernel." MSG.STAGE1OK >PSTRING "A2osX[Stage1]:Complete." *-------------------------------------- -A2osX.QC.END .EQ * -A2osX.QC.SIZE .EQ A2osX.QC.END-A2osX.QC.START - .BS $200-A2osX.QC.SIZE + .BS $1300-* .EP *-------------------------------------- MAN diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index 5d6bc0cf..fb772120 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -8,8 +8,6 @@ echo Env: SET INSDRV CONSOLE.DRV GETTY CON SBIN/LOGIN -#INSDRV SSC.DRV 9600 N 8 1 X -#GETTY COM2 SBIN/LOGIN #INSDRV PPIC.DRV INSDRV UTHERNET.DRV 000E3A123456 TCPIP ETH3 @@ -20,6 +18,8 @@ DHCPCLNT #INSDRV DHGR.DRV #INSDRV MOUSE.DRV #DESKTOP +INSDRV SSC.I.DRV 9600 N 8 1 X +GETTY COM2 SBIN/LOGIN ECHO *** End A2osX Startup file *** MAN TEXT A2OSX.STARTUP diff --git a/BIN/MEM.S.txt b/BIN/MEM.S.txt index 81010dc6..c7cb93f1 100644 --- a/BIN/MEM.S.txt +++ b/BIN/MEM.S.txt @@ -209,33 +209,33 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN lda (ZPPTR1),y sta ZPPTR2+1 lda #"{" - jsr COUT + >SYSCALL SYS.COutA lda (ZPPTR2) - jsr PRBYTE + >SYSCALL SYS.HexOutA lda #"|" - jsr COUT + >SYSCALL SYS.COutA ldy #1 .1 lda (ZPPTR2),y - ora #$80 - cmp #$A0 + cmp #$20 bcs .2 ora #$20 -.2 jsr COUT +.2 >SYSCALL SYS.COutA iny cpy #40 bne .1 lda #"}" - jsr COUT + >SYSCALL SYS.COutA bra .4 .3 >SYSCALL SYS.GetMemPtrA >PUSHYA >LIBCALL hLIBSTR,LIBSTR.PRINTP -.4 jsr CROUT +.4 lda #13 + >SYSCALL SYS.COutA ldy #LINE.COUNT lda (pData),y inc @@ -301,34 +301,6 @@ CS.QUIT lda hLIBSTR 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 -*-------------------------------------- CS.END LIBSTR >PSTRING "libstr.o" MSG0 >CSTRING "hMem Flags PID REF PTR LEN BINPATH/DATA\n" diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index 3b421f86..0371698e 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -141,10 +141,13 @@ COUT.CTRL cmp #8 ldy CV jmp SetCharAtXY -.2 cmp #12 +.2 cmp #10 + beq LFOUT + + cmp #12 beq HOME -.3 cmp #13 + cmp #13 beq CROUT cmp #27 ESC @@ -182,9 +185,12 @@ FSOUT ldx CH rts *-------------------------------------- CROUT jsr CLREOL + stz CH + clc + rts *-------------------------------------- CROUT1 stz CH - ldy CV +LFOUT ldy CV cpy #23 beq SCROLL.UP inc CV diff --git a/DRV/SSC.DRV.S.txt b/DRV/SSC.DRV.S.txt index b73621de..9c00fa88 100644 --- a/DRV/SSC.DRV.S.txt +++ b/DRV/SSC.DRV.S.txt @@ -10,20 +10,8 @@ AUTO 6 *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I - .INB INC/A2OSX.API.I *-------------------------------------- -BUF.SIZE .EQ $20 -BUF.MASK .EQ $1F -*-------------------------------------- -ZPGoCard .EQ ZPDRV -ZPTmpPtr1 .EQ ZPDRV+2 -*-------------------------------------- -* Pascal 1.1 Protocol -*-------------------------------------- -SSC.INIT .EQ $0D -SSC.READ .EQ $0E -SSC.WRITE .EQ $0F -SSC.STATUS .EQ $10 +ZPTmpPtr1 .EQ ZPDRV *-------------------------------------- * SSC/ACIA I/O *-------------------------------------- @@ -35,7 +23,7 @@ SSC.REG.STATUS .EQ $C089 R SSC.REG.STATUS.IRQ .EQ %10000000 SSC.REG.STATUS.DSR .EQ %01000000 SSC.REG.STATUS.DCD .EQ %00100000 -SSC.REG.STATUS.TDRF .EQ %00010000 +SSC.REG.STATUS.TDRE .EQ %00010000 SSC.REG.STATUS.RDRF .EQ %00001000 SSC.REG.STATUS.OE .EQ %00000100 SSC.REG.STATUS.FE .EQ %00000010 @@ -46,7 +34,7 @@ SSC.REG.CMD.EVENP .EQ %01100000 SSC.REG.CMD.MARKP .EQ %10100000 SSC.REG.CMD.SPACEP .EQ %11100000 SSC.REG.CMD.ECHO .EQ %00010000 -SSC.REG.CMD.TE .EQ %00001000 +SSC.REG.CMD.TENOIRQ .EQ %00001000 SSC.REG.CMD.TEIRQ .EQ %00000100 SSC.REG.CMD.TBRK .EQ %00001100 SSC.REG.CMD.RIRQDIS .EQ %00000010 @@ -68,11 +56,14 @@ CS.START cld * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT +L.MSG.DETECT.OK .DA MSG.DETECT.OK +L.MSG.DETECT.KO .DA MSG.DETECT.KO +L.DEV.HEADER.NAME .DA DEV.HEADER.NAME .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect sta hArgs >LDYA L.MSG.DETECT - >SYSCALL SYS.SysScrPPSTRYA + >SYSCALL SYS.PSTROutYA stz ZPTmpPtr1 lda #$C1 @@ -93,6 +84,9 @@ Dev.Detect sta hArgs cmp #$C8 bne .1 + >LDYA L.MSG.DETECT.KO + >SYSCALL SYS.PSTROutYA + lda #DEVMGR.ERRNOHW Not Found in any slot, exiting sec rts @@ -108,6 +102,14 @@ Dev.Detect sta hArgs asl asl sta DEVSLOTn0 + + >LDYA L.MSG.DETECT.OK + >SYSCALL SYS.PSTROutYA + >LDYA L.DEV.HEADER.NAME + >SYSCALL SYS.PSTROutYA + lda #13 + >SYSCALL SYS.COutA + clc rts *-------------------------------------- @@ -115,14 +117,16 @@ 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." +MSG.DETECT >PSTRING "Apple SSC (Super Serial Card,//c Serial Port) Driver.\n" +MSG.DETECT.OK >PSTRING "SSC Installed As Device : " +MSG.DETECT.KO >PSTRING "No SSC Found.\n" 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 + .DA #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 @@ -138,39 +142,33 @@ DRV.CS.START .DA OPEN L.DEVINFO .DA DEVINFO .DA 0 end or relocation *-------------------------------------- -OPEN -* ldy #SSC.INIT -* jsr GoCard - ldx DEVSLOTn0 - - stz SSC.REG.RESET,x - lda #$1E - sta SSC.REG.CTL,x - - stz INBUF.PTR - stz INBUF.CNT - stz OUTBUF.PTR - stz OUTBUF.CNT +OPEN ldx DEVSLOTn0 php sei + stz SSC.REG.RESET,x + + lda #$1E + sta SSC.REG.CTL,x + ldx DEVSLOTn0 - lda #SSC.REG.CMD.TEIRQ+SSC.REG.CMD.DTR + lda #SSC.REG.CMD.TENOIRQ+SSC.REG.CMD.RIRQDIS sta SSC.REG.CMD,x lda SSC.REG.STATUS,x clear any IRQ pending + bmi * plp - -.8 clc + clc rts *-------------------------------------- -GETEVENT php - sei - lda INBUF.CNT - beq .9 +GETEVENT ldx DEVSLOTn0 + lda SSC.REG.STATUS,x + bmi * + + and #SSC.REG.STATUS.RDRF incoming char? + beq .9 - ldx INBUF.PTR - lda INBUF,x + lda SSC.REG.DATA,x ldy #S.EVT.DATA sta (pEvent),y @@ -181,134 +179,50 @@ GETEVENT php lda #S.EVT.F.KEY sta (pEvent) - inx - cpx #BUF.SIZE - bne .1 - ldx #0 - -.1 stx INBUF.PTR - dec INBUF.CNT - - - plp clc rts -.9 plp - lda #0 +.9 lda #0 sec rts *-------------------------------------- -COUT php - sei +COUT pha ldx DEVSLOTn0 - lda SSC.REG.STATUS,x +.1 lda SSC.REG.STATUS,x + bmi * and #SSC.REG.STATUS.DCD+SSC.REG.STATUS.DSR beq .9 - - ldx OUTBUF.CNT - cpx #BUF.SIZE - beq .9 - - >PULLA - ldx OUTBUF.PTR - sta OUTBUF,x - inx - cpx #BUF.SIZE + + and #SSC.REG.STATUS.TDRE Outgoing char? bne .1 - ldx #0 -.1 stx OUTBUF.PTR - inc OUTBUF.CNT + pla + sta SSC.REG.DATA,x - plp clc rts -.9 >PULLA - plp +.9 pla sec rts *-------------------------------------- -CLOSE clc +CLOSE php + sei + ldx DEVSLOTn0 + stz SSC.REG.RESET,x + plp + clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO - clc +IRQ clc rts *-------------------------------------- -* IRQ Handler -* on exit, CS if handled -*-------------------------------------- -IRQ cld - - ldx DEVSLOTn0 - lda SSC.REG.STATUS,x IRQ from this device ? -* bpl .9 no, exit - pha save status ... - and #SSC.REG.STATUS.RDRF incoming char? - beq .1 - - ldy SSC.REG.DATA,x read data to clear IRQ - lda INBUF.CNT - cmp #BUF.SIZE - beq .1 buffer full, discard - phy - clc - adc INBUF.PTR - and #BUF.MASK - tay - pla get back data - sta INBUF,y - inc INBUF.CNT - -.1 pla get back status - and #SSC.REG.STATUS.TDRF - beq .8 - - lda OUTBUF.CNT something to transmit ? - beq .8 no, exit - - clc - adc OUTBUF.PTR - and #BUF.MASK - tay - - lda OUTBUF,Y - sta SSC.REG.DATA,x - - dec INBUF.CNT - -.8 clc - rts - -.9 sec - rts -*-------------------------------------- -* PRIVATE -*-------------------------------------- -GOCARD sta $CFFF Prevent SSC firmware bug - pha - stz ZPGoCard - ldx DEVSLOTCn - stx ZPGoCard+1 - lda (ZPGoCard),y - sta ZPGoCard - ldy DEVSLOTn0 - pla - jmp (ZPGoCard) -*-------------------------------------- DRV.CS.END DEVSLOT0n .BS 1 DEVSLOTCn .BS 1 DEVSLOTn0 .BS 1 -INBUF.PTR .BS 1 -INBUF.CNT .BS 1 -OUTBUF.PTR .BS 1 -OUTBUF.CNT .BS 1 -INBUF .BS BUF.SIZE -OUTBUF .BS BUF.SIZE DEVINFO .DA #S.DEVINFO.TYPE.CHAR .DA #0 *-------------------------------------- diff --git a/DRV/SSC.I.DRV.S.txt b/DRV/SSC.I.DRV.S.txt new file mode 100644 index 00000000..579e988d --- /dev/null +++ b/DRV/SSC.I.DRV.S.txt @@ -0,0 +1,372 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/DRV/SSC.I.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I +*-------------------------------------- +BUF.SIZE .EQ $20 +BUF.MASK .EQ $1F +*-------------------------------------- +ZPTmpPtr1 .EQ ZPDRV +*-------------------------------------- +* SSC/ACIA I/O +*-------------------------------------- +SSC.REG.DIPSW1 .EQ $C081 R +SSC.REG.DIPSW2 .EQ $C082 R +SSC.REG.DATA .EQ $C088 R,W +SSC.REG.RESET .EQ $C089 W +SSC.REG.STATUS .EQ $C089 R +SSC.REG.STATUS.IRQ .EQ %10000000 +SSC.REG.STATUS.DSR .EQ %01000000 +SSC.REG.STATUS.DCD .EQ %00100000 +SSC.REG.STATUS.TDRE .EQ %00010000 +SSC.REG.STATUS.RDRF .EQ %00001000 +SSC.REG.STATUS.OE .EQ %00000100 +SSC.REG.STATUS.FE .EQ %00000010 +SSC.REG.STATUS.PE .EQ %00000001 +SSC.REG.CMD .EQ $C08A W +SSC.REG.CMD.NOP .EQ %00000000 +SSC.REG.CMD.ODDP .EQ %00100000 +SSC.REG.CMD.EVENP .EQ %01100000 +SSC.REG.CMD.MARKP .EQ %10100000 +SSC.REG.CMD.SPACEP .EQ %11100000 +SSC.REG.CMD.ECHO .EQ %00010000 +SSC.REG.CMD.TBRK .EQ %00001100 +SSC.REG.CMD.TE .EQ %00001000 +SSC.REG.CMD.TEIRQ .EQ %00000100 +SSC.REG.CMD.RIRQDIS .EQ %00000010 +SSC.REG.CMD.DTR .EQ %00000001 +SSC.REG.CTL .EQ $C08B W +SSC.REG.CTL.1S .EQ %00000000 +SSC.REG.CTL.2S .EQ %10000000 +SSC.REG.CTL.8D .EQ %00000000 +SSC.REG.CTL.7D .EQ %00100000 +SSC.REG.CTL.6D .EQ %01000000 +SSC.REG.CTL.5D .EQ %01100000 +SSC.REG.CTL.CEXT .EQ %00000000 +SSC.REG.CTL.CINT .EQ %00010000 +SSC.REG.CTL.B16EXT .EQ %00000000 +SSC.REG.CTL.B50 .EQ %00000001 +SSC.REG.CTL.B75 .EQ %00000010 +SSC.REG.CTL.B110 .EQ %00000011 +SSC.REG.CTL.B135 .EQ %00000100 +SSC.REG.CTL.B150 .EQ %00000101 +SSC.REG.CTL.B300 .EQ %00000110 +SSC.REG.CTL.B600 .EQ %00000111 +SSC.REG.CTL.B1200 .EQ %00001000 +SSC.REG.CTL.B1800 .EQ %00001001 +SSC.REG.CTL.B2400 .EQ %00001010 +SSC.REG.CTL.B3600 .EQ %00001011 +SSC.REG.CTL.B4800 .EQ %00001100 +SSC.REG.CTL.B7200 .EQ %00001101 +SSC.REG.CTL.B9600 .EQ %00001110 +SSC.REG.CTL.B19200 .EQ %00001111 +*-------------------------------------- +* 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 +L.MSG.DETECT.OK .DA MSG.DETECT.OK +L.MSG.DETECT.KO .DA MSG.DETECT.KO +L.DEV.HEADER.NAME .DA DEV.HEADER.NAME + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect sta hArgs + >LDYA L.MSG.DETECT + >SYSCALL SYS.PSTROutYA + + stz ZPTmpPtr1 + lda #$C1 + sta ZPTmpPtr1+1 + +.1 ldx #DEVSIG.Length-1 + +.2 ldy DEVSIG.Offset,x + lda (ZPTmpPtr1),y + cmp DEVSIG.Value,x + bne .3 + dex + bpl .2 + bra .4 + +.3 inc ZPTmpPtr1+1 no match, try next slot.... + lda ZPTmpPtr1+1 + cmp #$C8 + bne .1 + + >LDYA L.MSG.DETECT.KO + >SYSCALL SYS.PSTROutYA + + lda #DEVMGR.ERRNOHW Not Found in any slot, exiting + sec + rts + +.4 lda ZPTmpPtr1+1 +* sta DEVSLOTCn + and #$0F + sta DEVSLOT0n + ora #$30 + sta DEV.HEADER.NAME+4 + asl + asl + asl + asl + sta DEVSLOTn0 + + >LDYA L.MSG.DETECT.OK + >SYSCALL SYS.PSTROutYA + >LDYA L.DEV.HEADER.NAME + >SYSCALL SYS.PSTROutYA + lda #13 + >SYSCALL SYS.COutA + + clc + rts +*-------------------------------------- +CS.END +DEVSIG.Offset .HS 05070B0C +DEVSIG.Value .HS 38180131 +DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset +MSG.DETECT >PSTRING "Apple SSC (Super Serial Card,//c Serial Port) Driver (IRQ Enabled).\n" +MSG.DETECT.OK >PSTRING "SSC Installed As Device : " +MSG.DETECT.KO >PSTRING "No SSC Found.\n" +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 ldx DEVSLOTn0 + + stz SSC.REG.RESET,x + lda #SSC.REG.CTL.CINT+SSC.REG.CTL.B9600 + sta SSC.REG.CTL,x + + stz INBUF.PTR + stz INBUF.CNT + stz OUTBUF.PTR + stz OUTBUF.CNT + stz IDX + + php + sei + lda #SSC.REG.CMD.TEIRQ+SSC.REG.CMD.DTR + sta SSC.REG.CMD,x + + lda SSC.REG.STATUS,x clear any IRQ pending + lda SSC.REG.DATA,x discard any garbage byte + + plp + + clc + rts +*-------------------------------------- +GETEVENT php + sei + lda INBUF.CNT + beq .9 + + ldx INBUF.PTR + lda INBUF,x + + ldy #S.EVT.DATA + sta (pEvent),y + + iny + lda #0 + sta (pEvent),y + + lda #S.EVT.F.KEY + sta (pEvent) + + inx + cpx #BUF.SIZE + bne .1 + ldx #0 + +.1 stx INBUF.PTR + dec INBUF.CNT + + plp + clc + rts + +.9 plp + lda #0 + sec + rts +*-------------------------------------- +COUT php + sei +* tay save char in Y + + ldx DEVSLOTn0 +* lda SSC.REG.STATUS,x + bit #SSC.REG.STATUS.DCD+SSC.REG.STATUS.DSR +* beq .9 + +* ldx OUTBUF.CNT Buffer Empty? +* bne .10 + +* bit #SSC.REG.STATUS.TDRE Register Empty ? +* beq .10 not empty, queue char + +* tya yes, write directly to ACIA + ldx DEVSLOTn0 + sta SSC.REG.DATA,x + + plp + clc + rts + +.10 cpx #BUF.SIZE + beq .9 Buffer Full!! + + ldx OUTBUF.PTR + tya + sta OUTBUF,x + + inx + cpx #BUF.SIZE + bne .1 + ldx #0 + +.1 stx OUTBUF.PTR + inc OUTBUF.CNT + + plp + clc + rts + +.9 plp + sec + rts +*-------------------------------------- +CLOSE php + sei + ldx DEVSLOTn0 + stz SSC.REG.RESET,x + plp + clc + rts +*-------------------------------------- +GETINFO >LDYA L.DEVINFO + clc + rts +*-------------------------------------- +* IRQ Handler +* on exit, CC if handled +*-------------------------------------- +IRQ ldx DEVSLOTn0 + lda SSC.REG.STATUS,x IRQ from this device ? +* bpl .9 no, exit + + pha save status ... + and #SSC.REG.STATUS.RDRF incoming char? + beq .1 + + ldy SSC.REG.DATA,x read data to clear IRQ + + phx + ldx IDX + tya + cmp #$20 + bcc .10 + ora #$80 +.10 sta $402,x + inx + txa + and #$1F + sta IDX + plx + + lda INBUF.CNT + cmp #BUF.SIZE + beq .1 buffer full, discard + + phy + clc + adc INBUF.PTR + and #BUF.MASK + tay + pla get back data + sta INBUF,y + inc INBUF.CNT + +.1 pla get back status + and #SSC.REG.STATUS.TDRE + beq .8 + + lda OUTBUF.CNT something to transmit ? + beq .8 no, exit + + clc + adc OUTBUF.PTR + and #BUF.MASK + tay + + lda OUTBUF,Y + sta SSC.REG.DATA,x + + ora #$80 + sta $401 + + dec INBUF.CNT + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +DRV.CS.END +IDX .BS 1 +DEVSLOT0n .BS 1 +*DEVSLOTCn .BS 1 +DEVSLOTn0 .BS 1 +INBUF.PTR .BS 1 +INBUF.CNT .BS 1 +OUTBUF.PTR .BS 1 +OUTBUF.CNT .BS 1 +INBUF .BS BUF.SIZE +OUTBUF .BS BUF.SIZE +DEVINFO .DA #S.DEVINFO.TYPE.CHAR + .DA #0 +*-------------------------------------- +MAN +SAVE DRV/SSC.DRV.I.S +ASM diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index fae6739c..6ba6d94b 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -17,7 +17,8 @@ AUTO 6 :1 bit $C000 bpl :1 sta $C010 -:2 .EM +:2 .EQ * + .EM *-------------------------------------- * SYSCALLs Macros *-------------------------------------- diff --git a/LIB/LIBSTR.S.txt b/LIB/LIBSTR.S.txt index 1b31d86f..6ee76a4a 100644 --- a/LIB/LIBSTR.S.txt +++ b/LIB/LIBSTR.S.txt @@ -182,7 +182,7 @@ PRINTFB ldx #8 >PULLA .1 asl pha - lda #$B0 + lda #'0' bcc .2 inc .2 jsr COUT @@ -351,9 +351,9 @@ UCASEP phx beq .9 .1 iny lda (ZPTmpPtr2),y - cmp #$61 "a" + cmp #'a' bmi .2 - cmp #$7B "z"+1 + cmp #'z'+1 bpl .2 sec sbc #$20 @@ -371,9 +371,9 @@ LCASEP phx beq .9 .1 iny lda (ZPTmpPtr2),y - cmp #$41 "A" + cmp #'A' bmi .2 - cmp #$5B "Z"+1 + cmp #'Z'+1 bpl .2 clc adc #$20 @@ -628,7 +628,7 @@ HEX2DEC phx .4 lda BCDBUF,y pha and #$0F - ora #$B0 + ora #$30 sta ASCBUF,x dex pla @@ -636,7 +636,7 @@ HEX2DEC phx lsr lsr lsr - ora #$B0 + ora #$30 sta ASCBUF,x iny dex @@ -648,10 +648,10 @@ HEX2DEC phx sbc PADLEN .5 tax x=0 if no padlen, or x=10-padlen .6 lda ASCBUF,x - cmp #$B0 a zero? + cmp #'0' a zero? beq .7 inc PADLEN found a non zero, print all digits, even if 0, next time - ldy #"0" + ldy #'0' sty PADCHAR bra .8 .7 cpx #9 last digit ? @@ -737,15 +737,15 @@ PRBYTE pha lsr lsr lsr - ora #$B0 - cmp #$BA + ora #$30 + cmp #'9'+1 bcc .1 adc #6 .1 jsr COUT pla PRHEX and #$0F - ora #$B0 - cmp #$BA + ora #$30 + cmp #'9'+1 bcc COUT adc #6 bra COUT @@ -754,11 +754,18 @@ CROUT lda #13 *-------------------------------------- COUT phx phy + cmp #13 + bne .1 ldx #DEVMGR.COUT + jsr pDevJmp + bcs .9 + lda #10 + +.1 ldx #DEVMGR.COUT jsr pDevJmp ply plx - rts +.9 rts *-------------------------------------- CS.END PRINTFTBL1 .AS "abBdDLnNhHiIsStT" diff --git a/SBIN/LOGIN.S.txt b/SBIN/LOGIN.S.txt index 54d47de9..7cd65cdc 100644 --- a/SBIN/LOGIN.S.txt +++ b/SBIN/LOGIN.S.txt @@ -184,13 +184,8 @@ INPUT.CHARIN tax saver char... *-------------------------------------- INPUT.LINEIN ldy #INPUT.STATUS lda (pData),y - asl CS is a line is in the buffer + asl CS if a line is in the buffer rts - ldy #INPUT.BUFFER - lda (pData),y get Line Length - bne .9 if 0, empty line - clc -.9 rts *-------------------------------------- CS.END MSG.LOGIN >PSTRING "login:" diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index 179967a6..57091cb0 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -102,7 +102,8 @@ CS.RUN lda #0 bne .2 jsr PrintPrompt - + bcs .99 + .1 >SYSCALL SYS.Sleep lda (pData) bpl .1 @@ -311,11 +312,12 @@ CS.QUIT jsr History.Quit *-------------------------------------- * PRIVATE *-------------------------------------- -PrintPrompt lda #"$" +PrintPrompt lda #'$' >SYSCALL SYS.COutA - lda #" " + bcs .9 + lda #' ' >SYSCALL SYS.COutA - rts +.9 rts *-------------------------------------- PrintError pha >PUSHA diff --git a/SYS/KERNEL.S.CIO.txt b/SYS/KERNEL.S.CIO.txt index 5935af1f..1000d1d9 100644 --- a/SYS/KERNEL.S.CIO.txt +++ b/SYS/KERNEL.S.CIO.txt @@ -96,7 +96,13 @@ S.HexOutA pha *-------------------------------------- S.COutA phx phy + cmp #13 + bne .1 ldx #DEVMGR.COUT + jsr pDevJmp + bcs S.COutA.RTS + lda #10 +.1 ldx #DEVMGR.COUT jsr pDevJmp ply plx diff --git a/SYS/KERNEL.S.DRV.txt b/SYS/KERNEL.S.DRV.txt index b742fdcd..09cc27cd 100644 --- a/SYS/KERNEL.S.DRV.txt +++ b/SYS/KERNEL.S.DRV.txt @@ -219,10 +219,13 @@ S.InsDrv.Move ldy #H.BIN.DEV.HEADER.O lda DevMgr.LastDevID jsr S.GetDevByIDA >STYA pDev - - ldy #S.DEV.SIZE-1 Copy DRV.Header -.1 lda (ZPQuickPtr1),y + ldy #S.DEV.SIZE Make sure DevMgr.Table Ends with 0 + lda #0 + sta (pDev),y + dey + +.1 lda (ZPQuickPtr1),y Copy DRV.Header sta (pDev),y dey bpl .1 diff --git a/SYS/KERNEL.S.IRQ.txt b/SYS/KERNEL.S.IRQ.txt new file mode 100644 index 00000000..997bf2e8 --- /dev/null +++ b/SYS/KERNEL.S.IRQ.txt @@ -0,0 +1,116 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* Setup MainLC ($3FE) +* +* +* Setup AuxLC $FFFE->Kernel IRQ Handler +* if irq not handled, jmp (S.IrqMgrOldFFFE) +*-------------------------------------- +S.IrqMgrInit >LDYA $FFFE + cpy #S.IrqHandlerAuxLC + bne .1 + cmp /S.IrqHandlerAuxLC + beq .8 + +.1 php + sei + >STYA S.IrqMgrOldFFFE + >LDYAI S.IrqHandlerAuxLC + >STYA $FFFE + plp + + +.8 clc +.9 rts +*-------------------------------------- +S.IrqMgrQuit php + sei + >LDYA S.IrqMgrOldFFFE + >STYA $FFFE + plp + cli +.8 rts +*-------------------------------------- + +*-------------------------------------- +* called directly by IRQ Vector $FFFE in AuxLC +* Must keep: +* A,X,Y +* SETREADAUX +* if we are here, Aux ZP/Stack already On +* Exit with RTI +* if A2osX Drivers cannot clear IRQ, +* must call regular System Handler +*-------------------------------------- +S.IrqHandlerAuxLC + sta S.IrqMgr.A + pla + pha + and #$10 BRK? + beq .10 + lda S.IrqMgr.A +.82 jmp (S.IrqMgrOldFFFE) + +.10 stx S.IrqMgr.X + sty S.IrqMgr.Y + lda $fe + pha + lda $ff + pha + lda RDREADAUX + pha + sta CLRREADAUX Make sure we can access DevMgr.Table + + >LDYAI DevMgr.Table + >STYA $fe + +.1 lda ($fe) End Of Table ? + sec + beq .8 + + ldy #S.DEV.F + lda ($fe),y + and #S.DEV.F.IRQ + beq .2 + + jsr S.IrqHandlerJMP + bcc .8 CC, IRQ cleared by device + +.2 lda $fe CS, + adc #S.DEV.SIZE-1 + sta $fe + bcc .1 + inc $ff + bra .1 + +.8 pla Must keep Carry + bpl .81 + sta SETREADAUX +.81 pla + sta $ff + pla + sta $fe + ldy S.IrqMgr.Y + ldx S.IrqMgr.X + lda S.IrqMgr.A + bcs .82 + rti + +S.IrqHandlerJMP ldx #DEVMGR.IRQ + jmp ($fe) +*-------------------------------------- +S.IrqMgrOldFFFE .BS 2 +S.IrqMgr.A .BS 1 +S.IrqMgr.X .BS 1 +S.IrqMgr.Y .BS 1 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.IRQ +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.MLI.txt b/SYS/KERNEL.S.MLI.txt index 11986cb5..d63adcdd 100644 --- a/SYS/KERNEL.S.MLI.txt +++ b/SYS/KERNEL.S.MLI.txt @@ -202,10 +202,11 @@ S.MLIGetBuf clc S.MLIGetTime >MLICALL MLIGETTIME rts *-------------------------------------- -S.MLIAllocIRQ >PULLB MLICALL.PARAMS+1 - >PULLW MLICALL.PARAMS+2 +S.MLIAllocIRQ >PULLW MLICALL.PARAMS+2 >MLICALL MLIALLOCIRQ - rts + bcs .9 + lda MLICALL.PARAMS+1 +.9 rts *-------------------------------------- S.MLIDeallocIRQA sta MLICALL.PARAMS+1 diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 5eb94771..e21f22f6 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -190,6 +190,8 @@ Kernel.Init sei stz A2osX.SCREENS stz A2osX.ASCREEN + jsr S.IrqMgrInit + bcs * jsr S.MemMgrInit bcs * jsr S.DevMgrInit @@ -370,6 +372,7 @@ ENV.LIB.VALUE >PSTRING "${A2OSX}LIB/" ENV.DRV >PSTRING "DRV" ENV.DRV.VALUE >PSTRING "${A2OSX}DRV/" *-------------------------------------- + .INB SYS/KERNEL.S.IRQ .INB SYS/KERNEL.S.MEM .INB SYS/KERNEL.S.STR .INB SYS/KERNEL.S.CIO