New uploader that can be hiding in top of memory waiting for a BLL-kind of
loadable application over the ComLynx serial port. By Karri Kaksonen. git-svn-id: svn://svn.cc65.org/cc65/trunk@4982 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -64,7 +64,8 @@ OBJS = bllhdr.o \
|
|||||||
oserror.o \
|
oserror.o \
|
||||||
read.o \
|
read.o \
|
||||||
sysuname.o \
|
sysuname.o \
|
||||||
toascii.o
|
toascii.o \
|
||||||
|
uploader.o
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# Drivers
|
# Drivers
|
||||||
|
|||||||
79
libsrc/lynx/uploader.s
Normal file
79
libsrc/lynx/uploader.s
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
.include "lynx.inc"
|
||||||
|
.include "extzp.inc"
|
||||||
|
.interruptor _UpLoaderIRQ
|
||||||
|
.export __UPLOADER__: absolute = 1
|
||||||
|
|
||||||
|
load_len=_FileDestAddr
|
||||||
|
load_ptr=_FileFileLen
|
||||||
|
load_ptr2=_FileCurrBlock
|
||||||
|
|
||||||
|
.segment "UPCODE"
|
||||||
|
|
||||||
|
ComLynxReadAndExec:
|
||||||
|
ldy #4
|
||||||
|
loop0:
|
||||||
|
jsr read_byte
|
||||||
|
sta load_len-1,y
|
||||||
|
dey
|
||||||
|
bne loop0 ; get destination and length
|
||||||
|
tax ; lowbyte of length
|
||||||
|
|
||||||
|
lda load_ptr
|
||||||
|
sta load_ptr2
|
||||||
|
lda load_ptr+1
|
||||||
|
sta load_ptr2+1
|
||||||
|
|
||||||
|
loop1:
|
||||||
|
inx
|
||||||
|
bne cont1
|
||||||
|
inc load_len+1
|
||||||
|
bne cont1
|
||||||
|
jmp (load_ptr)
|
||||||
|
|
||||||
|
cont1:
|
||||||
|
jsr read_byte
|
||||||
|
sta (load_ptr2),y
|
||||||
|
sta PALETTE ; feedback ;-)
|
||||||
|
iny
|
||||||
|
bne loop1
|
||||||
|
inc load_ptr2+1
|
||||||
|
bra loop1
|
||||||
|
|
||||||
|
read_byte:
|
||||||
|
bit SERCTL
|
||||||
|
bvc read_byte
|
||||||
|
lda SERDAT
|
||||||
|
rts
|
||||||
|
|
||||||
|
_UpLoaderIRQ:
|
||||||
|
lda INTSET
|
||||||
|
and #$10
|
||||||
|
bne @L0
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
@L0:
|
||||||
|
lda SERDAT ; wait for the start sequence
|
||||||
|
bit flag ; already seen $81 ?
|
||||||
|
bpl again ; >= 0 => no
|
||||||
|
cmp #$50 ; "P" ?
|
||||||
|
bne again ; not correct, so clear flag
|
||||||
|
sei
|
||||||
|
jmp ComLynxReadAndExec
|
||||||
|
|
||||||
|
again:
|
||||||
|
stz flag
|
||||||
|
cmp #$81
|
||||||
|
bne exit
|
||||||
|
sta flag
|
||||||
|
;
|
||||||
|
; last action : clear interrupt
|
||||||
|
;
|
||||||
|
exit:
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.segment "UPDATA"
|
||||||
|
|
||||||
|
flag:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
48
src/ld65/cfg/lynx-uploader.cfg
Normal file
48
src/ld65/cfg/lynx-uploader.cfg
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
SYMBOLS {
|
||||||
|
__STACKSIZE__: type = weak, value = $0800; # 2k stack
|
||||||
|
__STARTOFDIRECTORY__: type = weak, value = $00DF; # start just after loader
|
||||||
|
__BLOCKSIZE__: type = weak, value = 1024; # cart block size
|
||||||
|
__EXEHDR__: type = import;
|
||||||
|
__BOOTLDR__: type = import;
|
||||||
|
__DEFDIR__: type = import;
|
||||||
|
__UPLOADER__: type = import;
|
||||||
|
}
|
||||||
|
MEMORY {
|
||||||
|
ZP: file = "", define = yes, start = $0000, size = $0100;
|
||||||
|
HEADER: file = %O, start = $0000, size = $0040;
|
||||||
|
BOOT: file = %O, start = $0200, size = __STARTOFDIRECTORY__;
|
||||||
|
DIR: file = %O, start = $0000, size = 8;
|
||||||
|
RAM: file = %O, define = yes, start = $0200, size = $BD38 - __STACKSIZE__;
|
||||||
|
UPLDR: file = %O, define = yes, start = $BFDC, size = $005C;
|
||||||
|
}
|
||||||
|
SEGMENTS {
|
||||||
|
EXEHDR: load = HEADER, type = ro;
|
||||||
|
BOOTLDR: load = BOOT, type = ro;
|
||||||
|
DIRECTORY:load = DIR, type = ro;
|
||||||
|
STARTUP: load = RAM, type = ro, define = yes;
|
||||||
|
LOWCODE: load = RAM, type = ro, optional = yes;
|
||||||
|
INIT: load = RAM, type = ro, define = yes, optional = yes;
|
||||||
|
CODE: load = RAM, type = ro, define = yes;
|
||||||
|
RODATA: load = RAM, type = ro, define = yes;
|
||||||
|
DATA: load = RAM, type = rw, define = yes;
|
||||||
|
BSS: load = RAM, type = bss, define = yes;
|
||||||
|
UPCODE: load = UPLDR, type = ro, define = yes;
|
||||||
|
UPDATA: load = UPLDR, type = rw, define = yes;
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
EXTZP: load = ZP, type = zp, optional = yes;
|
||||||
|
APPZP: load = ZP, type = zp, optional = yes;
|
||||||
|
}
|
||||||
|
FEATURES {
|
||||||
|
CONDES: segment = INIT,
|
||||||
|
type = constructor,
|
||||||
|
label = __CONSTRUCTOR_TABLE__,
|
||||||
|
count = __CONSTRUCTOR_COUNT__;
|
||||||
|
CONDES: segment = RODATA,
|
||||||
|
type = destructor,
|
||||||
|
label = __DESTRUCTOR_TABLE__,
|
||||||
|
count = __DESTRUCTOR_COUNT__;
|
||||||
|
CONDES: segment = RODATA,
|
||||||
|
type = interruptor,
|
||||||
|
label = __INTERRUPTOR_TABLE__,
|
||||||
|
count = __INTERRUPTOR_COUNT__;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user