1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-18 00:07:21 +00:00
cc65/libsrc/lynx/upload.s

156 lines
3.2 KiB
ArmAsm
Raw Normal View History

; ***
; 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