NEW PREFIX /A2OSX.BUILD AUTO 4,1 *-------------------------------------- * K.LoadLib * in : * Y,A = PTR To "LibName.o" C-String * out : * A = hMem To loaded LIB *-------------------------------------- K.LoadLib jsr BIN.FindLIB.YA bcs .9 jsr BIN.Load.YA Y,A = "/PATH/BIN" 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 * in : * A = hMem To Lib * out : *-------------------------------------- K.UnloadLib 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 * in : * Y,A = PTR to "NAME.DRV [PARAM]" C-String * out : * none *-------------------------------------- K.LoadDrv >STYA .2+1 Save "BIN\0ARGS\0\0" jsr BIN.FindDRV.YA bcs .9 jsr BIN.Load.YA Y,A = "/PATH/BIN" bcs .9 >STYA pDrv stx .97+1 ldx #$ff .1 inx Skip "BIN" .2 lda $ffff,x bne .1 txa sec adc .2+1 tay lda #0 adc .2+2 jsr .88 call Dev.Detect bcs .96 jsr BIN.InsDrv 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 sec rts .88 jmp (pDrv) *-------------------------------------- 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 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 clc .9 rts */-------------------------------------- * # FileSearch * Search a file in the provided PATH list * And return, if found, the full path to it. * ## C * `int filesearch ( char * filename, char * searchpath, char * fullpath, stat * filestat);` * ## ASM * **In:** * `>PUSHWI filestat` * `>PUSHWI fullpath` * `>PUSHWI searchpath` * `>LDYAI filename` * **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 #$0 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 Filename... sta K.Buf256,x beq .5 iny inx bra .4 .5 >PUSHWI K.S.STAT >PUSHWI K.Buf256 >SYSCALL STAT -> BNK1 bcs .1 Failed...retry next path... lda K.S.STAT+S.STAT.P.TYPE cmp #S.FI.T.DIR Dir ? beq .1 jsr .98 Discard Expanded hSrch list clc .99 rts .98 lda #$ff SELF MODIFIED : Discard Expanded hSrch list jsr K.FreeMem.A lda #MLI.E.FNOTFND sec rts *-------------------------------------- BIN.Find.ENV.DRV .AZ "DRV" BIN.Find.ENV.LIB .AZ "LIB" *-------------------------------------- * BIN.Load.YA * in : * Y,A = /BIN/PATH (CSTR) * out : * Y,A = MEMPTR * X = hMem of Code Segment *-------------------------------------- BIN.Load.YA >STYA BIN.CmdLine >STYA .2+1 ldx Mem.LastSlot beq BIN.Load.YA.1 >LDYAI Mem.Table >STYA ZPPtr1 ldx #0 .1 lda (ZPPtr1) bpl .6 In Use? ldy #S.MEM.BIN any BIN PATH in this slot? lda (ZPPtr1),y beq .6 jsr K.GetMemPtr.A get pathname >STYA .3+1 ldy #0 .2 lda $ffff,y SELF MODIFIED .3 cmp $ffff,y SELF MODIFIED bne .6 iny ora #0 bne .2 ldy #S.MEM.REFCNT lda (ZPPtr1),y inc sta (ZPPtr1),y txa jmp K.GetMemPtr.A X=hMem from K.GetMemByNameA .6 lda ZPPtr1 clc adc #S.MEM sta ZPPtr1 bcc .7 inc ZPPtr1+1 .7 inx cpx Mem.LastSlot bne .1 *-------------------------------------- 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.R.Start >PUSHYA Push AUXTYPE >PUSHBI 6 S.FI.T.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.R.Start Get AUXTYPE for actual Base Address sta BIN.R.End compute Range End=AUXTYPE+FILELEN pla adc BIN.R.Start+1 sta BIN.R.End+1 txa jsr K.GetMemPtr.A >STYA ZPPtr1 set ZPPtr1 -> Code start pha YA = actual load address tya sec sbc BIN.R.Start sta BIN.R.Offset Offset=ZPPtr1-AUXTYPE pla sbc BIN.R.Start+1 sta BIN.R.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.RelExe >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... jmp K.GetMemPtr.A ...and Y,A=PTR to CS .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.InsDrv * In: * pDrv = .DRV File Loaded Address * Note: * BIN.Load.YA called from K.LoadDrvYA * Already setup correctly pDrv, * BIN.R.Start,End *-------------------------------------- BIN.InsDrv ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc adc BIN.R.Start Advance start From AUXTYPE to AUXTYPE+DRV code offset sta BIN.R.Start iny lda (pDrv),y adc BIN.R.Start+1 sta BIN.R.Start+1 lda DevMgr.Free Offset = Target DRV address-(AUXTYPE+DRV OFFSET) sec sbc BIN.R.Start sta BIN.R.Offset lda DevMgr.Free+1 sbc BIN.R.Start+1 sta BIN.R.Offset+1 lda BIN.R.End Compute DRVLen=End-start sec sbc BIN.R.Start sta BIN.InsDrv.Len lda BIN.R.End+1 sbc BIN.R.Start+1 sta BIN.InsDrv.Len+1 lda DevMgr.Free clc adc BIN.InsDrv.Len sta BIN.InsDrv.End tay Save DRVEnd LO lda DevMgr.Free+1 adc BIN.InsDrv.Len+1 A = DRVEnd HI sta BIN.InsDrv.End+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 #K.E.OOH sec rts .9 lda #K.E.OOM 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 Dev.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.InsDrv.Len+1 eor #$ff pha lda BIN.InsDrv.Len 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.RelDrv >LDYA BIN.InsDrv.End >STYA DevMgr.Free clc rts *-------------------------------------- BIN.InsDrv.Len .BS 2 BIN.InsDrv.End .BS 2 *-------------------------------------- * BIN.Rel___ : * In : * ZPPtr1 = Ptr to Code * ZPPtr2 = End Of Code *-------------------------------------- BIN.R.Start .BS 2 BIN.R.End .BS 2 BIN.R.Offset .BS 2 *-------------------------------------- BIN.RelExe ldy #H.BIN.T+1 lda (ZPPtr1),y cmp /H.BIN.T.BIN65 beq .1 cmp /H.BIN.T.DRV65 beq .1 lda #K.E.IBIN sec rts .1 ldy #H.BIN.JMP relocate Main JMP lda (ZPPtr1),y clc adc BIN.R.Offset sta (ZPPtr1),y iny lda (ZPPtr1),y adc BIN.R.Offset+1 sta (ZPPtr1),y ldy #H.BIN.EXE.REL.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) .HS 2C bit abs *-------------------------------------- BIN.RelDrv 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.R.Offset sta (ZPPtr1),y iny lda (ZPPtr1),y adc BIN.R.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.R.Start lda (ZPPtr1),y Get HI sbc BIN.R.Start+1 bcc .5 addr < BIN.R.Start, out of range txa Get back LO cpx BIN.R.End lda (ZPPtr1),y Get HI sbc BIN.R.End+1 bcs .5 addr > BIN.R.End, out of range txa Get back LO * clc CC from bcs .6 adc BIN.R.Offset add Offset to abs address dey sta (ZPPtr1),y store relocated addr LO iny lda (ZPPtr1),y Get HI adc BIN.R.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