A2osX/SYS/KERNEL.S.BIN.txt
2019-01-30 06:20:13 +00:00

450 lines
9.5 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
AUTO 4,1
*--------------------------------------
.DUMMY
.OR FAC 15 Bytes
BIN.CmdLine .BS 2
BIN.hMem .BS 1
BIN.Move.Len .BS 2
BIN.R.CS.Start .BS 2
BIN.R.CS.End .BS 2
BIN.R.End .BS 2
BIN.R.Offset .BS 2
.ED
*--------------------------------------
* LoadLib
* in :
* Y,A = PTR To "LibName.o" C-String
* out :
* A = hMem To loaded LIB
*--------------------------------------
K.LoadLib jsr ENV.Search.LIB
bcs .9
>LDYAI K.Buf256
jsr BIN.Load Y,A = "/PATH/BIN"
bcs .9
>STYA .1+1
stx BIN.hMem
txa Pass hLib to LibLoad
ldx #LIBMGR.LOAD
.1 jsr $ffff Self Modified, Call LIB.LOAD function
bcs BIN.Load.Cleanup
lda BIN.hMem hLib
clc
.9 rts
*--------------------------------------
* UnloadLib
* in :
* A = hMem To Lib
* out :
*--------------------------------------
K.UnloadLib pha
jsr K.GetMemPtr
>STYA .2+1
jsr MEM.decREFCNT
beq .1
pla
clc
rts
.1 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
* ## RETURN VALUE
* none
*\--------------------------------------
K.LoadDrv >STYA .2+1 Save "BIN\0ARGS\0\0"
jsr ENV.Search.DRV
bcs .9
>LDYAI K.Buf256
jsr BIN.Load Y,A = "/PATH/BIN"
bcs .9
>STYA .3+1
stx BIN.hMem
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 BIN.Load.Cleanup
jsr BIN.Load.Cleanup
lda #0 Make sure RC = 0 if success
clc
.9 rts
BIN.Load.Cleanup
pha
lda BIN.hMem
jsr K.FreeMem
pla
sec
BIN.Load.Cleanup.RTS
rts
*--------------------------------------
* BIN.Load
* in :
* Y,A = /BIN/PATH (CSTR)
* out :
* Y,A = MEMPTR
* X = hMem of Code Segment
*--------------------------------------
BIN.Load >STYA BIN.CmdLine
ldx #0
.1 cpx Mem.LastSlot
beq BIN.Load.1
inx we will skip Slot 0...
txa
jsr K.GetMemPtr
lda (ZPMemMgrSPtr)
bpl .1 In Use?
ldy #S.MEM.BIN any BIN PATH in this slot?
lda (ZPMemMgrSPtr),y
beq .1
jsr K.GetMemPtr X unmodified, get pathname
>STYA .3+1
ldy #0
.2 lda (BIN.CmdLine),y
.3 cmp $ffff,y SELF MODIFIED
bne .1
iny
ora #0
bne .2
txa
jsr K.GetMemPtr
jsr MEM.IncREFCNT
clc
jmp K.GetMemPtr.ZPMemMgrSPtr
* X=hMem, Y,A=Ptr
*--------------------------------------
* STAT Already called by Filesearch in FindDRV, FindLIB
* STAT Already called by PS.Load (TXT,BIN,SYS)
*--------------------------------------
BIN.Load.1 >LDYA K.S.STAT+S.STAT.P.AUXTYPE
>STYA BIN.R.CS.Start
>PUSHYA Push AUXTYPE
>PUSHBI S.FI.T.BIN
>PUSHBI O.RDONLY
>LDYA BIN.CmdLine
>SYSCALL LoadFile BANK1!!!
bcs BIN.Load.Cleanup.RTS 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.CS.SIZE get Code Len
lda (ZPPtr1),y
clc
adc BIN.R.CS.Start
sta BIN.R.CS.End ZPPtr1 + CodeLen
iny
lda (ZPPtr1),y
adc BIN.R.CS.Start+1
sta BIN.R.CS.End+1
jsr BIN.RelExe
>LDYA BIN.CmdLine get back bin path
>SYSCALL StrDup make a copy of this string
bcs .98
lda BIN.hMem Keep X=hMem
jsr MEM.GetMemByID X unmodified
lda (ZPMemMgrSPtr)
ora #S.MEM.F.CODE This is a code segment
sta (ZPMemMgrSPtr)
txa Get Back Cmd line hMem
ldy #S.MEM.BIN
sta (ZPMemMgrSPtr),y
ldx BIN.hMem return hMEM to Caller...
clc
jmp K.GetMemPtr.ZPMemMgrSPtr ...and Y,A=PTR to CS
.98 jmp BIN.Load.Cleanup Discard Loaded Code, exits CS
*/--------------------------------------
* # InsDrv
* ## C
* `void * insdrv (void * src, void * crvcsstart, void * drvcsend, void * drvend);`
* ## ASM
* **In:**
* `>PUSHW DRV.END`
* `>PUSHW DRV.CS.END`
* `>PUSHW DRV.CS.START`
* `>LDYA L.SRC`
* `SYSCALL insdrv`
* ## RETURN VALUE
* Y,A = Ptr to installed driver
*\--------------------------------------
K.InsDrv >STYA ZPPtr2 SRC PTR
>PULLW 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.Move.Len
tay
lda BIN.R.End+1
sbc BIN.R.CS.Start+1
sta BIN.Move.Len+1
jsr MEM.GetKrnlBuf Y,A = LEN
bcs .9 No More Room to load Driver
>STYA ZPPtr1 Y,A = DST Buf for RelDrv...
>STYA ZPPtr3 ...for move...
sty .7+1 ...and for exit
sta .8+1
lda ZPPtr1
sec
sbc BIN.R.CS.Start
sta BIN.R.Offset
lda ZPPtr1+1
sbc BIN.R.CS.Start+1
sta BIN.R.Offset+1
lda BIN.Move.Len+1
eor #$ff
pha
lda BIN.Move.Len
eor #$ff
tax
ldy #0
.1 inx
bne .2
pla
inc
beq .3
pha
.2 lda (ZPPtr2),y
sta (ZPPtr3),y
iny
bne .1
inc ZPPtr2+1
inc ZPPtr3+1
bra .1
.3 jsr BIN.RelDrv Relocate at Ptr1
.7 ldy #$ff SELF MODIFIED
.8 lda #$ff SELF MODIFIED
.9 rts
*--------------------------------------
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 #E.IBIN
sec
rts
.1 ldy #H.BIN.JMP relocate Main JMP
jsr BIN.RelocateAtPtr1Y
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 iny
lda (ZPPtr1),y HI in A
beq .2 $00xx = end of table
dey
jsr BIN.RelocateAtPtr1Y
iny
bra .1
*--------------------------------------
.2 jsr MEM.AddYp1ToPtr1 add current offset in Y to Ptr
* + 1 to skip last 00 from beq .2
* ZPPtr1=Current Code PTR
.3 lda BIN.R.CS.End compute new CS.END to stop relocating
clc
adc BIN.R.Offset
sta .7+1
lda BIN.R.CS.End+1
adc BIN.R.Offset+1
sta .8+1
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
jsr BIN.RelocateAtPtr1Y
.5 pla get back Opcode length...
.6 clc A = OPCODE length
adc ZPPtr1
sta ZPPtr1
bcc .7
inc ZPPtr1+1
clc Make sure exit with CC
.7 eor #$ff SELF MODIFIED A = ZPPtr1
bne .3
lda ZPPtr1+1
.8 eor #$ff SELF MODIFIED
bne .3 next opcode....
rts
*--------------------------------------
BIN.RelocateAtPtr1Y
lda (ZPPtr1),y Get LO
tax save LO in X
iny make Y point to HI
lda (ZPPtr1),y Get HI
cpx BIN.R.CS.Start
sbc BIN.R.CS.Start+1
bcc .9 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 .9 addr > BIN.R.End, out of range
txa Get back LO
dey
clc
adc BIN.R.Offset
sta (ZPPtr1),y
iny
lda (ZPPtr1),y
adc BIN.R.Offset+1
sta (ZPPtr1),y
.9 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 USR/SRC/SYS/KERNEL.S.BIN
LOAD USR/SRC/SYS/KERNEL.S
ASM