source: avrstuff/CPC stuff/cpc_serial_2313/code/main.asm@ 1dc9759

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

Add a circuit folder for kicad stuff
Initial (very early) version of the code

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

  • Property mode set to 100644
File size: 2.8 KB
Line 
1; ---------------------------------------------------------------
2; Copyright 2010, Adrien Destugues <pulkomandy@pulkomandy.ath.cx>
3; Distributed under the terms of the MIT Licence
4
5; Firmware for µSerial expansion board
6
7; Vectors
8; reset
9; int0
10 RJMP cpc_write
11; int1
12 RJMP cpc_read
13; ...
14
15; Interrupt vectors for external INT pins (read and write).
16; we have to react very quick.
17; A read operation for the CPC lasts 3 clock cycles at 4MHz, that's 15
18; AVR cycles. But the interrupt latency is as follow :
19; Lowlevel detection ; 2 cycles
20; End of running instruction ; up to 2 cycles
21; Save PC ; 4 cycles
22;Vector RJMP ; 2 cycles
23 ; TOTAL => 10 cycles
24
25; --- READ INTERRUPT ---
26cpc_read
27; That means we only have 5 cycles left to output the value on the BUS!
28; We have no time to do anything, so we assume that X is already pointing at
29; the right place and we just OUT it to the data port. We have no time for
30; PUSHing and loading it, anyway.
31
32; Note you can read from either port and get the same result. Two reasons to
33; that : you can already access all the registers and part of the SRAM,
34; and there's no time to do something more clever.
35
36; There is no time to push/pop regs, so we just use X as is. R27 is part of X.
37
38; We assume X (R26:R27) points to the current reg
39; So we can load it and react fast enough to the interrupt
40 LDI R0,ALL_OUT ; 1 ; peut être économisé si on sacrifie un reg
41 OUT DATADIR,R0 ; 1
42 LD R27,(X) ; 2 cycles ; peut être économisé si un reg. contient
43 ; déjà la valeur à envoyer
44 ; (mais qui l'update ?)
45 OUT DATA, R27 ; 1 cycle
46
47; Here data is sent, the CPC read operation is handled.
48; We now wait for the end of the read cycle.
49; This is not the end of the time-constrained nightmare, however :
50; In the worst case, the CPC can do another OUT or IN right after,
51; so we don't have an infinite number of cycles to handle the interrupt.
52; it is much more relaxed, as we have 12 CPC cycles = 60 AVR cycles free.
53
54; Restore R27
55 LD R27,curregbak
56 LD R27,(X)
57
58; release the bus
59 LDI R0,ALL_IN
60 OUT DATADIR, R0
61
62; Restore R27 to selected reg. (we erased it to do the OUT)
63 RETI
64
65; --- WRITE INTERRUPT ---
66cpc_write
67; The timing is a bit less constraining here.
68 PUSH R0
69 IN R0,DATA
70; we also need to know A0 state...
71 SBIS CTRL,A0
72 ; This was actually a reg select operation!
73 ; Jump to the proper code
74 RJMP regSel
75; We have read the CPC data. End of the heavy-constraint area
76
77; Register write
78 ST X,R0 ; Normal register write
79 RJMP intEnd
80
81regSel
82 LD R27,curregbak
83 ST (X),R0
84 MOV R27,R0
85
86 POP R0
87 RETI
88
89
90; --- RESET VECTOR ---
91; Here we perform the hardware initialization.
92; At a bare minimum :
93; * Set up the INT0 and INT1 so the CPC can do the rest of the setup itself
Note: See TracBrowser for help on using the repository browser.