rendered paste body.include "m169def.inc"
.cseg
.org 0x0000
jmp start
.org 0x000A
jmp int_T2
start:
ldi r16, 0x00 //STACKINIT
out SPL, r16
ldi r16, 0x04
out SPH, r16
call init_disp
cli ; globální zakázání p?erušení
ldi r16, 0b00001000
sts ASSR, r16 ; vyber hodiny od
; krystalového
; oscilátoru 32768 Hz
ldi r16, 0b00000001
sts TIMSK2, r16 ; povolení p?erušení
; od e`asovae`e 2
ldi r16, 0b00000101
sts TCCR2A, r16 ; ti`nspuší e`ítae`e s
; di`licím pomi`rem 128
clr r16 ; zákaz p?erušení od joysticku
sts EIMSK, r16
sei ; globální povolení p?erušení
in r17, DDRE
andi r17, 0b11110011
in r16, PORTE
ori r16, 0b00001100
out DDRE, r17
out PORTE, r16
ldi r16, 0b00000000
sts DIDR1, r16
in r17, DDRB
andi r17, 0b00101111
in r16, PORTB
ori r16, 0b11010000
out DDRB, r17
out PORTB, r16
monitor:
call cekej
call cekej
call cekej
call sejmi_polohu
jmp monitor
sejmi_polohu:
in r16, PINE
in r17, PINB
add r16, r17
in r18, PINE
in r19, PINB
add r18, r19
cp r16, r18
breq pravo
ret
pravo:
andi r16, 0b00001000
cpi r16,0
brne levo
ldi r16,'R'
ldi r18,2
call show_char
jmp monitor
levo:
in r16, PINE
andi r16, 0b00000100
cpi r16,0
brne nahoru
ldi r16,'L'
ldi r18,2
call show_char
jmp monitor
nahoru:
in r16, PINB
andi r16, 0b01000000
cpi r16,0
brne dolu
ldi r16,'U'
ldi r18,2
call show_char
jmp monitor
dolu:
in r16, PINB
andi r16, 0b10000000
cpi r16,0
brne enter
ldi r16,'D'
ldi r18,2
call show_char
jmp monitor
enter:
in r16, PINB
andi r16, 0b00010000
cpi r16,0
brne nic
ldi r16,'E'
ldi r18,2
call show_char
jmp monitor
nic:
ldi r16,'N'
ldi r18,2
call show_char
nop
jmp monitor
cekej:
push r19
ldi r19, 255
sm: dec r19
cpi r19,0
breq konec_sm
jmp sm
konec_sm:
pop r19
ret
konec: jmp konec
int_T2:
show_char:
//zasobnik
push r28
push r29
push r30
push r31
push r17
push r19
push r18
push r16
in r28, SPL //uloz do Y stackpointer
in r29, SPH
ldd r16,Y+1 //nahraj ze zasobniku znak
ldd r18,Y+2 //nahraj ze zasobniku pozici
//znaky+4 * ( ASCII('A') ľ 42 )
//odecti 42
subi r16,42
//vynasob * 4
clr r17
lsl r16 //low
rol r17 //high
lsl r16
rol r17
//+znaky
ldi r30, low(znaky<<1)
ldi r31, high(znaky<<1)
ldi r28, low(LCDDR0) // ovladaci bity display
ldi r29, high(LCDDR0)
add r16, r30 //prictu znaky+pozice v tabulce
adc r17, r31
mov r30, r16 //presunu do Z
mov r31, r17
//pozice
subi r18,2 //disp zacina na druhe pozici - odectu 2
// ktera pozice ze dvou? vydelit dvema, suda licha?
lsr r18 //deli dvema
brlo horni //podle zbytku - CARRY skßŔe
dolni:
clr r19
add r28, r18 //pozice + LCDDR0
adc r29, r19
ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß horni nibble dolni vycisti
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0
adiw Y,5// - dalsi cast segmentu
ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß puvodni bity
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0
adiw Y,5
ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß puvodni bity
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0
adiw Y,5
ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß puvodni bity
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0
jmp konec_zobr
horni:
clr r19
add r28, r18
adc r29, r19
//nacti ulozene bity
ld r18, Y // nacti zobrazene hodnoty
andi r18,0x0F //r18 and 00001111 zachovß dolni nibble, horni vymaze
lpm r0, Z+ // nacti z tabulky znaku
swap r0 // prohod nibbly
add r0, r18 //secti puvodni a novy
st Y,r0
adiw Y,5 //posunu na dalsi cast segmentu
ld r18, Y
andi r18,0x0F
lpm r0, Z+
swap r0
add r0, r18
st Y,r0
adiw Y,5
ld r18, Y
andi r18,0x0F
lpm r0, Z+
swap r0
add r0, r18
st Y,r0
adiw Y,5
ld r18, Y
andi r18,0x0F
lpm r0, Z+
swap r0
add r0, r18
st Y,r0
konec_zobr:
pop r16
pop r18
pop r19
pop r17
pop r31
pop r30
pop r29
pop r28
ret
clear_disp:
ldi r21,0x00
sts LCDDR0,r21
sts LCDDR1,r21
sts LCDDR2,r21
sts LCDDR3,r21
sts LCDDR0+5,r21
sts LCDDR1+5,r21
sts LCDDR2+5,r21
sts LCDDR3+5,r21
sts LCDDR0+10,r21
sts LCDDR1+10,r21
sts LCDDR2+10,r21
sts LCDDR3+10,r21
sts LCDDR0+15,r21
sts LCDDR1+15,r21
sts LCDDR2+15,r21
sts LCDDR3+15,r21
ret
init_disp:
ldi r16, 0xB7
sts LCDCRB, r16
ldi r16, 0x10
sts LCDFRR, r16
ldi r16, 0x0F
sts LCDCCR, r16
ldi r16, 0x80
sts LCDCRA, r16
ret
;*********************************************************
;
; Tabulka tvaru znaku pro AVR Butterfly
;
;*********************************************************
;
znaky: ; znaky ASCII tabulky od kodu 42 (*) do kodu 95 (_)
; platna je vzdy spodni polovina bitu
; prvni bajt: 0 0 0 0 K 0 0 A
; druhy bajt: 0 0 0 0 J F H B
; treti bajt: 0 0 0 0 L E G C
; ctvrty bajt: 0 0 0 0 M P N D
.db 0x08, 0x0A, 0x0A, 0x0E ; *
.db 0x00, 0x08, 0x0A, 0x02 ; +
.db 0x00, 0x00, 0x00, 0x00 ; , (nedefinovano)
.db 0x00, 0x00, 0x0A, 0x00 ; -
.db 0x01, 0x05, 0x0A, 0x00 ; .
.db 0x08, 0x00, 0x00, 0x04 ; /
.db 0x09, 0x05, 0x05, 0x05 ; 0
.db 0x08, 0x01, 0x01, 0x00 ; 1
.db 0x01, 0x01, 0x0E, 0x01 ; 2
.db 0x01, 0x01, 0x0B, 0x01 ; 3
.db 0x00, 0x05, 0x0B, 0x00 ; 4
.db 0x01, 0x04, 0x0B, 0x01 ; 5
.db 0x01, 0x04, 0x0F, 0x01 ; 6
.db 0x01, 0x01, 0x01, 0x00 ; 7
.db 0x01, 0x05, 0x0F, 0x01 ; 8
.db 0x01, 0x05, 0x0B, 0x01 ; 9
.db 0x00, 0x00, 0x00, 0x00 ; : (nedefinovano)
.db 0x00, 0x00, 0x00, 0x00 ; ; (nedefinovano)
.db 0x08, 0x00, 0x00, 0x08 ; <
.db 0x00, 0x00, 0x0A, 0x01 ; =
.db 0x00, 0x02, 0x00, 0x04 ; >
.db 0x00, 0x00, 0x00, 0x00 ; ? (nedefinovano)
.db 0x00, 0x00, 0x00, 0x00 ; @ (nedefinovano)
.db 0x01, 0x05, 0x0F, 0x00 ; A
.db 0x01, 0x09, 0x09, 0x03 ; B
.db 0x01, 0x04, 0x04, 0x01 ; C
.db 0x01, 0x09, 0x01, 0x03 ; D
.db 0x01, 0x04, 0x0E, 0x01 ; E
.db 0x01, 0x04, 0x0E, 0x00 ; F
.db 0x01, 0x04, 0x0D, 0x01 ; G
.db 0x00, 0x05, 0x0F, 0x00 ; H
.db 0x00, 0x08, 0x00, 0x02 ; I
.db 0x00, 0x01, 0x05, 0x01 ; J
.db 0x08, 0x04, 0x06, 0x08 ; K
.db 0x00, 0x04, 0x04, 0x01 ; L
.db 0x08, 0x07, 0x05, 0x00 ; M
.db 0x00, 0x07, 0x05, 0x08 ; N
.db 0x01, 0x05, 0x05, 0x01 ; O
.db 0x01, 0x05, 0x0E, 0x00 ; P
.db 0x01, 0x05, 0x05, 0x09 ; Q
.db 0x01, 0x05, 0x0E, 0x08 ; R
.db 0x01, 0x02, 0x00, 0x09 ; S
.db 0x01, 0x08, 0x00, 0x02 ; T
.db 0x00, 0x05, 0x05, 0x01 ; U
.db 0x08, 0x04, 0x04, 0x04 ; V
.db 0x00, 0x05, 0x05, 0x0C ; W
.db 0x08, 0x02, 0x00, 0x0C ; X
.db 0x08, 0x02, 0x00, 0x02 ; Y
.db 0x09, 0x00, 0x00, 0x05 ; Z
.db 0x01, 0x04, 0x04, 0x01 ; [
.db 0x00, 0x02, 0x00, 0x08 ; \
.db 0x01, 0x01, 0x01, 0x01 ; ]
.db 0x00, 0x00, 0x00, 0x00 ; ^ (nedefinovano)
.db 0x00, 0x00, 0x00, 0x01 ; _
.db 0x09, 0x0F, 0x0F, 0x0F ; vse
;----------------------------------------