diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index a88e4309..ae03c550 100644 Binary files a/A2OSX.BOOT.DSK and b/A2OSX.BOOT.DSK differ diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 31db6aa4..8d4cb318 100644 Binary files a/A2OSX.SRC.po and b/A2OSX.SRC.po differ diff --git a/A2osX.S.GP.txt b/A2osX.S.GP.txt index ff5bb2b2..9f2975b2 100644 --- a/A2osX.S.GP.txt +++ b/A2osX.S.GP.txt @@ -41,6 +41,9 @@ A2osX.GP.Start jmp (KERNEL.SYSCALL,x) jmp (pLib) pLibJmp .BS $BE20-* *-------------------------------------- +GO.Reset jsr GO.AUXLC + jmp KERNEL.COLDBOOT +*-------------------------------------- A2osX.LIBCALL1 pha phx tya @@ -76,6 +79,7 @@ GO.MAINLC php GO.AUXLC php sec + sei sta A2osX.SaveA pla keep P in A for later @@ -92,7 +96,6 @@ GO.AUXLC php ldx RRAMWRAMBNK1 ldx RRAMWRAMBNK1 - sei ldy pStack bcs GO.AUXLC1 @@ -117,12 +120,15 @@ GO.EXIT sty pStack plp GO.EXIT.JMP jmp $FFFF *-------------------------------------- -GO.Reset jsr GO.AUXLC - jmp KERNEL.COLDBOOT -*-------------------------------------- A2osX.SaveA .BS 1 A2osX.SaveX .BS 1 A2osX.SaveY .BS 1 +*-------------------------------------- + +*-------------------------------------- +IrqHandler + + *-------------------------------------- A2osX.GP.End .EQ * *-------------------------------------- @@ -132,7 +138,6 @@ A2osX.GP.End .EQ * ERROR:GP too big .FIN *-------------------------------------- -A2osX.GP.SIZE .EQ A2osX.GP.END-A2osX.GP.START .BS A2osX.GP.START+$100-* .EP *-------------------------------------- diff --git a/A2osX.S.QC.txt b/A2osX.S.QC.txt index f0239d73..22ef17af 100644 --- a/A2osX.S.QC.txt +++ b/A2osX.S.QC.txt @@ -65,7 +65,7 @@ A2osX.QC.Start1 sei >LDAXI 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