-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.asm
2613 lines (2142 loc) · 59.3 KB
/
main.asm
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
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; C64 interface for the FT8XX Yaesu Radio ;;
;; Using the CAT command protocol ;;
;; Jordan Rubin 2015 ;;
;; technocoma.blogspot.com ;;
;; Written for compilation with 64TASS ;;
;; All resulting PRG files should be UPPERCASE except ;;
;; for commodore-817.asm ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; main.asm ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Define GLINK232/SWIFTLINK/TURBO232 labels here ;;
;; Swiftlink registers found from ;;
;; ar.c64.org/wiki/turbo232_swiftlink_registers.txt ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
glink232 = $DE00 ;Glink232 cart, ACIA, this must match on the DIP switch of the GLINK232
dataregister = glink232
statusregister = glink232+1
commandregister = glink232+2
controlregister = glink232+3
recvhead = $A7 ;pointer to next byte to be removed from receive buffer
recvtail = $A8 ;pointer to location to store next byte received
recvbuffer = $F7 ;receive-buffer vector $c160
xmithead = $A9 ;pointer to next byte to be removed from transmit buffer
xmittail = $AA ;pointer to location to store next byte in transmit buffer
xmitbuffer = $F9 ;transmit buffer $c156
xmitbuffersize = $AB ;number of bytes currently in xmitbuffer
recvbuffersize = $B4 ;number of bytes currently in recvbuffer
xmiton = $B6 ;storage location for model of command register for transmit on
xmitoff = $BD ;storage location for model of command register for transmit off
nmivector = $0318 ;Commodore Non-Maskable Interrupt vector
oldnmivector = $03FE ;location to store our old NMI vector
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Define SPRITE LABELS HERE ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPRITEDATA = $2000 ;Data for sprites 0 through 7
SPENA = $D015 ;Sprite enable register
SSDP0 = $07F8 ;Sprite Data pointers
SP0X = $D000 ;Sprite 0 Horizontal
SP0Y = $D001 ;Sprite 0 Vertical
SP0COL = $D027 ;Sprite 0 Color register
OFFSET = $FE ;Initial Sprite offset Y
ENABLECURSOR = $CC ;00 enabled not 00 disabled
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Define FT817 LABELS HERE ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
isoutput = $FD
radiobyte = $FB
currentmode = $3F
updateline = #$0D
eepromoffset = #$FD
vfoAstarthigh = #$00
vfoAstartlow = #$7D
vfoBstarthigh = #$02
vfoBstartlow = #$03
memorystarthigh = #$04
memorystartlow = #$84
memjumplow = $2C ; seems safe to use
memjumphigh = $2B ; seems safe to use
tempjumplow = $2D
tempjumphigh = $2E
offsetfrombase = $2A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Program startpoint ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*= $C000 ;Start of program at 49152
lda #$17 ; changes to upperlower
sta $D018
nop
nop
nop
nop
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Initialize values to 0, clear everything ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda #$00
sta recvhead
sta recvtail
sta xmithead
sta xmittail
sta xmitbuffersize
sta recvbuffersize
sta isoutput
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Define the locations of the transmit and receive ;;
;; Buffers from the memory areas just at the bottom of ;;
;; the program. Stores it in 2 bytes for the 16bit ;;
;; memory address location ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda #<TRANSMIT_BUFFER
sta xmitbuffer
lda #>TRANSMIT_BUFFER
sta xmitbuffer + 1
lda #<RECEIVE_BUFFER
sta recvbuffer
lda #>RECEIVE_BUFFER
sta recvbuffer + 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Load the values of the control register ;;
;; and store it into control ;;
;; FT817 runs at 9600 or 4800 baud ;;
;; BIT [7] : (1) 2 stop bits ;;
;; BIT [6-5]: (00) 8 bit ;;
;; BIT [4] : (1) Internal baudrate generator ;;
;; BIT [3-0]: (1100) 9600 baud or..... ;;
;; BIT [3-0]: (1010) 4800 baud ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda #%10011100 ; 9600 baud
sta controlregister
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Load the values of the command register ;;
;; and store it into command and xmitoff ;;
;; BIT [7-5]: (000) Parity - NONE ;;
;; BIT [4] : (0) Echo - OFF ;;
;; BIT [3-2]: (10) TXIRQ - OFF, RTS - LOW , XMIT ON ;;
;; BIT [1] : (0) RCV INTERRUPT ENABLED ;;
;; BIT [0] : (1) MASTER IRQ CONTROL ON ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda #%00001001
sta commandregister
sta xmitoff
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Leave the parity and echo bits alone. BITS [7-4] ;;
;; make the last four bits 0101 and store it to ;;
;; xmiton to provide ;;
;; BIT [3-2]: (01) TXIRQ - ON , RTS - LOW , XMIT ON ;;
;; BIT [1] : (1) RCV INTERRUPT DISABLED ;;
;; BIT [0] : (0) MASTER IRQ CONTROL OFF ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
and #%11110000
ora #%00000101
sta xmiton
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is where we replace the old NMI vector with our ;;
;; own. The old vector will be stored in oldnmivector ;;
;; this is 16bit and requires 2 bytes ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sei ;Disable interrupts just in case
lda nmivector ;get low byte of the current NMI vector
sta oldnmivector ;store it in oldnmivector
lda nmivector+1 ;get the high byte of the current NMI vector
sta oldnmivector+1 ;store it in oldnmivector + 1
lda #<NEWNMI ;get low byte of our new NMI code
sta nmivector ;store it in the nmivector
lda #>NEWNMI ;get the high byte of our new NMI code
sta nmivector+1 ;store it in the nmivector + 1
cli ;re-enable IRQ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; We jump to CHECKCONNECT, where the program begins ;;
;; at the user end ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jmp ACIACODEFINISH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is our NEWNMI routine what happens when an NMI ;;
;; occurs, will jump to here to execute NMI code that ;;
;; we replaced thre original NMI code with. This is ;;
;; not IRQ, we must store the processor state to the ;;
;; stack first, and restore it later ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NEWNMI:
sei ; the usual processor status storage routine
pha
txa
pha
tya
pha ; processor state now stored to stack
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Load the statusregister into A ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda statusregister
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Modify command register shutoff NMI from GLINK232 ;;
;; ;;
;; BIT [7-5]: (000) Parity - NONE ;;
;; BIT [4] : (0) Echo - OFF ;;
;; BIT [3-2]: (00) TXIRQ - OFF, RTS - HIGH, XMIT OFF ;;
;; BIT [1] : (1) RCV INTERRUPT DISABLED ;;
;; BIT [0] : (1) MASTER IRQ CONTROL ON ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldx #%00000011
stx commandregister
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; RECEIVE AND TRANSMIT HIGH??? ;;
;; Mask out the statusregister just check bits 3 and 4 ;;
;; Are both Bits HIGH???? or JSR to LEAVE_NMI ;;
;; BIT [7] : (1) Interrupt caused by glink232 ;;
;; BIT [6] : (1) Carrier present ;;
;; BIT [5] : (1) DSR - HIGH (0) DSR - LOW ;;
;; BIT [4] : (1) Ready to get next byte in data reg ;;
;; BIT [4] : (0) Chip currently sending byte ;;
;; BIT [3] : (1) Byte recieved in data register ;;
;; BIT [3] : (0) Nothing received in data register ;;
;; BIT [2] : (1) Overrun occured!!! ;;
;; BIT [1] : (1) Parity error!!! ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
and #%00011000
beq LEAVE_NMI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IS THERE A RECEIVE BYTE IN THE DATA REGISTER??? ;;
;; Mask out the statusregister just check bits 3 ;;
;; Is it high??? ;;
;; If the value from and = 0, then it is not a receive ;;
;; branch off to transmit [SEND_TO_DATAREGISTER] ;;
;; otherwise proceed onto RECEIVE code ;;
;; find out where the end of the receive buffer is, ;;
;; store the byte at the end, ;;
;; incriment recvbuffer to next address, ;;
;; and incriment our receive buffer current size so we ;;
;; know how many bytes are in the buffer ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IS_RECEIVE_BYTE:
and #%00001000 ; Mask all but bit #3
beq SEND_TO_DATAREGISTER ; If 0 branch to SEND_TO_DATAREGISTER
; If you are still here, it is not zero
; start receive action
lda dataregister ; get received byte from dataregister
ldy recvtail ; load index memory value of end of receive buffer to Y
sta (recvbuffer),y ; and store it
inc recvtail ; move index to next slot
inc recvbuffersize ; increment count of bytes in receive buffer (if used by your program)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SEE IF THE TRANSMIT BUFFER IS EMPTY OR NOT ;;
;; If empty branch to LEAVE_NMI ;;
;; If not empty continue onto XMITBYTE ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IS_XMIT_NEEDED:
lda xmitbuffersize
beq LEAVE_NMI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SEE IF THE TRANSMIT BUFFER IS EMPTY OR NOT ;;
;; If empty branch to LEAVE_NMI ;;
;; If not empty continue onto XMITBYTE ;;
;; BIT [4] : (1) Ready to get next byte in data reg ;;
;; BIT [4] : (0) Chip currently sending byte ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IS_XMITBYTE_READY:
lda statusregister ; We have to reload the status register
and #%00010000 ; Mask all but bit #4
; if 0 its busy
; if 1 its available continue on
beq LEAVE_NMI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; STORE BYTE TO DATAREGISTER ;;
;; Get the location of xmithead and store it in Y, ;;
;; load a with the transmit buffer offset by Y, ;;
;; Store that byte in the dataregister, ;;
;; Incriment xmithead to the next memory location, ;;
;; decriment buffer by 1 since we pushed a byte out, ;;
;; load the new xmitbuffersize into A, ;;
;; if empty branch to LEAVE_NMI, ;;
;; if not empty load A with xmiton ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND_TO_DATAREGISTER:
ldy xmithead
lda (xmitbuffer),y ;get character at head of buffer
sta dataregister ;place in ACIA for transmit
;point to next character in buffer
inc xmithead ;and store new index
dec xmitbuffersize ;subtract one from count of bytes in xmit buffer
lda xmitbuffersize
beq LEAVE_NMI
lda xmiton ;model to leave both interrupts enabled
bne NMICOMMAND ;branch always to store model in command register
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LEAVE NMI with xmitoff ;;
;; This loads xmitoff into a before going onto ;;
;; NMICOMMAND and exiting the interrupt ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LEAVE_NMI:
lda xmitoff
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; STORE COMMANDREGISTER ;;
;; store A into commandregister, with either xmiton or ;;
;; xmitoff depending on the condition that loaded ;;
;; either/or into A ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NMICOMMAND:
sta commandregister
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; RELOAD PROCESSOR STATUS FROM BEFORE ;;
;;Restore the processor status and contine onto the ;;
;;NMI code from the KERNEL ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESTORE_FROM_NMI:
pla
tay
pla
tax
pla
rti
; jmp (oldnmivector) ; keep this for other NMI Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Radio specific code starts here....... ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ACIACODEFINISH:
START:
jmp GETID
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; UPDATE ;;
;; What gets done when the commandset is idle ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UPDATE:
jsr GETMEMORVFO
jsr GETCATFREQANDMODE
jsr GETCATTXKEY
jsr GETFURTHERINFO
jsr CHECKINPUT
jmp UPDATE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GET CATTXKEY ;;
;; Call cat commmand for TXKEY ;;
;; CAT 00 00 00 00 F7 - xmit status ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETCATTXKEY:
jsr CLEARBUFFER
GETCATTXKEY2:
lda GET_TX,x
tay
jsr TESTACIA
inx
cpx #$05
bne GETCATTXKEY2
jsr WAIT
lda (recvbuffer),y
sta radiobyte+1
and #%10000000
sta radiobyte
lda radiobyte+1
and #%00001111
sta radiobyte+1
ldx #$00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TXRXSEARCH/PRINT ;;
;; Search for and print TX or RX based on value in ;;
;; radiobyte. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TXRXSEARCH:
ldy TXRXLABEL,x
inx
cpx #$FF ; if X hits this thr receive data was garbage
beq GETCATTXKEY ; try the module over again
cpy radiobyte
bne TXRXSEARCH
ldy #$00
TXRXPRINT:
lda TXRXLABEL,x
sta $049B,y
inx
iny
cpy #02
bne TXRXPRINT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ISITRXORTX ;;
;; Fork in the code, is the 817 in TX or RX mode ;;
;; if TX continue on with TXINFO, if RX jump to RXINFO ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ISITRXORTX:
lda radiobyte
cmp #$80
beq RXINFOJUMP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TXINFO ;;
;; Get info from 00,00,00,00,BD ;;
;; Returns two bytes ;;
;; 1st byte PWR and VSWR is radiobyte+1 ;;
;; 2nd byte is ALC and MOD is radiobyte ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TXINFO:
jsr CLEARBUFFER
TXINFO2:
lda GET_TXMETER,x
tay
jsr TESTACIA
inx
cpx #$05
bne TXINFO2
jsr WAIT
ldx #$00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PWRSEARCH/PWRPRINT ;;
;; Compare radiobyte+1 data against PWR index to find ;;
;; its value and print it. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PWRSEARCH:
ldy PWR,x
inx
cpx #$FF ; if X hits this thr receive data was garbage
beq TXINFO ; try the module over again
cpy radiobyte+1
bne PWRSEARCH
ldy #$00
PWRPRINT:
lda PWR,x
sta $0494,y
inx
iny
cpy #02
bne PWRPRINT
ldy #$00
lda (recvbuffer),y
and #%00001111
cmp #$00 ; is 00, load SM0
beq SM0
cmp #$02 ; is 0001 first bar
bcc SM1
beq SM1
cmp #$04 ; is 0010 second bar
bcc SM2
beq SM2
cmp #$06 ; is 0011 third bar
bcc SM3
beq SM3
cmp #$08 ; is 0100 fourth bar
bcc SM4
beq SM4
cmp #$0A
bcc SM5
beq SM5
cmp #$0C
bcc SM6
beq SM6
cmp #$0D
bcc SM7
beq SM7
cmp #$0F
bcc SM8
beq SM8
rts
RXINFOJUMP:
jmp RXINFO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SPRITEMEMER CODE ;;
;; Updates enable sprite values for Smeter in RX or ;;
;; SWR meter in TX ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SM0:
lda #%00000000
jmp METERUPDATE
SM1:
lda #%00000001
jmp METERUPDATE
SM2:
lda #%00000011
jmp METERUPDATE
SM3:
lda #%00000111
jmp METERUPDATE
SM4:
lda #%00001111
jmp METERUPDATE
SM5:
lda #%00011111
jmp METERUPDATE
SM6:
lda #%00111111
jmp METERUPDATE
SM7:
lda #%01111111
jmp METERUPDATE
SM8:
lda #%11111111
jmp METERUPDATE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; RXINFO ;;
;; Where we folked from ISITRXORTX continue here for ;;
;; RX. From 00,00,00,00,E7 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RXINFO:
jsr CLEARBUFFER
RXINFO2:
lda GET_RX,x
tay
jsr TESTACIA
inx
cpx #$05
bne RXINFO2
jsr WAIT
lda (recvbuffer),y
jsr CLEARPOWER ; SQUELCH tag en/dis and clear power tag
and #%00001111 ; check only 1st 4, S-Meter reading
cmp #$00
beq SM0
cmp #$02
bcc SM1
beq SM1
cmp #$04
bcc SM2
beq SM2
cmp #$06
bcc SM3
beq SM3
cmp #$08
bcc SM4
beq SM4
cmp #$0A
bcc SM5
beq SM5
cmp #$0C
bcc SM6
beq SM6
cmp #$0D
bcc SM7
beq SM7
cmp #$0F
bcc SM8
beq SM8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; METERUPDATE ;;
;; Sends the value left in A to SPENA to turn on or ;;
;; off the sprites for the meter ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
METERUPDATE:
sta SPENA
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; CLEARPOWER/SQUELCHSEARCH/SQUELCHPRINT ;;
;; Blanks the power label, Enables or disables the ;;
;; Squelch label. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLEARPOWER:
sta radiobyte
and #%10000000
sta $FD
ldx #$00
SQUELCHSEARCH:
ldy SQUELCHLABEL,x
inx
cpy $FD
bne SQUELCHSEARCH
ldy #$00
SQUELCHPRINT:
lda SQUELCHLABEL,x
sta $0483,y
inx
iny
cpy #07
bne SQUELCHPRINT
lda radiobyte
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GETFREQANDMODE ;;
;; RETURNS CAT COMMAND FOR FREQ AND MODE, ADDS DECIMAL ;;
;; Drops into FIXED POSITION AT $043E,X ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETCATFREQANDMODE:
jsr CLEARBUFFER
GETCATFREQANDMODE2: ; c139
lda GET_CAT_FREQANDMODE,x ; load the bytes in GET_VERSION
tay
jsr TESTACIA ; pass it to the acia
inx
cpx #$05
bne GETCATFREQANDMODE2
jsr WAIT ;need this becuase process it too fast
freqout:
lda (recvbuffer),y
and #%11110000
lsr
lsr
lsr
lsr
adc #$30
sta $0440,x
inx
cpx #$03 ; first decimal
beq decimal
clc
continue:
lda (recvbuffer),y
and #%00001111
adc #$30
sta $0440,x
inx
cpx #$07 ; second decimal
beq decimal2
clc
continue2:
iny
cpy #$04 ; all 5 numbers processed
bne freqout
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MODE PORTION ;;
;; Parse lookup table and add 3chr mode name at 044B,X ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda (recvbuffer),y
sta $FB
sta currentmode
ldx #$00
modesearch:
ldy MODES,x
inx
cpx #$FF ; if X hits this thr receive data was garbage
beq GETCATFREQANDMODE ; try the module over again
cpy $FB
bne modesearch
ldy #$00
modeprint:
lda MODES,x
sta $044B,y
inx
iny
cpy #03
bne modeprint
rts
decimal:
clc
lda #$2E
sta $0440,x
inx
jmp continue
decimal2:
clc
lda #$2E
sta $0440,x
inx
jmp continue2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GETMEMORVFO ;;
;; Get the setting for MEM/VFO bit 7 00x55 and ;;
;; Get VFO A or B bit 0 00x55 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETMEMORVFO:
jsr CLEARBUFFER
GETMEMORVFO2:
lda GET_VFO_STATUS,x
tay
jsr TESTACIA
inx
cpx #$05
bne GETMEMORVFO2
jsr WAIT
lda (recvbuffer),y ; load in ONLY 1st byte from receive buffer
sta radiobyte
and #%10000000 ; is it Mem or VFO ; mem 0 vfo 1
sta $FC
ldx #$00
hometest:
lda radiobyte ; check to see if HOME is active, if so skip to it
and #%00010000 ; home is 4th bit
cmp #$10
beq homeprint
memvfosearch:
ldy MEMVFO,x
inx
cpx #$FF ; if X hits this thr receive data was garbage
beq GETMEMORVFO ; try the module over again
cpy $FC
bne memvfosearch
ldy #$00
memvfoprint:
lda MEMVFO,x
sta $042A,y
inx
iny
cpy #04
bne memvfoprint
jmp VFOletter
homeprint:
lda HOME,x
sta $042A,x
inx
cpx #$05
bne homeprint
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PRINTVFOLETTER or MEMCHAN # ;;
;; If its VFO goto letter print routine if its MEM go ;;
;; to code to get and print current memory channel ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VFOletter:
lda $FC ; is it VFO A or B CURRENTMEMnumber is at 04x4F
cmp #$80 ;is it vfo
beq PRINTVFOLETTER
lda #$20
sta $042E ; blank out vfo letter
rts
PRINTVFOLETTER:
lda radiobyte
and #$00000001
cmp #$00
beq printA
lda #$42 ; PRINT B
sta $042E
jmp GETVFOBAND
printA:
lda #$41 ; PRINT A
sta $042E
jmp GETVFOBAND
GETVFOBAND:
jsr CLEARBUFFER
GETVFOBAND2:
lda GET_VFO_BAND,x
tay
jsr TESTACIA
inx
cpx #$05
bne GETVFOBAND2
jsr WAIT
lda (recvbuffer),y ; load in ONLY 1st byte from receive buffer
sta radiobyte
ldx $042E
cpx #$42
beq GETVFOBANDb
GETVFOBANDa:
lda vfoAstarthigh
sta memjumphigh ; adds inital nemory 00x7D to memjump
lda vfoAstartlow
sta memjumplow
lda radiobyte
and #%00001111
sta $FC
ldx #$00
jmp GETVFOBANDSEARCH
GETVFOBANDb:
lda vfoBstarthigh
sta memjumphigh ; adds inital nemory 02x73 to memjump
lda vfoBstartlow
sta memjumplow
lda radiobyte
and #%11110000 ; needs further conversion asr x 4?
lsr
lsr
lsr
lsr
sta $FC
ldx #$00
jmp GETVFOBANDSEARCH
GETVFOBANDSEARCH:
ldy VFOBANDS,x
inx
cpx #$FF ; if X hits this the receive data was garbage
beq GETVFOBAND ; try the module over again
cpy $FC
bne GETVFOBANDSEARCH
stx $FB ; X must be preserved during the JSR
jsr UPDATEJUMPTABLEVFO ; update memjumplow and memjumphigh for the band given the VF0
ldx $FB ; Restore X from before
ldy #$00
VFOBANDPRINT:
lda VFOBANDS,x
sta $0431,y
inx
iny
cpy #04
bne VFOBANDPRINT
rts
UPDATEJUMPTABLEVFO:
;;;;;;;;;;;;;;;;;;;;;;;;load inital vfo offset add 26 [1A]for each value in FC
ldx #$00
cpy #$00
bne JUMPTABLEVFOLOOP
rts ; if its 160m , $00 no further conversion required
JUMPTABLEVFOLOOP: ;if not $00 we need to add 1A for each number greater than 0
clc
lda memjumplow
adc #$1A
sta memjumplow
lda memjumphigh
adc #$00
sta memjumphigh
inx
cpx $FC
bne JUMPTABLEVFOLOOP
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EZREADPREPARE ;;
;; Same as CLEARBUFFER, takes offsetfrombase and adds ;;
;; it to memjumplow and memjumphigh and stores new ;;
;; value in tempjumplow tempjumphigh ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EZREADPREPARE:
clc
lda memjumplow
adc offsetfrombase
sta tempjumplow
lda memjumphigh
adc #$00
sta tempjumphigh
ldy #$00 ; reinitialize buffer after send, we can find a better place
sty recvhead
sty recvtail
ldy #$00
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EZREAD ;;
;; After EZREADPREPARE dumps new offsets from ;;
;; offsetfrombase, add offset to A templomplow/high ;;
;; tempjumplow,tempjumphigh,00,00,BB to the acia ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EZREAD:
ldy tempjumphigh
jsr TESTACIA
ldy tempjumplow
jsr TESTACIA
ldy #$00
jsr TESTACIA
jsr TESTACIA
ldy #$BB
jsr TESTACIA
jsr WAIT
ldy #$01
lda (recvbuffer),y ; load in 2nd byte from receive buffer
sta radiobyte,y
dey
lda (recvbuffer),y ; load in 1st byte from receive buffer
sta radiobyte,y
rts
;;;;;;;;;;;;;;;;;;;;;;;;;; 2 bytes come back, may be second!!!!!!!!!!!!!!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GETFURTHERINFO ;;
;; This is where we get more stuff that needs offset ;;
;; memory locations from the memjumplow and memjumphigh ;;
;; vectors, works with VFO and Memory ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETFURTHERINFO:
jsr GET57
jsr GET58
jsr GET5D
jsr GET5F
jsr GET79
jsr GET7A
jsr GET7B
rts
;---------------------------------------------------------------------------------
GET79:
ldy #$00 ; reinitialize buffer after send, we can find a better place
sty recvhead
sty recvtail