-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathK6VCO.ASM
694 lines (621 loc) · 14.8 KB
/
K6VCO.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
TITLE 'AMRAD PACKET REPEATER V1.0'
;
; ASSEMBLED 26 NOV 1981
;
; PROGRAM TO RUN IN THE VADCG TERMINAL NODE CONTROLLER AND
; REPEAT PACKETS RECIEVED WHICH HAVE THE FOLLOWING ADDRESSES:
;
; 10XXXXXX
;
; WHERE THE MSB IS THE "REQUEST FOR REPEAT" BIT, THE NEXT
; BIT IS THE "REPEATED" BIT AND THE REMAINING BITS ARE THE
; UNIQUE USER ADDRESS.
;
; J. R. BLOOM KE3Z - 26 NOV 1981
;
MACLIB LIB85 ; 8085 MACRO LIBRARY
; DELAY PARAMETERS - SET "DELAY" TO 1 TO ASSEMBLE THE
; TX TURN ON DELAY. MAKE "DLYVAL" EQUAL TO THE DELAY
; TIME.
; SET "CBDLY" TO 1 TO ASSEMBLE THE CHANNEL BUSY
; DELAY. SET "CBDLYV" TO THE DELAY VALUE.
; SET "IDTIME" TO THE NUMBER OF SECONDS BETWEEN ID'S.
DELAY EQU 0
DLYVAL EQU 4000H
CBDLY EQU 0
CBDLYV EQU 1500H
IDTIME EQU 600 ;ID DELAY IN SECONDS
SECOND EQU 22306 ; # CWCHEKS IN SECOND
; CONFIGURATION EQUATES
BUFSIZ EQU 128 ;MAXIMUM PACKET SIZE
MAXPKT EQU 7 ;MAXIMUM # PACKETS TO BUFFER
; RAM MEMORY EQUATES
LORAM EQU 1000H ;BOTTOM OF MEMORY
HIRAM EQU 1FFFH ;TOP OF MEMORY
; PROCESSING STATUS ("PROCST") BIT EQUATES
TXBUSY EQU 01H ;TRANSMITTER BUSY
TXOCUR EQU 02H ;TRANSMISSION OCCURRED SINCE ID
CWIP EQU 04H ;CW ID IN PROGRESS
ACTDET EQU 08H ;CHANNEL ACTIVITY DETECTED
PAGE
; CW ID TIMING EQUATES
CW96 EQU 64
CW48 EQU 32
CW24 EQU 16
CW12 EQU 8
CW06 EQU 4
CW03 EQU 2
CW015 EQU 1
CW007 EQU 1
; SET CW ID TIMER FOR BAUD RATE USED
IDNUM EQU CW12
; 8273 PORT EQUATES
STAT73 EQU 10H ;STATUS REG
COMM73 EQU 10H ;COMMAND REG
PARM73 EQU 11H ;PARAMETER REG
RESL73 EQU 11H ;RESULT REG
TXIR73 EQU 12H ;TX INTERRUPT RESULT REG
RXIR73 EQU 13H ;RX INTERRUPT RESULR REG
TXDATA EQU 18H ;OUTPUT DATA REG
RXDATA EQU 20H ;INPUT DATA REG
; 8273 REGISTER EQUATES
CPBF EQU 20H ;STATUS REG PARM BUF FULL
CRBF EQU 10H ;STATUS REG RESULT BUF FULL
RINT EQU 08H ;RX INT PENDING
TINT EQU 04H ;TX INT PENDING
RXIRA EQU 02H ;RX INT RESULT AVAILABLE
TXIRA EQU 01H ;TX INT RESULT AVAILABLE
CD EQU 02H ;PORT A CARRIER DETECT
PAGE
; INTERRUPT VECTORS AT BOTTOM OF MEMORY
ORG 0
RESTRT: JMP REPEAT
ORG 08H
RET ;NO RST 1
ORG 10H
RET ;NO RST 2
ORG 18H
RET ;NO RST 3
ORG 20H
RET ;NO RST 4
ORG 24H
RET ;NO TRAP
ORG 28H
RET ;NO RST 5
ORG 2CH
RET ;NO RST 5.5 (8250)
ORG 30H
RET ;NO RST 6
ORG 34H
JMP TXINT ; 8273 TX INTERRUPT
ORG 38H
RET ;NO RST 7
ORG 3CH
JMP RXINT ; 8273 RX INTERRUPT
; ID STRING - BITS OF CW ID
IDSTR: DB 000H,0EAH,043H,0AEH,075H,051H,057H
DB 03AH,0E9H,0DDH,0C3H,0ABH,0A2H,0E8H
IDBYTS EQU $-IDSTR ;SIZE OF ID STRING
IDLTH EQU IDBYTS*IDNUM*8
; 8273 COMMAND STRINGS = PARM COUNT, COMMAND, PARMS
DATTRN: DB 1,97H,1 ;DATA TRANSPARENT MODE
OPMODE: DB 1,91H,0BH ;NO HDLC ABT, NO EOP, EARLY TX INT,
;UNBUFFERED, SYNC, FLAG IDLE
SERIO: DB 1,0A0H,1 ;NRZI MODE
DTRON: DB 1,0A3H,4 ;DATA TERMINAL READY ON
SETRTS: DB 1,0A3H,1 ;RTS ON (TRANSMITTING)
RESRTS: DB 1,63H,0FEH ;RTS OFF (STOP TRANSMITTING)
RXGEN: DB 2,0C0H,BUFSIZ+2,0 ;GENERAL RECEIVE
RDPA: DB 0,22H ;READ PORT A BITS
RXDIS: DB 0,0C5H ;DISABLE RECEIVER
TXCWID: DB 2,0C9H ;TX CW ID
DW IDLTH
CWOPMD: DB 1,60H,0F8H ;NO PRE-FRAME SYNC
CWSIO: DB 1,51H,9 ;NRZL
PAGE
; BEACON DATA - CREATE UP TO MAXPKT PACKET
; STRINGS AND ENTER THE STRING ADDR AND LENGTH
; IN BCNTAB. DON'T FORGET THE ADDRESS AND CONTROL
BCN1: DB 0FFH,3,' This is the beacon of the Pacific Packet Radio'
DB ' Society, K6VCO/R',0DH,0AH
LBCN1 EQU $-BCN1
BCN2: DB 0FFH,3,' Located in Oakland, California, courtesy of WA6TAT'
DB 0DH,0AH
LBCN2 EQU $-BCN2
BCN3: DB 0FFH,3,' AMRAD VADCG Repeater Program Version 1.01',0DH,0AH
LBCN3 EQU $-BCN3
; BEACON PACKET TABLE
BCNTAB:
DW BCN1
DB LBCN1
DW BCN2
DB LBCN2
DW BCN3
DB LBCN3
NUMBCN EQU ($-BCNTAB)/3
PAGE
REPEAT:
DI ;NO INT YET PLEASE
; ZERO RAM
LXI D,HIRAM ;END OF RAM (STOP ADDRESS)
LXI H,LORAM ;BEGINNING OF RAM (START ADDRESS)
RPT010:
MVI M,0 ;ZERO NEXT BYTE OF RAM
INX H
MOV A,D ;HIGH BYTE EQUAL?
CMP H
JNZ RPT010 ;NO, KEEP ZEROING
MOV A,E ;LOW BYTE EQUAL?
CMP L
JNZ RPT010 ;NO, KEEP ZEROING
LXI SP,STACK ;INIT SYSTEM STACK
; SET UP 8273
LXI H,DATTRN
CALL COMMAND
LXI H,OPMODE
CALL COMMAND
LXI H,SERIO
CALL COMMAND
LXI H,DTRON
CALL COMMAND
MVI A,19H ;ENABLE RST 6.5 AND 7.5
SIM
EI ;OK FOR INTERRUPTS
; HERE WHEN WAITING TO RECEIVE PACKETS
RPT050:
LXI H,BUFFER ;INIT TO FIRST BUFFER
SHLD BUFPTR
CALL RXSET ;SET UP AND ISSUE RX COMMAND
; WAITING FOR PACKET TO ARRIVE
RPT060:
CALL CWCHEK ;CHECK IF ID NEEDED
LDA NUMPKT ;GET # PACKETS RECEIVED
ORA A ;NO PACKET YET?
JZ RPT060 ;NOT YET, KEEP WAITING
PAGE
; PACKET(S) RECEIVED - WAIT FOR CARRIER TO GO AWAY
RPT070:
CALL CHKBSY ;SEE IF CHANNEL BUSY
JNZ RPT060 ;YES, WAIT FOR IT TO CLEAR
IF CBDLY
LXI H,CBDLYV ;SET UP TIMER
SHLD TIME
CALL TIMER
CALL CHKBSY ;CHECK CHANNEL AGAIN
JNZ RPT070 ;BUSY AGAIN, WAIT SOME MORE
ENDIF
; HERE TO SET UP FOR PACKET TRANSMISSION
LDA PROCST ;GET PROCESSING STATUS
ORI TXBUSY+TXOCUR ;SHOW TRANSMITTING
STA PROCST
LXI H,SETRTS ;TURN ON TX
CALL COMMAND
IF DELAY
LXI H,DLYVAL ;SETUP DELAY TIMER
SHLD TIME
CALL TIMER ;WAIT FOR TIME OUT
ENDIF
LXI H,NUMPKT
MOV B,M ;B = PACKET COUNTER
LXI H,BUFFER ;INITIAL BUFFER TO SEND
PAGE
; PACKET SENDING LOOP - CALLS TXPKT TO DO THE WORK.
; AFTER EACH PACKET SENT, DECREMENTS PACKET COUNT (B)
; AND, IF NOT 0, SENDS ANOTHER PACKET.
RPT080:
SHLD BUFPTR ;POINTER TO CURRENT BUFFER
CALL TXPKT ;TRANSMIT THE PACKET
LXI D,BUFSIZ+3 ;INCREMENT TO NEXT BUFFER
LHLD BUFPTR ;CURRENT BUFFER PTR
DAD D
DCR B ;ALL PACKETS SENT YET?
JNZ RPT080 ;NO, KEEP SENDING
; RE-INITIALIZE NUMBER OF PACKETS TO 0 AND START OVER
RPT090:
LDA TXWAIT ;HAS FINAL TX INT OCCURRED?
CPI 2
JNZ RPT090 ;NO, WAIT FOR COMPLETION
LXI H,RESRTS ;STOP TRANSMITTING
CALL COMMAND
LDA PROCST ;GET PROCESSING STATUS
ANI 0FEH ;SHOW NOT TRANSMITTING
STA PROCST
XRA A
STA NUMPKT
JMP RPT050
PAGE
; TRANSMISSION ROUTINES
; TXPKT - DISABLES RECEIVER, COMMANDS 8273 TO SEND
; A PACKET AND WAITS FOR PACKET COMPLETION
TXPKT:
PUSH B
XCHG ;SAVE HL IN DE
LXI H,RXDIS ;DISABLE RECEIVER
CALL COMMAND
LXI H,CMDBUF ;WHERE TO BUILD COMMAND
MVI M,2 ;TWO PARAMETERS
INX H
MVI M,0C8H ;TX FRAME COMMAND
INX H
LDAX D ;GET PACKET LENGTH
INX D ;POINT TO PACKET DATA
MOV M,A
INX H
MVI M,0 ;MS BYTE OF LENGTH
XCHG ;HL = PACKET POINTER
MOV A,M ;GET ADDRESS
ORI 0A0H ;REPEATED BIT SET !!!!!!!!!!!!!!!!!!!!!!
MOV M,A
SHLD PKTPTR
XRA A ;WAIT FLAG RESET
STA TXWAIT
LXI H,CMDBUF ;COMMAND 8273 TO TRANSMIT FRAME
CALL COMMAND
; WAIT FOR END OF PACKET TRANSMISSION
TXP010:
CALL CWCHEK ;DEC CW ID TIMER
LDA TXWAIT ;CHECK WAIT FLAG
ORA A
JZ TXP010 ;KEEP WAITING
POP B
RET ;ALL DONE
PAGE
; TRANSMIT INTERRUPT SERVICE ROUTINE
TXINT:
PUSH H ;SAVE REGISTERS
PUSH B
PUSH PSW
LDA PROCST ;GET PROCESSING STATUS
ANI CWIP ;CW ID INT?
JNZ IDINT ;YES, PROCESS IT
IN STAT73 ;END OF PACKET OR DATA INT?
ANI TXIRA
JNZ TXI010 ;END OF PACKET - GO PROCESS
LHLD PKTPTR ;GET DATA POINTER
MOV A,M ;GET NEXT BYTE OF DATA
INX H
SHLD PKTPTR
OUT TXDATA ;SEND DATA BYTE TO 8273
JMP TXI020 ;RETURN
; END OF PACKET - SET WAIT FLAG
TXI010:
IN TXIR73 ;GET THE STATUS
CPI 0CH ;EARLY TX INT?
JNZ TXI015 ;NO, FINAL INTERRUPT
MVI A,1 ;FLAG EARLY TX INT
JMP TXI019
TXI015:
MVI A,02H
TXI019:
STA TXWAIT
TXI020:
POP PSW ;RESTORE REGS
POP B
POP H
EI ;INTS OK AGAIN
RET
PAGE
; SET UP FOR RECEIVE
RXSET:
LHLD BUFPTR ;POINT TO CURRENT BUFFER
MVI M,0 ;COUNT = 0
INX H ;FIRST DATA BYTE
SHLD PKTPTR
LXI H,RXGEN ;COMMAND 8273 TO RECEIVE
CALL COMMAND
RET
PAGE
; RECEIVE INTERRUPT SERVICE
RXINT:
PUSH H ;SAVE REGISTERS
PUSH B
PUSH PSW
IN STAT73 ;END OF PACKET OR DATA INT?
ANI RXIRA
JNZ RXI010 ;END OF PACKET - PROCESS IT
LHLD PKTPTR ;DATA POINTER
IN RXDATA ;GET NEXT DATA BYTE
MOV M,A ;STORE IN BUFFER
INX H
SHLD PKTPTR
JMP RXI030 ;RETURN
; HERE AT END OF PACKET. GET THE INTERRUPT STATUS
; AND THE RESULTS (RECEIVED BUFFER LENGTH).
RXI010:
IN RXIR73 ;GET INT RESULTS
MOV C,A ;SAVE THE RESULT STATUS
RXI015:
IN STAT73 ;RX INT STILL PENDING?
ANI RINT
JZ RXI017 ;NO, GO CHECK INT RESULT
IN STAT73 ;CHECK FOR INT RES AVAIL. AGAIN
ANI RXIRA ;INT RESULT AVAIL. AGAIN?
JZ RXI015 ;NO, KEEP WAITING
IN RXIR73 ;GET LOW BYTE OF COUNT
LHLD BUFPTR
MOV M,A ;STORE COUNT
RXI016:
IN STAT73 ;STILL PENDING?
ANI RINT
JZ RXI017 ;NO, GO CHECK STATUS
IN STAT73 ;RESULT AVAILABLE?
ANI RXIRA
JZ RXI016 ;NO, KEEP WAITING
IN RXIR73 ;GET (AND IGNORE) RESULT BYTE
JMP RXI016
PAGE
; CHECK THE RX STATUS. IF IT SHOWS A GOOD FRAME,
; CHECK FOR VALID ADDRESS (1X0XXXXX) AND, IF SO,
; UPDATE THE BUFFER POINTER AND NUMBER OF PACKETS
; COUNT.
RXI017:
MOV A,C ;RESTORE RESULTS
CPI 0E0H ;GOOD STATUS?
JC RXI020 ;NO, RESCHEDULE RX
LDA PROCST ;GET PROCESSING STATUS
ORI ACTDET ;SHOW CHANNEL ACTIVITY
STA PROCST
LHLD BUFPTR ;GET BUFFER POINTER
INX H ;POINT TO ADDRESS BYTE
MOV A,M
DCX H
CPI 0FEH ;INTERNET TYPE PACKET? !!!!!!!!!!!!!!!
JZ RXI018 ;YES, REPEAT IT !!!!!!!!!!!!!!!
ANI 0A0H ;MASK OFF ALL BUT RPT BITS !!!!!!!!!!!!!!!
CPI 080H ;WANTS RPT BUT NOT FROM RPTR?
JNZ RXI020 ;NO, IGNORE THE PACKET
RXI018: LXI B,BUFSIZ+3
DAD B
SHLD BUFPTR
LXI H,NUMPKT ;ANOTHER PACKET AVAILABLE
INR M
; HERE TO RE-SCHEDULE RECEPTION. IF "MAXPKT"
; PACKETS HAVE BEEN RECEIVED, DISABLE THE RECEIVER.
; OTHERWISE, COMMAND THE 8273 TO RECEIVE AGAIN.
RXI020:
LDA NUMPKT
CPI MAXPKT ;MAXIMUM # PACKETS IN YET?
JC RXI025 ;NO, RX ANOTHER
LXI H,RXDIS ;STOP RECEIVING
CALL COMMAND
JMP RXI030
RXI025:
CALL RXSET
RXI030:
POP PSW ;RESTORE REGS
POP B
POP H
EI
RET
PAGE
; SUBROUTINES
; COMMAND - OUTPUT COMMAND AND PARAMETERS TO 8273
COMMAND:
MOV B,M ;GET # PARAMETERS
INX H
CMD010:
IN STAT73 ;CAN WE COMMAND?
RLC
JC CMD010 ;NO, KEEP WAITING
MOV A,M ;GET COMMAND
OUT COMM73
CMD020:
MOV A,B ;ANY PARAMETERS?
ANA A
RZ ;NO, RETURN
INX H ;POINT TO NEXT PARM
DCR B
CMD030:
IN STAT73 ;OK TO STUFF PARM INTO 8273?
ANI CPBF
JNZ CMD030 ;NO, KEEP WAITING
MOV A,M ;GET PARM
OUT PARM73
JMP CMD020
; RESULT ROUTINE - RETURNS 8273 RESULT REG
RESULT:
IN STAT73 ;OK TO READ RESULT REG?
ANI CRBF
JZ RESULT
IN RESL73
RET
PAGE
; TIMING SUBROUTINES
; TIMER - COUNTS DOWN TIME VALUE IN "TIME"
TIMER:
CALL TIMER1 ;WAIT ONE COUNT
JNZ TIMER ;GO AGAIN IF NOT TIMED OUT
RET
TIMER1:
LHLD TIME ;GET TIMER VALUE
DCX H ;COUNT DOWN ONCE
SHLD TIME
MOV A,H ;CHECK FOR ZERO VALUE
ORA L
RET
; CHKBSY - CHECK TO SEE IF CHANNEL BUSY
CHKBSY:
LXI H,RDPA ;TELL 8273 TO READ PORT A
CALL COMMAND
CALL RESULT ;GET THE STATUS BITS
ANI CD ;LOOK AT CARRIER DETECT
RET ;(Z SET IF CHANNEL FREE)
PAGE
; CW ID CHECKER
CWCHEK:
LHLD CWSEC ;GET SECOND COUNT
MOV A,H
ORA L ;COUNT = 0?
JZ CWC005 ;YES, CHECK TIME COUNT
DCX H ;ANOTHER TICK GONE
SHLD CWSEC
RET
CWC005:
LHLD CWTIME ;GET TIME COUNT
MOV A,H
ORA L ;TIME EXPIRED?
JZ CWC007 ;YES, GO TRY ID
DCX H ;ANOTHER SECOND GONE
SHLD CWTIME
LXI H,SECOND ;SETUP SECOND COUNT
SHLD CWSEC
RET
; HERE TO TRY CW ID - CHECK STATUS: IF WE ARE
; TRANSMITTING OR HAVE PACKETS TO SEND, WAIT.
; WAIT ALSO IF CHANNEL IS BUSY
CWC007:
LDA PROCST ;GET PROCESSING STATUS
ANI TXBUSY ;TRANSMITTING?
RNZ ;YES, WAIT
LDA NUMPKT ;PACKETS IN BUFFER?
ORA A
RNZ ;YES, WAIT
CALL CHKBSY ;SEE IF CHANNEL FREE
RNZ ;NOPE! WAIT
LDA PROCST
ORI CWIP ;SHOW CW IN PROGRESS
STA PROCST
LXI H,RXDIS ;KILL RECEIVER
CALL COMMAND
LXI H,CWOPMD ;NO PRE-FRAME SYNC
CALL COMMAND
LXI H,CWSIO ;NRZL
CALL COMMAND
LXI H,SETRTS ;TURN ON TX
CALL COMMAND
MVI A,0
STA CWCNT
LXI H,IDSTR ;ADDRESS OF ID STRING
SHLD CWPTR
MVI A,0
STA CWBIT
XRA A ;INIT WAIT FLAG
STA TXWAIT
LXI H,TXCWID ;TELL 8273 TO TX
CALL COMMAND
PAGE
CWC030:
LDA TXWAIT ;FINISHED YET?
CPI 2 ;END OF FRAME?
JNZ CWC030 ;NO, KEEP WAITING
LXI H,RESRTS ;TURN OFF TX (RTS)
CALL COMMAND
LXI H,BUFFER
SHLD PKTPTR ;INIT BUFFER POINTER
LXI H,BCNTAB ;INIT PACKET TABLE POINTER
SHLD BCNPTR
MVI C,NUMBCN ;# PACKETS TO FILL
; FILL NEXT PACKET
CWC050:
LHLD BCNPTR
MOV E,M ;GET PACKET STRING ADDRESS
INX H
MOV D,M
INX H
MOV B,M ;GET PACKET LENGTH
INX H
SHLD BCNPTR ;UPDATE TABLE POINTER
LHLD PKTPTR ;GET NEXT BUFFER ADDRESS
MOV M,B ;STORE LENGTH
INX H
; FILL NEXT BUFFER
CWC060:
LDAX D ;GET NEXT PACKET BYTE
INX D
MOV M,A ;PUT INTO BUFFER
INX H
DCR B
JNZ CWC060
LHLD PKTPTR
LXI D,BUFSIZ+3
DAD D ;FORM NEXT BUFFER ADDR
SHLD PKTPTR
DCR C ;LAST BEACON PACKET?
JNZ CWC050 ;NO, KEEP GOING
MVI A,NUMBCN
STA NUMPKT ;INIT # PACKETS
LXI H,OPMODE
CALL COMMAND ;RE-SETUP 8273
LXI H,SERIO
CALL COMMAND
LDA PROCST ;SHOW CWID COMPLETE
ANI 0FBH
STA PROCST
LXI H,IDTIME ;SET UP TIMER AGAIN
SHLD CWTIME
RET
PAGE
; CW ID TX INTERRUPT SERVICE ROUTINE
IDINT:
IN STAT73 ;RESULT OR DATA INT?
ANI TXIRA
JNZ IDI020 ;RESULT, GO PROCESS IT
LDA CWCNT ;DONE WITH THIS BIT?
ORA A
JNZ IDI004 ;NO, DO THIS BIT AGAIN
LDA CWDAT ;ROTATE TO NEXT BIT
RLC
STA CWDAT
LDA CWBIT ;DONE WITH THIS BYTE
ORA A
JNZ IDI002 ;NO, SKIP BYTE UPDATE
LHLD CWPTR ;GET ID STRING POINTER
MOV A,M ;GET NEXT BYTE
INX H ;UPDATE STRING POINTER
SHLD CWPTR
STA CWDAT
MVI A,8 ;INIT BIT COUNT
IDI002:
DCR A ;NEXT BIT
STA CWBIT
MVI A,IDNUM ;INIT REPEAT COUNT
IDI004:
DCR A ;ANOTHER COUNT DONE
STA CWCNT
LDA CWDAT ;GET CURRENT DATA
RLC ;MOVE CURRENT BIT TO CARRY
MVI A,0 ;IF BIT IS ZERO
JNC IDI010 ;BIT IS 0, SEND IT
MVI A,0FFH ;BIT IS 1
IDI010:
OUT TXDATA ;OUTPUT THE DATA BYTE
JMP IDI030 ;RETURN
; HERE IF RESULT INTERRUPT - SET STATUS
IDI020:
IN TXIR73 ;GET INTERRUPT STATUS
CPI 0CH ;EARLY INTERRUPT?
JNZ IDI025 ;NO, FINAL INTERRUPT
MVI A,1 ;SHOW EARLY INT
JMP IDI027
IDI025:
MVI A,2 ;SHOW FINAL INT
IDI027:
STA TXWAIT
IDI030:
POP PSW
POP B
POP H
EI ;INTS OK AGAIN
RET
PAGE
; RAM ALLOCATION
ORG LORAM
DS 100 ;STACK AREA
STACK EQU $
NUMPKT: DS 1 ;# PACKETS RECEIVED
CMDBUF: DS 4 ;PLACE TO BUILD COMMANDS
PKTPTR: DS 2 ;POINTER TO CURRENT PACKET BYTE
BUFPTR: DS 2 ;POINTER TO CURRENT BUFFER
TXWAIT: DS 1 ;TX WAIT FLAG
TIME: DS 2 ;TIMER VALUE
PROCST: DS 1 ;PROCESSING STATUS BYTE
CWCNT: DS 1 ;CW ID BIT REPEAT COUNT
CWPTR: DS 2 ;ID STRING POINTER
CWBIT: DS 1 ;ID BYTE BIT COUNT
CWDAT: DS 1 ;ID TEMP DATA
CWSEC: DS 2 ;CW ID SECOND COUNT
CWTIME: DS 2 ;CW TIMER
BCNPTR: DS 2 ;PACKET BEACON POINTER
BUFFER: DS (BUFSIZ+3)*MAXPKT
END