mirror of
https://github.com/cc65/cc65.git
synced 2024-11-18 15:05:14 +00:00
New upload module
git-svn-id: svn://svn.cc65.org/cc65/trunk@3254 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
ca1cefa000
commit
c2f003449d
@ -35,7 +35,8 @@
|
||||
|
||||
OBJS = crt0.o \
|
||||
eeprom.o \
|
||||
framerate.o
|
||||
framerate.o \
|
||||
upload.o
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Drivers
|
||||
|
155
libsrc/lynx/upload.s
Normal file
155
libsrc/lynx/upload.s
Normal file
@ -0,0 +1,155 @@
|
||||
; ***
|
||||
; CC65 Lynx Library
|
||||
;
|
||||
; Originally by Bastian Schick
|
||||
; http://www.geocities.com/SiliconValley/Byte/4242/lynx/
|
||||
;
|
||||
; Ported to cc65 (http://www.cc65.org) by
|
||||
; Shawn Jefferson, June 2004
|
||||
;
|
||||
; ***
|
||||
;
|
||||
; void install_uploader(unsigned char divider);
|
||||
;
|
||||
; Installs an interrupt handler that hooks the comlynx rx/tx interrupts to
|
||||
; allow upload of code to the lynx from another computer via the comlynx
|
||||
; cable. divider values are in lynx.h
|
||||
;
|
||||
; Loader is installed under the mikey chip at $FE00.
|
||||
;
|
||||
|
||||
.include "lynx.inc"
|
||||
.export _lynx_install_uploader
|
||||
.import _install_irq
|
||||
.import popa, pusha
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.segment "EXTZP": zeropage
|
||||
|
||||
load_len: .res 2
|
||||
load_ptr: .res 2
|
||||
load_ptr2: .res 2
|
||||
|
||||
|
||||
.code
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; The following code will get moved to $FE00 when installing the uploader.
|
||||
|
||||
.proc Loader
|
||||
|
||||
.org $fe00
|
||||
|
||||
run: 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
|
||||
|
||||
.reloc
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.code
|
||||
|
||||
_lynx_install_uploader:
|
||||
|
||||
ldx #.sizeof(Loader)-1 ; put Loader in the right place
|
||||
loop: lda Loader,x ; x is length of loader
|
||||
sta Loader::run,x
|
||||
dex
|
||||
bpl loop
|
||||
|
||||
;
|
||||
; install serial-irq vector
|
||||
;
|
||||
lda #4
|
||||
jsr pusha
|
||||
lda #<UpLoader
|
||||
ldx #>UpLoader
|
||||
jsr _install_irq ; set vector
|
||||
;
|
||||
; set baudrate
|
||||
;
|
||||
jsr popa ; get divider
|
||||
sta $fd10
|
||||
lda #%00011000 ; Baudrate = 1MHz/16/(divider+1)
|
||||
sta $fd11
|
||||
;
|
||||
; set ComLynx parameters
|
||||
;
|
||||
lda #%00011101 ; even par
|
||||
sta SERCTL ; set 8E1
|
||||
;
|
||||
; clear Rx-buffer
|
||||
;
|
||||
clear: bit SERCTL
|
||||
bvc ok0
|
||||
ldx SERDAT
|
||||
bra clear
|
||||
;
|
||||
; enable Rx-interrupt
|
||||
;
|
||||
ok0: ora #$40
|
||||
sta SERCTL
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Rx-IRQ-handler
|
||||
|
||||
UpLoader:
|
||||
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
|
||||
jmp Loader::run
|
||||
|
||||
again: stz flag
|
||||
cmp #$81
|
||||
bne exit
|
||||
sta flag
|
||||
;
|
||||
; last action : clear interrupt
|
||||
;
|
||||
exit: lda #$10
|
||||
sta INTRST
|
||||
rts
|
||||
|
||||
|
||||
.data
|
||||
|
||||
flag: .byte 0
|
||||
|
Loading…
Reference in New Issue
Block a user