A2osX/SYS/KERNEL.S.BIN.txt

545 lines
10 KiB
Plaintext
Raw Normal View History

NEW
2018-11-17 17:17:13 +00:00
PREFIX
AUTO 4,1
2015-03-14 21:48:35 +00:00
*--------------------------------------
2018-07-20 05:43:11 +00:00
* LoadLib
* in :
* Y,A = PTR To "LibName.o" C-String
* out :
* A = hMem To loaded LIB
*--------------------------------------
2018-06-21 15:12:10 +00:00
K.LoadLib jsr BIN.FindLIB
bcs .9
2018-06-22 06:24:35 +00:00
jsr BIN.Load 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
2018-06-22 06:24:35 +00:00
jsr K.FreeMem
pla
sec
rts
*--------------------------------------
2018-07-20 05:43:11 +00:00
* UnloadLib
* in :
* A = hMem To Lib
* out :
*--------------------------------------
2018-06-18 06:22:50 +00:00
K.UnloadLib pha
2018-06-21 15:12:10 +00:00
jsr K.GetMemByID
>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
2018-06-22 06:24:35 +00:00
jmp K.FreeMem
2018-06-21 15:12:10 +00:00
*/--------------------------------------
* # LoadDrv
2018-07-20 05:43:11 +00:00
* ## ASM
2018-06-21 15:12:10 +00:00
* **In:**
* Y,A = PTR to "NAME.DRV [PARAM]" C-String
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-06-21 15:12:10 +00:00
* none
*\--------------------------------------
2018-06-18 06:22:50 +00:00
K.LoadDrv >STYA .2+1 Save "BIN\0ARGS\0\0"
2018-06-21 15:12:10 +00:00
jsr BIN.FindDRV
bcs .9
2018-06-22 06:24:35 +00:00
jsr BIN.Load Y,A = "/PATH/BIN"
bcs .9
2018-07-05 15:39:36 +00:00
>STYA .3+1
stx .97+1
ldx #$ff
.1 inx Skip "BIN"
.2 lda $ffff,x
bne .1
txa
sec
adc .2+1
tay
lda #0
2018-06-28 15:26:34 +00:00
adc .2+2 Y,A = ARGS
2018-07-05 15:39:36 +00:00
.3 jsr $ffff SELF MODIFIED, call Dev.Detect
bcs .96
jsr .96 Cleanup...
lda #0 Make sure RC = 0 if success
clc
.9 rts
.96 pha
.97 lda #$ff
2018-06-22 06:24:35 +00:00
jsr K.FreeMem
pla
sec
2018-07-05 15:39:36 +00:00
rts
*--------------------------------------
2018-06-18 06:22:50 +00:00
BIN.FindLIB clc
.HS B0 bcs
2018-06-18 06:22:50 +00:00
BIN.FindDRV sec
>STYA BIN.CmdLine
>LDYAI BIN.Find.ENV.LIB
bcc .1
>LDYAI BIN.Find.ENV.DRV
2018-06-18 06:22:50 +00:00
.1 jsr K.GetEnv get value for Search Path
bcs .9
2018-06-28 15:26:34 +00:00
>STYA K.FileSearch.SearchPath
>LDYA BIN.CmdLine
jsr K.FileSearch.YA find LIB/DRV in Search
bcs .9
>LDYAI K.Buf256
clc
.9 rts
*--------------------------------------
BIN.Find.ENV.DRV .AZ "DRV"
BIN.Find.ENV.LIB .AZ "LIB"
*--------------------------------------
2018-06-28 15:26:34 +00:00
* BIN.Load
2015-03-14 21:48:35 +00:00
* in :
* Y,A = /BIN/PATH (CSTR)
2015-03-14 21:48:35 +00:00
* out :
* Y,A = MEMPTR
* X = hMem of Code Segment
*--------------------------------------
2018-06-22 06:24:35 +00:00
BIN.Load >STYA BIN.CmdLine
>STYA .2+1
>LDYAI Mem.Table
>STYA ZPPtr1
2018-08-20 15:15:37 +00:00
ldx #0 we will skip Slot 0...
.1 cpx Mem.LastSlot
beq BIN.Load.1
inx
lda ZPPtr1
clc
adc #S.MEM
sta ZPPtr1
bcc .11
inc ZPPtr1+1
2018-08-20 15:15:37 +00:00
.11 lda (ZPPtr1)
bpl .1 In Use?
ldy #S.MEM.BIN any BIN PATH in this slot?
lda (ZPPtr1),y
2018-08-20 15:15:37 +00:00
beq .1
2018-08-20 15:15:37 +00:00
jsr K.GetMemPtr X unmodified, get pathname
>STYA .3+1
ldy #0
.2 lda $ffff,y SELF MODIFIED
.3 cmp $ffff,y SELF MODIFIED
2018-08-20 15:15:37 +00:00
bne .1
iny
ora #0
bne .2
2015-03-14 21:48:35 +00:00
ldy #S.MEM.REFCNT
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
2015-03-14 21:48:35 +00:00
inc
sta (ZPPtr1),y
2018-08-20 15:15:37 +00:00
ldy #S.MEM.PTR
lda (ZPPtr1),y
pha
iny
lda (ZPPtr1),y
ply
clc
2018-08-20 15:15:37 +00:00
rts X=hMem, Y,A=Ptr
*--------------------------------------
2018-11-22 16:39:41 +00:00
BIN.Load.1
* >PUSHWI K.S.STAT
* >LDYA BIN.CmdLine
* >SYSCALL STAT BANK1!!! Look for AUXTYPE
* bcs .9
* Already called by Filesearch in FindDRV, FindLIB
* Already called by PS.Load (TXT,BIN,SYS)
>LDYA K.S.STAT+S.STAT.P.AUXTYPE
2018-06-29 14:16:40 +00:00
>STYA BIN.R.CS.Start
2016-09-26 16:00:52 +00:00
>PUSHYA Push AUXTYPE
2018-06-29 14:16:40 +00:00
>PUSHBI S.FI.T.BIN
2018-10-02 15:52:30 +00:00
>PUSHBI O.RDONLY
2018-07-25 15:26:14 +00:00
>LDYA 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
2018-07-13 14:38:24 +00:00
adc BIN.R.CS.Start Get AUXTYPE for actual Base Address
2017-10-27 14:56:46 +00:00
sta BIN.R.End compute Range End=AUXTYPE+FILELEN
pla
2018-06-29 14:16:40 +00:00
adc BIN.R.CS.Start+1
2017-10-27 14:56:46 +00:00
sta BIN.R.End+1
txa
2018-06-21 15:12:10 +00:00
jsr K.GetMemPtr
>STYA ZPPtr1 set ZPPtr1 -> Code start
2018-06-21 15:12:10 +00:00
pha YA = actual load address
tya
sec
2018-06-29 14:16:40 +00:00
sbc BIN.R.CS.Start
2018-06-21 15:12:10 +00:00
sta BIN.R.Offset Offset=ZPPtr1-AUXTYPE
pla
2018-06-29 14:16:40 +00:00
sbc BIN.R.CS.Start+1
2017-10-27 14:56:46 +00:00
sta BIN.R.Offset+1
2018-09-11 13:32:56 +00:00
ldy #H.BIN.CS.SIZE get Code Len
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
clc
2018-07-19 15:33:55 +00:00
adc BIN.R.CS.Start
2018-07-13 14:38:24 +00:00
sta BIN.R.CS.End ZPPtr1 + CodeLen
iny
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
2018-07-19 15:33:55 +00:00
adc BIN.R.CS.Start+1
2018-07-13 14:38:24 +00:00
sta BIN.R.CS.End+1
2017-10-27 14:56:46 +00:00
jsr BIN.RelExe
2015-06-03 18:30:57 +00:00
2018-06-21 15:12:10 +00:00
>LDYA BIN.CmdLine get back bin path
jsr K.NewStr make a copy of this string
2015-03-14 21:48:35 +00:00
bcs .98
2018-06-21 15:12:10 +00:00
lda BIN.hMem Keep X=hMem
jsr K.GetMemByID X unmodified
2017-01-12 17:43:45 +00:00
>STYA ZPPtr1
2015-06-03 18:30:57 +00:00
2017-01-12 17:43:45 +00:00
lda (ZPPtr1)
2015-03-14 21:48:35 +00:00
ora #S.MEM.F.CODE This is a code segment
2017-01-12 17:43:45 +00:00
sta (ZPPtr1)
2016-03-13 21:47:19 +00:00
txa Get Back hMem
2015-03-14 21:48:35 +00:00
ldy #S.MEM.BIN
2017-01-12 17:43:45 +00:00
sta (ZPPtr1),y
2015-06-03 18:30:57 +00:00
lda BIN.hMem
2015-06-03 18:30:57 +00:00
tax return hMEM to Caller...
2018-06-21 15:12:10 +00:00
jmp K.GetMemPtr ...and Y,A=PTR to CS
2015-03-14 21:48:35 +00:00
.98 pha
lda BIN.hMem
2018-06-21 15:12:10 +00:00
jsr K.FreeMem Discard Loaded Code
2015-03-14 21:48:35 +00:00
pla
2015-06-03 18:30:57 +00:00
sec
.99 rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
BIN.CmdLine .BS 2
BIN.hMem .BS 1
2018-06-28 15:26:34 +00:00
*/--------------------------------------
2018-07-20 05:43:11 +00:00
* # InsDrv
* ## C
2018-07-17 15:45:59 +00:00
* `void * insdrv (void * src, void * crvcsstart, void * drvcsend, void * drvend);`
2018-07-20 05:43:11 +00:00
* ## ASM
2018-06-28 15:26:34 +00:00
* **In:**
2018-07-19 15:33:55 +00:00
* `>PUSHW DRV.END`
* `>PUSHW DRV.CS.END`
* `>PUSHW DRV.CS.START`
* `>LDYA L.SRC`
* `SYSCALL insdrv`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-07-17 15:45:59 +00:00
* Y,A = Ptr to installed driver
2018-06-28 15:26:34 +00:00
*\--------------------------------------
2018-07-17 15:45:59 +00:00
K.InsDrv >STYA ZPPtr1
>PULLW BIN.R.CS.Start
2018-06-29 14:16:40 +00:00
>PULLW BIN.R.CS.End
>PULLW BIN.R.End
2018-07-17 15:45:59 +00:00
2017-10-27 14:56:46 +00:00
lda BIN.R.End Compute DRVLen=End-start
sec
2018-06-29 14:16:40 +00:00
sbc BIN.R.CS.Start
2018-07-17 15:45:59 +00:00
sta BIN.Move.Len
2017-10-27 14:56:46 +00:00
lda BIN.R.End+1
2018-06-29 14:16:40 +00:00
sbc BIN.R.CS.Start+1
2018-07-17 15:45:59 +00:00
sta BIN.Move.Len+1
2018-06-29 14:16:40 +00:00
lda DevMgr.Free Compute new DevMgr.Free
clc
2018-07-17 15:45:59 +00:00
adc BIN.Move.Len
2018-06-21 15:12:10 +00:00
tay Save DRVEnd LO
lda DevMgr.Free+1
2018-07-17 15:45:59 +00:00
adc BIN.Move.Len+1 A = DRVEnd HI
bcs .9 we crossed $FFFF, out of mem
cpy #DevMgr.HiMem
sbc /DevMgr.HiMem
bcs .9 No More Room to load Driver....
2018-07-17 15:45:59 +00:00
>LDYA DevMgr.Free
jsr BIN.MoveToYA
2018-07-17 15:45:59 +00:00
lda DevMgr.Free
sta ZPPtr1
2018-06-29 14:16:40 +00:00
sec
sbc BIN.R.CS.Start
sta BIN.R.Offset
lda DevMgr.Free+1
2018-07-17 15:45:59 +00:00
sta ZPPtr1+1
2018-06-29 14:16:40 +00:00
sbc BIN.R.CS.Start+1
sta BIN.R.Offset+1
2018-07-17 15:45:59 +00:00
2018-06-29 14:16:40 +00:00
jsr BIN.RelDrv
lda DevMgr.Free
2018-07-17 15:45:59 +00:00
tay
clc
adc BIN.Move.Len
sta DevMgr.Free
2018-06-29 14:16:40 +00:00
lda DevMgr.Free+1
2018-07-17 15:45:59 +00:00
pha
adc BIN.Move.Len+1
sta DevMgr.Free+1
pla
clc
2018-06-29 14:16:40 +00:00
rts
2018-07-17 15:45:59 +00:00
2018-10-21 20:54:07 +00:00
.9 lda #E.OOM
2018-07-17 15:45:59 +00:00
sec
rts
2018-06-29 14:16:40 +00:00
*--------------------------------------
2018-07-17 15:45:59 +00:00
BIN.Move.Len .BS 2
*--------------------------------------
BIN.MoveToYA >STYA ZPPtr2
2018-07-17 15:45:59 +00:00
lda BIN.Move.Len+1
eor #$ff
pha
2018-07-17 15:45:59 +00:00
lda BIN.Move.Len
eor #$ff
tax
ldy #0
2018-06-29 14:16:40 +00:00
.1 inx
bne .2
pla
inc
2018-06-29 14:16:40 +00:00
beq .3
pha
2018-06-29 14:16:40 +00:00
.2 lda (ZPPtr1),y
2017-01-12 17:43:45 +00:00
sta (ZPPtr2),y
iny
2018-06-29 14:16:40 +00:00
bne .1
2017-01-12 17:43:45 +00:00
inc ZPPtr1+1
inc ZPPtr2+1
2018-06-29 14:16:40 +00:00
bra .1
2018-07-17 15:45:59 +00:00
.3 rts
*--------------------------------------
2017-10-27 14:56:46 +00:00
* BIN.Rel___ :
*--------------------------------------
2018-06-29 14:16:40 +00:00
BIN.R.CS.Start .BS 2
BIN.R.CS.End .BS 2
2017-10-27 14:56:46 +00:00
BIN.R.End .BS 2
BIN.R.Offset .BS 2
*--------------------------------------
2017-10-27 14:56:46 +00:00
BIN.RelExe ldy #H.BIN.T+1
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
cmp /H.BIN.T.BIN65
beq .1
cmp /H.BIN.T.DRV65
beq .1
2018-10-21 20:54:07 +00:00
lda #E.IBIN
sec
rts
.1 ldy #H.BIN.JMP relocate Main JMP
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
clc
2017-10-27 14:56:46 +00:00
adc BIN.R.Offset
2017-01-12 17:43:45 +00:00
sta (ZPPtr1),y
iny
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
2017-10-27 14:56:46 +00:00
adc BIN.R.Offset+1
2017-01-12 17:43:45 +00:00
sta (ZPPtr1),y
ldy #H.BIN.EXE.REL.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes)
.HS 2C bit abs
*--------------------------------------
2017-10-27 14:56:46 +00:00
BIN.RelDrv ldy #H.BIN.DRV.REL.TABLE
2018-07-17 15:45:59 +00:00
2018-07-16 15:29:18 +00:00
.1 lda (ZPPtr1),y Start Relocate JMP table
tax LO in X
iny
2018-09-09 08:11:42 +00:00
lda (ZPPtr1),y HI in A
beq .2 $00xx = end of table
2018-09-09 08:11:42 +00:00
cpx BIN.R.CS.Start
sbc BIN.R.CS.Start+1
bcc .11 addr < BIN.R.CS.Start, out of range
txa Get back LO
cpx BIN.R.End
lda (ZPPtr1),y Get HI
sbc BIN.R.End+1
bcs .11 addr > BIN.R.End, out of range
dey
txa get back LO
clc
2017-10-27 14:56:46 +00:00
adc BIN.R.Offset
2017-01-12 17:43:45 +00:00
sta (ZPPtr1),y
iny
2017-01-12 17:43:45 +00:00
lda (ZPPtr1),y
2017-10-27 14:56:46 +00:00
adc BIN.R.Offset+1
2017-01-12 17:43:45 +00:00
sta (ZPPtr1),y
2018-09-09 08:11:42 +00:00
.11 iny
bra .1
*--------------------------------------
.2 tya add current offset in Y to Ptr
sec + 1 to skip last 00 from beq .2
2017-01-12 17:43:45 +00:00
adc ZPPtr1
sta ZPPtr1
bcc .3
inc ZPPtr1+1 ZPPtr1=Current Code PTR
2018-07-20 05:43:11 +00:00
.3 lda BIN.R.CS.End compute new CS.END to stop relocating
2018-07-19 15:33:55 +00:00
clc
adc BIN.R.Offset
sta .7+1
lda BIN.R.CS.End+1
adc BIN.R.Offset+1
sta .71+1
2018-07-20 05:43:11 +00:00
lda (ZPPtr1) get OPCODE
lsr /2
tax
2018-06-29 14:16:40 +00:00
lda BIN.65816,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
2018-07-17 15:45:59 +00:00
lda (ZPPtr1),y Get LO
tax save LO in X
iny make Y point to HI
2018-07-17 15:45:59 +00:00
lda (ZPPtr1),y Get HI
2018-06-29 14:16:40 +00:00
cpx BIN.R.CS.Start
sbc BIN.R.CS.Start+1
bcc .5 addr < BIN.R.CS.Start, out of range
txa Get back LO
2017-10-27 14:56:46 +00:00
cpx BIN.R.End
2018-07-17 15:45:59 +00:00
lda (ZPPtr1),y Get HI
2017-10-27 14:56:46 +00:00
sbc BIN.R.End+1
bcs .5 addr > BIN.R.End, out of range
txa Get back LO
* clc CC from bcs .6
2018-07-17 15:45:59 +00:00
adc BIN.R.Offset add Offset to abs address
dey
2018-07-17 15:45:59 +00:00
sta (ZPPtr1),y store relocated addr LO
iny
2018-07-17 15:45:59 +00:00
lda (ZPPtr1),y Get HI
2017-10-27 14:56:46 +00:00
adc BIN.R.Offset+1
2018-07-17 15:45:59 +00:00
sta (ZPPtr1),y store relocated addr HI
.5 pla get back Opcode length...
.6 clc A = OPCODE length
2017-01-12 17:43:45 +00:00
adc ZPPtr1
sta ZPPtr1
bcc .7
2017-01-12 17:43:45 +00:00
inc ZPPtr1+1
2018-07-19 15:33:55 +00:00
.7 eor #$ff SELF MODIFIED A = ZPPtr1
bne .3
2017-01-12 17:43:45 +00:00
lda ZPPtr1+1
2018-07-19 15:33:55 +00:00
.71 eor #$ff SELF MODIFIED
bne .3 next opcode....
.8 rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
MAN
2018-11-17 17:17:13 +00:00
SAVE USR/SRC/SYS/KERNEL.S.BIN
LOAD USR/SRC/SYS/KERNEL.S
2015-03-14 21:48:35 +00:00
ASM