2015-03-14 21:48:35 +00:00
|
|
|
|
PR#3
|
2015-03-15 22:00:40 +00:00
|
|
|
|
PREFIX /A2OSX.BUILD
|
2015-03-14 21:48:35 +00:00
|
|
|
|
NEW
|
|
|
|
|
INC 1
|
|
|
|
|
AUTO 6
|
|
|
|
|
.LIST OFF
|
|
|
|
|
.OP 65C02
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.LoadBinA
|
|
|
|
|
* in :
|
|
|
|
|
* A = hMem of FilePath (PSTRING)
|
|
|
|
|
* out :
|
|
|
|
|
* Y,A = MEMPTR
|
|
|
|
|
* X = hMem of Code Segment
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.LoadBinA sta R.DH save file path
|
|
|
|
|
jsr S.GetMemByNameA
|
|
|
|
|
bcs .1 not already loaded
|
|
|
|
|
>STYA R.AX Save base address
|
|
|
|
|
ldy #S.MEM.REFCNT
|
|
|
|
|
lda (R.AX),y
|
|
|
|
|
inc
|
|
|
|
|
sta (R.AX),y
|
|
|
|
|
ldy #S.MEM.PTR
|
|
|
|
|
lda (R.AX),y
|
|
|
|
|
pha Y,A = MEM PTR...
|
|
|
|
|
iny
|
|
|
|
|
lda (R.AX),y
|
|
|
|
|
ply X=hMem from S.GetMemByNameA
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
.1 lda R.DH
|
|
|
|
|
jsr S.LoadFileA
|
|
|
|
|
bcs .99
|
|
|
|
|
>STYA R.BX save file length for relocation
|
|
|
|
|
stx R.DL save hMem
|
|
|
|
|
txa
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA R.AX save base address for relocation
|
|
|
|
|
lda R.DH
|
|
|
|
|
jsr S.MLIGetFileInfoA Get File Info for AUXTYPE
|
|
|
|
|
bcs .98
|
|
|
|
|
>STYA ZPQuickPtr1
|
|
|
|
|
ldy #2 get AUXTYPE
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
sta R.CL
|
|
|
|
|
iny
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
sta R.CH save File load address for relocation
|
|
|
|
|
lda R.AL compute offset for relocation....
|
|
|
|
|
sec
|
|
|
|
|
sbc R.CL ...AX-CX...
|
|
|
|
|
sta R.CL
|
|
|
|
|
lda R.AH
|
|
|
|
|
sbc R.CH
|
|
|
|
|
sta R.CH ...to CX
|
|
|
|
|
jsr S.BinRelocate
|
|
|
|
|
bcs .98 relocation error, dicard Code segment
|
|
|
|
|
lda R.DH get back bin path
|
|
|
|
|
jsr S.PStrCpyA
|
|
|
|
|
bcs .98
|
|
|
|
|
pha save copy of bin path
|
|
|
|
|
lda R.DL
|
|
|
|
|
jsr S.GetMemByIDA
|
|
|
|
|
>STYA ZPQuickPtr1
|
|
|
|
|
lda (ZPQuickPtr1)
|
|
|
|
|
ora #S.MEM.F.CODE This is a code segment
|
|
|
|
|
sta (ZPQuickPtr1)
|
|
|
|
|
ldy #S.MEM.BIN
|
|
|
|
|
pla get back copy of bin path
|
|
|
|
|
sta (ZPQuickPtr1),y
|
|
|
|
|
>LDYA R.AX return CS PTR ... not modified by S.LoadCodeReloc
|
|
|
|
|
ldx R.DL ...and hMEM to Caller
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.98 pha
|
|
|
|
|
lda R.DL
|
|
|
|
|
jsr S.FreeMemA Discard Loaded Code
|
|
|
|
|
pla
|
|
|
|
|
.99 sec
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.LoadDrvA
|
|
|
|
|
* in :
|
|
|
|
|
* A = hMem To Full Cmd Line
|
|
|
|
|
* out :
|
|
|
|
|
* none
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn
|
|
|
|
|
>LDYAI MSG.DRVLOAD
|
|
|
|
|
jsr S.SysScrPPSTR
|
|
|
|
|
jsr S.CreateDevice
|
|
|
|
|
bcc .1
|
|
|
|
|
pha save error code
|
|
|
|
|
>PULLA discard Cmd Line
|
|
|
|
|
pla
|
|
|
|
|
sec
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
.1 >PUSHBI $20 Push SEP=' '
|
|
|
|
|
>PUSHBI 0 Push 0 for getting CMD And ARGS
|
|
|
|
|
jsr S.PStrGetTkn
|
|
|
|
|
bcs .98
|
|
|
|
|
ldy #S.DEV.hCMD
|
|
|
|
|
sta (DEVMGR.DEVPTR),y
|
|
|
|
|
|
|
|
|
|
>PUSHA push CMD for S.FileSearch
|
|
|
|
|
txa
|
|
|
|
|
ldy #S.DEV.hARGS
|
|
|
|
|
sta (DEVMGR.DEVPTR),y
|
|
|
|
|
>PUSHWI ENV.DRV push ENVNAME=DRV
|
|
|
|
|
ldy #S.PS.hENV
|
|
|
|
|
lda TSKMGR.TABLE,y Get PS #0 Env
|
|
|
|
|
>PUSHA
|
|
|
|
|
jsr S.GetEnvVarP get value for ENV=%DRV%
|
|
|
|
|
bcs .98
|
|
|
|
|
|
|
|
|
|
sta LoadDrv.ENV
|
|
|
|
|
>PUSHA A=PStr to Value
|
|
|
|
|
jsr S.FileSearch find File in %DRV%
|
|
|
|
|
bcs .98 not Found
|
|
|
|
|
|
|
|
|
|
sta LoadDrv.BIN
|
|
|
|
|
jsr S.SysScrPPSTRA
|
|
|
|
|
|
|
|
|
|
lda LoadDrv.BIN
|
|
|
|
|
jsr S.LoadBinA X = BinPath hMem
|
|
|
|
|
bcs .97
|
|
|
|
|
>STYA Kernel.JMP save PTR to Code Segment
|
|
|
|
|
txa
|
|
|
|
|
ldy #S.DEV.hCS
|
|
|
|
|
sta (DEVMGR.DEVPTR),y save CS hMem in DEVSLOT
|
|
|
|
|
|
|
|
|
|
lda LoadDrv.BIN
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
lda LoadDrv.ENV
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
|
|
|
|
|
ldx #DEVMGR.OPEN
|
|
|
|
|
>LDYA DEVMGR.DEVPTR
|
|
|
|
|
jsr Kernel.DRVCALL Call DRV Open function
|
|
|
|
|
bcs .99
|
|
|
|
|
|
|
|
|
|
lda (DEVMGR.DEVPTR)
|
|
|
|
|
ora #S.DEV.F.INUSE Get Device Flags in A
|
|
|
|
|
sta (DEVMGR.DEVPTR)
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
.97 pha save error code
|
|
|
|
|
lda LoadDrv.BIN
|
|
|
|
|
jsr S.FreeMemA discard BIN in case of failed load
|
|
|
|
|
pla
|
|
|
|
|
|
|
|
|
|
.98 pha
|
|
|
|
|
lda LoadDrv.ENV
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
pla
|
|
|
|
|
|
|
|
|
|
.99 pha
|
|
|
|
|
jsr S.DestroyDevice
|
|
|
|
|
pla
|
|
|
|
|
sec
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.LoadLib
|
|
|
|
|
* in :
|
|
|
|
|
* PULLW = PTR To Lib Name
|
|
|
|
|
* out :
|
|
|
|
|
* A = hMem To loaded LIB
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.LoadLib jsr S.NewPStr
|
|
|
|
|
bcs .99
|
|
|
|
|
pha save LibName hMem for discard
|
|
|
|
|
jsr S.LoadLibA
|
|
|
|
|
bcs .98
|
|
|
|
|
plx get back STR hMem
|
|
|
|
|
pha save error code/hMem
|
|
|
|
|
txa
|
|
|
|
|
jsr S.FreeMemA discard STR hMem
|
|
|
|
|
pla get back error code/hMem
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.98 plx get back STR hMem
|
|
|
|
|
pha save error code/hMem
|
|
|
|
|
txa
|
|
|
|
|
jsr S.FreeMemA discard STR hMem
|
|
|
|
|
pla get back error code/hMem
|
|
|
|
|
sec
|
|
|
|
|
.99 rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.LoadLibA
|
|
|
|
|
* in :
|
|
|
|
|
* A = hMem To Lib Name
|
|
|
|
|
* out :
|
|
|
|
|
* A = hMem of Loaded Lib
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.LoadLibA >PUSHA push libname for S.FileSearch
|
|
|
|
|
>LDYAI MSG.LOADLIB
|
|
|
|
|
jsr S.SysScrPPSTR
|
|
|
|
|
>PUSHWI ENV.LIB push ENVNAME=LIB
|
|
|
|
|
ldy #S.PS.hENV
|
|
|
|
|
lda (TSKMGR.TSKPTR),y
|
|
|
|
|
>PUSHA
|
|
|
|
|
jsr S.GetEnvVarP get value for ENV=LIB
|
|
|
|
|
bcs .99
|
|
|
|
|
pha save hMem to LIB VALUE
|
|
|
|
|
>PUSHA Push %LIB% VALUE
|
|
|
|
|
jsr S.FileSearch find libname in %LIB%
|
|
|
|
|
bcs .98
|
|
|
|
|
pha save hMem to LIB full path
|
|
|
|
|
jsr S.SysScrPPSTRA
|
|
|
|
|
pla
|
|
|
|
|
pha
|
|
|
|
|
jsr S.LoadBinA A = hMem of filename full path
|
|
|
|
|
bcs .97
|
|
|
|
|
phx
|
|
|
|
|
>STYA Kernel.JMP
|
|
|
|
|
|
|
|
|
|
ldx #LIBMGR.LOAD
|
|
|
|
|
jsr Kernel.LIBCALL Call LIB.LOAD function
|
|
|
|
|
|
|
|
|
|
bcs .97
|
|
|
|
|
|
|
|
|
|
plx
|
|
|
|
|
pla discard LIB PATH
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
pla discard LIB VALUE
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
txa
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.97 pla discard LIB PATH
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
.98 pla discard LIB VALUE
|
|
|
|
|
jsr S.FreeMemA
|
|
|
|
|
sec
|
|
|
|
|
.99 rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.UnloadLibA
|
|
|
|
|
* in :
|
|
|
|
|
* A = hMem To Lib
|
|
|
|
|
* out :
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.UnloadLibA pha
|
|
|
|
|
jsr S.GetMemByIDA
|
|
|
|
|
>STYA ZPQuickPtr1
|
|
|
|
|
ldy #S.MEM.REFCNT
|
|
|
|
|
lda (ZPQuickPtr1),y Get count of those referencing this lib
|
|
|
|
|
dec only one left ?
|
|
|
|
|
beq .1
|
|
|
|
|
sta (ZPQuickPtr1),y
|
|
|
|
|
pla
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
.1 ldy #S.MEM.PTR
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
pha
|
|
|
|
|
iny
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
ply
|
|
|
|
|
>STYA Kernel.JMP
|
|
|
|
|
|
|
|
|
|
ldx #LIBMGR.UNLOAD
|
|
|
|
|
jsr Kernel.BINCALL Call LIB.UNLOAD function
|
|
|
|
|
pla
|
|
|
|
|
jmp S.FreeMemA
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.BinRelocate :
|
|
|
|
|
* R.AX = base address to start relocate
|
|
|
|
|
* R.BX = segment length (including data)
|
|
|
|
|
* R.CX = offset to apply to all abs addresses within segment
|
|
|
|
|
* R.DX unmodified
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.BinRelocate lda (R.AX)
|
|
|
|
|
cmp #K.BIN.MAGICHEADER
|
|
|
|
|
bne .99
|
|
|
|
|
ldy #1
|
|
|
|
|
lda (R.AX),y
|
|
|
|
|
cmp /K.BIN.MAGICHEADER
|
|
|
|
|
beq .1
|
|
|
|
|
.99 sec Not a Valid Relocatable BIN File, exiting
|
|
|
|
|
rts
|
|
|
|
|
.1 >PUSHW R.DX
|
|
|
|
|
lda R.AL
|
|
|
|
|
clc
|
|
|
|
|
adc R.BL Make BX end of Segment Range (BX=AX+BX)
|
|
|
|
|
sta R.BL
|
|
|
|
|
lda R.AH
|
|
|
|
|
adc R.BH
|
|
|
|
|
sta R.BH
|
|
|
|
|
iny
|
|
|
|
|
.2 lda (R.AX),y Start Relocate JMP table
|
|
|
|
|
clc
|
|
|
|
|
adc R.CL
|
|
|
|
|
tax save LO to X
|
|
|
|
|
iny
|
|
|
|
|
lda (R.AX),y if HI = 0,we are done
|
|
|
|
|
beq .3
|
|
|
|
|
adc R.CH
|
|
|
|
|
sta (R.AX),y
|
|
|
|
|
dey
|
|
|
|
|
txa get back LO
|
|
|
|
|
sta (R.AX),y
|
|
|
|
|
iny
|
|
|
|
|
iny
|
|
|
|
|
bra .2
|
|
|
|
|
.3 iny we already skipped the 2 "0" bytes indicating end of JMP table
|
|
|
|
|
lda R.AL
|
|
|
|
|
clc
|
|
|
|
|
adc (R.AX),y make DX = end of opcode range
|
|
|
|
|
sta R.DL
|
|
|
|
|
iny
|
|
|
|
|
lda R.AH
|
|
|
|
|
adc (R.AX),y
|
|
|
|
|
sta R.DH
|
|
|
|
|
iny
|
|
|
|
|
* Start relocating opcodes between R.AX and R.DX with abs addressing pointing between R.AX and R.BX
|
|
|
|
|
* Applying offset = R.CX
|
|
|
|
|
tya add current offset in Y to R.AX
|
|
|
|
|
clc
|
|
|
|
|
adc R.AL
|
|
|
|
|
sta ZPQuickPtr1
|
|
|
|
|
lda #0
|
|
|
|
|
adc R.AH
|
|
|
|
|
sta ZPQuickPtr1+1
|
|
|
|
|
.4 lda (ZPQuickPtr1) get OPCODE
|
|
|
|
|
tax
|
|
|
|
|
lda OPCODES,x get OPCODE definition
|
|
|
|
|
bpl .7 abs addressing?
|
|
|
|
|
ldy #1
|
|
|
|
|
lda (ZPQuickPtr1),y Get LO
|
|
|
|
|
clc
|
|
|
|
|
adc R.CL add CX to abs address
|
|
|
|
|
sta ZPQuickPtr2 store relocated addr LO
|
|
|
|
|
iny
|
|
|
|
|
lda (ZPQuickPtr1),y Get HI
|
|
|
|
|
adc R.CH
|
|
|
|
|
sta ZPQuickPtr2+1 store relocated addr LO
|
|
|
|
|
dey
|
|
|
|
|
lda ZPQuickPtr2 Get new LO
|
|
|
|
|
sec
|
|
|
|
|
sbc R.AL
|
|
|
|
|
iny
|
|
|
|
|
lda ZPQuickPtr2+1 Get new HI
|
|
|
|
|
sbc R.AH
|
|
|
|
|
bcc .6 new addr < AX, out of range
|
|
|
|
|
dey
|
|
|
|
|
lda ZPQuickPtr2 Get new LO
|
|
|
|
|
sec
|
|
|
|
|
sbc R.BL
|
|
|
|
|
iny
|
|
|
|
|
lda ZPQuickPtr2+1 Get new HI
|
|
|
|
|
sbc R.BH
|
|
|
|
|
bcs .6 new addr > BX, out of range
|
|
|
|
|
dey
|
|
|
|
|
lda ZPQuickPtr2 Get new LO
|
|
|
|
|
sta (ZPQuickPtr1),y
|
|
|
|
|
iny
|
|
|
|
|
lda ZPQuickPtr2+1 Get new HI
|
|
|
|
|
sta (ZPQuickPtr1),y
|
|
|
|
|
.6 lda OPCODES,x
|
|
|
|
|
.7 and #$3 get OPCODE length
|
|
|
|
|
clc
|
|
|
|
|
adc ZPQuickPtr1
|
|
|
|
|
sta ZPQuickPtr1
|
|
|
|
|
bcc .8
|
|
|
|
|
inc ZPQuickPtr1+1
|
|
|
|
|
.8 sec A already got Ptr LO
|
|
|
|
|
sbc R.DL
|
|
|
|
|
lda ZPQuickPtr1+1 is Ptr greater than DX ?
|
|
|
|
|
sbc R.DH
|
|
|
|
|
bcc .4 no, continue relocating
|
|
|
|
|
>PULLW R.DX
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
MSG.DRVLOAD >PSTRING "\nLoadDrv:"
|
|
|
|
|
MSG.LOADLIB >PSTRING "\nLoadLib:"
|
|
|
|
|
LoadDrv.ENV .BS 1
|
|
|
|
|
LoadDrv.BIN .BS 1
|
|
|
|
|
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* 65C02 OPCODES
|
|
|
|
|
* Bit 7 : 1 absolute addressing
|
|
|
|
|
* Bit 1-0 : opcode + @ length
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* x0.x1.x2.x3.x4.x5.x6.x7.x8.x9.xA.xB.xC.xD.xE.xF
|
|
|
|
|
OPCODES .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
|
|
|
|
|
.HS 83.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
|
|
|
|
|
.HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03
|
|
|
|
|
.HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
|
|
|
|
|
.HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
MAN
|
|
|
|
|
SAVE SYS/KERNEL.S.BIN
|
|
|
|
|
LOAD SYS/KERNEL.S
|
|
|
|
|
ASM
|