Initial bi-install shared code. Does not identify the starting location of the relocatable code at this time.

This commit is contained in:
Rob Greene 2015-10-08 19:27:23 -05:00
parent d6877dbe77
commit 673208720b
2 changed files with 147 additions and 0 deletions

130
shared/bi-install.asm Normal file
View File

@ -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

17
shared/bi-install.config Normal file
View File

@ -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;
}