1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
|
Disassembly Listing for Xilofono
Generated From:
Z:/SAMB_4/projects/xilofono/src/dist/default/production/src.production.elf
23-feb-2018 16:30:03
--- Z:/SAMB_4/projects/xilofono/src/rs232.c -----------------------------------------------------------
1: #include "rs232.h"
2: #include <xc.h>
3:
4: void eusart1_init(void)
5: {
6: // set Async and 8 bits frame
7: TXSTA1bits.SYNC = 0;
03FC 98AC BCF TXSTA1, 4, ACCESS
8: TXSTA1bits.TX9 = 0;
03FE 9CAC BCF TXSTA1, 6, ACCESS
9:
10: // baud prescaler
11: RCSTA1bits.SPEN = 1;
0400 8EAB BSF RCSTA1, 7, ACCESS
12: SPBRG1 = 31;
0402 0E1F MOVLW 0x1F
0404 6EAF MOVWF SPBRG1, ACCESS
13: SPBRGH1 = 0;
0406 0E00 MOVLW 0x0
0408 6EB0 MOVWF SPBRGH1, ACCESS
14: TXSTA1bits.BRGH = 0;
040A 94AC BCF TXSTA1, 2, ACCESS
15: BAUDCON1bits.BRG16 = 0;
040C 96B8 BCF BAUDCON1, 3, ACCESS
16:
17: // set up TX / RX pins
18: TRISCbits.TRISC7 = 1;
040E 8E94 BSF TRISC, 7, ACCESS
19: TRISCbits.TRISC6 = 1;
0410 8C94 BSF TRISC, 6, ACCESS
20: RCSTA1bits.CREN = 1; // enable continuous reception
0412 88AB BSF RCSTA1, 4, ACCESS
21: TXSTA1bits.TXEN = 1;
0414 8AAC BSF TXSTA1, 5, ACCESS
22: }
0416 0012 RETURN 0
23:
24: void eusart2_init(void)
25: {
26: // TODO
27: }
28:
29: void putch(char c)
0418 6E1A MOVWF p1, ACCESS
30: {
31: while (!TX1IF);
041A A89E BTFSS PIR1, 4, ACCESS
041C D7FE BRA 0x41A
32: TX1REG = c;
041E C01A MOVFF p1, TXREG1
0420 FFAD NOP
33: }
0008 8245 BSF btemp, 1, ACCESS
000A CFFA MOVFF PCLATH, 0x5
000C F005 NOP
000E CFFB MOVFF PCLATU, 0x6
0010 F006 NOP
0012 CFE9 MOVFF FSR0, 0x7
0014 F007 NOP
0016 CFEA MOVFF FSR0H, 0x8
0018 F008 NOP
001A CFE1 MOVFF FSR1, 0x9
001C F009 NOP
001E CFE2 MOVFF FSR1H, 0xA
0020 F00A NOP
0022 CFD9 MOVFF FSR2, 0xB
0024 F00B NOP
0026 CFDA MOVFF FSR2H, 0xC
0028 F00C NOP
002A CFF3 MOVFF PROD, 0xD
002C F00D NOP
002E CFF4 MOVFF PRODH, 0xE
0030 F00E NOP
0032 CFF6 MOVFF TBLPTR, 0xF
0034 F00F NOP
0036 CFF7 MOVFF TBLPTRH, 0x10
0038 F010 NOP
003A CFF8 MOVFF TBLPTRU, 0x11
003C F011 NOP
003E CFF5 MOVFF TABLAT, 0x12
0040 F012 NOP
0042 C045 MOVFF btemp, 0x13
0044 F013 NOP
0046 C046 MOVFF 0x46, 0x14
0048 F014 NOP
004A C047 MOVFF 0x47, 0x15
004C F015 NOP
004E C048 MOVFF 0x48, 0x16
0050 F016 NOP
0422 0012 RETURN 0
34:
35: char getch(void)
36: {
37: while (!RC1IF);
38: return RC1REG;
39: }
40:
41: char getche(void)
42: {
43: char c = getch();
44: putch(c); // echo
45:
46: return c;
47: }
--- Z:/SAMB_4/projects/xilofono/src/midi.c ------------------------------------------------------------
1: #include "midi.h"
2:
3: #include <stdint.h>
4: #include <stddef.h>
5: #include <stdio.h>
6: #include <stdlib.h>
7:
8:
9: #ifdef MIDI_DYNAMIC_MEMORY_ALLOC
10: midi_message_t *midi_alloc_message(size_t data_size)
11: {
12: return (midi_message_t *) malloc(sizeof(midi_message_t) + data_size);
13: }
14:
15: void midi_free_message(midi_message_t *pkt)
16: {
17: if (pkt == NULL) {
18: return;
19: }
20:
21: free(pkt);
22: pkt = NULL;
23: }
24:
25: size_t midi_message_size(const midi_message_t *pkt)
26: {
27: if (pkt == NULL) {
28: return 0;
29: }
30:
31: switch (pkt->status) {
32: case NOTE_ON: return sizeof(midi_message_t) + 2;
33: case NOTE_OFF: return sizeof(midi_message_t) + 1;
34: default: return sizeof(midi_message_t);
35: }
36: }
37: #endif
38:
39:
40: int midi_set_status(midi_message_t *pkt, midi_status_t status)
41: {
42: if (pkt == NULL) {
03D8 501A MOVF p1, W, ACCESS
03DA 101B IORWF pkt, W, ACCESS
03DC B4D8 BTFSC STATUS, 2, ACCESS
03DE 0012 RETURN 0
43: return -1;
44: }
45:
46: pkt->status = status & 0x0F;
03E0 C01C MOVFF c, 0x1D
03E2 F01D NOP
03E4 0E0F MOVLW 0xF
03E6 161D ANDWF 0x1D, F, ACCESS
03E8 C01A MOVFF p1, FSR2
03EA FFD9 NOP
03EC C01B MOVFF pkt, FSR2H
03EE FFDA NOP
03F0 50DF MOVF INDF2, W, ACCESS
03F2 181D XORWF 0x1D, W, ACCESS
03F4 0BF0 ANDLW 0xF0
03F6 181D XORWF 0x1D, W, ACCESS
03F8 6EDF MOVWF INDF2, ACCESS
03FA 0012 RETURN 0
47:
48: return 0;
49: }
50:
51: int midi_set_channel(midi_message_t *pkt, unsigned channel)
52: {
53: if (pkt == NULL) {
03B2 501A MOVF p1, W, ACCESS
03B4 101B IORWF pkt, W, ACCESS
03B6 B4D8 BTFSC STATUS, 2, ACCESS
03B8 0012 RETURN 0
54: return -1;
55: }
56:
57: pkt->channel = channel & 0x0F;
03BA C01C MOVFF c, n
03BC F01E NOP
03BE 0E0F MOVLW 0xF
03C0 161E ANDWF n, F, ACCESS
03C2 C01A MOVFF p1, FSR2
03C4 FFD9 NOP
03C6 C01B MOVFF pkt, FSR2H
03C8 FFDA NOP
03CA 3A1E SWAPF n, F, ACCESS
03CC 50DF MOVF INDF2, W, ACCESS
03CE 181E XORWF n, W, ACCESS
03D0 0B0F ANDLW 0xF
03D2 181E XORWF n, W, ACCESS
03D4 6EDF MOVWF INDF2, ACCESS
03D6 0012 RETURN 0
58:
59: return 0;
60: }
61:
62: int midi_note_on(midi_message_t *pkt, unsigned channel, midi_note_t note, uint8_t velocity)
63: {
64: if (pkt == NULL) {
01BC 501F MOVF pkt, W, ACCESS
01BE 1020 IORWF p, W, ACCESS
01C0 B4D8 BTFSC STATUS, 2, ACCESS
01C2 0012 RETURN 0
65: return -1;
66: }
67:
68: if (pkt->data == NULL) {
01C4 0E03 MOVLW 0x3
01C6 241F ADDWF pkt, W, ACCESS
01C8 0100 MOVLB 0x0
01CA 6F60 MOVWF __pcstackBANK0, BANKED
01CC 0E00 MOVLW 0x0
01CE 2020 ADDWFC p, W, ACCESS
01D0 6F61 MOVWF 0x61, BANKED
01D2 5160 MOVF __pcstackBANK0, W, BANKED
01D4 1161 IORWF 0x61, W, BANKED
01D6 B4D8 BTFSC STATUS, 2, ACCESS
01D8 0012 RETURN 0
69: return -2;
70: }
71:
72: midi_set_status(pkt, NOTE_ON);
01DA C01F MOVFF pkt, p1
01DC F01A NOP
01DE C020 MOVFF p, pkt
01E0 F01B NOP
01E2 0E08 MOVLW 0x8
01E4 6E1C MOVWF c, ACCESS
01E6 ECEC CALL 0x3D8, 0
01E8 F001 NOP
73: midi_set_channel(pkt, channel);
01EA C01F MOVFF pkt, p1
01EC F01A NOP
01EE C020 MOVFF p, pkt
01F0 F01B NOP
01F2 C021 MOVFF channel, c
01F4 F01C NOP
01F6 C022 MOVFF 0x22, 0x1D
01F8 F01D NOP
01FA ECD9 CALL 0x3B2, 0
01FC F001 NOP
74:
75: pkt->data[0] = note;
01FE EE20 LFSR 2, 0x3
0200 F003 NOP
0202 501F MOVF pkt, W, ACCESS
0204 26D9 ADDWF FSR2, F, ACCESS
0206 5020 MOVF p, W, ACCESS
0208 22DA ADDWFC FSR2H, F, ACCESS
020A C023 MOVFF note, INDF2
020C FFDF NOP
76: pkt->data[1] = velocity;
020E EE20 LFSR 2, 0x4
0210 F004 NOP
0212 501F MOVF pkt, W, ACCESS
0214 26D9 ADDWF FSR2, F, ACCESS
0216 5020 MOVF p, W, ACCESS
0218 22DA ADDWFC FSR2H, F, ACCESS
021A C024 MOVFF velocity, INDF2
021C FFDF NOP
77:
78: #ifndef MIDI_DYNAMIC_MEMORY_ALLOC
79: pkt->data_size = 2;
021E EE20 LFSR 2, 0x1
0220 F001 NOP
0222 501F MOVF pkt, W, ACCESS
0224 26D9 ADDWF FSR2, F, ACCESS
0226 5020 MOVF p, W, ACCESS
0228 22DA ADDWFC FSR2H, F, ACCESS
022A 0E02 MOVLW 0x2
022C 6EDE MOVWF POSTINC2, ACCESS
022E 0E00 MOVLW 0x0
0230 6EDD MOVWF POSTDEC2, ACCESS
0232 0012 RETURN 0
80: #endif
81:
82: return 0;
83: }
84:
85: int midi_note_off(midi_message_t *pkt, unsigned channel, midi_note_t note, uint8_t velocity)
86: {
87: if (pkt == NULL) {
88: return -1;
89: }
90:
91: if (pkt->data == NULL) {
92: return -2;
93: }
94:
95: midi_set_status(pkt, NOTE_OFF);
96: midi_set_channel(pkt, channel);
97:
98: pkt->data[0] = note;
99: pkt->data[1] = velocity;
100:
101: #ifndef MIDI_DYNAMIC_MEMORY_ALLOC
102: pkt->data_size = 2;
103: #endif
104:
105: return 0;
106: }
--- Z:/SAMB_4/projects/xilofono/src/main.c ------------------------------------------------------------
1: /*
2: * File: main.c
3: * Author: Naoki Pross 4E
4: * Date: 08.01.2018
5: * Target: PIC18F44K22
6: * Version 1.0
7: *
8: * Description:
9: *
10: * Main program for the Xylophone project.
11: */
12:
13: // PIC18F44K22 Configuration Bit Settings
14: // 'C' source line config statements
15:
16: // CONFIG1H
17: #pragma config FOSC = INTIO7 // Oscillator Selection bits (Internal oscillator block)
18: #pragma config PLLCFG = ON // 4X PLL Enable (Oscillator multiplied by 4)
19: #pragma config PRICLKEN = ON // Primary clock enable bit (Primary clock is always enabled)
20: #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
21: #pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
22:
23: // CONFIG2L
24: #pragma config PWRTEN = OFF // Power-up Timer Enable bit (Power up timer disabled)
25: #pragma config BOREN = SBORDIS // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
26: #pragma config BORV = 190 // Brown Out Reset Voltage bits (VBOR set to 1.90 V nominal)
27:
28: // CONFIG2H
29: #pragma config WDTEN = ON // Watchdog Timer Enable bits (WDT is always enabled. SWDTEN bit has no effect)
30: #pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
31:
32: // CONFIG3H
33: #pragma config CCP2MX = PORTC1 // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
34: #pragma config PBADEN = ON // PORTB A/D Enable bit (PORTB<5:0> pins are configured as analog input channels on Reset)
35: #pragma config CCP3MX = PORTB5 // P3A/CCP3 Mux bit (P3A/CCP3 input/output is multiplexed with RB5)
36: #pragma config HFOFST = ON // HFINTOSC Fast Start-up (HFINTOSC output and ready status are not delayed by the oscillator stable status)
37: #pragma config T3CMX = PORTC0 // Timer3 Clock input mux bit (T3CKI is on RC0)
38: #pragma config P2BMX = PORTD2 // ECCP2 B output mux bit (P2B is on RD2)
39: #pragma config MCLRE = EXTMCLR // MCLR Pin Enable bit (MCLR pin enabled, RE3 input pin disabled)
40:
41: // CONFIG4L
42: #pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
43: #pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled if MCLRE is also 1)
44: #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
45:
46: // CONFIG5L
47: #pragma config CP0 = OFF // Code Protection Block 0 (Block 0 (000800-001FFFh) not code-protected)
48: #pragma config CP1 = OFF // Code Protection Block 1 (Block 1 (002000-003FFFh) not code-protected)
49: #pragma config CP2 = OFF // Code Protection Block 2 (Block 2 (004000-005FFFh) not code-protected)
50: #pragma config CP3 = OFF // Code Protection Block 3 (Block 3 (006000-007FFFh) not code-protected)
51:
52: // CONFIG5H
53: #pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
54: #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
55:
56: // CONFIG6L
57: #pragma config WRT0 = OFF // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
58: #pragma config WRT1 = OFF // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
59: #pragma config WRT2 = OFF // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
60: #pragma config WRT3 = OFF // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)
61:
62: // CONFIG6H
63: #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
64: #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
65: #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
66:
67: // CONFIG7L
68: #pragma config EBTR0 = OFF // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
69: #pragma config EBTR1 = OFF // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
70: #pragma config EBTR2 = OFF // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
71: #pragma config EBTR3 = OFF // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
72:
73: // CONFIG7H
74: #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)
75:
76: // #pragma config statements should precede project file includes.
77: // Use project enums instead of #define for ON and OFF.
78:
79: #define _XTAL_FREQ 64000000
80:
81: #include "rs232.h"
82: #include "midi.h"
83:
84: #include <xc.h>
85: #include <stdio.h>
86: #include <stdlib.h>
87: #include <stdint.h>
88: #include <string.h>
89:
90: #define NOTES 15
91: #define NOTE_MASK 0xFF00
92:
93:
94: /* global variables */
95: volatile uint16_t keypresses[NOTES];
96:
97: /* function prototypes */
98: int eusart_write_midi(const midi_message_t *pkt);
99:
100: /* interrupt service routine */
101: interrupt void isr(void)
0008 8245 BSF btemp, 1, ACCESS
102: {
103: unsigned char i, data;
104:
105: PORTDbits.RD3 = 0;
0052 9683 BCF PORTD, 3, ACCESS
106:
107: if (PIR1bits.TMR2IF) {
0054 A29E BTFSS PIR1, 1, ACCESS
0056 D089 BRA 0x16A
108: // PORTA
109: data = PORTA;
0058 CF80 MOVFF PORTA, data
005A F018 NOP
110: i = 7;
005C 0E07 MOVLW 0x7
005E 6E19 MOVWF i, ACCESS
111: do {
112: keypresses[i] = (keypresses[i] << 1) | ((data >> i) & 0x01);
0060 5019 MOVF i, W, ACCESS
0062 0D02 MULLW 0x2
0064 0E25 MOVLW 0x25
0066 24F3 ADDWF PROD, W, ACCESS
0068 6ED9 MOVWF FSR2, ACCESS
006A 0E00 MOVLW 0x0
006C 20F4 ADDWFC PRODH, W, ACCESS
006E 6EDA MOVWF FSR2H, ACCESS
0070 CFDE MOVFF POSTINC2, __pcstackCOMRAM
0072 F001 NOP
0074 CFDD MOVFF POSTDEC2, 0x2
0076 F002 NOP
0078 90D8 BCF STATUS, 0, ACCESS
007A 3601 RLCF __pcstackCOMRAM, F, ACCESS
007C 3602 RLCF 0x2, F, ACCESS
007E C019 MOVFF i, 0x3
0080 F003 NOP
0082 C018 MOVFF data, 0x4
0084 F004 NOP
0086 2A03 INCF 0x3, F, ACCESS
0088 D002 BRA 0x8E
008A 90D8 BCF STATUS, 0, ACCESS
008C 3204 RRCF 0x4, F, ACCESS
008E 2E03 DECFSZ 0x3, F, ACCESS
0090 D7FC BRA 0x8A
0092 0E01 MOVLW 0x1
0094 1604 ANDWF 0x4, F, ACCESS
0096 5004 MOVF 0x4, W, ACCESS
0098 1201 IORWF __pcstackCOMRAM, F, ACCESS
009A 0E00 MOVLW 0x0
009C 1202 IORWF 0x2, F, ACCESS
009E 5019 MOVF i, W, ACCESS
00A0 0D02 MULLW 0x2
00A2 0E25 MOVLW 0x25
00A4 24F3 ADDWF PROD, W, ACCESS
00A6 6ED9 MOVWF FSR2, ACCESS
00A8 0E00 MOVLW 0x0
00AA 20F4 ADDWFC PRODH, W, ACCESS
00AC 6EDA MOVWF FSR2H, ACCESS
00AE C001 MOVFF __pcstackCOMRAM, POSTINC2
00B0 FFDE NOP
00B2 C002 MOVFF 0x2, POSTDEC2
00B4 FFDD NOP
113: } while (i--);
00B6 0619 DECF i, F, ACCESS
00B8 2819 INCF i, W, ACCESS
00BA A4D8 BTFSS STATUS, 2, ACCESS
00BC D7D1 BRA 0x60
114:
115: data = PORTB;
00BE CF81 MOVFF PORTB, data
00C0 F018 NOP
116: i = 7;
00C2 0E07 MOVLW 0x7
00C4 6E19 MOVWF i, ACCESS
117: do {
118: keypresses[i] = (keypresses[i] << 1) | ((data >> i) & 0x01);
00C6 5019 MOVF i, W, ACCESS
00C8 0D02 MULLW 0x2
00CA 0E25 MOVLW 0x25
00CC 24F3 ADDWF PROD, W, ACCESS
00CE 6ED9 MOVWF FSR2, ACCESS
00D0 0E00 MOVLW 0x0
00D2 20F4 ADDWFC PRODH, W, ACCESS
00D4 6EDA MOVWF FSR2H, ACCESS
00D6 CFDE MOVFF POSTINC2, __pcstackCOMRAM
00D8 F001 NOP
00DA CFDD MOVFF POSTDEC2, 0x2
00DC F002 NOP
00DE 90D8 BCF STATUS, 0, ACCESS
00E0 3601 RLCF __pcstackCOMRAM, F, ACCESS
00E2 3602 RLCF 0x2, F, ACCESS
00E4 C019 MOVFF i, 0x3
00E6 F003 NOP
00E8 C018 MOVFF data, 0x4
00EA F004 NOP
00EC 2A03 INCF 0x3, F, ACCESS
00EE D002 BRA 0xF4
00F0 90D8 BCF STATUS, 0, ACCESS
00F2 3204 RRCF 0x4, F, ACCESS
00F4 2E03 DECFSZ 0x3, F, ACCESS
00F6 D7FC BRA 0xF0
00F8 0E01 MOVLW 0x1
00FA 1604 ANDWF 0x4, F, ACCESS
00FC 5004 MOVF 0x4, W, ACCESS
00FE 1201 IORWF __pcstackCOMRAM, F, ACCESS
0100 0E00 MOVLW 0x0
0102 1202 IORWF 0x2, F, ACCESS
0104 5019 MOVF i, W, ACCESS
0106 0D02 MULLW 0x2
0108 0E25 MOVLW 0x25
010A 24F3 ADDWF PROD, W, ACCESS
010C 6ED9 MOVWF FSR2, ACCESS
010E 0E00 MOVLW 0x0
0110 20F4 ADDWFC PRODH, W, ACCESS
0112 6EDA MOVWF FSR2H, ACCESS
0114 C001 MOVFF __pcstackCOMRAM, POSTINC2
0116 FFDE NOP
0118 C002 MOVFF 0x2, POSTDEC2
011A FFDD NOP
119: } while (i-- - 8);
011C 0EF8 MOVLW 0xF8
011E 6E01 MOVWF __pcstackCOMRAM, ACCESS
0120 0EFF MOVLW 0xFF
0122 6E02 MOVWF 0x2, ACCESS
0124 0619 DECF i, F, ACCESS
0126 2819 INCF i, W, ACCESS
0128 6E03 MOVWF 0x3, ACCESS
012A 6A04 CLRF 0x4, ACCESS
012C 5001 MOVF __pcstackCOMRAM, W, ACCESS
012E 2603 ADDWF 0x3, F, ACCESS
0130 5002 MOVF 0x2, W, ACCESS
0132 2204 ADDWFC 0x4, F, ACCESS
0134 5003 MOVF 0x3, W, ACCESS
0136 1004 IORWF 0x4, W, ACCESS
0138 A4D8 BTFSS STATUS, 2, ACCESS
013A D7C5 BRA 0xC6
120:
121: // PORTB
122: // for (i = 8; i < NOTES; i++) {
123: // keypresses[i] = (keypresses[i] << 1) | ((PORTB & (1 << i)) >> i);
124: // }
125:
126: // TODO same for PORTD when the steps board is printed
127:
128: // debug stuff
129: PORTDbits.RD4 = PORTAbits.RA0;
013C A080 BTFSS PORTA, 0, ACCESS
013E D002 BRA 0x144
0140 8883 BSF PORTD, 4, ACCESS
0142 D001 BRA 0x146
0144 9883 BCF PORTD, 4, ACCESS
130: PORTDbits.RD2 = (keypresses[0] && !(keypresses[0] & NOTE_MASK));
0146 0E00 MOVLW 0x0
0148 6E17 MOVWF 0x17, ACCESS
014A 5025 MOVF keypresses, W, ACCESS
014C 1026 IORWF 0x26, W, ACCESS
014E B4D8 BTFSC STATUS, 2, ACCESS
0150 D006 BRA 0x15E
0152 0EFF MOVLW 0xFF
0154 1426 ANDWF 0x26, W, ACCESS
0156 A4D8 BTFSS STATUS, 2, ACCESS
0158 D002 BRA 0x15E
015A 0E01 MOVLW 0x1
015C 6E17 MOVWF 0x17, ACCESS
015E B017 BTFSC 0x17, 0, ACCESS
0160 D002 BRA 0x166
0162 9483 BCF PORTD, 2, ACCESS
0164 D001 BRA 0x168
0166 8483 BSF PORTD, 2, ACCESS
131:
132: // reset interrupt flag
133: PIR1bits.TMR2IF = 0;
0168 929E BCF PIR1, 1, ACCESS
134: }
135:
136: PORTDbits.RD3 = 1;
016A 8683 BSF PORTD, 3, ACCESS
137: }
016C C016 MOVFF 0x16, 0x48
016E F048 NOP
0170 C015 MOVFF 0x15, 0x47
0172 F047 NOP
0174 C014 MOVFF 0x14, 0x46
0176 F046 NOP
0178 C013 MOVFF 0x13, btemp
017A F045 NOP
017C C012 MOVFF 0x12, TABLAT
017E FFF5 NOP
0180 C011 MOVFF 0x11, TBLPTRU
0182 FFF8 NOP
0184 C010 MOVFF 0x10, TBLPTRH
0186 FFF7 NOP
0188 C00F MOVFF 0xF, TBLPTR
018A FFF6 NOP
018C C00E MOVFF 0xE, PRODH
018E FFF4 NOP
0190 C00D MOVFF 0xD, PROD
0192 FFF3 NOP
0194 C00C MOVFF 0xC, FSR2H
0196 FFDA NOP
0198 C00B MOVFF 0xB, FSR2
019A FFD9 NOP
019C C00A MOVFF 0xA, FSR1H
019E FFE2 NOP
01A0 C009 MOVFF 0x9, FSR1
01A2 FFE1 NOP
01A4 C008 MOVFF 0x8, FSR0H
01A6 FFEA NOP
01A8 C007 MOVFF 0x7, FSR0
01AA FFE9 NOP
01AC C006 MOVFF 0x6, PCLATU
01AE FFFB NOP
01B0 C005 MOVFF 0x5, PCLATH
01B2 FFFA NOP
01B4 9245 BCF btemp, 1, ACCESS
01B6 0011 RETFIE 1
138:
139: /* hardware configuration (inlined) */
140: inline void init_hw(void)
141: {
142: di();
02A8 9EF2 BCF INTCON, 7, ACCESS
143:
144: /* PLL / FOSC configuration */
145: // enable PLL
146: OSCTUNEbits.PLLEN = 1;
02AA 8C9B BSF OSCTUNE, 6, ACCESS
147: // set FOSC to HFINTOSC (max frequency)
148: OSCTUNEbits.TUN = 0b011111;
02AC 809B BSF OSCTUNE, 0, ACCESS
02AE 829B BSF OSCTUNE, 1, ACCESS
02B0 849B BSF OSCTUNE, 2, ACCESS
02B2 869B BSF OSCTUNE, 3, ACCESS
02B4 889B BSF OSCTUNE, 4, ACCESS
02B6 9A9B BCF OSCTUNE, 5, ACCESS
149: // set 16 MHz oscillator, datasheet p.30
150: OSCCONbits.IRCF = 0b111;
02B8 88D3 BSF OSCCON, 4, ACCESS
02BA 8AD3 BSF OSCCON, 5, ACCESS
02BC 8CD3 BSF OSCCON, 6, ACCESS
151: // select primary clock (with PLL)
152: OSCCONbits.SCS = 0b00;
02BE 0EFC MOVLW 0xFC
02C0 16D3 ANDWF OSCCON, F, ACCESS
153:
154: /* i/o initializazion */
155: // disable all ADCs
156: ANSELA = 0x00;
02C2 0E00 MOVLW 0x0
02C4 010F MOVLB 0xF
02C6 6F38 MOVWF 0x38, BANKED
157: ANSELB = 0x00;
02C8 0E00 MOVLW 0x0
02CA 6F39 MOVWF 0x39, BANKED
158: ANSELC = 0x00;
02CC 0E00 MOVLW 0x0
02CE 6F3A MOVWF 0x3A, BANKED
159: ANSELD = 0x00;
02D0 0E00 MOVLW 0x0
02D2 6F3B MOVWF 0x3B, BANKED
160:
161: // TODO: remove demo
162: TRISA = 0xFF;
02D4 6892 SETF TRISA, ACCESS
163: TRISB = 0xFF;
02D6 6893 SETF TRISB, ACCESS
164:
165: TRISDbits.TRISD1 = 0;
02D8 9295 BCF TRISD, 1, ACCESS
166: TRISDbits.TRISD2 = 0;
02DA 9495 BCF TRISD, 2, ACCESS
167: TRISDbits.TRISD3 = 0;
02DC 9695 BCF TRISD, 3, ACCESS
168: TRISDbits.TRISD4 = 0;
02DE 9895 BCF TRISD, 4, ACCESS
169:
170: // LED
171: PORTDbits.RD1 = 1;
02E0 8283 BSF PORTD, 1, ACCESS
172: // TEST OUTPUT 1
173: PORTDbits.RD2 = 0;
02E2 9483 BCF PORTD, 2, ACCESS
174: // TEST OUTPUT 2
175: PORTDbits.RD3 = 1;
02E4 8683 BSF PORTD, 3, ACCESS
176: // TEST OUTPUT 3
177: PORTDbits.RD4 = 0;
02E6 9883 BCF PORTD, 4, ACCESS
178:
179: /* timer configuration */
180: // timer 2 comp value
181: PR2 = 128;
02E8 0E80 MOVLW 0x80
02EA 6EBB MOVWF PR2, ACCESS
182: // postscaler 1:4
183: T2CONbits.T2OUTPS = 0b0011;
02EC 50BA MOVF T2CON, W, ACCESS
02EE 0B87 ANDLW 0x87
02F0 0918 IORLW 0x18
02F2 6EBA MOVWF T2CON, ACCESS
184: // prescaler 1:16
185: T2CONbits.T2CKPS = 0b11;
02F4 0E03 MOVLW 0x3
02F6 12BA IORWF T2CON, F, ACCESS
186: // start timer
187: T2CONbits.TMR2ON = 1;
02F8 84BA BSF T2CON, 2, ACCESS
188:
189: // timer 2 interrupts
190: PIE1bits.TMR2IE = 1;
02FA 829D BSF PIE1, 1, ACCESS
191: PIR1bits.TMR2IF = 0;
02FC 929E BCF PIR1, 1, ACCESS
192:
193: // enable peripheral interrupts
194: INTCONbits.PEIE = 1;
02FE 8CF2 BSF INTCON, 6, ACCESS
195:
196: /* serial configuration */
197: eusart1_init();
0300 ECFE CALL 0x3FC, 0
0302 F001 NOP
198:
199: ei();
0304 8EF2 BSF INTCON, 7, ACCESS
200: }
0306 0012 RETURN 0
201:
202:
203: /* main program */
204: void main(void)
205: {
206: unsigned char i, data;
207: midi_message_t sample_message;
208:
209: /* setup hardware */
210: init_hw();
0308 EC54 CALL 0x2A8, 0
030A F001 NOP
211:
212: /* setup software */
213: memset(keypresses, 0, sizeof(keypresses));
030C 0E25 MOVLW 0x25
030E 6E1A MOVWF p1, ACCESS
0310 0E00 MOVLW 0x0
0312 6E1B MOVWF pkt, ACCESS
0314 0E00 MOVLW 0x0
0316 6E1D MOVWF 0x1D, ACCESS
0318 0E00 MOVLW 0x0
031A 6E1C MOVWF c, ACCESS
031C 0E00 MOVLW 0x0
031E 6E1F MOVWF pkt, ACCESS
0320 0E1E MOVLW 0x1E
0322 6E1E MOVWF n, ACCESS
0324 ECC3 CALL 0x386, 0
0326 F001 NOP
214:
215: /* TODO remove demo code */
216: midi_note_on(&sample_message, 0x0, 0x3C, 0x7F);
0328 0E62 MOVLW 0x62
032A 6E1F MOVWF pkt, ACCESS
032C 0E00 MOVLW 0x0
032E 6E20 MOVWF p, ACCESS
0330 0E00 MOVLW 0x0
0332 6E22 MOVWF 0x22, ACCESS
0334 0E00 MOVLW 0x0
0336 6E21 MOVWF channel, ACCESS
0338 0E3C MOVLW 0x3C
033A 6E23 MOVWF note, ACCESS
033C 0E7F MOVLW 0x7F
033E 6E24 MOVWF velocity, ACCESS
0340 ECDE CALL 0x1BC, 0
0342 F000 NOP
217: PORTDbits.RD1 = 0;
0344 9283 BCF PORTD, 1, ACCESS
218:
219: /* main loop */
220: while (1) {
0352 D7F9 BRA 0x346
221: eusart_write_midi(&sample_message);
0346 0E62 MOVLW 0x62
0348 6E1B MOVWF pkt, ACCESS
034A 0E00 MOVLW 0x0
034C 6E1C MOVWF c, ACCESS
034E EC1A CALL 0x234, 0
0350 F001 NOP
0352 D7F9 BRA 0x346
222: }
223: }
224:
225:
226: int eusart_write_midi(const midi_message_t *pkt)
227: {
228: size_t length;
229: uint8_t *data;
230:
231: if (pkt == NULL) {
0234 501B MOVF pkt, W, ACCESS
0236 101C IORWF c, W, ACCESS
0238 B4D8 BTFSC STATUS, 2, ACCESS
023A 0012 RETURN 0
232: return -1;
233: }
234:
235: length = pkt->data_size;
023C EE20 LFSR 2, 0x1
023E F001 NOP
0240 501B MOVF pkt, W, ACCESS
0242 26D9 ADDWF FSR2, F, ACCESS
0244 501C MOVF c, W, ACCESS
0246 22DA ADDWFC FSR2H, F, ACCESS
0248 CFDE MOVFF POSTINC2, pkt
024A F01F NOP
024C CFDD MOVFF POSTDEC2, p
024E F020 NOP
236: data = (uint8_t *) pkt->data;
0250 0E03 MOVLW 0x3
0252 241B ADDWF pkt, W, ACCESS
0254 6E21 MOVWF channel, ACCESS
0256 0E00 MOVLW 0x0
0258 201C ADDWFC c, W, ACCESS
025A 6E22 MOVWF 0x22, ACCESS
237:
238: putch((char)((pkt->status << 4) | pkt->channel));
025C C01B MOVFF pkt, FSR2
025E FFD9 NOP
0260 C01C MOVFF c, FSR2H
0262 FFDA NOP
0264 38DF SWAPF INDF2, W, ACCESS
0266 0B0F ANDLW 0xF
0268 6E1D MOVWF 0x1D, ACCESS
026A C01B MOVFF pkt, FSR2
026C FFD9 NOP
026E C01C MOVFF c, FSR2H
0270 FFDA NOP
0272 50DF MOVF INDF2, W, ACCESS
0274 0B0F ANDLW 0xF
0276 6E1E MOVWF n, ACCESS
0278 381E SWAPF n, W, ACCESS
027A 0BF0 ANDLW 0xF0
027C 101D IORWF 0x1D, W, ACCESS
027E EC0C CALL 0x418, 0
0280 F002 NOP
239:
240: while (length--) {
0282 D009 BRA 0x296
241: putch((char) *(data++));
0284 C021 MOVFF channel, FSR2
0286 FFD9 NOP
0288 C022 MOVFF 0x22, FSR2H
028A FFDA NOP
028C 50DF MOVF INDF2, W, ACCESS
028E EC0C CALL 0x418, 0
0290 F002 NOP
0292 4A21 INFSNZ channel, F, ACCESS
0294 2A22 INCF 0x22, F, ACCESS
242: }
0296 061F DECF pkt, F, ACCESS
0298 A0D8 BTFSS STATUS, 0, ACCESS
029A 0620 DECF p, F, ACCESS
029C 281F INCF pkt, W, ACCESS
029E E1F2 BNZ 0x284
02A0 2820 INCF p, W, ACCESS
02A2 B4D8 BTFSC STATUS, 2, ACCESS
02A4 0012 RETURN 0
02A6 D7EE BRA 0x284
243:
244: return 0;
245: }
--- C:/Program Files/Microchip/xc8/v1.44/sources/common/memset.c --------------------------------------
1: #include <string.h>
2:
3: #ifdef _PIC16
4: far void *
5: memset(far void * p1, int c, register size_t n)
6: #else /* _PIC16 */
7: void *
8: memset(void * p1, int c, register size_t n)
9: #endif /* _PIC16 */
10: {
11:
12: #ifdef _PIC16
13: register far char * p;
14: #else /* _PIC16 */
15: register char * p;
16: #endif /* _PIC16 */
17:
18: p = p1;
0386 C01A MOVFF p1, p
0388 F020 NOP
038A C01B MOVFF pkt, channel
038C F021 NOP
19: while(n--)
038E D008 BRA 0x3A0
03A0 061E DECF n, F, ACCESS
20: *p++ = c;
0390 C020 MOVFF p, FSR2
0392 FFD9 NOP
0394 C021 MOVFF channel, FSR2H
0396 FFDA NOP
0398 C01C MOVFF c, INDF2
039A FFDF NOP
039C 4A20 INFSNZ p, F, ACCESS
039E 2A21 INCF channel, F, ACCESS
03A0 061E DECF n, F, ACCESS
03A2 A0D8 BTFSS STATUS, 0, ACCESS
03A4 061F DECF pkt, F, ACCESS
03A6 281E INCF n, W, ACCESS
03A8 E1F3 BNZ 0x390
03AA 281F INCF pkt, W, ACCESS
03AC B4D8 BTFSC STATUS, 2, ACCESS
03AE 0012 RETURN 0
03B0 D7EF BRA 0x390
21: return p1;
22: }
|