#PIC V0.9.2 (c)1997 J.Petroglou	LIST FILE
#file: data:aminetupp/PICSim/examples/Amikeyterm.src
#date: Sat May 10 15:11:49 1997
#pic : PIC16C84

ADDR CODE	 SRCLINE SOURCECODE

0000             000001 
0000             000002 
0000             000003 ;PIC16C84 keybord controller for Amiga keybords
0000             000004 ;pressed keys are located in table and send in serial ascii format (19200baud)
0000             000005 ;
0000             000006 ;Dirk Duesterberg duesterb@unixserv.rz.fh-hannover.de
0000             000007 ;                 http://linux.rz.fh-hannover.de/~duesterb
0000             000008 
0000             000009 
0000             000010 	list	p=PIC16C84, r=dec, s=off
0000             000011 

#include 'ram:p16cxx.inc' start
0000             000001 	LIST
0000             000002 ; P16CXX.INC  Standard PICAsm Header File
0000             000070 	LIST
#include end.

0000             000013 
0000             000014 
0000             000015 #define	ACLK	PortA,0
0000             000016 #define	ADAT	PortA,1
0000             000017 
0000             000018 #define	TXD	PortA,2
0000             000019 #define c	3,0
0000             000020 #define z	3,2
0000             000021 
0000             000022 RA	=	5		;PortA is register 5
0000             000023 
0000             000024 
0000             000025 
0000             000026 
0000             000027 	CBLOCK	0ch
0000             000028 
0000             000028 
0000             000029 	   count0
0000             000030 	   count1
0000             000031 	   Akeydat
0000             000032 	   serbuf
0000             000033 
0000             000033 
0000             000034 	ENDC
0000             000035 
0000             000036 
0000             000037 
0000 30FB        000038 	movlw	11111011b		;pin 2 is output (TXD)
0001 0065        000039 	tris	PortA
0002             000040 
0002 3000        000041 	movlw	0			;PortB is output
0003 0066        000042 	tris	PortB
0004             000043 
0004 2888        000044 	goto	Reset
0005             000045 
0005             000046 
0005             000047 
0005 080E        000048 rawkeys	movf	Akeydat,w
0006 397F        000049 	andlw	7fh			;clr bit 7 (make/break or pressed/unpressed)
0007 0782        000050 	addwf	pcl,f
0008             000051 
0008             000052 
0008             000053 ; characters, numbers and spezial keys
0008             000054 ; $00-$3F
0008             000055 
0008 3400        000056 	retlw	00h			;00h
0009 3400        000057 	retlw	00h			;01h
000A 3400        000058 	retlw	00h			;02h
000B 3400        000059 	retlw	00h			;03h
000C 3400        000060 	retlw	00h			;04h
000D 3400        000061 	retlw	00h			;05h
000E 3400        000062 	retlw	00h			;06h
000F 3400        000063 	retlw	00h			;07h
0010             000064 
0010 3400        000065 	retlw	00h			;08h
0011 3400        000066 	retlw	00h			;09h
0012 3400        000067 	retlw	00h			;0Ah
0013 3400        000068 	retlw	00h			;0Bh
0014 3400        000069 	retlw	00h			;0Ch
0015 3400        000070 	retlw	00h			;0Dh
0016 3400        000071 	retlw	00h			;0Eh	
0017 3400        000072 	retlw	00h			;0Fh
0018             000073 
0018             000074 
0018             000075 
0018 3471        000076 	retlw	"q"			;10h
0019 3477        000077 	retlw	"w"			;11h
001A 3465        000078 	retlw	"e"			;12h
001B 3472        000079 	retlw	"r"			;13h
001C 3474        000080 	retlw	"t"			;14h
001D 347A        000081 	retlw	"z"			;15h
001E 3475        000082 	retlw	"u"			;16h
001F 3469        000083 	retlw	"i"			;17h
0020             000084 
0020 346F        000085 	retlw	"o"			;18h
0021 3470        000086 	retlw	"p"			;19h
0022 FFFFFFFC        000087 	retlw	"ü"			;1Ah
0023 342B        000088 	retlw	"+"			;1Bh
0024 3400        000089 	retlw	00h			;1Ch
0025 3400        000090 	retlw	00h			;1Dh
0026 3400        000091 	retlw	00h			;1Eh
0027 3400        000092 	retlw	00h			;1Fh
0028             000093 
0028             000094 
0028             000095 
0028 3461        000096 	retlw	"a"			;20h
0029 3473        000097 	retlw	"s"			;21h
002A 3464        000098 	retlw	"d"			;22h
002B 3466        000099 	retlw	"f"			;23h
002C 3467        000100 	retlw	"g"			;24h
002D 3468        000101 	retlw	"h"			;25h
002E 346A        000102 	retlw	"j"			;26h
002F 346B        000103 	retlw	"k"			;27h
0030             000104 
0030 346C        000105 	retlw	"l"			;28h
0031 FFFFFFF6        000106 	retlw	"ö"			;29h
0032 FFFFFFE4        000107 	retlw	"ä"			;2Ah
0033 3400        000108 	retlw	00h			;2Bh
0034 3400        000109 	retlw	00h			;2Ch
0035 3400        000110 	retlw	00h			;2Dh
0036 3400        000111 	retlw	00h			;2Eh
0037 3400        000112 	retlw	00h			;2Fh
0038             000113 
0038             000114 
0038             000115 
0038 3400        000116 	retlw	00h			;30h
0039 3400        000117 	retlw	00h			;31h
003A 3400        000118 	retlw	00h			;32h
003B 3400        000119 	retlw	00h			;33h
003C 3400        000120 	retlw	00h			;34h
003D 3400        000121 	retlw	00h			;35h
003E 3400        000122 	retlw	00h			;36h
003F 3400        000123 	retlw	00h			;37h
0040             000124 
0040 3400        000125 	retlw	00h			;38h
0041 3400        000126 	retlw	00h			;39h
0042 3400        000127 	retlw	00h			;3Ah
0043 3400        000128 	retlw	00h			;3Bh
0044 3400        000129 	retlw	00h			;3Ch
0045 3400        000130 	retlw	00h			;3Dh
0046 3400        000131 	retlw	00h			;3Eh
0047 3400        000132 	retlw	00h			;3Fh
0048             000133 
0048             000134 ; other spezial keys (space, TAB, Return)
0048             000135 ; $40-$4F
0048             000136 
0048 3400        000137 	retlw	00h			;40h
0049 3400        000138 	retlw	00h			;41h
004A 3400        000139 	retlw	00h			;42h
004B 3400        000140 	retlw	00h			;43h
004C 3400        000141 	retlw	00h			;44h
004D 3400        000142 	retlw	00h			;45h
004E 3400        000143 	retlw	00h			;46h
004F 3400        000144 	retlw	00h			;47h
0050             000145 
0050 3400        000146 	retlw	00h			;48h
0051 3400        000147 	retlw	00h			;49h
0052 3400        000148 	retlw	00h			;4Ah
0053 3400        000149 	retlw	00h			;4Bh
0054 3400        000150 	retlw	00h			;4Ch
0055 3400        000151 	retlw	00h			;4Dh
0056 3400        000152 	retlw	00h			;4Eh
0057 3400        000153 	retlw	00h			;4Fh
0058             000154 
0058             000155 
0058             000156 ; Function keys, Help etc.
0058             000157 ; $50-$5F
0058             000158 
0058 3400        000159 	retlw	00h			;50h
0059 3400        000160 	retlw	00h			;51h
005A 3400        000161 	retlw	00h			;52h
005B 3400        000162 	retlw	00h			;53h
005C 3400        000163 	retlw	00h			;54h
005D 3400        000164 	retlw	00h			;55h
005E 3400        000165 	retlw	00h			;56h
005F 3400        000166 	retlw	00h			;57h
0060             000167 
0060 3400        000168 	retlw	00h			;58h
0061 3400        000169 	retlw	00h			;59h
0062 3400        000170 	retlw	00h			;5Ah
0063 3400        000171 	retlw	00h			;5Bh
0064 3400        000172 	retlw	00h			;5Ch
0065 3400        000173 	retlw	00h			;5Dh
0066 3400        000174 	retlw	00h			;5Eh
0067 3400        000175 	retlw	00h			;5Fh
0068             000176 
0068             000177 
0068             000178 
0068             000179 ; shifting keys like shift, amiga, Alternate and Control
0068             000180 ; $60-6F
0068             000181 	
0068 3400        000182 	retlw	00h			;60h
0069 3400        000183 	retlw	00h			;61h
006A 3400        000184 	retlw	00h			;62h
006B 3400        000185 	retlw	00h			;63h
006C 3400        000186 	retlw	00h			;64h
006D 3400        000187 	retlw	00h			;65h
006E 3400        000188 	retlw	00h			;66h
006F 3400        000189 	retlw	00h			;67h
0070             000190 
0070 3400        000191 	retlw	00h			;68h
0071 3400        000192 	retlw	00h			;69h
0072 3400        000193 	retlw	00h			;6Ah
0073 3400        000194 	retlw	00h			;6Bh
0074 3400        000195 	retlw	00h			;6Ch
0075 3400        000196 	retlw	00h			;6Dh
0076 3400        000197 	retlw	00h			;6Eh
0077 3400        000198 	retlw	00h			;6Fh
0078             000199 
0078             000200 
0078             000201 ;spezial keybord commandos
0078             000202 ; $70-$7F
0078             000203 
0078 3400        000204 	retlw	00h			;70h	
0079 3400        000205 	retlw	00h			;71h
007A 3400        000206 	retlw	00h			;72h
007B 3400        000207 	retlw	00h			;73h
007C 3400        000208 	retlw	00h			;74h
007D 3400        000209 	retlw	00h			;75h
007E 3400        000210 	retlw	00h			;76h
007F 3400        000211 	retlw	00h			;77h
0080             000212 
0080 3400        000213 	retlw	00h			;78h
0081 3400        000214 	retlw	00h			;79h=F9h= letzter tasten code war fehlerhaft
0082 3400        000215 	retlw	00h			;7Ah=FAh= tastenpuffer im keybord voll
0083 3400        000216 	retlw	00h			;7Bh
0084 3400        000217 	retlw	00h			;7Ch=FCh= selbsttest der tastatur war fehlerhaft
0085 3400        000218 	retlw	00h			;7Dh=FDh= beginn der beim Einschalten gedrueckten Tasten
0086 3400        000219 	retlw	00h			;7Eh=FEh= ende der beim Einschalten gedrueckten Tasten
0087 3400        000220 	retlw	00h			;7Fh
0088             000221 
0088             000222 	
0088             000223 
0088             000224 
0088             000225 
0088             000226 
0088             000227 
0088             000228 
0088             000229 
0088             000230 
0088             000231 
0088             000232 
0088             000233 
0088             000234 
0088             000235 
0088             000236 
0088             000237 
0088             000238 
0088             000239 
0088             000240 
0088             000241 
0088             000242 
0088             000243 
0088             000244 
0088 018E        000245 Reset	clrf	Akeydat			;Akeydat is used as character counter
0089             000246 
0089 300B        000247 check	movlw	11
008A 020E        000248 	subwf	Akeydat,w		;how many characters ?
008B 1903        000249 	btfsc	z
008C 289F        000250 	goto	ready
008D             000251 
008D 2092        000252 	call	dat
008E 008F        000253 	movwf	serbuf
008F 20D6        000254 	call	sendb			;send letter
0090 0A8E        000255 	incf	Akeydat,f
0091 2889        000256 	goto	check
0092             000257 
0092             000258 
0092             000259 
0092 080E        000260 dat	movf	Akeydat,w		;letter to w routine
0093 0782        000261 	addwf	pcl,f			;jump in table
0094 346D        000262 	retlw	"mache RESET"
0095 3461        000262 
0096 3463        000262 
0097 3468        000262 
0098 3465        000262 
0099 3420        000262 
009A 3452        000262 
009B 3445        000262 
009C 3453        000262 
009D 3445        000262 
009E 3454        000262 
009F             000263 
009F             000264 
009F             000265 
009F             000266 
009F             000267 
009F             000268 
009F             000269 
009F 20B2        000270 ready	call	sync
00A0             000271 
00A0             000272 
00A0             000273 
00A0             000274 
00A0 3007        000275 rcAdat	movlw	7
00A1 008C        000276 	movwf	count0
00A2             000277 
00A2 20CD        000278 :loop	call	wACLK			;wait for Amiga CLK
00A3 0D8E        000279 	rlf	Akeydat,f		;rotate bits into register
00A4 0B8C        000280 	decfsz	count0,f
00A5 28A2        000281 	goto	:loop			;format is x6543210
00A6             000282 
00A6             000283 
00A6 0D8E        000284 	rlf	Akeydat,f		;format is 6543210x
00A7 20CD        000285 	call	wACLK			;wait for Amiga CLK
00A8 0C8E        000286 	rrf	Akeydat,f		;format is 76543210, jippije
00A9 098E        000287 	comf	Akeydat,f		;data is inverted
00AA             000288 
00AA 3005        000289 	movlw	5
00AB 20BA        000290 	call	wms			;wait 5 ms
00AC             000291 
00AC             000292 ;	mov	serbuf,Akeydat
00AC             000293 ;	call	sendb			;send raw data
00AC             000294 
00AC             000295 
00AC 2005        000296 	call	rawkeys
00AD 008F        000297 	movwf	serbuf
00AE             000298 
00AE 1F8E        000299 	btfss	Akeydat,7		;no sending if key up flag is set
00AF 20D6        000300 	call	sendb			;send the in table found code
00B0             000301 
00B0 20C3        000302 	call	AHshake			;all data OK, do the Handshake
00B1 28A0        000303 	goto	rcAdat			;receive next byte from keybord
00B2             000304 
00B2             000305 
00B2             000306 
00B2             000307 
00B2             000308 
00B2             000309 
00B2             000310 
00B2             000311 
00B2             000312 
00B2             000313 
00B2             000314 
00B2 20CD        000315 sync	call	wACLK			;wait for clock and do no Acknowledge
00B3             000316 	
00B3 30FA        000317 	movlw	250
00B4 20BA        000318 	call	wms			;wait 250 ms (we want the sync mode!)
00B5             000319 
00B5 20CD        000320 	call	wACLK			;wait for Amiga CLK for Handshake
00B6             000321 
00B6 3001        000322 	movlw	1
00B7 20BA        000323 	call	wms			;wait 1 ms
00B8             000324 
00B8 20C3        000325 	call	AHshake			;now we do the shake!
00B9 0008        000326 	return
00BA             000327 
00BA             000328 
00BA             000329  
00BA             000330 
00BA             000331 
00BA             000332 
00BA 008C        000333 wms	movwf	count0
00BB             000334 
00BB 30F8        000335 :loop	movlw	248
00BC 008D        000336 	movwf	count1
00BD 0000        000337 :do_it	nop
00BE             000338 
00BE 0B8D        000339 	decfsz	count1,f
00BF 28BD        000340 	goto	:do_it
00C0             000341 
00C0 0B8C        000342 	decfsz	count0,f
00C1 28BB        000343 	goto	:loop
00C2             000344 
00C2 0008        000345 	return
00C3             000346 
00C3             000347 
00C3             000348 
00C3             000349 
00C3             000350 
00C3             000351 
00C3 30F9        000352 AHshake	movlw	11111001b		;bit1 = ADAT = output
00C4 0065        000353 	tris	RA
00C5             000354 
00C5 1085        000355 	bcf	ADAT			;clr Amiga data line
00C6             000356 	
00C6 3028        000357 	movlw	40
00C7 008C        000358 	movwf	count0			;40 * 3 = 120cycles = 120 µs (min 75µs)
00C8 0B8C        000359 :do_it	decfsz	count0,f
00C9 28C8        000360 	goto	:do_it
00CA             000361 
00CA 30FB        000362 	movlw	11111011b		;bit1 = ADAT = input
00CB 0065        000363 	tris	RA
00CC 0008        000364 	return
00CD             000365 
00CD             000366 
00CD             000367 
00CD             000368 
00CD             000369 
00CD             000370 
00CD 1805        000371 wACLK	btfsc	ACLK			;wait for neg clock pulse
00CE 28CD        000372 	goto	wACLK
00CF             000373 
00CF 1C85        000374 	btfss	Adat
00D0 1003        000375 	bcf	c
00D1 1885        000376 	btfsc	Adat
00D2 1403        000377 	bsf	c			;mov the data to carry bit
00D3             000378 
00D3 1C05        000379 wACLK2	btfss	ACLK			;wait for pos clock pulse
00D4 28D3        000380 	goto	wACLK2
00D5 0008        000381 	return
00D6             000382 
00D6             000383 
00D6             000384 
00D6             000385 
00D6             000386 
00D6             000387 
00D6             000388 
00D6 20E7        000389 sendb	call	wbit			;this are stop bits from previous sending
00D7 20E7        000390 	call	wbit
00D8             000391 
00D8 1505        000392 	bsf	TXD			;send startbit
00D9 3008        000393 	movlw	8
00DA 008C        000394 	movwf	count0			;8 bits to send
00DB 098F        000395 	comf	serbuf,f		;invert serbuf
00DC             000396 
00DC 20E7        000397 s_it	call	wbit
00DD 0C8F        000398 	rrf	serbuf,f
00DE             000399 
00DE 1C03        000400 	btfss	c
00DF 1105        000401 	bcf	TXD
00E0 1803        000402 	btfsc	c
00E1 1505        000403 	bsf	TXD
00E2             000404 
00E2 0B8C        000405 	decfsz	count0,f
00E3 28DC        000406 	goto	s_it			;all bits send ? decrement the bitcounter
00E4             000407 
00E4 20E7        000408 	call	wbit
00E5 1105        000409 	bcf	TXD			;clear TXD, stopbit, lenght is defined by 
00E6             000410 					;next sending
00E6 0008        000411 	return
00E7             000412 
00E7             000413 
00E7             000414 
00E7             000415 
00E7             000416 
00E7 300D        000417 wbit	movlw	13
00E8 008D        000418 	movwf	count1			;19200 at 4 Mhz
00E9 0B8D        000419 :loop	decfsz	count1,f
00EA 28E9        000420 	goto	:loop
00EB 0000        000421 	nop
00EC 0008        000422 	return
00ED             000423 


