Initial bi-install shared code. Does not identify the starting location of the relocatable code at this time.
This commit is contained in:
parent
d6877dbe77
commit
673208720b
|
@ -0,0 +1,130 @@
|
|||
;
|
||||
; bi-install.asm
|
||||
;
|
||||
; BASIC.SYSTEM installation program.
|
||||
; * All installation code is placed into either RCODE or RDATA and placed into the first memory location.
|
||||
; * All application code is placed into either CODE or DATA and relocated into location supplied by BI.
|
||||
;
|
||||
; Copyright (c) 2015 Rob Greene
|
||||
;
|
||||
|
||||
; Application stuff:
|
||||
|
||||
cptr = $0c ; Code pointer
|
||||
dptr = $0e ; Data pointer
|
||||
|
||||
.ifp02
|
||||
.error "Installer requires 65C02 instructions."
|
||||
.endif
|
||||
|
||||
.include "../include/asciizh.inc"
|
||||
.include "../include/basic-system.inc"
|
||||
.include "../include/monitor.inc"
|
||||
|
||||
.import __CODE_LOAD__, __CODE_START__, __CODE_SIZE__
|
||||
.import __INIT_LAST__
|
||||
|
||||
.macro bi_install hookaddr
|
||||
|
||||
.if .paramcount <> 1
|
||||
.error "Must include hook address in bi-install macro."
|
||||
.endif
|
||||
|
||||
install:
|
||||
|
||||
; Requires 65C02 or later:
|
||||
sed
|
||||
lda #$99
|
||||
clc
|
||||
adc #$01
|
||||
cld
|
||||
bpl @not6502
|
||||
|
||||
@6502:
|
||||
jsr printz
|
||||
asciizh "ERR: MUST HAVE ENHANCED //E, //C, OR IIGS"
|
||||
rts
|
||||
|
||||
; Get address from BASIC.SYSTEM:
|
||||
@not6502:
|
||||
lda #1
|
||||
jsr bi_getbufr
|
||||
bcc @gotmem
|
||||
|
||||
@nomem:
|
||||
jsr printz
|
||||
asciizh "UNABLE TO ALLOCATE MEMORY"
|
||||
rts
|
||||
|
||||
@gotmem:
|
||||
sta cptr+1
|
||||
stz cptr
|
||||
|
||||
; Move code to destination address:
|
||||
ldy #0
|
||||
: lda __INIT_LAST__,y
|
||||
sta (cptr),y
|
||||
iny
|
||||
bne :-
|
||||
|
||||
; Patch code for new location - ASSUMES 1 PAGE ONLY!
|
||||
ldy #0
|
||||
@copy:
|
||||
lda (cptr),y
|
||||
jsr ilen ; calculate instruction length
|
||||
tax
|
||||
cpx #3
|
||||
bne :+
|
||||
iny ; Skip instruction
|
||||
dex
|
||||
iny ; Skip low byte
|
||||
dex
|
||||
lda (cptr),y
|
||||
cmp #>__CODE_LOAD__
|
||||
bne :+
|
||||
lda cptr+1
|
||||
sta (cptr),y
|
||||
: iny ; Skip rest of instruction
|
||||
dex
|
||||
bne :-
|
||||
cpy #<__CODE_SIZE__
|
||||
bcc @copy
|
||||
|
||||
; Setup BASIC.SYSTEM hooks:
|
||||
; 1. Save EXTRNCMD
|
||||
lda bi_extrncmd+2
|
||||
ldy #<hookaddr+1
|
||||
sta (cptr),y
|
||||
lda bi_extrncmd+1
|
||||
dey
|
||||
sta (cptr),y
|
||||
; 2. Place our hook into EXTRNCMD
|
||||
lda cptr+1
|
||||
sta bi_extrncmd+2
|
||||
stz bi_extrncmd+1
|
||||
|
||||
; Notify user:
|
||||
jsr printz
|
||||
asciizh "ONLINE COMMAND INSTALLED"
|
||||
rts
|
||||
|
||||
printz:
|
||||
pla
|
||||
sta dptr
|
||||
pla
|
||||
sta dptr+1
|
||||
@L: inc dptr
|
||||
bne :+
|
||||
inc dptr+1
|
||||
: lda (dptr)
|
||||
beq @X
|
||||
jsr mon_cout
|
||||
bra @L
|
||||
@X: lda dptr+1
|
||||
pha
|
||||
lda dptr
|
||||
pha
|
||||
rts
|
||||
|
||||
.endmacro
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
#
|
||||
# Linker memory layout:
|
||||
# $2000 = installer hook
|
||||
# $2100 = origin of actual program, but populates immediately after installer
|
||||
#
|
||||
|
||||
MEMORY {
|
||||
INIT: start = $2000, size = $100, define = yes;
|
||||
PGM: start = $2100, size = $100;
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
RCODE: load = INIT;
|
||||
CODE: load = PGM, define = yes;
|
||||
DATA: load = PGM;
|
||||
}
|
||||
|
Loading…
Reference in New Issue