Files
SyncHome/trunk/AVRProjects/AVR_6502/Daryl_1284p/AVRSource/bootload.asm
2023-03-13 09:01:12 +00:00

250 lines
7.6 KiB
NASM

;
; AVR Bootloader
;
.org 0xF000
;******************************************************************************
; Code Begins at 0xF000
; System IRQ jump table from 0xF000 - 0xF045
;******************************************************************************
jmp RESET ; External Reset
ldi irv, 0x02
rjmp INT0V ; External Interrupt Request 0
ldi irv, 0x04
rjmp INT1V ; External Interrupt Request 1
ldi irv, 0x06
rjmp INT2V ; External Interrupt Request 2
ldi irv, 0x08
rjmp PCINT0V ; Pin Change Interrupt Request 0
ldi irv, 0x0a
rjmp PCINT1V ; Pin Change Interrupt Request 1
ldi irv, 0x0c
rjmp PCINT2V ; Pin Change Interrupt Request 2
ldi irv, 0x0e
rjmp PCINT3V ; Pin Change Interrupt Request 3
ldi irv, 0x10
rjmp WDT ; Watchdog Time-out Interrupt
ldi irv, 0x12
rjmp TIMER2_COMPA ; Timer/Counter2 Compare Match A
ldi irv, 0x14
rjmp TIMER2_COMPB ; Timer/Counter2 Compare Match B
ldi irv, 0x16
rjmp TIMER2_OVF ; Timer/Counter2 Overflow
ldi irv, 0x18
rjmp TIMER1_CAPT ; Timer/Counter1 Capture Event
ldi irv, 0x1a
rjmp TIMER1_COMPA ; Timer/Counter1 Compare Match A
ldi irv, 0x1c
rjmp TIMER1_COMPB ; Timer/Counter1 Compare Match B
ldi irv, 0x1e
rjmp TIMER1_OVF ; Timer/Counter1 Overflow
ldi irv, 0x20
rjmp TIMER0_COMPA ; Timer/Counter0 Compare Match A
ldi irv, 0x22
rjmp TIMER0_COMPB ; Timer/Counter0 Compare match B
ldi irv, 0x24
rjmp TIMER0_OVF ; Timer/Counter0 Overflow
ldi irv, 0x26
rjmp SPI_STC ; SPI Serial Transfer Complete
ldi irv, 0x28
rjmp USART0_RX ; USART0 Rx Complete
ldi irv, 0x2a
rjmp USART0_UDRE ; USART0 Data Register Empty
ldi irv, 0x2c
rjmp USART0_TX ; USART0 Tx Complete
ldi irv, 0x2e
rjmp ANALOG_COMP ; Analog Comparator ldi irv, 0x01
ldi irv, 0x30
rjmp ADCC ; ADC Conversion Complete
ldi irv, 0x32
rjmp EE_READY ; EEPROM Ready
ldi irv, 0x34
rjmp TWI ; 2-wire Serial Interface
ldi irv, 0x36
rjmp SPM_READY ; Store Program Memory Ready
ldi irv, 0x38
rjmp USART1_RX ; USART1 Rx Complete
ldi irv, 0x3a
rjmp USART1_UDRE ; USART1 Data Register Empty
ldi irv, 0x3c
rjmp USART1_TX ; USART1 Tx Complete
ldi irv, 0x3e
rjmp TIMER3_CAPT ; Timer/Counter3 Capture Event
ldi irv, 0x40
rjmp TIMER3_COMPA ; Timer/Counter3 Compare Match A
ldi irv, 0x42
rjmp TIMER3_COMPB ; Timer/Counter3 Compare Match B
ldi irv, 0x44
rjmp TIMER3_OVF ; Timer/Counter3 Overflow
;******************************************************************************
; unused IRQ vector's point to software reset code
;******************************************************************************
INT0V: ; External Interrupt Request 0
INT1V: ; External Interrupt Request 1
INT2V: ; External Interrupt Request 2
PCINT0V: ; Pin Change Interrupt Request 0
PCINT1V: ; Pin Change Interrupt Request 1
PCINT2V: ; Pin Change Interrupt Request 2
PCINT3V: ; Pin Change Interrupt Request 3
WDT: ; Watchdog Time-out Interrupt
TIMER2_COMPA: ; Timer/Counter2 Compare Match A
TIMER2_COMPB: ; Timer/Counter2 Compare Match B
TIMER2_OVF: ; Timer/Counter2 Overflow
TIMER1_CAPT: ; Timer/Counter1 Capture Event
TIMER1_COMPA: ; Timer/Counter1 Compare Match A
TIMER1_COMPB: ; Timer/Counter1 Compare Match B
TIMER1_OVF: ; Timer/Counter1 Overflow
TIMER0_COMPA: ; Timer/Counter0 Compare Match A
TIMER0_COMPB: ; Timer/Counter0 Compare match B
TIMER0_OVF: ; Timer/Counter0 Overflow
SPI_STC: ; SPI Serial Transfer Complete
USART0_RX: ; USART0 Rx Complete
USART0_UDRE: ; USART0 Data Register Empty
USART0_TX: ; USART0 Tx Complete
ANALOG_COMP: ; Analog Comparator
ADCC: ; ADC Conversion Complete
EE_READY: ; EEPROM Ready
TWI: ; 2-wire Serial Interface
SPM_READY: ; Store Program Memory Ready
USART1_RX: ; USART1 Rx Complete
USART1_UDRE: ; USART1 Data Register Empty
USART1_TX: ; USART1 Tx Complete
TIMER3_CAPT: ; Timer/Counter3 Capture Event
TIMER3_COMPA: ; Timer/Counter3 Compare Match A
TIMER3_COMPB: ; Timer/Counter3 Compare Match B
TIMER3_OVF: ; Timer/Counter3 Overflow
; master IRQ handler
or IFLAG, one ; IRQ trigger flag, bit 0
ret ; do not set I flag here
;******************************************************************************
; Program Starts here on Reset
;******************************************************************************
RESET: ; first line executed after reset
CLI ; disable interupts
; move IRQ table to bootloader
in i, mcucr
andi i, 0xfc
mov j, i
ori i, 0x01
ori j, 0x02
out mcucr, i
out mcucr, j ; IRQ jump table in bootloader
;******************************************************************************
; Initialize the I/O Ports
;******************************************************************************
; port A pins
ldi i, 0xff ;
out porta, i ;
LDI i, 0x00 ;
out ddra, i ;
; port B pins
LDI i, 0xff ;
out portb, i ;
LDI i, 0x00 ;
out ddrb, i ;
; port C pins
ldi i, 0xff ;
out portc, i ;
LDI i, 0x00 ;
out ddrc, i ;
; port D pins
ldi i, 0xff ;
out portd, i ;
LDI i, 0x00 ;
out ddrd, i ;
;******************************************************************************
; Init other CPU I/O registers
;******************************************************************************
ldi i, 0x80
out ACSR, i ; turn off comparator
ldi i, 0x40 ; set stack pointer to top of SRAM
out SPH, i ;
ldi i, 0xff ;
out SPL, i ;
;******************************************************************************
; Init RS-232 port
;******************************************************************************
.include "serial.asm"
;******************************************************************************
; Init program registers
;******************************************************************************
clr zero
ldi i, 0x01
mov one, i
;******************************************************************************
; Boot Loader Prompts
;******************************************************************************
Boot:
out rampz, one
ldi zl, low(greet*2)
ldi zh, high(greet*2)
clr R24
clr R25
clr R26
Boot1:
elpm i, Z+
tst i
breq Boot2
call Put_Chr
rjmp Boot1
Boot2: ; autostart EMU
adiw R24, 0x01 ; after 24 bit counter
brne Boot3 ; cycles
inc R26
breq Boot4
mov i, R26
andi i, 0x1F
brne Boot3
ldi i, '.'
call Put_Chr
Boot3:
lds i, udr0
cpi i, 0x0d
breq Boot4
cpi i, 'u'
breq Load
cpi i, 'U'
breq Load
cpi i, '|'
brne Boot2
clr zsav ; set start address for Emulator
clr zsavh ; engine and ROM image
ldi i, 0x36 ; start of Datatables
mov zsavh, i
call Xmodem1
rjmp Boot ; load Emu Engine
Load:
call xmodem ; load ROM image
rjmp Boot
Boot4:
out rampz, zero
jmp Startup
;******************************************************************************
; Text messages (version from AVR6502.asm)
;******************************************************************************
greet:
.db 0x0d, 0x0a, "********************************* ", 0x0d, 0x0a
.db "AVR 65C02 Emulator ", 0x0d, 0x0a, "By Daryl Rictor (c) 2013", 0x0d, 0x0a, 0x0d, 0x0a
.db "Press Enter to Start System", 0x0d, 0x0a, "Press 'U' to upload new ROM image ", 0x0d, 0x0a, 0x00