source: avrstuff/CPC stuff/cpc_serial_2313/code/main.asm@ 741c0b9

main
Last change on this file since 741c0b9 was 741c0b9, checked in by Adrien Destugues <pulkomandy@…>, 14 years ago

Some optimizations to get faster interrupts
Some comments in main to tell what it should be doing

git-svn-id: svn://pulkomandy.tk/avrstuff@28 c6672c3c-f6b6-47f9-9001-1fd6b12fecbe

  • Property mode set to 100644
File size: 3.5 KB
Line 
1; ---------------------------------------------------------------
2; Copyright 2010, Adrien Destugues <pulkomandy@pulkomandy.ath.cx>
3; Distributed under the terms of the MIT Licence
4.INCLUDE "2313def.inc"
5
6; Firmware for µSerial expansion board
7
8.EQU ALL_OUT = 255
9.EQU ALL_IN = 0
10
11.EQU DATADIR = DDRB
12.EQU DATAOUT = PORTB
13.EQU DATAIN = PINB
14
15.EQU CTRLIN = PIND
16.EQU A0 = PIND4
17
18.EQU curregbak = SRAM_START
19
20; REGISTERS ALLOCATION
21; R0 = 255 used in interrupt handler for fast switching of DATADIR
22; X (R27 & R26) used in interrupt for fast addressing of regs
23
24.CSEG
25; Vectors
26; reset
27 RJMP init
28; int0
29 RJMP cpc_write
30; int1
31 RJMP cpc_read
32; ...
33
34; Interrupt vectors for external INT pins (read and write).
35; we have to react very quick.
36; A read operation for the CPC lasts 3 clock cycles at 4MHz, that's 15
37; AVR cycles. But the interrupt latency is as follow :
38; Lowlevel detection ; 2 cycles
39; End of running instruction ; up to 2 cycles
40; Save PC ; 4 cycles
41;Vector RJMP ; 2 cycles
42 ; TOTAL => 10 cycles
43
44; --- READ INTERRUPT ---
45cpc_read:
46; That means we only have 5 cycles left to output the value on the BUS!
47; We have no time to do anything, so we assume that X is already pointing at
48; the right place and we just OUT it to the data port. We have no time for
49; PUSHing and loading it, anyway.
50
51; Note you can read from either port and get the same result. Two reasons to
52; that : you can already access all the registers and part of the SRAM,
53; and there's no time to do something more clever.
54
55; There is no time to push/pop regs, so we just use X as is. R27 is part of X.
56
57; We assume X (R26:R27) points to the current reg
58; So we can load it and react fast enough to the interrupt
59 OUT DATADIR,R16 ; 1
60 LD R27,X ; 2 cycles ; peut être économisé si un reg. contient
61 ; déjà la valeur à envoyer
62 ; (mais qui l'update ?)
63 OUT DATAOUT, R27 ; 1 cycle
64
65; Here data is sent, the CPC read operation is handled.
66; We now wait for the end of the read cycle.
67; This is not the end of the time-constrained nightmare, however :
68; In the worst case, the CPC can do another OUT or IN right after,
69; so we don't have an infinite number of cycles to handle the interrupt.
70; it is much more relaxed, as we have 12 CPC cycles = 60 AVR cycles free.
71
72; Restore R27
73 LDS R27,curregbak
74
75; release the bus
76 LDI R16,ALL_IN
77 OUT DATADIR, R16
78 LDI R16,ALL_OUT
79
80; Restore R27 to selected reg. (we erased it to do the OUT)
81 RETI
82
83
84; --- WRITE INTERRUPT ---
85cpc_write:
86; The timing is a bit less constraining here.
87 PUSH R0 ; 2 cycles
88 IN R0,DATAIN ; 1
89; we also need to know A0 state...
90 SBIS CTRLIN,A0 ; 1
91 ; This was actually a reg select operation!
92 ; Jump to the proper code
93 RJMP regSel
94; We have read the CPC data. End of the heavy-constraint area
95
96; Register write
97 ST X,R0 ; Normal register write
98 RJMP intEnd
99
100regSel:
101 STS curregbak,R0
102 MOV R27,R0
103
104intEnd:
105 POP R0
106 RETI
107
108
109; --- RESET VECTOR ---
110; Here we perform the hardware initialization.
111; At a bare minimum :
112; * Set up the INT0 and INT1 so the CPC can do the rest of the setup itself
113init:
114 ; setup ctrl port : RW and A0 as inputs, INT as output
115 ; led on (will be turned off by software at init)
116 ; init serial port speed and io
117 ; check for bootloader jumper and jump to bootload code if needed
118
119 SEI
120mainloop:
121 ; maybe we will have to handle a buffer for the serial port
122 ; and 'fake' registers in SRAM
123
124 SLEEP
125 RJMP mainloop
Note: See TracBrowser for help on using the repository browser.