#PIC V1.0 (c)1997 J.Petroglou	LIST FILE
#file: dh2:IDE/APICforAMINET/APIC/examples/Amikeyterm.asm
#date: Sun Dec 14 20:41:45 1997
#pic : PIC16C84
#xtal: 4000000 Hz

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


Used Symbols
-----------------------------------------
PortA                            00000005
PortB                            00000006
pcl                              00000002
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
-----------------------------------------
c                                3,0 
z                                3,2 
TXD                              PortA,2 
ADAT                             PortA,1 
ACLK                             PortA,0 


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
