265 lines
8.0 KiB
NASM
265 lines
8.0 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
|
|
;******************************************************************************
|
|
; set baud rate
|
|
ldi i, 0x0C ;
|
|
; 16MHZ 20MHZ 24MHz
|
|
ldi j, 0x00 ; 115200 xxxx 000A 000C
|
|
sts UBRR0H, j ; 19200 0033 0040 004D
|
|
sts UBRR0L, i ; 9600 0067 0081 009B
|
|
; 4800 00CF 0103 0137
|
|
; 2400 019F 0208 0270
|
|
|
|
; Enable receiver and transmitter
|
|
ldi i, (1<<RXEN0)|(1<<TXEN0)
|
|
sts UCSR0B, i
|
|
|
|
; Set frame format: 8data, 1stop bit
|
|
ldi i, (3<<UCSZ00)
|
|
sts UCSR0C, i
|
|
|
|
;******************************************************************************
|
|
; 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
|