PR#3 PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- * K.LoadLib.YA * in : * Y,A = PTR To "LibName.o" C-String * out : * A = hMem To loaded LIB *-------------------------------------- K.LoadLib.YA jsr BIN.FindLIB bcs .9 jsr BIN.Load.YA Y,A=filename full path bcs .9 stx .8+1 >STYA .1+1 txa Pass hLib to LibLoad ldx #LIBMGR.LOAD .1 jsr $ffff Self Modified, Call LIB.LOAD function bcs .99 .8 lda #$ff hLib clc .9 rts .99 pha lda .8+1 jsr K.FreeMem.A pla sec rts *-------------------------------------- * K.UnloadLib.A * in : * A = hMem To Lib * out : *-------------------------------------- K.UnloadLib.A pha jsr K.GetMemByID.A >STYA ZPPtr1 ldy #S.MEM.REFCNT lda (ZPPtr1),y Get count of those referencing this lib dec only one left ? beq .1 sta (ZPPtr1),y pla clc rts .1 ldy #S.MEM.PTR lda (ZPPtr1),y sta .2+1 iny lda (ZPPtr1),y sta .2+2 ldx #LIBMGR.UNLOAD .2 jsr $ffff Self Modified, Call LIB.UNLOAD function pla jmp K.FreeMem.A *-------------------------------------- * K.LoadDrv.YA * in : * Y,A = PTR to "NAME.DRV [PARAM]" C-String * out : * none *-------------------------------------- K.LoadDrv.YA jsr BIN.FindDRV bcs .9 jsr BIN.Load.YA Y,A =filename full path bcs .9 >STYA pDrv stx .97+1 >LDYA BIN.CmdLine >STYA ZPPtr1 .1 lda (ZPPtr1) Advance to ARG[1] pha inc ZPPtr1 bne .2 inc ZPPtr1+1 .2 pla bne .1 >LDYA ZPPtr1 jsr pDrvJmp call Dev.Detect bcs .96 jsr BIN.InstallDRV bcs .96 jsr .96 Cleanup... lda #0 Make sure RC = 0 if success clc .9 rts .96 pha .97 lda #$ff jsr K.FreeMem.A pla rts */-------------------------------------- * # FileSearch * Search a file in the provided PATH list * And return, if found, the full path to it. * ## In: * PUSHW = Ptr to Search Path (CSTR) %LIB%;/SYS/SLIB * PUSHW = Ptr to File Name (CSTR) * PUSHW = Ptr to DstBuf * PUSHW = Ptr to DstStat * ## Out: * CC : success * DstBuf = FilePath * DstStat = S.STAT * CS : not found *\-------------------------------------- K.FileSearch >PULLW .4+1 DstStat >PULLW .2+1 DstBuf jsr K.FileSearch.I bcs .9 ldx #$ff .1 inx lda K.Buf256,x .2 sta $ffff,x Self Modified bne .1 ldx #S.STAT-1 .3 lda K.S.STAT,x .4 sta $ffff,x Self Modified dex bpl .3 .9 rts K.FileSearch.I >PULLW .4+1 Filename >PULLYA Get Search list jsr K.ExpandStr.YA Expand it bcs .99 stx .98+1 >STYA .2+1 expanded search list ; stz .1+1 .1 ldy #$ff Self Modified Index in Search list string ldx #$0 .2 lda $ffff,y Self Modified, Search list string beq .3 end of string, try it.... iny cmp #';' beq .3 sta K.Buf256,x inx bra .2 .3 txa beq .98 String is empty....nothing to try sty .1+1 save current index ldy #$0 .4 lda $ffff,y Self Modified, Append Fiename... sta K.Buf256,x beq .5 iny inx bra .4 .5 stz K.Buf256+1,x set string ending 0 >PUSHWI K.S.STAT >PUSHWI K.Buf256 >SYSCALL STAT -> BNK1 bcs .1 Failed...retry next path... jsr .98 Discard Expanded hSrch list clc rts .98 lda #$ff SELF MODIFIED : Discard Expanded hSrch list jsr K.FreeMem.A lda #MLI.ERR.FNOTFND sec .99 rts *-------------------------------------- BIN.FindLIB clc .HS B0 bcs BIN.FindDRV sec >STYA BIN.CmdLine >LDYAI BIN.Find.ENV.LIB bcc .1 >LDYAI BIN.Find.ENV.DRV .1 jsr K.GetEnv.YA get value for Search Path bcs .9 >PUSHYA >PUSHW BIN.CmdLine jsr K.FileSearch.I find LIB/DRV in Search bcs .9 >LDYAI K.Buf256 .9 rts *-------------------------------------- BIN.Find.ENV.DRV >CSTR "DRV" BIN.Find.ENV.LIB >CSTR "LIB" *-------------------------------------- * BIN.Load.YA * in : * A = hMem of FilePath (PSTR) * out : * Y,A = MEMPTR * X = hMem of Code Segment *-------------------------------------- BIN.Load.YA >STYA BIN.CmdLine jsr MEM.GetMemByNameYA bcs BIN.Load.YA.1 not already loaded >STYA ZPPtr1 Save base address ldy #S.MEM.REFCNT lda (ZPPtr1),y inc sta (ZPPtr1),y txa jmp K.GetMemPtr.A X=hMem from K.GetMemByNameA *-------------------------------------- BIN.Load.YA.1 >PUSHWI K.S.STAT >PUSHW BIN.CmdLine >SYSCALL STAT BANK1!!! Look for AUXTYPE bcs .9 >LDYA K.S.STAT+S.STAT.P.AUXTYPE >STYA BIN.Relocate.Start >PUSHYA Push AUXTYPE >PUSHBI 6 S.FILEINFO.TYPE.BIN >PUSHBI SYS.FOpen.R >PUSHW BIN.CmdLine >SYSCALL LoadFile BANK1!!! .9 bcs .99 Error Loading file stx BIN.hMem save hMem pha YA=CODE+DATA size tya * clc CC from bcs .99 adc BIN.Relocate.Start Get AUXTYPE for actual Base Address sta BIN.Relocate.End compute Range End=AUXTYPE+FILELEN pla adc BIN.Relocate.Start+1 sta BIN.Relocate.End+1 txa jsr K.GetMemPtr.A >STYA ZPPtr1 set ZPPtr1 -> Code start pha YA = actual load address tya sec sbc BIN.Relocate.Start sta BIN.Relocate.Offset Offset=ZPPtr1-AUXTYPE pla sbc BIN.Relocate.Start+1 sta BIN.Relocate.Offset+1 ldy #H.BIN.CODE.LEN get Code Len lda (ZPPtr1),y clc adc ZPPtr1 sta ZPPtr2 Make ZPPtr2 = ZPPtr1 + CodeLen iny lda (ZPPtr1),y adc ZPPtr1+1 sta ZPPtr2+1 jsr BIN.RelocateEXE >LDYA BIN.CmdLine get back bin path jsr K.NewStr.YA make a copy of this string bcs .98 lda BIN.hMem Keep X=hMem jsr K.GetMemByID.A X unmodified >STYA ZPPtr1 lda (ZPPtr1) ora #S.MEM.F.CODE This is a code segment sta (ZPPtr1) txa Get Back hMem ldy #S.MEM.BIN sta (ZPPtr1),y lda BIN.hMem tax return hMEM to Caller... jsr K.GetMemPtr.A clc ...and Y,A=PTR to CS rts .98 pha lda BIN.hMem jsr K.FreeMem.A Discard Loaded Code pla sec .99 rts *-------------------------------------- BIN.CmdLine .BS 2 BIN.hMem .BS 1 *-------------------------------------- * BIN.InstallDRV * In: * pDrv = .DRV File Loaded Address * Note: * BIN.Load.YA called from K.LoadDrvYA * Already setup correctly pDrv, * BIN.Relocate.Start,End *-------------------------------------- BIN.InstallDRV ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc adc BIN.Relocate.Start Advance start From AUXTYPE to AUXTYPE+DRV code offset sta BIN.Relocate.Start iny lda (pDrv),y adc BIN.Relocate.Start+1 sta BIN.Relocate.Start+1 lda DevMgr.Free Offset = Target DRV address-(AUXTYPE+DRV OFFSET) sec sbc BIN.Relocate.Start sta BIN.Relocate.Offset lda DevMgr.Free+1 sbc BIN.Relocate.Start+1 sta BIN.Relocate.Offset+1 lda BIN.Relocate.End Compute DRVLen=End-start sec sbc BIN.Relocate.Start sta BIN.InstallDRV.DRVLen lda BIN.Relocate.End+1 sbc BIN.Relocate.Start+1 sta BIN.InstallDRV.DRVLen+1 lda DevMgr.Free clc adc BIN.InstallDRV.DRVLen sta BIN.InstallDRV.DRVEnd tay Save DRVEnd LO lda DevMgr.Free+1 adc BIN.InstallDRV.DRVLen+1 A = DRVEnd HI sta BIN.InstallDRV.DRVEnd+1 bcs .9 we crossed $FFFF, out of mem cpy #DevMgr.HiMem sbc /DevMgr.HiMem bcs .9 No More Room to load Driver.... lda DevMgr.Count cmp #K.DEV.MAX bne .10 No Device Handle Left lda #MEMMGR.ERROOH sec rts .9 lda #MEMMGR.ERROOM sec rts .10 inc DevMgr.Count >SYSCALL GetDevByID.A >STYA ZPPtr2 setup Ptr2 to dest HEADER ldy #H.BIN.DRV.HEADER.O lda (pDrv),y clc adc pDrv sta ZPPtr1 iny lda (pDrv),y adc pDrv+1 sta ZPPtr1+1 set Ptr1 to Src HEADER ldy #S.DEV-1 .1 lda (ZPPtr1),y copy header to DevMgr.Table sta (ZPPtr2),y dey bpl .1 ldy #S.DEV.DRV.JMP+1 Setup Main JMP lda DevMgr.Free+1 sta (ZPPtr2),y tax dey lda DevMgr.Free sta (ZPPtr2),y sta ZPPtr2 set Ptr2 to Dest CODE stx ZPPtr2+1 ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc adc pDrv sta ZPPtr1 iny lda (pDrv),y adc pDrv+1 sta ZPPtr1+1 set Ptr1 to Src CODE lda BIN.InstallDRV.DrvLen+1 eor #$ff pha lda BIN.InstallDRV.DrvLen eor #$ff tax ldy #0 .2 inx Move CODE in LC bne .3 pla inc beq .4 pha .3 lda (ZPPtr1),y sta (ZPPtr2),y iny bne .2 inc ZPPtr1+1 inc ZPPtr2+1 bra .2 .4 ldy #H.BIN.DRV.CODE.LEN lda DevMgr.Free Make Ptr1 = code start sta ZPPtr1 clc adc (pDrv),y sta ZPPtr2 iny lda DevMgr.Free+1 sta ZPPtr1+1 adc (pDrv),y sta ZPPtr2+1 Make ZPPtr2 = ZPPtr1 + CodeLen jsr BIN.RelocateDRV >LDYA BIN.InstallDRV.DrvEnd >STYA DevMgr.Free clc rts *-------------------------------------- BIN.InstallDRV.DrvLen .BS 2 BIN.InstallDRV.DrvEnd .BS 2 *-------------------------------------- * BIN.Relocate___ : * In : * ZPPtr1 = Ptr to Code * ZPPtr2 = End Of Code *-------------------------------------- BIN.Relocate.Start .BS 2 BIN.Relocate.End .BS 2 BIN.Relocate.Offset .BS 2 *-------------------------------------- BIN.RelocateEXE ldy #H.BIN.HEADER+1 lda (ZPPtr1),y cmp /H.BIN.HEADER.BIN65 beq .1 cmp /H.BIN.HEADER.DRV65 beq .1 lda #SYSMGR.ERRIBIN sec rts .1 ldy #H.BIN.JMP relocate Main JMP lda (ZPPtr1),y clc adc BIN.Relocate.Offset sta (ZPPtr1),y iny lda (ZPPtr1),y adc BIN.Relocate.Offset+1 sta (ZPPtr1),y ldy #H.BIN.EXE.REL.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) .HS 2C bit abs *-------------------------------------- BIN.RelocateDRV ldy #H.BIN.DRV.REL.TABLE .1 lda (ZPPtr1),y Start Relocate JMP table tax LO in X iny ora (ZPPtr1),y ORA with HI beq .2 $0000 = end of table dey txa get back LO clc adc BIN.Relocate.Offset sta (ZPPtr1),y iny lda (ZPPtr1),y adc BIN.Relocate.Offset+1 sta (ZPPtr1),y iny bra .1 *-------------------------------------- .2 tya add current offset in Y to Ptr sec + 1 to skip last 00 from beq .2 adc ZPPtr1 sta ZPPtr1 bcc .3 inc ZPPtr1+1 ZPPtr1=Current Code PTR .3 lda (ZPPtr1) get OPCODE lsr /2 tax lda BIN.OPCODES,x get OPCODE definition bcs .4 go get LO nibble lsr lsr move HI -> LO lsr lsr .4 and #$0f bit #$8 abs addressing? beq .6 no.... and #7 save Opcode length... pha ldy #1 lda (ZPPtr1),y Get LO tax save LO in X iny make Y point to HI cpx BIN.Relocate.Start lda (ZPPtr1),y Get HI sbc BIN.Relocate.Start+1 bcc .5 addr < BIN.Relocate.Start, out of range txa Get back LO cpx BIN.Relocate.End lda (ZPPtr1),y Get HI sbc BIN.Relocate.End+1 bcs .5 addr > BIN.Relocate.End, out of range txa Get back LO * clc CC from bcs .6 adc BIN.Relocate.Offset add Offset to abs address dey sta (ZPPtr1),y store relocated addr LO iny lda (ZPPtr1),y Get HI adc BIN.Relocate.Offset+1 sta (ZPPtr1),y store relocated addr HI .5 pla get back Opcode length... .6 clc A = OPCODE length adc ZPPtr1 sta ZPPtr1 bcc .7 inc ZPPtr1+1 .7 eor ZPPtr2 A = ZPPtr1 bne .3 lda ZPPtr1+1 eor ZPPtr2+1 bne .3 next opcode.... .8 rts *-------------------------------------- * 65C02 OPCODES * Bit 3 : 1 = absolute addressing * Bit 2-1-0 : opcode + @ length *-------------------------------------- * 0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F BIN.OPCODES .HS 1.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 .HS B.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 .HS 1.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.1.B.B.3 .HS 1.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.1.B.B.3 .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 .HS 2.2.2.1.2.2.2.2.1.B.1.1.1.B.B.3 *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.BIN LOAD /A2OSX.SRC/SYS/KERNEL.S ASM