Used Symbols
-----------------------------------------
W                                00000000
F                                00000001
INDF                             00000000
TMR0                             00000001
PCL                              00000002
STATUS                           00000003
FSR                              00000004
PORTA                            00000005
PORTB                            00000006
PCLATH                           0000000A
INTCON                           0000000B
OPTION_REG                       00000081
TRISA                            00000085
TRISB                            00000086
GIE                              00000007
T0IE                             00000005
INTE                             00000004
RBIE                             00000003
T0IF                             00000002
INTF                             00000001
RBIF                             00000000
NOT_RBPU                         00000007
INTEDG                           00000006
T0CS                             00000005
T0SE                             00000004
PSA                              00000003
PS2                              00000002
PS1                              00000001
PS0                              00000000
IRP                              00000007
RP1                              00000006
RP0                              00000005
NOT_TO                           00000004
NOT_PD                           00000003
Z                                00000002
DC                               00000001
C                                00000000
EEDATA                           00000008
EEADR                            00000009
EECON1                           00000088
EECON2                           00000089
RA                               00000005
count0                           0000000C
count1                           0000000D
Akeydat                          0000000E
serbuf                           0000000F
rawkeys                          00000005
Reset                            00000088
check                            00000089
dat                              00000092
ready                            0000009F
rcAdat                           000000A0
sync                             000000B2
wms                              000000BA
AHshake                          000000C3
wACLK                            000000CD
wACLK2                           000000D3
sendb                            000000D6
s_it                             000000DC
wbit                             000000E7


Used Defines
-----------------------------------------
ACLK                             PortA,0 
ADAT                             PortA,1 
TXD                              PortA,2 
c                                3,0 
z                                3,2 


PROGRAM MEMORY USAGE TABLE:	'-' = not used  'X' = used

0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
0100 : ---------------- ---------------- ---------------- ----------------
0140 : ---------------- ---------------- ---------------- ----------------
0180 : ---------------- ---------------- ---------------- ----------------
01C0 : ---------------- ---------------- ---------------- ----------------
0200 : ---------------- ---------------- ---------------- ----------------
0240 : ---------------- ---------------- ---------------- ----------------
0280 : ---------------- ---------------- ---------------- ----------------
02C0 : ---------------- ---------------- ---------------- ----------------
0300 : ---------------- ---------------- ---------------- ----------------
0340 : ---------------- ---------------- ---------------- ----------------
0380 : ---------------- ---------------- ---------------- ----------------
03C0 : ---------------- ---------------- ---------------- ----------------

Program Memory Words Used:  0237
Program Memory Words Free:  0787

Errors: 0
