A2osX/SYS/KERNEL.S.BIN.txt
2018-07-13 16:38:24 +02:00

576 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
bcs .9
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
jsr K.FreeMem
pla
sec
rts
*--------------------------------------
* K.UnloadLib
* in :
* A = hMem To Lib
* out :
*--------------------------------------
K.UnloadLib pha
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
jmp K.FreeMem
*/--------------------------------------
* # LoadDrv
* ##ASM
* **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
bcs .9
jsr BIN.Load Y,A = "/PATH/BIN"
bcs .9
>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
adc .2+2 Y,A = ARGS
.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
jsr K.FreeMem
pla
sec
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 get value for Search Path
bcs .9
>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"
*--------------------------------------
* BIN.Load
* in :
* Y,A = /BIN/PATH (CSTR)
* out :
* Y,A = MEMPTR
* X = hMem of Code Segment
*--------------------------------------
BIN.Load >STYA BIN.CmdLine
>STYA .2+1
ldx Mem.LastSlot
beq BIN.Load.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 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 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.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.CS.Start
>PUSHYA Push AUXTYPE
>PUSHBI 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.CS.Start Get AUXTYPE for actual Base Address
sta BIN.R.End compute Range End=AUXTYPE+FILELEN
pla
adc BIN.R.CS.Start+1
sta BIN.R.End+1
txa
jsr K.GetMemPtr
>STYA ZPPtr1 set ZPPtr1 -> Code start
pha YA = actual load address
tya
sec
sbc BIN.R.CS.Start
sta BIN.R.Offset Offset=ZPPtr1-AUXTYPE
pla
sbc BIN.R.CS.Start+1
sta BIN.R.Offset+1
ldy #H.BIN.CODE.LEN get Code Len
lda (ZPPtr1),y
clc
adc ZPPtr1
sta BIN.R.CS.End ZPPtr1 + CodeLen
iny
lda (ZPPtr1),y
adc ZPPtr1+1
sta BIN.R.CS.End+1
jsr BIN.RelExe
>LDYA BIN.CmdLine get back bin path
jsr K.NewStr make a copy of this string
bcs .98
lda BIN.hMem Keep X=hMem
jsr K.GetMemByID 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 ...and Y,A=PTR to CS
.98 pha
lda BIN.hMem
jsr K.FreeMem Discard Loaded Code
pla
sec
.99 rts
*--------------------------------------
BIN.CmdLine .BS 2
BIN.hMem .BS 1
*/--------------------------------------
* #K.InsDrv
* ##ASM
* **In:**
* PUSHW = DRV.END
* PUSHW = DRV.CS.END
* Y,A = DRV.CS.START
*\--------------------------------------
K.InsDrv >STYA BIN.R.CS.Start
>PULLW BIN.R.CS.End
>PULLW BIN.R.End
lda BIN.R.End Compute DRVLen=End-start
sec
sbc BIN.R.CS.Start
sta BIN.R.Len
lda BIN.R.End+1
sbc BIN.R.CS.Start+1
sta BIN.R.Len+1
lda DevMgr.Free Compute new DevMgr.Free
clc
adc BIN.R.Len
sta BIN.R.End
tay Save DRVEnd LO
lda DevMgr.Free+1
adc BIN.R.Len+1 A = DRVEnd HI
sta BIN.R.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.DevCnt
cmp #K.DEV.MAX
bne .10 No Device Handle Left
lda #K.E.OOH
sec
rts
.9 lda #K.E.OOM
sec
rts
.10 lda DevMgr.Free Offset = Target DRV address-Src Address
sec
sbc BIN.R.CS.Start
sta BIN.R.Offset
lda DevMgr.Free+1
sbc BIN.R.CS.Start+1
sta BIN.R.Offset+1
jsr BIN.Move
jsr BIN.RelDrv
>LDYA BIN.R.End
>STYA DevMgr.Free
ldx DevMgr.DevCnt
lda DevMgr.Free
sta FD.Table.PTRLO,x
inx
lda DevMgr.Free+1
sta FD.Table.PTRHI,x
inx
stx DevMgr.DevCnt
clc
rts
*--------------------------------------
BIN.Move lda BIN.R.CS.Start
clc
sta ZPPtr1
adc BIN.R.Offset
sta BIN.R.CS.Start
sta ZPPtr2
lda BIN.R.CS.Start+1
sta ZPPtr1+1
adc BIN.R.Offset+1
sta BIN.R.CS.Start+1
sta ZPPtr2+1
lda BIN.R.Len+1
eor #$ff
pha
lda BIN.R.Len
eor #$ff
tax
ldy #0
.1 inx
bne .2
pla
inc
beq .3
pha
.2 lda (ZPPtr1),y
sta (ZPPtr2),y
iny
bne .1
inc ZPPtr1+1
inc ZPPtr2+1
bra .1
.3 lda BIN.R.CS.End
clc
adc BIN.R.Offset
sta BIN.R.CS.End
lda BIN.R.CS.End+1
adc BIN.R.Offset+1
sta BIN.R.CS.End+1
lda BIN.R.End
clc
adc BIN.R.Offset
sta BIN.R.End
lda BIN.R.End+1
adc BIN.R.Offset+1
sta BIN.R.End+1
rts
*--------------------------------------
* BIN.Rel___ :
*--------------------------------------
BIN.R.CS.Start .BS 2
BIN.R.CS.End .BS 2
BIN.R.End .BS 2
BIN.R.Offset .BS 2
*--------------------------------------
BIN.R.Len .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.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
lda (ZPPtr1),y Get LO
tax save LO in X
iny make Y point to HI
cpx BIN.R.CS.Start
lda (ZPPtr1),y Get HI
sbc BIN.R.CS.Start+1
bcc .5 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 .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 BIN.R.CS.End A = ZPPtr1
bne .3
lda ZPPtr1+1
eor BIN.R.CS.End+1
bne .3 next opcode....
.8 rts
*--------------------------------------
* 6502/65C02/65816 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.65816
* TO DO : Make 2 different tables
* http://axis.llx.com/~nparker/a2/opcodes.html
*--------------------------------------
* 65R02 OPCODES
*--------------------------------------
* 0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F
BIN.65R02 .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