1 ; PBX Software (MCS51 Assembly program) - Project 2 ; 3 ; General Info 4 ; Course : Final Project (BS degree) 5 ; Prgrmr : Sayed Behdad Hosseini, #781413112 6 ; Instr : Mr. Etemadi 7 ; Date : Feb,Mar,Apr 2003 8 ; Place : University of Isfahan, Isfahan 9 ; 10 ; Project Info 11 ; Name : PBX 12 ; Lang : 8051 Assembly 13 ; Source : pbx.asm 14 ; Object : pbx.obj 15 ; Hex&Lst: pbx.hex - pbx.lst 16 ; Method : Procedure Oriented (structured) 17 ; Program: Machine (Binary) Code 18 ; Editor : Ms Visual Studio 2000 19 ; Assmblr: 8051 Cross Assembler 20 ; EpPrgmr: Kahroma Tarashe EEProm programmer 21 ; 22 ; Description Info 23 ; Work : 24 ; This program in 8051 (MCS51) asm lang. 25 ; is for controlling a pbx ckt. It 26 ; communicates with ports and processes the 27 ; signals and then controlling the whole 28 ; system with outputing to ports (like an 29 ; open-loop control system). The boards 30 ; (hardware) makes a private branch exchange 31 ; (pbx) i.e the switching center for 32 ; some phones and also some external lines. 33 ; In this project the no of phones is 4 34 ; (lines) and the no of external connections 35 ; (trunks) is 1. For more information see the 36 ; schematics (pbx.dsn or schematics.pdf) and 37 ; the thesis (thesis.pdf). 38 ; 39 ; The software is responsilbe for 40 ; detecting user inputs (scan the phones and 41 ; trunk) and respond to the requests like 42 ; establishing the connections and sending 43 ; informative tones to the phones ... 44 ; 45 ; The software implements a low degree of 46 ; concurrency with use of states and events. 47 ; States are internal situations a procedure 48 ; can have and at a specified time is in one 49 ; of those states. Events are data messages 50 ; between procedures and are exported 51 ; whenever an event has been occured in the 52 ; system. The concurrent routines is invoked 53 ; repeatedly with the aid of time interrupt 54 ; and exposes the time sharing method. The 55 ; software first initializes the variables & 56 ; afterwards does an infinite loop and lets 57 ; the time interrupt do the rest. 58 ; 59 ; Two used features of 8052: timer2 and 60 ; upper 128 data bytes of ram. So the program 61 ; must be executed on an 8X52 instead of its 62 ; familiar sibling (8X51). 63 ; 64 ; The program can be divided into 3 parts: 65 ; Constants, Variable declarations & Routines 66 ; 67 ; Hardware Considrations : 68 ; As said before the software assumes that 69 ; uC is 8X52 and works with 12.0 Mhz clock 70 ; (needed for timing routines). The port 71 ; assignments can be found in schematics and 72 ; also in Constants section of the program. 73 ; All input ports must be TTL compatible. 74 ; 75 ; Note that there are 3 leds just for 76 ; debuging purposes and can be removed for 77 ; the final version of the implementaion. 78 79 80 81 ; 8051 Cross assembler controls 82 $MOD52 83 $NOPAGING 84 85 USING 0 ; Register bank 0 is used 86 87 88 89 ;************************************************ 90 ;** Contants Section ** 91 92 ; ----- For debuging ----- 0000 93 DebugMode equ 0 94 ; DebugModes : 95 ; 0: normal mode. Only if th's err led2 will be 1 96 ; 1: shows a 3 bit increasing no (delay:1ms) 97 ; 2: line 0 rings 98 ; 3: all lines ring 99 ; 4: shows line interface states of line 1 100 ; 5: shows events got by LineControl 4 line 1 101 ; 6: connects line 0&1 to CC0 and show on leds 102 ; 7: shows free state of CCs (l0->CC0 l1->CC1) 103 ; 8: shows l1 is con. to which CC (l1->CC1) 104 ; 9: GetAFreeConv. output (l0->CC0 l2->CC2) 105 ; 10: (l0->CC0:No l1->CC1:Dial l2->CC2:Busy) 106 ; 11: (l0->CC0:Invalid l1->CC1:Ringback) 107 ; 12: (l0,l1: EvConvReq&EvToneReq(Dial) l0:rel) 108 ; 13: shows line control states of line 1 109 ; 14: shows line3 connections to all CCs 110 ; 15: shows TrunkControl states of t0 111 112 ; ----- Ports ----- 113 ; line ports : 114 ; Rng: command to ring a phone 115 ; Dtct: dc-loop detect singnal (low active) 116 ; Intr: make internal connection 0080 117 L0_Rng equ P0.0 0081 118 L0_Dtct equ P0.1 0082 119 L0_Intr equ P0.2 0090 120 L1_Rng equ P1.0 0091 121 L1_Dtct equ P1.1 0092 122 L1_Intr equ P1.2 00A0 123 L2_Rng equ P2.0 00A1 124 L2_Dtct equ P2.1 00A2 125 L2_Intr equ P2.2 00B0 126 L3_Rng equ P3.0 00B1 127 L3_Dtct equ P3.1 00B2 128 L3_Intr equ P3.2 129 130 ; switch ports: 131 ; Sx: The x-th line switch command 132 ; Tone: tone generating command (to conv signal) 0083 133 C0_S0 equ P0.3 0084 134 C0_S1 equ P0.4 0085 135 C0_S2 equ P0.5 0086 136 C0_S3 equ P0.6 0087 137 C0_Tone equ P0.7 0093 138 C1_S0 equ P1.3 0094 139 C1_S1 equ P1.4 0095 140 C1_S2 equ P1.5 0096 141 C1_S3 equ P1.6 0097 142 C1_Tone equ P1.7 00A3 143 C2_S0 equ P2.3 00A4 144 C2_S1 equ P2.4 00A5 145 C2_S2 equ P2.5 00A6 146 C2_S3 equ P2.6 00A7 147 C2_Tone equ P2.7 148 149 ; trunk ports: 150 ; Cnct: connect (to conversation) command 151 ; Rdtct: ring detect singal 00B3 152 T0_Cnct equ P3.3 00B4 153 T0_RDtct equ P3.4 154 155 ; led ports: 00B5 156 Led0 equ P3.5 00B6 157 Led1 equ P3.6 00B7 158 Led2 equ P3.7 159 160 ; ----- Tones ----- 0000 161 TnNo equ 0 ; silence 0001 162 TnDial equ 1 0002 163 TnBusy equ 2 0003 164 TnInvalid equ 3 0004 165 TnRingback equ 4 0000 166 TnDefault equ TnNo 167 168 ; ----- LineInterface states ----- 0000 169 StDown equ 0 ; on-hook 0001 170 StUp equ 1 ; off-hook 0002 171 StLow1 equ 2 ; open loop for 1 state 0003 172 StLow2 equ 3 ; open loop for 2 state 0004 173 StLow3 equ 4 ; open loop for 3 state 0005 174 StLow4 equ 5 ; open loop for 4 state 0006 175 StHigh1 equ 6 ; close loop for 1 state 0007 176 StHigh2 equ 7 ; close loop for 2 state 0008 177 StHigh3 equ 8 ; close loop for 3 state 0009 178 StHigh4 equ 9 ; close loop for 4 state 0000 179 LIDefaultN equ 0 0000 180 LIDefaultState equ StDown 181 182 ; ----- LineControl & TrunkControl states ----- 0000 183 StIdle equ 0 ; no request (on-hook) 0001 184 StDialTone equ 1 ; wait for dialing 0002 185 StInvalidTone equ 2 ; invalid tone is sent 0003 186 StBusyTone equ 3 ; busy tone is sent 0004 187 StRingbackTone equ 4 ; ringback tone is sent 0005 188 StTrunk equ 5 ; conv with trunk 0006 189 StRing equ 6 ; ringing 0007 190 StTalk equ 7 ; conv is established 0008 191 StDialing equ 8 ; in dialing 0000 192 LCDefaultState equ StIdle 0000 193 TCDefaultState equ StIdle 194 195 ; ----- CentralControl defaults ----- FFFF 196 LineWantDefault equ -1 FFFF 197 TrunkWantDefault equ -1 198 199 ; ----- Events ----- 0000 200 EvPickup equ 0 ; phone pick up 0001 201 EvPutdown equ 1 ; phone put down 0002 202 EvSOD equ 2 ; start of dialing 0003 203 EvEOD equ 3 ; end of dialing 0004 204 EvConvReq equ 4 ; a conver. is requested 0005 205 EvAllRel equ 5 ; release all resources 0006 206 EvToneReq equ 6 ; a tone request 0007 207 EvTalkAccept equ 7 ; conversation is OK 0008 208 EvTalkCancel equ 8 ; request is canceled 0009 209 EvDigitDialed equ 9 ; a digit is dialed 000A 210 EvSOR equ 10 ; start of ring 000B 211 EvEOR equ 11 ; end of ring 000C 212 EvNoInvalid equ 12 ; dialed no is invalid 000D 213 EvNoLineBusy equ 13 ; dialed no is busy line 000E 214 EvNoTrunkBusy equ 14 ; dialed no is busy trunk 000F 215 EvNoTrunkOK equ 15 ; dialed no is trunk & OK 0010 216 EvNoLineRB equ 16 ; dialed no is ring line 0011 217 EvOK equ 17 ; OK response 0012 218 EvConnect equ 18 ; a connect command 0013 219 EvTalkReq equ 19 ; talk request from line 0014 220 EvTrunkRel equ 20 ; release trunk 0015 221 EvRdtctSample equ 21 ; a Rdtct is sampled 0016 222 EvTTalkReq equ 22 ; talk request from trunk 0017 223 EvTTalkCancel equ 23 ; request is canceled 224 225 ; ----- Auxiliary Registers ----- 226 ; some assignment for read(writ)ibility 227 ; ARs are absolute (direct) addressings in ram 228 n equ R0 0000 229 nAR equ AR0 230 d equ R1 0001 231 dAR equ AR1 232 e equ R2 0002 233 eAR equ AR2 234 t equ R3 0003 235 tAR equ AR3 236 state equ R7 0007 237 stateAR equ AR7 238 239 240 241 ;************************************************ 242 ;** Variable declarations ** 243 244 ; ----- Byte Allocation (at direct segment) ----- 0030 245 dseg at 30H 246 247 ; these two bytes are used for debuging purposes 0030 248 debug1: ds 1 0031 249 debug2: ds 1 250 251 ; vars for timings 0032 252 count4: ds 1 0033 253 count20: ds 1 0034 254 count250: ds 1 255 256 ; Tones that is to apply at conversations 0035 257 c0ToneState: ds 1 0036 258 c1ToneState: ds 1 0037 259 c2ToneState: ds 1 260 261 ; LineInterface state & n variables 0038 262 lIstate0: ds 1 0039 263 lIstate1: ds 1 003A 264 lIstate2: ds 1 003B 265 lIstate3: ds 1 003C 266 lIn0: ds 1 003D 267 lIn1: ds 1 003E 268 lIn2: ds 1 003F 269 lIn3: ds 1 270 271 ; LineControl state variables 0040 272 lCstate0: ds 1 0041 273 lCstate1: ds 1 0042 274 lCstate2: ds 1 0043 275 lCstate3: ds 1 276 277 ; CentralControl variables 278 ; these are used to save each line/trunk request 0044 279 lineWant0: ds 1 0045 280 lineWant1: ds 1 0046 281 lineWant2: ds 1 0047 282 lineWant3: ds 1 0048 283 trunkWant: ds 1 284 285 ; TrunkControl variables 0049 286 tCstate: ds 1 ; its state 004A 287 countTC: ds 1 ; its aux var for timing 288 289 290 ; ----- Bit Allocation (at bit segment) ----- ---- 291 bseg 292 293 ; the main 500Hz wave for use in tones 0000 294 mainWave: dbit 1 295 296 ; varying-with-time variables for making tones 0001 297 noTone: dbit 1 0002 298 dialTone: dbit 1 0003 299 busyTone: dbit 1 0004 300 invalidTone: dbit 1 0005 301 ringbackTone: dbit 1 0005 302 ringWave equ ringbackTone ; 4 readability 303 304 ; ring variables indicating which line is ringing 0006 305 l0RingState: dbit 1 0007 306 l1RingState: dbit 1 0008 307 l2RingState: dbit 1 0009 308 l3RingState: dbit 1 309 310 ; two general purposes flags, for temp works 000A 311 gf0: dbit 1 000B 312 gf1: dbit 1 313 314 315 316 ;************************************************ 317 ;** Routines ** ---- 318 cseg 319 0000 320 org 0000H 0000 020038 321 jmp Start 322 323 324 ;/** 325 ; * Timer 2 ISR: This piece of code is executed 326 ; * whenever timer 2 interrupts the uC. 327 ; * @author Behdad Hosseini, #781413112 328 ; * @version 1.0, Apr 2003 329 ; */ 002B 330 org 002BH 331 002B 332 T2Isr: 002B C2CF 333 clr tf2 ; OK, the int is seen 002D 12084D 334 call Int1ms 0030 32 335 reti 336 337 338 ;/** 339 ; * The first executable code after each restart. 340 ; * It first calls initialize routine then waits 341 ; * in a loop forever. The interrupt system 342 ; * continues handling the software. 343 ; * @author Behdad Hosseini, #781413112 344 ; * @version 1.0, Apr 2003 345 ; */ 0038 346 org 0038H 347 0038 348 Start: 0038 75817F 349 mov sp, #7FH ; stack 003B 120040 350 call Init 351 352 ; These are just for debug and don't assemble 353 ; during final version 354 IF (DebugMode = 2) 355 push acc 356 push psw 357 clr a 358 setb c 359 call SetLineRingState 360 pop psw 361 pop acc 362 ENDIF 363 364 IF (DebugMode = 3) 365 push acc 366 push psw 367 clr a 368 setb c 369 DM3L0: 370 call SetLineRingState 371 inc a 372 cjne a, #4, DM3L0 373 pop psw 374 pop acc 375 ENDIF 376 377 IF (DebugMode = 6) 378 push acc 379 push dAR 380 push psw 381 382 setb c 383 mov d, #0 384 mov a, #0 385 call SetSwitch 386 call GetSwitch 387 mov led0, c 388 389 setb c 390 mov a, #1 391 call SetSwitch 392 call GetSwitch 393 mov led1, c 394 395 mov a, #2 396 call GetSwitch 397 mov led2, c 398 399 pop psw 400 pop dAR 401 pop acc 402 ENDIF 403 404 IF (DebugMode = 7) 405 push acc 406 push dAR 407 push psw 408 409 setb c 410 mov d, #0 411 mov a, #0 412 call SetSwitch 413 call IsConversationFree 414 mov led0, c 415 416 setb c 417 mov d, #1 418 mov a, #1 419 call SetSwitch 420 call IsConversationFree 421 mov led1, c 422 423 mov d, #2 424 call IsConversationFree 425 mov led2, c 426 427 pop psw 428 pop dAR 429 pop acc 430 ENDIF 431 432 IF (DebugMode = 8) 433 push acc 434 push dAR 435 push psw 436 push nAR 437 438 setb c 439 mov d, #1 440 mov a, #1 441 call SetSwitch 442 443 mov d, #0 444 call GetLineConversation 445 mov n, dAR 446 call ShowOnLeds 447 mov led2, c 448 449 pop nAR 450 pop psw 451 pop dAR 452 pop acc 453 ENDIF 454 455 IF (DebugMode = 9) 456 push acc 457 push dAR 458 push psw 459 push nAR 460 461 setb c 462 mov d, #0 463 mov a, #0 464 call SetSwitch 465 mov d, #2 466 mov a, #2 467 call SetSwitch 468 469 call GetAFreeConversation 470 mov n, dAR 471 call ShowOnLeds 472 mov led2, c 473 474 pop nAR 475 pop psw 476 pop dAR 477 pop acc 478 ENDIF 479 480 IF (DebugMode = 10) 481 push acc 482 push dAR 483 push psw 484 push b 485 486 setb c 487 mov d, #0 488 mov a, #0 489 call SetSwitch 490 mov b, #TnNo 491 call SetConversationToneState 492 493 mov d, #1 494 mov a, #1 495 call SetSwitch 496 mov b, #TnDial 497 call SetConversationToneState 498 499 mov d, #2 500 mov a, #2 501 call SetSwitch 502 mov b, #TnBusy 503 call SetConversationToneState 504 505 pop b 506 pop psw 507 pop dAR 508 pop acc 509 ENDIF 510 511 IF (DebugMode = 11) 512 push acc 513 push dAR 514 push psw 515 push b 516 517 setb c 518 mov d, #0 519 mov a, #0 520 call SetSwitch 521 mov b, #TnInvalid 522 call SetConversationToneState 523 524 mov d, #1 525 mov a, #1 526 call SetSwitch 527 mov b, #TnRingback 528 call SetConversationToneState 529 530 pop b 531 pop psw 532 pop dAR 533 pop acc 534 ENDIF 535 536 IF (DebugMode = 12) 537 push acc 538 push nAR 539 push psw 540 push b 541 542 mov a, #0 543 mov e, #EvConvReq 544 call SwitchControl 545 mov led0, c 546 call SetSwitch 547 548 mov a,#1 549 call SwitchControl 550 mov led1, c 551 552 mov e, #EvToneReq 553 mov n, #TnDial 554 call SwitchControl 555 556 mov a, #0 557 mov e, #EvAllRel 558 call SwitchControl 559 mov led2, c 560 561 pop b 562 pop psw 563 pop nAR 564 pop acc 565 ENDIF 566 003E 567 Loop: 003E 80FE 568 jmp Loop ; infine loop 569 570 571 ;/** 572 ; * This routine initializes everything that is 573 ; * concerned to be correct at the beginnig of 574 ; * the program. 575 ; * @author Behdad Hosseini, #781413112 576 ; * @version 1.0, Apr 2003 577 ; */ 0040 578 Init: 579 ; it can also be done using the set routines 580 581 ; initialize ports 0040 C280 582 clr L0_Rng 0042 D282 583 setb L0_Intr 0044 C283 584 clr C0_S0 0046 C284 585 clr C0_S1 0048 C285 586 clr C0_S2 004A C286 587 clr C0_S3 588 004C C290 589 clr L1_Rng 004E D292 590 setb L1_Intr 0050 C293 591 clr C1_S0 0052 C294 592 clr C1_S1 0054 C295 593 clr C1_S2 0056 C296 594 clr C1_S3 595 0058 C2A0 596 clr L2_Rng 005A D2A2 597 setb L2_Intr 005C C2A3 598 clr C2_S0 005E C2A4 599 clr C2_S1 0060 C2A5 600 clr C2_S2 0062 C2A6 601 clr C2_S3 602 0064 C2B0 603 clr L3_Rng 0066 D2B2 604 setb L3_Intr 605 0068 C2B3 606 clr T0_Cnct 607 006A C2B5 608 clr Led0 006C C2B6 609 clr Led1 006E C2B7 610 clr Led2 611 612 ; initialize variables 0070 753314 613 mov count20, #20 0073 7534FA 614 mov count250, #250 0076 753204 615 mov count4, #4 616 0079 D202 617 setb dialTone 007B C201 618 clr noTone 007D C206 619 clr l0RingState 007F C207 620 clr l1RingState 0081 C208 621 clr l2RingState 0083 C209 622 clr l3RingState 623 0085 753800 624 mov lIState0, #LIDefaultState 0088 753900 625 mov lIState1, #LIDefaultState 008B 753A00 626 mov lIState2, #LIDefaultState 008E 753B00 627 mov lIState3, #LIDefaultState 628 0091 753C00 629 mov lIn0, #LIDefaultN 0094 753D00 630 mov lIn1, #LIDefaultN 0097 753E00 631 mov lIn2, #LIDefaultN 009A 753F00 632 mov lIn3, #LIDefaultN 633 009D 754000 634 mov lCState0, #LCDefaultState 00A0 754100 635 mov lCState1, #LCDefaultState 00A3 754200 636 mov lCState2, #LCDefaultState 00A6 754300 637 mov lCState3, #LCDefaultState 638 00A9 753500 639 mov c0ToneState, #TnDefault 00AC 753600 640 mov c1ToneState, #TnDefault 00AF 753700 641 mov c2ToneState, #TnDefault 642 00B2 7544FF 643 mov lineWant0, #LineWantDefault 00B5 7545FF 644 mov lineWant1, #LineWantDefault 00B8 7546FF 645 mov lineWant2, #LineWantDefault 00BB 7547FF 646 mov lineWant3, #LineWantDefault 00BE 7548FF 647 mov trunkWant, #TrunkWantDefault 648 00C1 754900 649 mov tCstate, #TCDefaultState 650 651 ; initialize timer2 (for 1000us == 1ms) 00C4 75CBFC 652 mov rcap2h, #HIGH(-1000) 00C7 75CA18 653 mov rcap2l, #LOW(-1000) 00CA 75C800 654 mov t2con, #00H 00CD 75A8A0 655 mov ie, #10100000B ; enable interrupt 656 657 ; wait some miliseconds(500) for stability 00D0 7905 658 mov d, #5 00D2 659 WLOOP: 00D2 75F0C8 660 mov b, #200 00D5 74FA 661 mov a, #250 00D7 D5E0FD 662 djnz acc, $ 00DA D5F0F8 663 djnz b, $-5 00DD D9F3 664 djnz d, WLOOP 665 666 ; Everything is ready. FIRE! 00DF D2CA 667 setb tr2 668 00E1 22 669 ret 670 671 672 ;/** 673 ; * This routine is used for showing a number (4 674 ; * test) between 0 and 7 on 3 leds that is 675 ; * connected to the uC. 676 ; * @param n the number (the least 3 bit is used) 677 ; * @author Behdad Hosseini, #781413112 678 ; * @version 1.0, Apr 2003 679 ; */ 00E2 680 ShowOnLeds: 00E2 C0E0 681 push acc 00E4 C0D0 682 push psw 00E6 E8 683 mov a, n 684 00E7 13 685 rrc a 00E8 92B5 686 mov Led0, c 687 00EA 13 688 rrc a 00EB 92B6 689 mov Led1, c 690 00ED 13 691 rrc a 00EE 92B7 692 mov Led2, c 693 00F0 D0D0 694 pop psw 00F2 D0E0 695 pop acc 00F4 22 696 ret 697 698 699 ;/** 700 ; * This routine is invoked whenever a routine 701 ; * determines an unpredicted error. In this 702 ; * implementaion it just turns led2 on. 703 ; * @author Behdad Hosseini, #781413112 704 ; * @version 1.0, Apr 2003 705 ; */ 00F5 706 Error: 00F5 D2B7 707 setb Led2 00F7 22 708 ret 709 710 711 ;/** 712 ; * It sets a tone to a conversation ckt. 713 ; * @param d conversation number 714 ; * @param b the desired tone 715 ; * @author Behdad Hosseini, #781413112 716 ; * @version 1.0, Apr 2003 717 ; */ 00F8 718 SetConversationToneState: 00F8 C0D0 719 push psw 720 721 ; a switch() on d 00FA 722 SCTS0: 00FA B90006 723 cjne d, #0, SCTS1 00FD 85F035 724 mov c0ToneState, b 0100 020115 725 jmp SCTSEnd 726 0103 727 SCTS1: 0103 B90106 728 cjne d, #1, SCTS2 0106 85F036 729 mov c1ToneState, b 0109 020115 730 jmp SCTSEnd 731 010C 732 SCTS2: 010C B90206 733 cjne d, #2, SCTS3 010F 85F037 734 mov c2ToneState, b 0112 020115 735 jmp SCTSEnd 736 0115 737 SCTS3: 738 0115 739 SCTSEnd: 0115 D0D0 740 pop psw 0117 22 741 ret 742 743 744 ;/** 745 ; * It outputs the tone assigned to a conv. ckt. 746 ; * @param d conversation number 747 ; * @return b the assigned tone 748 ; * @author Behdad Hosseini, #781413112 749 ; * @version 1.0, Apr 2003 750 ; */ 0118 751 GetConversationToneState: 0118 C0D0 752 push psw 753 754 ; a switch() on d 011A 755 GCTS0: 011A B90006 756 cjne d, #0, GCTS1 011D 8535F0 757 mov b, c0ToneState 0120 020135 758 jmp GCTSEnd 759 0123 760 GCTS1: 0123 B90106 761 cjne d, #1, GCTS2 0126 8536F0 762 mov b, c1ToneState 0129 020135 763 jmp GCTSEnd 764 012C 765 GCTS2: 012C B90206 766 cjne d, #2, GCTS3 012F 8537F0 767 mov b, c2ToneState 0132 020135 768 jmp GCTSEnd 769 0135 770 GCTS3: 771 0135 772 GCTSEnd: 0135 D0D0 773 pop psw 0137 22 774 ret 775 776 777 ;/** 778 ; * This routine starts/stops a line to ring. 779 ; * @param a line number 780 ; * @param c determines start(1) or stop(0) 781 ; * @author Behdad Hosseini, #781413112 782 ; * @version 1.0, Apr 2003 783 ; */ 0138 784 SetLineRingState: 0138 C0D0 785 push psw 786 787 ; a switch() on a 013A 788 SLRS0: 013A B40007 789 cjne a, #0, SLRS1 013D D0D0 790 pop psw 013F 9206 791 mov l0RingState, c 0141 020164 792 jmp SLRSEnd 793 0144 794 SLRS1: 0144 B40107 795 cjne a, #1, SLRS2 0147 D0D0 796 pop psw 0149 9207 797 mov l1RingState, c 014B 020164 798 jmp SLRSEnd 799 014E 800 SLRS2: 014E B40207 801 cjne a, #2, SLRS3 0151 D0D0 802 pop psw 0153 9208 803 mov l2RingState, c 0155 020164 804 jmp SLRSEnd 805 0158 806 SLRS3: 0158 B40307 807 cjne a, #3, SLRS4 015B D0D0 808 pop psw 015D 9209 809 mov l3RingState, c 015F 020164 810 jmp SLRSEnd 811 0162 812 SLRS4: 0162 D0D0 813 pop psw 814 0164 815 SLRSEnd: 0164 22 816 ret 817 818 819 ;/** 820 ; * This routine outputs a line ring state. 821 ; * @param a line number 822 ; * @return c determines ringing(1) or not(0) 823 ; * @author Behdad Hosseini, #781413112 824 ; * @version 1.0, Apr 2003 825 ; */ 0165 826 GetLineRingState: 827 828 ; a switch() on a 0165 829 GLRS0: 0165 B40005 830 cjne a, #0, GLRS1 0168 A206 831 mov c, l0RingState 016A 020185 832 jmp GLRSEnd 833 016D 834 GLRS1: 016D B40105 835 cjne a, #1, GLRS2 0170 A207 836 mov c, l1RingState 0172 020185 837 jmp GLRSEnd 838 0175 839 GLRS2: 0175 B40205 840 cjne a, #2, GLRS3 0178 A208 841 mov c, l2RingState 017A 020185 842 jmp GLRSEnd 843 017D 844 GLRS3: 017D B40305 845 cjne a, #3, GLRS4 0180 A209 846 mov c, l3RingState 0182 020185 847 jmp GLRSEnd 848 0185 849 GLRS4: 850 0185 851 GLRSEnd: 0185 22 852 ret 853 854 855 ;/** 856 ; * This routine sets a line contact in a 857 ; * conversation ckt to c (1:connect 0:open) 858 ; * @param a line number 859 ; * @param d conversation number 860 ; * @param c hardware signal to the port 861 ; * @author Behdad Hosseini, #781413112 862 ; * @version 1.0, Apr 2003 863 ; */ 0186 864 SetSwitch: 0186 C0D0 865 push psw 866 867 ; first a switch() on d then on a 0188 868 SSChk0: 0188 B90028 869 cjne d, #0, SSChk1 870 018B 871 SSChk0_0: 018B B40007 872 cjne a, #0, SSChk0_1 018E D0D0 873 pop psw 0190 9283 874 mov C0_S0, c 0192 020210 875 jmp SSEnd 876 0195 877 SSChk0_1: 0195 B40107 878 cjne a, #1, SSChk0_2 0198 D0D0 879 pop psw 019A 9284 880 mov C0_S1, c 019C 020210 881 jmp SSEnd 882 019F 883 SSChk0_2: 019F B40207 884 cjne a, #2, SSChk0_3 01A2 D0D0 885 pop psw 01A4 9285 886 mov C0_S2, c 01A6 020210 887 jmp SSEnd 888 01A9 889 SSChk0_3: 01A9 B4035D 890 cjne a, #3, SSError 01AC D0D0 891 pop psw 01AE 9286 892 mov C0_S3, c 01B0 020210 893 jmp SSEnd 894 01B3 895 SSChk1: 01B3 B90128 896 cjne d, #1, SSChk2 897 01B6 898 SSChk1_0: 01B6 B40007 899 cjne a, #0, SSChk1_1 01B9 D0D0 900 pop psw 01BB 9293 901 mov C1_S0, c 01BD 020210 902 jmp SSEnd 903 01C0 904 SSChk1_1: 01C0 B40107 905 cjne a, #1, SSChk1_2 01C3 D0D0 906 pop psw 01C5 9294 907 mov C1_S1, c 01C7 020210 908 jmp SSEnd 909 01CA 910 SSChk1_2: 01CA B40207 911 cjne a, #2, SSChk1_3 01CD D0D0 912 pop psw 01CF 9295 913 mov C1_S2, c 01D1 020210 914 jmp SSEnd 915 01D4 916 SSChk1_3: 01D4 B40332 917 cjne a, #3, SSError 01D7 D0D0 918 pop psw 01D9 9296 919 mov C1_S3, c 01DB 020210 920 jmp SSEnd 921 01DE 922 SSChk2: 01DE B90228 923 cjne d, #2, SSError 924 01E1 925 SSChk2_0: 01E1 B40007 926 cjne a, #0, SSChk2_1 01E4 D0D0 927 pop psw 01E6 92A3 928 mov C2_S0, c 01E8 020210 929 jmp SSEnd 930 01EB 931 SSChk2_1: 01EB B40107 932 cjne a, #1, SSChk2_2 01EE D0D0 933 pop psw 01F0 92A4 934 mov C2_S1, c 01F2 020210 935 jmp SSEnd 936 01F5 937 SSChk2_2: 01F5 B40207 938 cjne a, #2, SSChk2_3 01F8 D0D0 939 pop psw 01FA 92A5 940 mov C2_S2, c 01FC 020210 941 jmp SSEnd 942 01FF 943 SSChk2_3: 01FF B40307 944 cjne a, #3, SSError 0202 D0D0 945 pop psw 0204 92A6 946 mov C2_S3, c 0206 020210 947 jmp SSEnd 948 0209 949 SSError: 950 ; invalid d or a 0209 D0D0 951 pop psw 952 IF (DebugMode = 0) 020B 11F5 953 call Error 954 ENDIF 020D 020210 955 jmp SSEnd 956 0210 957 SSEnd: 0210 22 958 ret 959 960 961 ;/** 962 ; * This routine gets a line contact in a 963 ; * conversation ckt into c (1:connect 0:open) 964 ; * @param a line number 965 ; * @param d conversation number 966 ; * @return c hardware signal from the port 967 ; * @author Behdad Hosseini, #781413112 968 ; * @version 1.0, Apr 2003 969 ; */ 0211 970 GetSwitch: 971 972 ; first a switch() on d then on a 0211 973 GSChk0: 0211 B90020 974 cjne d, #0, GSChk1 975 0214 976 GSChk0_0: 0214 B40005 977 cjne a, #0, GSChk0_1 0217 A283 978 mov c, C0_S0 0219 02027F 979 jmp GSEnd 980 021C 981 GSChk0_1: 021C B40105 982 cjne a, #1, GSChk0_2 021F A284 983 mov c, C0_S1 0221 02027F 984 jmp GSEnd 985 0224 986 GSChk0_2: 0224 B40205 987 cjne a, #2, GSChk0_3 0227 A285 988 mov c, C0_S2 0229 02027F 989 jmp GSEnd 990 022C 991 GSChk0_3: 022C B4034B 992 cjne a, #3, GSError 022F A286 993 mov c, C0_S3 0231 02027F 994 jmp GSEnd 995 0234 996 GSChk1: 0234 B90120 997 cjne d, #1, GSChk2 998 0237 999 GSChk1_0: 0237 B40005 1000 cjne a, #0, GSChk1_1 023A A293 1001 mov c, C1_S0 023C 02027F 1002 jmp GSEnd 1003 023F 1004 GSChk1_1: 023F B40105 1005 cjne a, #1, GSChk1_2 0242 A294 1006 mov c, C1_S1 0244 02027F 1007 jmp GSEnd 1008 0247 1009 GSChk1_2: 0247 B40205 1010 cjne a, #2, GSChk1_3 024A A295 1011 mov c, C1_S2 024C 02027F 1012 jmp GSEnd 1013 024F 1014 GSChk1_3: 024F B40328 1015 cjne a, #3, GSError 0252 A296 1016 mov c, C1_S3 0254 02027F 1017 jmp GSEnd 1018 0257 1019 GSChk2: 0257 B90220 1020 cjne d, #2, GSError 1021 025A 1022 GSChk2_0: 025A B40005 1023 cjne a, #0, GSChk2_1 025D A2A3 1024 mov c, C2_S0 025F 02027F 1025 jmp GSEnd 1026 0262 1027 GSChk2_1: 0262 B40105 1028 cjne a, #1, GSChk2_2 0265 A2A4 1029 mov c, C2_S1 0267 02027F 1030 jmp GSEnd 1031 026A 1032 GSChk2_2: 026A B40205 1033 cjne a, #2, GSChk2_3 026D A2A5 1034 mov c, C2_S2 026F 02027F 1035 jmp GSEnd 1036 0272 1037 GSChk2_3: 0272 B40305 1038 cjne a, #3, GSError 0275 A2A6 1039 mov c, C2_S3 0277 02027F 1040 jmp GSEnd 1041 027A 1042 GSError: 1043 ; invlid d or a 1044 IF (DebugMode = 0) 027A 11F5 1045 call Error 1046 ENDIF 027C 02027F 1047 jmp GSEnd 1048 027F 1049 GSEnd: 027F 22 1050 ret 1051 1052 1053 ;/** 1054 ; * It determines a specified conversation ckt 1055 ; * is free to use (c:1) or not(c:0) 1056 ; * @param d conversation ckt number 1057 ; * @return c free(1) or not(0) 1058 ; * @author Behdad Hosseini, #781413112 1059 ; * @version 1.0, Apr 2003 1060 ; */ 0280 1061 IsConversationFree: 0280 C0E0 1062 push acc 0282 E4 1063 clr a 1064 1065 ; loop on a 0283 1066 ISFNext: 0283 5111 1067 call GetSwitch 0285 4004 1068 jc ISFEnd ; found 0287 04 1069 inc a 0288 B404F8 1070 cjne a, #4, ISFNext 1071 028B 1072 ISFEnd: 028B B3 1073 cpl c 1074 028C D0E0 1075 pop acc 028E 22 1076 ret 1077 1078 1079 ;/** 1080 ; * It outputs a line is connected to whitch 1081 ; * conversation ckt. 1082 ; * @param a line number 1083 ; * @return c it is connected at all or not 1084 ; * @return d conversation ckt number 1085 ; * @author Behdad Hosseini, #781413112 1086 ; * @version 1.0, Apr 2003 1087 ; */ 028F 1088 GetLineConversation: 028F 7900 1089 mov d, #0 1090 1091 ; loop on d 0291 1092 GLCNext: 0291 5111 1093 call GetSwitch 0293 4005 1094 jc GLCEnd 0295 09 1095 inc d 0296 B903F8 1096 cjne d, #3, GLCNext 1097 0299 C3 1098 clr c ; not found 1099 029A 1100 GLCEnd: 029A 22 1101 ret 1102 1103 1104 ;/** 1105 ; * It outputs first free conversation ckt found. 1106 ; * @return c is there a free(1) or not(0) 1107 ; * @return d conversation ckt number 1108 ; * @author Behdad Hosseini, #781413112 1109 ; * @version 1.0, Apr 2003 1110 ; */ 029B 1111 GetAFreeConversation: 029B 7900 1112 mov d, #0 1113 1114 ; loop on d 029D 1115 GAFCNext: 029D 5180 1116 call IsConversationFree 029F 4005 1117 jc GAFCEnd ; found 02A1 09 1118 inc d 02A2 B903F8 1119 cjne d, #3, GAFCNext 1120 02A5 C3 1121 clr c 1122 02A6 1123 GAFCEnd: 02A6 22 1124 ret 1125 1126 1127 ;/** 1128 ; * This routine controls the switch unit: 2 int. 1129 ; * + 1 ext. conversation ckt. It recieves events 1130 ; * from other units and makes necessary changes 1131 ; * to the switch unit. 1132 ; * @param a line number 1133 ; * @param e event 1134 ; * @param n another parameter if e determines 1135 ; * @return c it's executed properly(1) or not(0) 1136 ; * @author Behdad Hosseini, #781413112 1137 ; * @version 1.0, Apr 2003 1138 ; */ 02A7 1139 SwitchControl: 02A7 C0E0 1140 push acc 02A9 C001 1141 push dAR 02AB C0F0 1142 push b 1143 1144 ; a switch() on e 02AD 1145 SC0: 02AD BA0416 1146 cjne e, #EvConvReq, SC1 02B0 518F 1147 call GetLineConversation 02B2 4007 1148 jc SC0Error 02B4 519B 1149 call GetAFreeConversation 02B6 5003 1150 jnc SC0Error 02B8 B90204 1151 cjne d, #2, SC0OK 1152 02BB 1153 SC0Error: 02BB C3 1154 clr c 02BC 020304 1155 jmp SCEnd 1156 02BF 1157 SC0OK: 02BF D3 1158 setb c 02C0 3186 1159 call SetSwitch 02C2 D3 1160 setb c 02C3 020304 1161 jmp SCEnd 1162 02C6 1163 SC1: 02C6 BA051E 1164 cjne e, #EvAllRel, SC2 02C9 518F 1165 call GetLineConversation 02CB 5037 1166 jnc SCEnd 02CD C3 1167 clr c 02CE 3186 1168 call SetSwitch 1169 02D0 5180 1170 call IsConversationFree 02D2 500F 1171 jnc SC1Con 02D4 75F000 1172 mov b, #TnDefault 02D7 11F8 1173 call SetConversationToneState 02D9 B90207 1174 cjne d, #2, SC1Con 02DC 7B00 1175 mov t, #0 02DE 7A14 1176 mov e, #EvTrunkRel 02E0 12049B 1177 call TrunkControl 1178 02E3 1179 SC1Con: 02E3 D3 1180 setb c 02E4 020304 1181 jmp SCEnd 1182 02E7 1183 SC2: 02E7 BA060C 1184 cjne e, #EvToneReq, SC3 02EA 518F 1185 call GetLineConversation 02EC 5016 1186 jnc SCEnd 02EE 88F0 1187 mov b, n 02F0 11F8 1188 call SetConversationToneState 02F2 D3 1189 setb c 02F3 020304 1190 jmp SCEnd 1191 02F6 1192 SC3: 02F6 BA120B 1193 cjne e, #EvConnect, SC4 02F9 518F 1194 call GetLineConversation 02FB 5007 1195 jnc SCEnd 02FD E8 1196 mov a, n 02FE D3 1197 setb c 02FF 3186 1198 call SetSwitch 0301 020304 1199 jmp SCEnd 1200 0304 1201 SC4: 1202 0304 1203 SCEnd: 0304 D0F0 1204 pop b 0306 D001 1205 pop dAR 0308 D0E0 1206 pop acc 030A 22 1207 ret 1208 1209 1210 ;/** 1211 ; * Outputs lineWant (the connection a line has 1212 ; * been requested) of each line. 1213 ; * @param a line number 1214 ; * @return n lineWant 1215 ; * @author Behdad Hosseini, #781413112 1216 ; * @version 1.0, Apr 2003 1217 ; */ 030B 1218 GetLineWant: 030B C0D0 1219 push psw 1220 1221 ; a switch() on a 030D 1222 GLW0: 030D B40005 1223 cjne a, #0, GLW1 0310 A844 1224 mov n, lineWant0 0312 02032D 1225 jmp GLWEnd 1226 0315 1227 GLW1: 0315 B40105 1228 cjne a, #1, GLW2 0318 A845 1229 mov n, lineWant1 031A 02032D 1230 jmp GLWEnd 1231 031D 1232 GLW2: 031D B40205 1233 cjne a, #2, GLW3 0320 A846 1234 mov n, lineWant2 0322 02032D 1235 jmp GLWEnd 1236 0325 1237 GLW3: 0325 B40305 1238 cjne a, #3, GLW4 0328 A847 1239 mov n, lineWant3 032A 02032D 1240 jmp GLWEnd 1241 032D 1242 GLW4: 1243 032D 1244 GLWEnd: 032D D0D0 1245 pop psw 032F 22 1246 ret 1247 1248 1249 ;/** 1250 ; * Sets lineWant (the connection a line has been 1251 ; * requested) of each line into memory. 1252 ; * @param a line number 1253 ; * @param n lineWant 1254 ; * @author Behdad Hosseini, #781413112 1255 ; * @version 1.0, Apr 2003 1256 ; */ 0330 1257 SetLineWant: 0330 C0D0 1258 push psw 1259 1260 ; a switch() on a 0332 1261 SLW0: 0332 B40005 1262 cjne a, #0, SLW1 0335 8844 1263 mov lineWant0, n 0337 020352 1264 jmp SLWEnd 1265 033A 1266 SLW1: 033A B40105 1267 cjne a, #1, SLW2 033D 8845 1268 mov lineWant1, n 033F 020352 1269 jmp SLWEnd 1270 0342 1271 SLW2: 0342 B40205 1272 cjne a, #2, SLW3 0345 8846 1273 mov lineWant2, n 0347 020352 1274 jmp SLWEnd 1275 034A 1276 SLW3: 034A B40305 1277 cjne a, #3, SLW4 034D 8847 1278 mov lineWant3, n 034F 020352 1279 jmp SLWEnd 1280 0352 1281 SLW4: 1282 0352 1283 SLWEnd: 0352 D0D0 1284 pop psw 0354 22 1285 ret 1286 1287 1288 ;/** 1289 ; * The routine controls interconnection (switch) 1290 ; * between lines & trunks. It acccept requests 1291 ; * (in form of events) from line controls and 1292 ; * trunk controls. 1293 ; * @param e event 1294 ; * @param a line number 1295 ; * @param n if the event needs passing a param 1296 ; * @return e in some events for pass the result 1297 ; * @author Behdad Hosseini, #781413112 1298 ; * @version 1.0, Apr 2003 1299 ; */ 0355 1300 CentralControl: 0355 C0D0 1301 push psw 0357 C0F0 1302 push b 0359 C000 1303 push nAR 035B C0E0 1304 push acc 035D C002 1305 push eAR 1306 1307 ; a switch() on e 035F 1308 CC0: 035F BA0920 1309 cjne e, #EvDigitDialed, CC1_near 0362 020385 1310 jmp CC0_0 1311 0365 1312 CC0LineBusy: 0365 D002 1313 pop eAR 0367 7A0D 1314 mov e, #EvNoLineBusy 0369 C002 1315 push eAR 036B 020490 1316 jmp CCEnd 1317 036E 1318 CC0TrunkBusy: 036E D002 1319 pop eAR 0370 7A0E 1320 mov e, #EvNoTrunkBusy 0372 C002 1321 push eAR 0374 020490 1322 jmp CCEnd 1323 0377 1324 CC0LineRB: 0377 7130 1325 call SetLineWant 0379 D002 1326 pop eAR 037B 7A10 1327 mov e, #EvNoLineRB 037D C002 1328 push eAR 037F 020490 1329 jmp CCEnd 1330 0382 1331 CC1_near: ; CC1 exeeds jmp valid range 0382 0203F8 1332 jmp CC1 1333 0385 1334 CC0_0: 0385 B80112 1335 cjne n, #1, CC0_1 0388 C0E0 1336 push acc 038A 7400 1337 mov a, #0 038C A8E0 1338 mov n, acc 038E 7A0A 1339 mov e, #EvSOR 0390 120572 1340 call LineControl 0393 D0E0 1341 pop acc 0395 BA11CD 1342 cjne e, #EvOK, CC0LineBusy 0398 80DD 1343 jmp CC0LineRB 1344 039A 1345 CC0_1: 039A B80212 1346 cjne n, #2, CC0_2 039D C0E0 1347 push acc 039F 7401 1348 mov a, #1 03A1 A8E0 1349 mov n, acc 03A3 7A0A 1350 mov e, #EvSOR 03A5 120572 1351 call LineControl 03A8 D0E0 1352 pop acc 03AA BA11B8 1353 cjne e, #EvOK, CC0LineBusy 03AD 80C8 1354 jmp CC0LineRB 1355 03AF 1356 CC0_2: 03AF B80312 1357 cjne n, #3, CC0_3 03B2 C0E0 1358 push acc 03B4 7402 1359 mov a, #2 03B6 A8E0 1360 mov n, acc 03B8 7A0A 1361 mov e, #EvSOR 03BA 120572 1362 call LineControl 03BD D0E0 1363 pop acc 03BF BA11A3 1364 cjne e, #EvOK, CC0LineBusy 03C2 80B3 1365 jmp CC0LineRB 1366 03C4 1367 CC0_3: 03C4 B80412 1368 cjne n, #4, CC0_4 03C7 C0E0 1369 push acc 03C9 7403 1370 mov a, #3 03CB A8E0 1371 mov n, acc 03CD 7A0A 1372 mov e, #EvSOR 03CF 120572 1373 call LineControl 03D2 D0E0 1374 pop acc 03D4 BA118E 1375 cjne e, #EvOK, CC0LineBusy 03D7 809E 1376 jmp CC0LineRB 1377 03D9 1378 CC0_4: 03D9 B80013 1379 cjne n, #0, CC0_5 03DC 7B00 1380 mov t, #0 03DE 7A13 1381 mov e, #EvTalkReq 03E0 12049B 1382 call TrunkControl 03E3 BA1188 1383 cjne e, #EvOK, CC0TrunkBusy 03E6 D002 1384 pop eAR 03E8 7A0F 1385 mov e, #EvNoTrunkOK 03EA C002 1386 push eAR 03EC 020490 1387 jmp CCEnd 1388 03EF 1389 CC0_5: 03EF D002 1390 pop eAR 03F1 7A0C 1391 mov e, #EvNoInvalid 03F3 C002 1392 push eAR 03F5 020490 1393 jmp CCEnd 1394 03F8 1395 CC1: 03F8 BA0745 1396 cjne e, #EvTalkAccept, CC2 03FB F5F0 1397 mov b ,a 03FD 7400 1398 mov a, #0 1399 03FF 1400 CC1Next: 03FF 710B 1401 call GetLineWant 0401 C0E0 1402 push acc 0403 E8 1403 mov a, n 0404 B5F005 1404 cjne a, b, CC1Inc 0407 D0E0 1405 pop acc 0409 02042E 1406 jmp CC1OK 040C 1407 CC1Inc: 040C D0E0 1408 pop acc 040E 04 1409 inc a 040F B404ED 1410 cjne a, #4, CC1Next 1411 0412 E5F0 1412 mov a, b 0414 B54812 1413 cjne a, trunkWant, CC1Error 0417 7B00 1414 mov t, #0 0419 7A07 1415 mov e, #EvTalkAccept 041B 12049B 1416 call TrunkControl 041E 7548FF 1417 mov trunkWant, #TrunkWantDefault 0421 7902 1418 mov d, #2 0423 D3 1419 setb c 0424 3186 1420 call SetSwitch 0426 020490 1421 jmp CCEnd 1422 0429 1423 CC1Error: 1424 IF (DebugMode = 0) 1425 ; Serious Error 0429 11F5 1426 call Error 1427 EndIF 042B 020490 1428 jmp CCEnd 1429 042E 1430 CC1OK: 042E 7A07 1431 mov e, #EvTalkAccept 0430 120572 1432 call LineControl 1433 0433 78FF 1434 mov n, #LineWantDefault 0435 7130 1435 call SetLineWant 1436 0437 A8F0 1437 mov n, b 0439 7A12 1438 mov e, #EvConnect 043B 51A7 1439 call SwitchControl 1440 043D 020490 1441 jmp CCEnd 1442 0440 1443 CC2: 0440 BA0813 1444 cjne e, #EvTalkCancel, CC3 0443 710B 1445 call GetLineWant 1446 0445 C0E0 1447 push acc 0447 E8 1448 mov a, n 0448 7A0B 1449 mov e, #EvEOR 044A 120572 1450 call LineControl 044D D0E0 1451 pop acc 1452 044F 78FF 1453 mov n, #LineWantDefault 0451 7130 1454 call SetLineWant 0453 020490 1455 jmp CCEnd 1456 1457 0456 1458 CC3: 0456 BA1408 1459 cjne e, #EvTrunkRel, CC4 0459 7B00 1460 mov t, #0 045B 12049B 1461 call TrunkControl 045E 020490 1462 jmp CCEnd 1463 0461 1464 CC4: 0461 BA1616 1465 cjne e, #EvTTalkReq, CC5 0464 7400 1466 mov a, #0 1467 0466 1468 CC4Next: 0466 7A0A 1469 mov e, #EvSOR 0468 120572 1470 call LineControl 046B BA1105 1471 cjne e, #EvOK, CC4Inc 046E F548 1472 mov trunkWant, a 0470 020490 1473 jmp CCEnd 0473 1474 CC4Inc: 0473 04 1475 inc a 0474 B404EF 1476 cjne a, #4, CC4Next 1477 0477 020490 1478 jmp CCEnd 1479 047A 1480 CC5: 047A BA1713 1481 cjne e, #EvTTalkCancel, CC6 047D E548 1482 mov a, trunkWant 047F B4FF03 1483 cjne a, #TrunkWantDefault, CC5Cancel 0482 020490 1484 jmp CCEnd 1485 0485 1486 CC5Cancel: 0485 7A0B 1487 mov e, #EvEOR 0487 120572 1488 call LineControl 048A 7548FF 1489 mov trunkWant, #TrunkWantDefault 048D 020490 1490 jmp CCEnd 1491 0490 1492 CC6: 1493 0490 1494 CCEnd: 0490 D002 1495 pop eAR 0492 D0E0 1496 pop acc 0494 D000 1497 pop nAR 0496 D0F0 1498 pop b 0498 D0D0 1499 pop psw 049A 22 1500 ret 1501 1502 1503 ;/** 1504 ; * This routine controls a trunk. It means it 1505 ; * monitors ring signal and recieves events from 1506 ; * higher levels and does the control tasks. 1507 ; * @param e event 1508 ; * @param t trunk number 1509 ; * @return e in some events for pass the result 1510 ; * @author Behdad Hosseini, #781413112 1511 ; * @version 1.0, Apr 2003 1512 ; */ 049B 1513 TrunkControl: 049B C0D0 1514 push psw 049D C007 1515 push stateAR 049F C002 1516 push eAR 04A1 C0D0 1517 push psw 1518 04A3 AF49 1519 mov state, tCstate 1520 1521 ; a switch() first on state then on e 04A5 1522 TC0: 04A5 BF0029 1523 cjne state, #StIdle, TC1 1524 04A8 1525 TC0_0: 04A8 BA1311 1526 cjne e, #EvTalkReq, TC0_1 04AB D0D0 1527 pop psw 04AD D002 1528 pop eAR 04AF 7A11 1529 mov e, #EvOK 04B1 C002 1530 push eAR 04B3 D3 1531 setb c 04B4 12091E 1532 call SetTrunkCnct 04B7 7F07 1533 mov state, #StTalk 04B9 02051F 1534 jmp TCEnd 1535 04BC 1536 TC0_1: 04BC BA150D 1537 cjne e, #EvRdtctSample, TC0_2 04BF D0D0 1538 pop psw 04C1 505C 1539 jnc TCEnd 04C3 7F06 1540 mov state, #StRing 04C5 7A16 1541 mov e, #EvTTalkReq 04C7 7155 1542 call CentralControl 04C9 02051F 1543 jmp TCEnd 1544 04CC 1545 TC0_2: 04CC D0D0 1546 pop psw 04CE 02051F 1547 jmp TCEnd 1548 04D1 1549 TC1: 04D1 BF0713 1550 cjne state, #StTalk, TC2 1551 04D4 1552 TC1_0: 04D4 BA140B 1553 cjne e, #EvTrunkRel, TC1_1 04D7 D0D0 1554 pop psw 04D9 7F00 1555 mov state, #StIdle 04DB C3 1556 clr c 04DC 12091E 1557 call SetTrunkCnct 04DF 02051F 1558 jmp TCEnd 1559 04E2 1560 TC1_1: 04E2 D0D0 1561 pop psw 04E4 02051F 1562 jmp TCEnd 1563 04E7 1564 TC2: 04E7 BF062C 1565 cjne state, #StRing, TC3 1566 04EA 1567 TC2_0: 04EA BA1516 1568 cjne e, #EvRdtctSample, TC2_1 04ED D0D0 1569 pop psw 04EF 5006 1570 jnc TC2_0Chk 04F1 754AD2 1571 mov countTC, #210 04F4 02051F 1572 jmp TCEnd 1573 04F7 1574 TC2_0Chk: 04F7 D54A25 1575 djnz countTC, TCEnd 04FA 7F00 1576 mov state, #StIdle 04FC 7A17 1577 mov e, #EvTTalkCancel 04FE 7155 1578 call CentralControl 0500 02051F 1579 jmp TCEnd 1580 0503 1581 TC2_1: 0503 BA070B 1582 cjne e, #EvTalkAccept, TC2_2 0506 D0D0 1583 pop psw 0508 7F07 1584 mov state, #StTalk 050A D3 1585 setb c 050B 12091E 1586 call SetTrunkCnct 050E 02051F 1587 jmp TCEnd 1588 0511 1589 TC2_2: 0511 D0D0 1590 pop psw 0513 02051F 1591 jmp TCEnd 1592 0516 1593 TC3: 1594 ; invalid state 0516 D0D0 1595 pop psw 1596 IF (DebugMode = 0) 0518 11F5 1597 call Error 1598 ENDIF 051A 7F00 1599 mov state, #TCDefaultState 051C 02051F 1600 jmp TCEnd 1601 051F 1602 TCEnd: 051F 8F49 1603 mov tCstate, state 1604 1605 IF (DebugMode = 15) 1606 push psw 1607 push nAR 1608 cjne t, #0, DB15L0 1609 mov n, stateAR 1610 call ShowOnLeds 1611 1612 DB15L0: 1613 pop nAR 1614 pop psw 1615 ENDIF 1616 0521 D002 1617 pop eAR 0523 D007 1618 pop stateAR 0525 D0D0 1619 pop psw 0527 22 1620 ret 1621 1622 1623 ;/** 1624 ; * Outputs state of each LineControl. 1625 ; * @param a line number 1626 ; * @return state current state of LineControl 1627 ; * @author Behdad Hosseini, #781413112 1628 ; * @version 1.0, Apr 2003 1629 ; */ 0528 1630 GetLineControlData: 0528 C0D0 1631 push psw 1632 1633 ; a switch() on a 052A 1634 GLCD0: 052A B40005 1635 cjne a, #0, GLCD1 052D AF40 1636 mov state, lCstate0 052F 02054A 1637 jmp GLCDEnd 1638 0532 1639 GLCD1: 0532 B40105 1640 cjne a, #1, GLCD2 0535 AF41 1641 mov state, lCstate1 0537 02054A 1642 jmp GLCDEnd 1643 053A 1644 GLCD2: 053A B40205 1645 cjne a, #2, GLCD3 053D AF42 1646 mov state, lCstate2 053F 02054A 1647 jmp GLCDEnd 1648 0542 1649 GLCD3: 0542 B40305 1650 cjne a, #3, GLCD4 0545 AF43 1651 mov state, lCstate3 0547 02054A 1652 jmp GLCDEnd 1653 054A 1654 GLCD4: 1655 054A 1656 GLCDEnd: 054A D0D0 1657 pop psw 054C 22 1658 ret 1659 1660 1661 ;/** 1662 ; * Sets the state of each LineControl into the 1663 ; * memory. 1664 ; * @param a line number 1665 ; * @param state updated state of the LineControl 1666 ; * @author Behdad Hosseini, #781413112 1667 ; * @version 1.0, Apr 2003 1668 ; */ 054D 1669 SetLineControlData: 054D C0D0 1670 push psw 1671 1672 ; a switch() on a 054F 1673 SLCD0: 054F B40005 1674 cjne a, #0, SLCD1 0552 8F40 1675 mov lCstate0, state 0554 02056F 1676 jmp SLCDEnd 1677 0557 1678 SLCD1: 0557 B40105 1679 cjne a, #1, SLCD2 055A 8F41 1680 mov lCstate1, state 055C 02056F 1681 jmp SLCDEnd 1682 055F 1683 SLCD2: 055F B40205 1684 cjne a, #2, SLCD3 0562 8F42 1685 mov lCstate2, state 0564 02056F 1686 jmp SLCDEnd 1687 0567 1688 SLCD3: 0567 B40305 1689 cjne a, #3, SLCD4 056A 8F43 1690 mov lCstate3, state 056C 02056F 1691 jmp SLCDEnd 1692 056F 1693 SLCD4: 1694 056F 1695 SLCDEnd: 056F D0D0 1696 pop psw 0571 22 1697 ret 1698 1699 1700 ;/** 1701 ; * This routine controls and commands everything 1702 ; * that is related to a line. It recieves events 1703 ; * from lower or higher levels and decides what 1704 ; * to do with a line. 1705 ; * @param a line number 1706 ; * @param e event 1707 ; * @param n if e==EOD contains the dialed no 1708 ; * @return e in some events for show correctness 1709 ; * @author Behdad Hosseini, #781413112 1710 ; * @version 1.0, Apr 2003 1711 ; */ 0572 1712 LineControl: 1713 1714 IF (DebugMode = 5) 1715 push psw 1716 push nAR 1717 cjne a, #1, DB5L0 1718 mov n, eAR 1719 call ShowOnLeds 1720 1721 DB5L0: 1722 pop nAR 1723 pop psw 1724 ENDIF 1725 0572 C0D0 1726 push psw 0574 C007 1727 push stateAR 0576 C000 1728 push nAR 0578 C002 1729 push eAR 1730 057A B128 1731 call GetLineControlData 1732 1733 ; a switch() on state then on e 057C 1734 LC0: 057C BF002D 1735 cjne state, #StIdle, LC1 1736 057F 1737 LC0_0: 057F BA0016 1738 cjne e, #EvPickUp, LC0_1 0582 7F01 1739 mov state, #StDialTone 0584 7A04 1740 mov e, #EvConvReq 0586 51A7 1741 call SwitchControl 0588 4005 1742 jc LC0_0OK 058A 7F02 1743 mov state, #StInvalidTone 058C 0206DA 1744 jmp LCEnd 1745 058F 1746 LC0_0OK: 058F 7A06 1747 mov e, #EvToneReq 0591 7801 1748 mov n, #TnDial 0593 51A7 1749 call SwitchControl 0595 0206DA 1750 jmp LCEnd 1751 0598 1752 LC0_1: 0598 BA0A0E 1753 cjne e, #EvSOR, LC0_2 059B 7F06 1754 mov state, #StRing 059D D002 1755 pop eAR 059F 7A11 1756 mov e, #EvOK 05A1 C002 1757 push eAR 05A3 D3 1758 setb c 05A4 3138 1759 call SetLineRingState 05A6 0206DA 1760 jmp LCEnd 1761 05A9 1762 LC0_2: 05A9 0206DA 1763 jmp LCEnd 1764 05AC 1765 LC1: 05AC BF061D 1766 cjne state, #StRing, LC2 1767 05AF 1768 LC1_0: 05AF BA0B08 1769 cjne e, #EvEOR, LC1_1 05B2 C3 1770 clr c 05B3 3138 1771 call SetLineRingState 05B5 7F00 1772 mov state, #StIdle 05B7 0206DA 1773 jmp LCEnd 1774 05BA 1775 LC1_1: 05BA BA000C 1776 cjne e, #EvPickup, LC1_2 05BD C3 1777 clr c 05BE 3138 1778 call SetLineRingState 05C0 7F07 1779 mov state, #StTalk 05C2 7A07 1780 mov e, #EvTalkAccept 05C4 7155 1781 call CentralControl 05C6 0206DA 1782 jmp LCEnd 1783 05C9 1784 LC1_2: 05C9 0206DA 1785 jmp LCEnd 1786 05CC 1787 LC2: 05CC BF070F 1788 cjne state, #StTalk, LC3 1789 05CF 1790 LC2_0: 05CF BA0109 1791 cjne e, #EvPutdown, LC2_1 05D2 7F00 1792 mov state, #StIdle 05D4 7A05 1793 mov e, #EvAllRel 05D6 51A7 1794 call SwitchControl 05D8 0206DA 1795 jmp LCEnd 1796 05DB 1797 LC2_1: 05DB 0206DA 1798 jmp LCEnd 1799 05DE 1800 LC3: 05DE BF011D 1801 cjne state, #StDialTone, LC4 1802 05E1 1803 LC3_0: 05E1 BA020B 1804 cjne e, #EvSOD, LC3_1 05E4 7F08 1805 mov state, #StDialing 05E6 7A06 1806 mov e, #EvToneReq 05E8 7800 1807 mov n, #TnNo 05EA 51A7 1808 call SwitchControl 05EC 0206DA 1809 jmp LCEnd 1810 05EF 1811 LC3_1: 05EF BA0109 1812 cjne e, #EvPutdown, LC3_2 05F2 7F00 1813 mov state, #StIdle 05F4 7A05 1814 mov e, #EvAllRel 05F6 51A7 1815 call SwitchControl 05F8 0206DA 1816 jmp LCEnd 1817 05FB 1818 LC3_2: 05FB 0206DA 1819 jmp LCEnd 1820 05FE 1821 LC4: 05FE BF0862 1822 cjne state, #StDialing, LC5 1823 0601 1824 LC4_0: 0601 BA0109 1825 cjne e, #EvPutdown, LC4_1 0604 7F00 1826 mov state, #StIdle 0606 7A05 1827 mov e, #EvAllRel 0608 51A7 1828 call SwitchControl 060A 0206DA 1829 jmp LCEnd 1830 060D 1831 LC4_1: 060D BA0350 1832 cjne e, #EvEOD, LC4_2 0610 7A09 1833 mov e, #EvDigitDialed 0612 7155 1834 call CentralControl 1835 0614 1836 LCNo0: 0614 BA0C0B 1837 cjne e, #EvNoInvalid, LCNo1 0617 7F02 1838 mov state, #StInvalidTone 0619 7A06 1839 mov e, #EvToneReq 061B 7803 1840 mov n, #TnInvalid 061D 51A7 1841 call SwitchControl 061F 0206DA 1842 jmp LCEnd 1843 0622 1844 LCNo1: 0622 BA0D0B 1845 cjne e, #EvNoLineBusy, LCNo2 0625 7F03 1846 mov state, #StBusyTone 0627 7A06 1847 mov e, #EvToneReq 0629 7802 1848 mov n, #TnBusy 062B 51A7 1849 call SwitchControl 062D 0206DA 1850 jmp LCEnd 1851 0630 1852 LCNo2: 0630 BA0E0B 1853 cjne e, #EvNoTrunkBusy, LCNo3 0633 7F03 1854 mov state, #StBusyTone 0635 7A06 1855 mov e, #EvToneReq 0637 7802 1856 mov n, #TnBusy 0639 51A7 1857 call SwitchControl 063B 0206DA 1858 jmp LCEnd 1859 063E 1860 LCNo3: 063E BA100B 1861 cjne e, #EvNoLineRB, LCNo4 0641 7F04 1862 mov state, #StRingbackTone 0643 7A06 1863 mov e, #EvToneReq 0645 7804 1864 mov n, #TnRingback 0647 51A7 1865 call SwitchControl 0649 0206DA 1866 jmp LCEnd 1867 064C 1868 LCNo4: 064C BA0F0E 1869 cjne e, #EvNoTrunkOK, LCNo5 064F 7F05 1870 mov state, #StTrunk 0651 7A05 1871 mov e, #EvAllRel 0653 51A7 1872 call SwitchControl 1873 ;clr c 1874 ;call SetLineIntr 0655 7902 1875 mov d, #2 0657 D3 1876 setb c 0658 3186 1877 call SetSwitch 065A 0206DA 1878 jmp LCEnd 1879 065D 1880 LCNo5: 065D 0206DA 1881 jmp LCEnd 1882 0660 1883 LC4_2: 0660 0206DA 1884 jmp LCEnd 1885 0663 1886 LC5: 0663 BF030F 1887 cjne state, #StBusyTone, LC6 1888 0666 1889 LC5_0: 0666 BA0109 1890 cjne e, #EvPutdown, LC5_1 0669 7F00 1891 mov state, #StIdle 066B 7A05 1892 mov e, #EvAllRel 066D 51A7 1893 call SwitchControl 066F 0206DA 1894 jmp LCEnd 1895 0672 1896 LC5_1: 0672 0206DA 1897 jmp LCEnd 1898 0675 1899 LC6: 0675 BF020F 1900 cjne state, #StInvalidTone, LC7 1901 0678 1902 LC6_0: 0678 BA0109 1903 cjne e, #EvPutdown, LC6_1 067B 7F00 1904 mov state, #StIdle 067D 7A05 1905 mov e, #EvAllRel 067F 51A7 1906 call SwitchControl 0681 0206DA 1907 jmp LCEnd 1908 0684 1909 LC6_1: 0684 0206DA 1910 jmp LCEnd 1911 0687 1912 LC7: 0687 BF0513 1913 cjne state, #StTrunk, LC8 1914 068A 1915 LC7_0: 068A BA010D 1916 cjne e, #EvPutdown, LC7_1 068D 7F00 1917 mov state, #StIdle 068F 7A05 1918 mov e, #EvAllRel 0691 51A7 1919 call SwitchControl 1920 ;setb c 1921 ;call SetLineIntr 0693 7A14 1922 mov e, #EvTrunkRel 0695 7155 1923 call CentralControl 0697 0206DA 1924 jmp LCEnd 1925 069A 1926 LC7_1: 069A 0206DA 1927 jmp LCEnd 1928 069D 1929 LC8: 069D BF070F 1930 cjne state, #StTalk, LC9 1931 06A0 1932 LC8_0: 06A0 BA0109 1933 cjne e, #EvPutdown, LC8_1 06A3 7F00 1934 mov state, #StIdle 06A5 7A05 1935 mov e, #EvAllRel 06A7 51A7 1936 call SwitchControl 06A9 0206DA 1937 jmp LCEnd 1938 06AC 1939 LC8_1: 06AC 0206DA 1940 jmp LCEnd 1941 06AF 1942 LC9: 06AF BF0421 1943 cjne state, #StRingbackTone, LC10 1944 06B2 1945 LC9_0: 06B2 BA010D 1946 cjne e, #EvPutdown, LC9_1 06B5 7F00 1947 mov state, #StIdle 06B7 7A05 1948 mov e, #EvAllRel 06B9 51A7 1949 call SwitchControl 06BB 7A08 1950 mov e, #EvTalkCancel 06BD 7155 1951 call CentralControl 06BF 0206DA 1952 jmp LCEnd 1953 06C2 1954 LC9_1: 06C2 BA070B 1955 cjne e, #EvTalkAccept, LC9_2 06C5 7F07 1956 mov state, #StTalk 06C7 7A06 1957 mov e, #EvToneReq 06C9 7800 1958 mov n, #TnNo 06CB 51A7 1959 call SwitchControl 06CD 0206DA 1960 jmp LCEnd 1961 06D0 1962 LC9_2: 06D0 0206DA 1963 jmp LCEnd 1964 06D3 1965 LC10: 1966 ; invalid state 1967 IF (DebugMode = 0) 06D3 11F5 1968 call Error 1969 ENDIF 06D5 7F00 1970 mov state, #LCDefaultState 06D7 0206DA 1971 jmp LCEnd 1972 06DA 1973 LCEnd: 06DA B14D 1974 call SetLineControlData 1975 1976 IF (DebugMode = 13) 1977 push psw 1978 push nAR 1979 cjne a, #1, DB13L0 1980 mov n, stateAR 1981 call ShowOnLeds 1982 1983 DB13L0: 1984 pop nAR 1985 pop psw 1986 ENDIF 1987 06DC D002 1988 pop eAR 06DE D000 1989 pop nAR 06E0 D007 1990 pop stateAR 06E2 D0D0 1991 pop psw 06E4 22 1992 ret 1993 1994 1995 ;/** 1996 ; * Outputs state & no (dialed) of each line of 1997 ; * LineInterface. 1998 ; * @param a line number 1999 ; * @return state previous state of the LineInte. 2000 ; * @return n number that is counted until now 2001 ; * @author Behdad Hosseini, #781413112 2002 ; * @version 1.0, Apr 2003 2003 ; */ 06E5 2004 GetLineInterfaceData: 06E5 C0D0 2005 push psw 2006 2007 ; a switch() on a 06E7 2008 GLID0: 06E7 B40007 2009 cjne a, #0, GLID1 06EA AF38 2010 mov state, lIstate0 06EC A83C 2011 mov n, lIn0 06EE 02070F 2012 jmp GLIDEnd 2013 06F1 2014 GLID1: 06F1 B40107 2015 cjne a, #1, GLID2 06F4 AF39 2016 mov state, lIstate1 06F6 A83D 2017 mov n, lIn1 06F8 02070F 2018 jmp GLIDEnd 2019 06FB 2020 GLID2: 06FB B40207 2021 cjne a, #2, GLID3 06FE AF3A 2022 mov state, lIstate2 0700 A83E 2023 mov n, lIn2 0702 02070F 2024 jmp GLIDEnd 2025 0705 2026 GLID3: 0705 B40307 2027 cjne a, #3, GLID4 0708 AF3B 2028 mov state, lIstate3 070A A83F 2029 mov n, lIn3 070C 02070F 2030 jmp GLIDEnd 2031 070F 2032 GLID4: 2033 070F 2034 GLIDEnd: 070F D0D0 2035 pop psw 0711 22 2036 ret 2037 2038 2039 ;/** 2040 ; * Sets the state & no of each LineInterface 2041 ; * into the memory. 2042 ; * @param a line number 2043 ; * @param state updated state of the LineInter. 2044 ; * @param n number that is counted until now 2045 ; * @author Behdad Hosseini, #781413112 2046 ; * @version 1.0, Apr 2003 2047 ; */ 0712 2048 SetLineInterfaceData: 0712 C0D0 2049 push psw 2050 2051 ; a switch() on a 0714 2052 SLID0: 0714 B40007 2053 cjne a, #0, SLID1 0717 8F38 2054 mov lIstate0, state 0719 883C 2055 mov lIn0, n 071B 02073C 2056 jmp SLIDEnd 2057 071E 2058 SLID1: 071E B40107 2059 cjne a, #1, SLID2 0721 8F39 2060 mov lIstate1, state 0723 883D 2061 mov lIn1, n 0725 02073C 2062 jmp SLIDEnd 2063 0728 2064 SLID2: 0728 B40207 2065 cjne a, #2, SLID3 072B 8F3A 2066 mov lIstate2, state 072D 883E 2067 mov lIn2, n 072F 02073C 2068 jmp SLIDEnd 2069 0732 2070 SLID3: 0732 B40307 2071 cjne a, #3, SLID4 0735 8F3B 2072 mov lIstate3, state 0737 883F 2073 mov lIn3, n 0739 02073C 2074 jmp SLIDEnd 2075 073C 2076 SLID4: 2077 073C 2078 SLIDEnd: 073C D0D0 2079 pop psw 073E 22 2080 ret 2081 2082 2083 ;/** 2084 ; * This routine interfaces the dtct line signal 2085 ; * to meaningful events and if necessary send it 2086 ; * to higher levels. 2087 ; * @param a line number 2088 ; * @param c debounced dtct signal 2089 ; * @author Behdad Hosseini, #781413112 2090 ; * @version 1.0, Apr 2003 2091 ; */ 073F 2092 LineInterface: 073F C007 2093 push stateAR 0741 C000 2094 push nAR 0743 C002 2095 push eAR 0745 C0D0 2096 push psw 2097 0747 D1E5 2098 call GetLineInterfaceData 2099 ; a switch() on state 0749 020765 2100 jmp LIChk0 2101 074C 2102 LIEnd: 074C F112 2103 call SetLineInterfaceData 2104 2105 IF (DebugMode = 4) 2106 push psw 2107 push nAR 2108 cjne a, #1, DB4L0 2109 mov n, stateAR 2110 call ShowOnLeds 2111 2112 DB4L0: 2113 pop nAR 2114 pop psw 2115 ENDIF 2116 074E D002 2117 pop eAR 0750 D000 2118 pop nAR 0752 D007 2119 pop stateAR 0754 22 2120 ret 2121 0755 2122 GotoHigh: 0755 7F06 2123 mov state, #StHigh1 0757 B80004 2124 cjne n, #0, IncNo 075A 7A02 2125 mov e, #EvSOD 075C B172 2126 call LineControl 2127 075E 2128 IncNo: 075E 08 2129 inc n 075F 80EB 2130 jmp LIEnd 2131 0761 2132 GotoLow: 0761 7F02 2133 mov state, #StLow1 0763 80E7 2134 jmp LIEnd 2135 0765 2136 LIChk0: 0765 BF000C 2137 cjne state, #StDown, LIChk1 0768 D0D0 2138 pop psw 076A 50E0 2139 jnc LIEnd 076C 7F01 2140 mov state, #StUp 076E 7A00 2141 mov e, #EvPickup 0770 B172 2142 call LineControl 0772 80D8 2143 jmp LIEnd 2144 0774 2145 LIChk1: 0774 BF0108 2146 cjne state, #StUp, LIChk2 0777 D0D0 2147 pop psw 0779 40D1 2148 jc LIEnd 077B 7F02 2149 mov state, #StLow1 077D 80CD 2150 jmp LIEnd 2151 077F 2152 LIChk2: 077F BF0208 2153 cjne state, #StLow1, LIChk3 0782 D0D0 2154 pop psw 0784 40CF 2155 jc GotoHigh 0786 7F03 2156 mov state, #StLow2 0788 80C2 2157 jmp LIEnd 2158 078A 2159 LIChk3: 078A BF0308 2160 cjne state, #StLow2, LIChk4 078D D0D0 2161 pop psw 078F 40C4 2162 jc GotoHigh 0791 7F04 2163 mov state, #StLow3 0793 80B7 2164 jmp LIEnd 2165 0795 2166 LIChk4: 0795 BF0408 2167 cjne state, #StLow3, LIChk5 0798 D0D0 2168 pop psw 079A 40B9 2169 jc GotoHigh 079C 7F05 2170 mov state, #StLow4 079E 80AC 2171 jmp LIEnd 2172 07A0 2173 LIChk5: 07A0 BF050C 2174 cjne state, #StLow4, LIChk6 07A3 D0D0 2175 pop psw 07A5 40AE 2176 jc GotoHigh 07A7 7F00 2177 mov state, #StDown 07A9 7A01 2178 mov e, #EvPutdown 07AB B172 2179 call LineControl 07AD 809D 2180 jmp LIEnd 2181 2182 07AF 2183 LIChk6: 07AF BF0608 2184 cjne state, #StHigh1, LIChk7 07B2 D0D0 2185 pop psw 07B4 50AB 2186 jnc GotoLow 07B6 7F07 2187 mov state, #StHigh2 07B8 8092 2188 jmp LIEnd 2189 07BA 2190 LIChk7: 07BA BF0708 2191 cjne state, #StHigh2, LIChk8 07BD D0D0 2192 pop psw 07BF 50A0 2193 jnc GotoLow 07C1 7F08 2194 mov state, #StHigh3 07C3 8087 2195 jmp LIEnd 2196 07C5 2197 LIChk8: 07C5 BF0808 2198 cjne state, #StHigh3, LIChk9 07C8 D0D0 2199 pop psw 07CA 5095 2200 jnc GotoLow 07CC 7F09 2201 mov state, #StHigh4 07CE E14C 2202 jmp LIEnd 2203 07D0 2204 LIChk9: 07D0 BF0913 2205 cjne state, #StHigh4, LIChk10 07D3 D0D0 2206 pop psw 07D5 508A 2207 jnc GotoLow 2208 2209 ; Digit correction (10->0) 07D7 B80A02 2210 cjne n, #10, LIChkDOK 07DA 7800 2211 mov n, #0 2212 07DC 2213 LIChkDOK: 07DC 7A03 2214 mov e, #EvEOD 07DE B172 2215 call LineControl 2216 07E0 7800 2217 mov n, #0 07E2 7F01 2218 mov state, #StUp 07E4 E14C 2219 jmp LIEnd 2220 07E6 2221 LIChk10: 2222 ; invalid state 07E6 D0D0 2223 pop psw 2224 IF (DebugMode = 0) 07E8 11F5 2225 call Error 2226 ENDIF 07EA 7F00 2227 mov state, #LIDefaultState 07EC E14C 2228 jmp LIEnd 2229 2230 2231 ;/** 2232 ; * This routine is executed every 1ms and is 2233 ; * responsible for updating the conv. tone 2234 ; * signals based on the known tone states. 2235 ; * @author Behdad Hosseini, #781413112 2236 ; * @version 1.0, Apr 2003 2237 ; */ 07EE 2238 ApplyConversationTones: 07EE C0D0 2239 push psw 07F0 C001 2240 push dAR 07F2 C0F0 2241 push b 07F4 C0E0 2242 push acc 2243 2244 ; a for() on d 07F6 7900 2245 mov d, #0 07F8 2246 ACTNext: 07F8 3118 2247 call GetConversationToneState 07FA E5F0 2248 mov a, b 2249 2250 ; a switch on a 07FC 2251 ACTChk0: 07FC B4000A 2252 cjne a, #TnNo, ACTChk1 07FF A200 2253 mov c, mainWave 0801 8201 2254 anl c, noTone 0803 12092D 2255 call SetConversationTone 0806 020840 2256 jmp ACTInc 2257 0809 2258 ACTChk1: 0809 B4010A 2259 cjne a, #TnDial, ACTChk2 080C A200 2260 mov c, mainWave 080E 8202 2261 anl c, dialTone 0810 12092D 2262 call SetConversationTone 0813 020840 2263 jmp ACTInc 2264 0816 2265 ACTChk2: 0816 B4020A 2266 cjne a, #TnBusy, ACTChk3 0819 A200 2267 mov c, mainWave 081B 8203 2268 anl c, busyTone 081D 12092D 2269 call SetConversationTone 0820 020840 2270 jmp ACTInc 2271 0823 2272 ACTChk3: 0823 B4030A 2273 cjne a, #TnInvalid, ACTChk4 0826 A200 2274 mov c, mainWave 0828 8204 2275 anl c, invalidTone 082A 12092D 2276 call SetConversationTone 082D 020840 2277 jmp ACTInc 2278 0830 2279 ACTChk4: 0830 B4040A 2280 cjne a, #TnRingback, ACTChk5 0833 A200 2281 mov c, mainWave 0835 8205 2282 anl c, ringbackTone 0837 12092D 2283 call SetConversationTone 083A 020840 2284 jmp ACTInc 2285 083D 2286 ACTChk5: 083D 020840 2287 jmp ACTInc 2288 0840 2289 ACTInc: 0840 09 2290 inc d 0841 B903B4 2291 cjne d, #3, ACTNext 2292 0844 D0E0 2293 pop acc 0846 D001 2294 pop dAR 0848 D0F0 2295 pop b 084A D0D0 2296 pop psw 084C 22 2297 ret 2298 2299 2300 ;/** 2301 ; * This routine is executed every 1ms and is 2302 ; * responsible for making another timings. 2303 ; * @author Behdad Hosseini, #781413112 2304 ; * @version 1.0, Apr 2003 2305 ; */ 084D 2306 Int1ms: 084D B200 2307 cpl mainWave 2308 2309 ; make 20ms 084F 2310 Chk20: 084F D53306 2311 djnz count20, Chk250 0852 753314 2312 mov count20, #20 0855 120865 2313 call Int20ms 2314 2315 ; make 250ms 0858 2316 Chk250: 0858 D53406 2317 djnz count250, I1End 085B 7534FA 2318 mov count250, #250 085E 1208A3 2319 call Int250ms 2320 0861 2321 I1End: 0861 1207EE 2322 call ApplyConversationTones 0864 22 2323 ret 2324 2325 2326 ;/** 2327 ; * This routine is executed every 20ms. Its main 2328 ; * purpose is sampling input signals and send it 2329 ; * to higher levels of software. 2330 ; * @author Behdad Hosseini, #781413112 2331 ; * @version 1.0, Apr 2003 2332 ; */ 0865 2333 Int20ms: 0865 C0E0 2334 push acc 0867 C0D0 2335 push psw 2336 0869 E4 2337 clr a 086A 2338 DBounce: 086A 120950 2339 call GetLineDtct 086D 920A 2340 mov gf0, c 086F 00 2341 nop 0870 120950 2342 call GetLineDtct 0873 920B 2343 mov gf1, c 0875 A00A 2344 orl c, /gf0 0877 50F1 2345 jnc DBounce 0879 A20A 2346 mov c, gf0 087B A00B 2347 orl c, /gf1 087D 50EB 2348 jnc DBounce 2349 2350 ;OK (xor of two sequential samples == 0) 087F A20A 2351 mov c, gf0 0881 12073F 2352 call LineInterface 2353 2354 IF (DebugMode = 2) 2355 mov c, l0RingState 2356 mov led0, c 2357 ENDIF 2358 2359 ; apply ring state for each line 0884 120165 2360 call GetLineRingState 0887 8205 2361 anl c, ringWave 0889 1208B8 2362 call SetLineRng 2363 088C 2364 NextLine: 088C 04 2365 inc a 088D B404DA 2366 cjne a, #4, DBounce 2367 0890 7B00 2368 mov t, #0 0892 2369 NextTrunk: 0892 120972 2370 call GetTrunkRdtct 0895 7A15 2371 mov e, #EvRdtctSample 0897 12049B 2372 call TrunkControl 089A 0B 2373 inc t 089B BB01F4 2374 cjne t, #1, NextTrunk 2375 2376 2377 IF (DebugMode = 14) 2378 push dAR 2379 push acc 2380 push psw 2381 2382 mov a, #3 2383 mov d, #0 2384 call GetSwitch 2385 mov led0, c 2386 mov d, #1 2387 call GetSwitch 2388 mov led1, c 2389 mov d, #2 2390 call GetSwitch 2391 mov led2, c 2392 2393 pop psw 2394 pop acc 2395 pop dAR 2396 ENDIF 2397 089E D0D0 2398 pop psw 08A0 D0E0 2399 pop acc 08A2 22 2400 ret 2401 2402 2403 ;/** 2404 ; * This routine is executed every 250ms. It 2405 ; * makes the necessary waves especially for tone 2406 ; * generator unit. 2407 ; * @author Behdad Hosseini, #781413112 2408 ; * @version 1.0, Apr 2003 2409 ; */ 08A3 2410 Int250ms: 08A3 B204 2411 cpl invalidTone 08A5 20040F 2412 jb invalidTone, I250End 2413 08A8 B203 2414 cpl busyTone 08AA 20030A 2415 jb busyTone, I250End 2416 2417 IF (DebugMode = 1) 2418 inc debug1 2419 push nAR 2420 mov n, debug1 2421 call ShowOnLeds 2422 pop nAR 2423 ENDIF 2424 08AD C205 2425 clr ringbackTone 08AF D53205 2426 djnz count4, I250End 08B2 D205 2427 setb ringbackTone 08B4 753204 2428 mov count4, #4 2429 08B7 2430 I250End: 08B7 22 2431 ret 2432 2433 2434 ;/** 2435 ; * This routine changes the line ring signal. 2436 ; * @param a line number 2437 ; * @param c the signal to the port 2438 ; * @author Behdad Hosseini, #781413112 2439 ; * @version 1.0, Apr 2003 2440 ; */ 08B8 2441 SetLineRng: 08B8 C0D0 2442 push psw 2443 2444 ; first check that phone is on-hook 08BA 920A 2445 mov gf0, c 08BC 120950 2446 call GetLineDtct 08BF B3 2447 cpl c 08C0 820A 2448 anl c,gf0 08C2 C0D0 2449 push psw 2450 2451 ; a switch() on a 08C4 2452 SLRng0: 08C4 B40007 2453 cjne a, #0, SLRng1 08C7 D0D0 2454 pop psw 08C9 9280 2455 mov l0_Rng, c 08CB 0208EE 2456 jmp SLRngEnd 2457 08CE 2458 SLRng1: 08CE B40107 2459 cjne a, #1, SLRng2 08D1 D0D0 2460 pop psw 08D3 9290 2461 mov l1_Rng, c 08D5 0208EE 2462 jmp SLRngEnd 2463 08D8 2464 SLRng2: 08D8 B40207 2465 cjne a, #2, SLRng3 08DB D0D0 2466 pop psw 08DD 92A0 2467 mov l2_Rng, c 08DF 0208EE 2468 jmp SLRngEnd 2469 08E2 2470 SLRng3: 08E2 B40307 2471 cjne a, #3, SLRng4 08E5 D0D0 2472 pop psw 08E7 92B0 2473 mov l3_Rng, c 08E9 0208EE 2474 jmp SLRngEnd 2475 08EC 2476 SLRng4: 08EC D0D0 2477 pop psw 2478 08EE 2479 SLRngEnd: 08EE D0D0 2480 pop psw 08F0 22 2481 ret 2482 2483 2484 ;/** 2485 ; * This routine changes line internal signals. 2486 ; * @param a line number 2487 ; * @param c the signal to the port 2488 ; * @author Behdad Hosseini, #781413112 2489 ; * @version 1.0, Apr 2003 2490 ; */ 08F1 2491 SetLineIntr: 08F1 C0D0 2492 push psw 2493 ; Maybe here, some check is necessary 2494 2495 ; a switch() on a 08F3 2496 SLIntr0: 08F3 B40007 2497 cjne a, #0, SLIntr1 08F6 D0D0 2498 pop psw 08F8 9282 2499 mov l0_Intr, c 08FA 02091D 2500 jmp SLIntrEnd 2501 08FD 2502 SLIntr1: 08FD B40107 2503 cjne a, #1, SLIntr2 0900 D0D0 2504 pop psw 0902 9292 2505 mov l1_Intr, c 0904 02091D 2506 jmp SLIntrEnd 2507 0907 2508 SLIntr2: 0907 B40207 2509 cjne a, #2, SLIntr3 090A D0D0 2510 pop psw 090C 92A2 2511 mov l2_Intr, c 090E 02091D 2512 jmp SLIntrEnd 2513 0911 2514 SLIntr3: 0911 B40307 2515 cjne a, #3, SLIntr4 0914 D0D0 2516 pop psw 0916 92B2 2517 mov l3_Intr, c 0918 02091D 2518 jmp SLIntrEnd 2519 091B 2520 SLIntr4: 091B D0D0 2521 pop psw 2522 091D 2523 SLIntrEnd: 091D 22 2524 ret 2525 2526 2527 ;/** 2528 ; * This routine changes trunk connect signals. 2529 ; * @param t trunk number 2530 ; * @param c the signal to the port 2531 ; * @author Behdad Hosseini, #781413112 2532 ; * @version 1.0, Apr 2003 2533 ; */ 091E 2534 SetTrunkCnct: 091E C0D0 2535 push psw 2536 0920 2537 STCnct0: 0920 BB0007 2538 cjne t, #0, STCnct1 0923 D0D0 2539 pop psw 0925 92B3 2540 mov T0_Cnct, c 0927 02092C 2541 jmp STCnctEnd 2542 092A 2543 STCnct1: 092A D0D0 2544 pop psw 2545 092C 2546 STCnctEnd: 092C 22 2547 ret 2548 2549 2550 ;/** 2551 ; * This routine changes the conv. tone signal. 2552 ; * @param d conversation number 2553 ; * @param c the signal to the port 2554 ; * @author Behdad Hosseini, #781413112 2555 ; * @version 1.0, Apr 2003 2556 ; */ 092D 2557 SetConversationTone: 092D C0D0 2558 push psw 2559 2560 ; a switch() on d 092F 2561 SCTone0: 092F B90007 2562 cjne d, #0, SCTone1 0932 D0D0 2563 pop psw 0934 9287 2564 mov C0_Tone, c 0936 02094F 2565 jmp SCToneEnd 2566 0939 2567 SCTone1: 0939 B90107 2568 cjne d, #1, SCTone2 093C D0D0 2569 pop psw 093E 9297 2570 mov C1_Tone, c 0940 02094F 2571 jmp SCToneEnd 2572 0943 2573 SCTone2: 0943 B90207 2574 cjne d, #2, SCTone3 0946 D0D0 2575 pop psw 0948 92A7 2576 mov C2_Tone, c 094A 02094F 2577 jmp SCToneEnd 2578 094D 2579 SCTone3: 094D D0D0 2580 pop psw 2581 094F 2582 SCToneEnd: 094F 22 2583 ret 2584 2585 2586 ;/** 2587 ; * This routine outputs the line detect signal. 2588 ; * @param a line number 2589 ; * @return c the signal from the port 2590 ; * @author Behdad Hosseini, #781413112 2591 ; * @version 1.0, Apr 2003 2592 ; */ 0950 2593 GetLineDtct: 2594 2595 ; a switch() on a 0950 2596 GLDtct0: 0950 B40005 2597 cjne a, #0, GLDtct1 0953 A281 2598 mov c, l0_Dtct 0955 020970 2599 jmp GLDtctEnd 2600 0958 2601 GLDtct1: 0958 B40105 2602 cjne a, #1, GLDtct2 095B A291 2603 mov c, l1_Dtct 095D 020970 2604 jmp GLDtctEnd 2605 0960 2606 GLDtct2: 0960 B40205 2607 cjne a, #2, GLDtct3 0963 A2A1 2608 mov c, l2_Dtct 0965 020970 2609 jmp GLDtctEnd 2610 0968 2611 GLDtct3: 0968 B40305 2612 cjne a, #3, GLDtct4 096B A2B1 2613 mov c, l3_Dtct 096D 020970 2614 jmp GLDtctEnd 2615 0970 2616 GLDtct4: 2617 0970 2618 GLDtctEnd: 0970 B3 2619 cpl c ; change low active to high active 0971 22 2620 ret 2621 2622 2623 ;/** 2624 ; * This routine outputs the trunk ring detect 2625 ; * signal. 2626 ; * @param t trunk number 2627 ; * @return c the signal from the port (trunk) 2628 ; * @author Behdad Hosseini, #781413112 2629 ; * @version 1.0, Apr 2003 2630 ; */ 0972 2631 GetTrunkRdtct: 0972 2632 GTRdtct0: 0972 BB0005 2633 cjne t, #0, GTRdtct1 0975 A2B4 2634 mov c, T0_Rdtct 0977 02097A 2635 jmp GTRdtctEnd 2636 097A 2637 GTRdtct1: 2638 097A 2639 GTRdtctEnd: 097A B3 2640 cpl c ; change low active to high active 097B 22 2641 ret 2642 2643 2644 end VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED ACTCHK0. . . . . . . . . . . . . C ADDR 07FCH NOT USED ACTCHK1. . . . . . . . . . . . . C ADDR 0809H ACTCHK2. . . . . . . . . . . . . C ADDR 0816H ACTCHK3. . . . . . . . . . . . . C ADDR 0823H ACTCHK4. . . . . . . . . . . . . C ADDR 0830H ACTCHK5. . . . . . . . . . . . . C ADDR 083DH ACTINC . . . . . . . . . . . . . C ADDR 0840H ACTNEXT. . . . . . . . . . . . . C ADDR 07F8H APPLYCONVERSATIONTONES . . . . . C ADDR 07EEH AR0. . . . . . . . . . . . . . . D ADDR 0000H AR1. . . . . . . . . . . . . . . D ADDR 0001H AR2. . . . . . . . . . . . . . . D ADDR 0002H AR3. . . . . . . . . . . . . . . D ADDR 0003H AR4. . . . . . . . . . . . . . . D ADDR 0004H NOT USED AR5. . . . . . . . . . . . . . . D ADDR 0005H NOT USED AR6. . . . . . . . . . . . . . . D ADDR 0006H NOT USED AR7. . . . . . . . . . . . . . . D ADDR 0007H B. . . . . . . . . . . . . . . . D ADDR 00F0H PREDEFINED BUSYTONE . . . . . . . . . . . . B ADDR 0003H C0TONESTATE. . . . . . . . . . . D ADDR 0035H C0_S0. . . . . . . . . . . . . . NUMB 0083H C0_S1. . . . . . . . . . . . . . NUMB 0084H C0_S2. . . . . . . . . . . . . . NUMB 0085H C0_S3. . . . . . . . . . . . . . NUMB 0086H C0_TONE. . . . . . . . . . . . . NUMB 0087H C1TONESTATE. . . . . . . . . . . D ADDR 0036H C1_S0. . . . . . . . . . . . . . NUMB 0093H C1_S1. . . . . . . . . . . . . . NUMB 0094H C1_S2. . . . . . . . . . . . . . NUMB 0095H C1_S3. . . . . . . . . . . . . . NUMB 0096H C1_TONE. . . . . . . . . . . . . NUMB 0097H C2TONESTATE. . . . . . . . . . . D ADDR 0037H C2_S0. . . . . . . . . . . . . . NUMB 00A3H C2_S1. . . . . . . . . . . . . . NUMB 00A4H C2_S2. . . . . . . . . . . . . . NUMB 00A5H C2_S3. . . . . . . . . . . . . . NUMB 00A6H C2_TONE. . . . . . . . . . . . . NUMB 00A7H CC0. . . . . . . . . . . . . . . C ADDR 035FH NOT USED CC0LINEBUSY. . . . . . . . . . . C ADDR 0365H CC0LINERB. . . . . . . . . . . . C ADDR 0377H CC0TRUNKBUSY . . . . . . . . . . C ADDR 036EH CC0_0. . . . . . . . . . . . . . C ADDR 0385H CC0_1. . . . . . . . . . . . . . C ADDR 039AH CC0_2. . . . . . . . . . . . . . C ADDR 03AFH CC0_3. . . . . . . . . . . . . . C ADDR 03C4H CC0_4. . . . . . . . . . . . . . C ADDR 03D9H CC0_5. . . . . . . . . . . . . . C ADDR 03EFH CC1. . . . . . . . . . . . . . . C ADDR 03F8H CC1ERROR . . . . . . . . . . . . C ADDR 0429H CC1INC . . . . . . . . . . . . . C ADDR 040CH CC1NEXT. . . . . . . . . . . . . C ADDR 03FFH CC1OK. . . . . . . . . . . . . . C ADDR 042EH CC1_NEAR . . . . . . . . . . . . C ADDR 0382H CC2. . . . . . . . . . . . . . . C ADDR 0440H CC3. . . . . . . . . . . . . . . C ADDR 0456H CC4. . . . . . . . . . . . . . . C ADDR 0461H CC4INC . . . . . . . . . . . . . C ADDR 0473H CC4NEXT. . . . . . . . . . . . . C ADDR 0466H CC5. . . . . . . . . . . . . . . C ADDR 047AH CC5CANCEL. . . . . . . . . . . . C ADDR 0485H CC6. . . . . . . . . . . . . . . C ADDR 0490H CCEND. . . . . . . . . . . . . . C ADDR 0490H CENTRALCONTROL . . . . . . . . . C ADDR 0355H CHK20. . . . . . . . . . . . . . C ADDR 084FH NOT USED CHK250 . . . . . . . . . . . . . C ADDR 0858H COUNT20. . . . . . . . . . . . . D ADDR 0033H COUNT250 . . . . . . . . . . . . D ADDR 0034H COUNT4 . . . . . . . . . . . . . D ADDR 0032H COUNTTC. . . . . . . . . . . . . D ADDR 004AH D. . . . . . . . . . . . . . . . REG1 DAR. . . . . . . . . . . . . . . NUMB 0001H DBOUNCE. . . . . . . . . . . . . C ADDR 086AH DEBUG1 . . . . . . . . . . . . . D ADDR 0030H NOT USED DEBUG2 . . . . . . . . . . . . . D ADDR 0031H NOT USED DEBUGMODE. . . . . . . . . . . . NUMB 0000H DIALTONE . . . . . . . . . . . . B ADDR 0002H E. . . . . . . . . . . . . . . . REG2 EAR. . . . . . . . . . . . . . . NUMB 0002H ERROR. . . . . . . . . . . . . . C ADDR 00F5H EVALLREL . . . . . . . . . . . . NUMB 0005H EVCONNECT. . . . . . . . . . . . NUMB 0012H EVCONVREQ. . . . . . . . . . . . NUMB 0004H EVDIGITDIALED. . . . . . . . . . NUMB 0009H EVEOD. . . . . . . . . . . . . . NUMB 0003H EVEOR. . . . . . . . . . . . . . NUMB 000BH EVNOINVALID. . . . . . . . . . . NUMB 000CH EVNOLINEBUSY . . . . . . . . . . NUMB 000DH EVNOLINERB . . . . . . . . . . . NUMB 0010H EVNOTRUNKBUSY. . . . . . . . . . NUMB 000EH EVNOTRUNKOK. . . . . . . . . . . NUMB 000FH EVOK . . . . . . . . . . . . . . NUMB 0011H EVPICKUP . . . . . . . . . . . . NUMB 0000H EVPUTDOWN. . . . . . . . . . . . NUMB 0001H EVRDTCTSAMPLE. . . . . . . . . . NUMB 0015H EVSOD. . . . . . . . . . . . . . NUMB 0002H EVSOR. . . . . . . . . . . . . . NUMB 000AH EVTALKACCEPT . . . . . . . . . . NUMB 0007H EVTALKCANCEL . . . . . . . . . . NUMB 0008H EVTALKREQ. . . . . . . . . . . . NUMB 0013H EVTONEREQ. . . . . . . . . . . . NUMB 0006H EVTRUNKREL . . . . . . . . . . . NUMB 0014H EVTTALKCANCEL. . . . . . . . . . NUMB 0017H EVTTALKREQ . . . . . . . . . . . NUMB 0016H GAFCEND. . . . . . . . . . . . . C ADDR 02A6H GAFCNEXT . . . . . . . . . . . . C ADDR 029DH GCTS0. . . . . . . . . . . . . . C ADDR 011AH NOT USED GCTS1. . . . . . . . . . . . . . C ADDR 0123H GCTS2. . . . . . . . . . . . . . C ADDR 012CH GCTS3. . . . . . . . . . . . . . C ADDR 0135H GCTSEND. . . . . . . . . . . . . C ADDR 0135H GETAFREECONVERSATION . . . . . . C ADDR 029BH GETCONVERSATIONTONESTATE . . . . C ADDR 0118H GETLINECONTROLDATA . . . . . . . C ADDR 0528H GETLINECONVERSATION. . . . . . . C ADDR 028FH GETLINEDTCT. . . . . . . . . . . C ADDR 0950H GETLINEINTERFACEDATA . . . . . . C ADDR 06E5H GETLINERINGSTATE . . . . . . . . C ADDR 0165H GETLINEWANT. . . . . . . . . . . C ADDR 030BH GETSWITCH. . . . . . . . . . . . C ADDR 0211H GETTRUNKRDTCT. . . . . . . . . . C ADDR 0972H GF0. . . . . . . . . . . . . . . B ADDR 000AH GF1. . . . . . . . . . . . . . . B ADDR 000BH GLCD0. . . . . . . . . . . . . . C ADDR 052AH NOT USED GLCD1. . . . . . . . . . . . . . C ADDR 0532H GLCD2. . . . . . . . . . . . . . C ADDR 053AH GLCD3. . . . . . . . . . . . . . C ADDR 0542H GLCD4. . . . . . . . . . . . . . C ADDR 054AH GLCDEND. . . . . . . . . . . . . C ADDR 054AH GLCEND . . . . . . . . . . . . . C ADDR 029AH GLCNEXT. . . . . . . . . . . . . C ADDR 0291H GLDTCT0. . . . . . . . . . . . . C ADDR 0950H NOT USED GLDTCT1. . . . . . . . . . . . . C ADDR 0958H GLDTCT2. . . . . . . . . . . . . C ADDR 0960H GLDTCT3. . . . . . . . . . . . . C ADDR 0968H GLDTCT4. . . . . . . . . . . . . C ADDR 0970H GLDTCTEND. . . . . . . . . . . . C ADDR 0970H GLID0. . . . . . . . . . . . . . C ADDR 06E7H NOT USED GLID1. . . . . . . . . . . . . . C ADDR 06F1H GLID2. . . . . . . . . . . . . . C ADDR 06FBH GLID3. . . . . . . . . . . . . . C ADDR 0705H GLID4. . . . . . . . . . . . . . C ADDR 070FH GLIDEND. . . . . . . . . . . . . C ADDR 070FH GLRS0. . . . . . . . . . . . . . C ADDR 0165H NOT USED GLRS1. . . . . . . . . . . . . . C ADDR 016DH GLRS2. . . . . . . . . . . . . . C ADDR 0175H GLRS3. . . . . . . . . . . . . . C ADDR 017DH GLRS4. . . . . . . . . . . . . . C ADDR 0185H GLRSEND. . . . . . . . . . . . . C ADDR 0185H GLW0 . . . . . . . . . . . . . . C ADDR 030DH NOT USED GLW1 . . . . . . . . . . . . . . C ADDR 0315H GLW2 . . . . . . . . . . . . . . C ADDR 031DH GLW3 . . . . . . . . . . . . . . C ADDR 0325H GLW4 . . . . . . . . . . . . . . C ADDR 032DH GLWEND . . . . . . . . . . . . . C ADDR 032DH GOTOHIGH . . . . . . . . . . . . C ADDR 0755H GOTOLOW. . . . . . . . . . . . . C ADDR 0761H GSCHK0 . . . . . . . . . . . . . C ADDR 0211H NOT USED GSCHK0_0 . . . . . . . . . . . . C ADDR 0214H NOT USED GSCHK0_1 . . . . . . . . . . . . C ADDR 021CH GSCHK0_2 . . . . . . . . . . . . C ADDR 0224H GSCHK0_3 . . . . . . . . . . . . C ADDR 022CH GSCHK1 . . . . . . . . . . . . . C ADDR 0234H GSCHK1_0 . . . . . . . . . . . . C ADDR 0237H NOT USED GSCHK1_1 . . . . . . . . . . . . C ADDR 023FH GSCHK1_2 . . . . . . . . . . . . C ADDR 0247H GSCHK1_3 . . . . . . . . . . . . C ADDR 024FH GSCHK2 . . . . . . . . . . . . . C ADDR 0257H GSCHK2_0 . . . . . . . . . . . . C ADDR 025AH NOT USED GSCHK2_1 . . . . . . . . . . . . C ADDR 0262H GSCHK2_2 . . . . . . . . . . . . C ADDR 026AH GSCHK2_3 . . . . . . . . . . . . C ADDR 0272H GSEND. . . . . . . . . . . . . . C ADDR 027FH GSERROR. . . . . . . . . . . . . C ADDR 027AH GTRDTCT0 . . . . . . . . . . . . C ADDR 0972H NOT USED GTRDTCT1 . . . . . . . . . . . . C ADDR 097AH GTRDTCTEND . . . . . . . . . . . C ADDR 097AH I1END. . . . . . . . . . . . . . C ADDR 0861H I250END. . . . . . . . . . . . . C ADDR 08B7H IE . . . . . . . . . . . . . . . D ADDR 00A8H PREDEFINED INCNO. . . . . . . . . . . . . . C ADDR 075EH INIT . . . . . . . . . . . . . . C ADDR 0040H INT1MS . . . . . . . . . . . . . C ADDR 084DH INT20MS. . . . . . . . . . . . . C ADDR 0865H INT250MS . . . . . . . . . . . . C ADDR 08A3H INVALIDTONE. . . . . . . . . . . B ADDR 0004H ISCONVERSATIONFREE . . . . . . . C ADDR 0280H ISFEND . . . . . . . . . . . . . C ADDR 028BH ISFNEXT. . . . . . . . . . . . . C ADDR 0283H L0RINGSTATE. . . . . . . . . . . B ADDR 0006H L0_DTCT. . . . . . . . . . . . . NUMB 0081H L0_INTR. . . . . . . . . . . . . NUMB 0082H L0_RNG . . . . . . . . . . . . . NUMB 0080H L1RINGSTATE. . . . . . . . . . . B ADDR 0007H L1_DTCT. . . . . . . . . . . . . NUMB 0091H L1_INTR. . . . . . . . . . . . . NUMB 0092H L1_RNG . . . . . . . . . . . . . NUMB 0090H L2RINGSTATE. . . . . . . . . . . B ADDR 0008H L2_DTCT. . . . . . . . . . . . . NUMB 00A1H L2_INTR. . . . . . . . . . . . . NUMB 00A2H L2_RNG . . . . . . . . . . . . . NUMB 00A0H L3RINGSTATE. . . . . . . . . . . B ADDR 0009H L3_DTCT. . . . . . . . . . . . . NUMB 00B1H L3_INTR. . . . . . . . . . . . . NUMB 00B2H L3_RNG . . . . . . . . . . . . . NUMB 00B0H LC0. . . . . . . . . . . . . . . C ADDR 057CH NOT USED LC0_0. . . . . . . . . . . . . . C ADDR 057FH NOT USED LC0_0OK. . . . . . . . . . . . . C ADDR 058FH LC0_1. . . . . . . . . . . . . . C ADDR 0598H LC0_2. . . . . . . . . . . . . . C ADDR 05A9H LC1. . . . . . . . . . . . . . . C ADDR 05ACH LC10 . . . . . . . . . . . . . . C ADDR 06D3H LC1_0. . . . . . . . . . . . . . C ADDR 05AFH NOT USED LC1_1. . . . . . . . . . . . . . C ADDR 05BAH LC1_2. . . . . . . . . . . . . . C ADDR 05C9H LC2. . . . . . . . . . . . . . . C ADDR 05CCH LC2_0. . . . . . . . . . . . . . C ADDR 05CFH NOT USED LC2_1. . . . . . . . . . . . . . C ADDR 05DBH LC3. . . . . . . . . . . . . . . C ADDR 05DEH LC3_0. . . . . . . . . . . . . . C ADDR 05E1H NOT USED LC3_1. . . . . . . . . . . . . . C ADDR 05EFH LC3_2. . . . . . . . . . . . . . C ADDR 05FBH LC4. . . . . . . . . . . . . . . C ADDR 05FEH LC4_0. . . . . . . . . . . . . . C ADDR 0601H NOT USED LC4_1. . . . . . . . . . . . . . C ADDR 060DH LC4_2. . . . . . . . . . . . . . C ADDR 0660H LC5. . . . . . . . . . . . . . . C ADDR 0663H LC5_0. . . . . . . . . . . . . . C ADDR 0666H NOT USED LC5_1. . . . . . . . . . . . . . C ADDR 0672H LC6. . . . . . . . . . . . . . . C ADDR 0675H LC6_0. . . . . . . . . . . . . . C ADDR 0678H NOT USED LC6_1. . . . . . . . . . . . . . C ADDR 0684H LC7. . . . . . . . . . . . . . . C ADDR 0687H LC7_0. . . . . . . . . . . . . . C ADDR 068AH NOT USED LC7_1. . . . . . . . . . . . . . C ADDR 069AH LC8. . . . . . . . . . . . . . . C ADDR 069DH LC8_0. . . . . . . . . . . . . . C ADDR 06A0H NOT USED LC8_1. . . . . . . . . . . . . . C ADDR 06ACH LC9. . . . . . . . . . . . . . . C ADDR 06AFH LC9_0. . . . . . . . . . . . . . C ADDR 06B2H NOT USED LC9_1. . . . . . . . . . . . . . C ADDR 06C2H LC9_2. . . . . . . . . . . . . . C ADDR 06D0H LCDEFAULTSTATE . . . . . . . . . NUMB 0000H LCEND. . . . . . . . . . . . . . C ADDR 06DAH LCNO0. . . . . . . . . . . . . . C ADDR 0614H NOT USED LCNO1. . . . . . . . . . . . . . C ADDR 0622H LCNO2. . . . . . . . . . . . . . C ADDR 0630H LCNO3. . . . . . . . . . . . . . C ADDR 063EH LCNO4. . . . . . . . . . . . . . C ADDR 064CH LCNO5. . . . . . . . . . . . . . C ADDR 065DH LCSTATE0 . . . . . . . . . . . . D ADDR 0040H LCSTATE1 . . . . . . . . . . . . D ADDR 0041H LCSTATE2 . . . . . . . . . . . . D ADDR 0042H LCSTATE3 . . . . . . . . . . . . D ADDR 0043H LED0 . . . . . . . . . . . . . . NUMB 00B5H LED1 . . . . . . . . . . . . . . NUMB 00B6H LED2 . . . . . . . . . . . . . . NUMB 00B7H LICHK0 . . . . . . . . . . . . . C ADDR 0765H LICHK1 . . . . . . . . . . . . . C ADDR 0774H LICHK10. . . . . . . . . . . . . C ADDR 07E6H LICHK2 . . . . . . . . . . . . . C ADDR 077FH LICHK3 . . . . . . . . . . . . . C ADDR 078AH LICHK4 . . . . . . . . . . . . . C ADDR 0795H LICHK5 . . . . . . . . . . . . . C ADDR 07A0H LICHK6 . . . . . . . . . . . . . C ADDR 07AFH LICHK7 . . . . . . . . . . . . . C ADDR 07BAH LICHK8 . . . . . . . . . . . . . C ADDR 07C5H LICHK9 . . . . . . . . . . . . . C ADDR 07D0H LICHKDOK . . . . . . . . . . . . C ADDR 07DCH LIDEFAULTN . . . . . . . . . . . NUMB 0000H LIDEFAULTSTATE . . . . . . . . . NUMB 0000H LIEND. . . . . . . . . . . . . . C ADDR 074CH LIN0 . . . . . . . . . . . . . . D ADDR 003CH LIN1 . . . . . . . . . . . . . . D ADDR 003DH LIN2 . . . . . . . . . . . . . . D ADDR 003EH LIN3 . . . . . . . . . . . . . . D ADDR 003FH LINECONTROL. . . . . . . . . . . C ADDR 0572H LINEINTERFACE. . . . . . . . . . C ADDR 073FH LINEWANT0. . . . . . . . . . . . D ADDR 0044H LINEWANT1. . . . . . . . . . . . D ADDR 0045H LINEWANT2. . . . . . . . . . . . D ADDR 0046H LINEWANT3. . . . . . . . . . . . D ADDR 0047H LINEWANTDEFAULT. . . . . . . . . NUMB FFFFH LISTATE0 . . . . . . . . . . . . D ADDR 0038H LISTATE1 . . . . . . . . . . . . D ADDR 0039H LISTATE2 . . . . . . . . . . . . D ADDR 003AH LISTATE3 . . . . . . . . . . . . D ADDR 003BH LOOP . . . . . . . . . . . . . . C ADDR 003EH MAINWAVE . . . . . . . . . . . . B ADDR 0000H N. . . . . . . . . . . . . . . . REG0 NAR. . . . . . . . . . . . . . . NUMB 0000H NEXTLINE . . . . . . . . . . . . C ADDR 088CH NOT USED NEXTTRUNK. . . . . . . . . . . . C ADDR 0892H NOTONE . . . . . . . . . . . . . B ADDR 0001H P0 . . . . . . . . . . . . . . . D ADDR 0080H PREDEFINED P1 . . . . . . . . . . . . . . . D ADDR 0090H PREDEFINED P2 . . . . . . . . . . . . . . . D ADDR 00A0H PREDEFINED P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED PSW. . . . . . . . . . . . . . . D ADDR 00D0H PREDEFINED RCAP2H . . . . . . . . . . . . . D ADDR 00CBH PREDEFINED RCAP2L . . . . . . . . . . . . . D ADDR 00CAH PREDEFINED RINGBACKTONE . . . . . . . . . . B ADDR 0005H RINGWAVE . . . . . . . . . . . . NUMB 0005H SC0. . . . . . . . . . . . . . . C ADDR 02ADH NOT USED SC0ERROR . . . . . . . . . . . . C ADDR 02BBH SC0OK. . . . . . . . . . . . . . C ADDR 02BFH SC1. . . . . . . . . . . . . . . C ADDR 02C6H SC1CON . . . . . . . . . . . . . C ADDR 02E3H SC2. . . . . . . . . . . . . . . C ADDR 02E7H SC3. . . . . . . . . . . . . . . C ADDR 02F6H SC4. . . . . . . . . . . . . . . C ADDR 0304H SCEND. . . . . . . . . . . . . . C ADDR 0304H SCTONE0. . . . . . . . . . . . . C ADDR 092FH NOT USED SCTONE1. . . . . . . . . . . . . C ADDR 0939H SCTONE2. . . . . . . . . . . . . C ADDR 0943H SCTONE3. . . . . . . . . . . . . C ADDR 094DH SCTONEEND. . . . . . . . . . . . C ADDR 094FH SCTS0. . . . . . . . . . . . . . C ADDR 00FAH NOT USED SCTS1. . . . . . . . . . . . . . C ADDR 0103H SCTS2. . . . . . . . . . . . . . C ADDR 010CH SCTS3. . . . . . . . . . . . . . C ADDR 0115H SCTSEND. . . . . . . . . . . . . C ADDR 0115H SETCONVERSATIONTONE. . . . . . . C ADDR 092DH SETCONVERSATIONTONESTATE . . . . C ADDR 00F8H SETLINECONTROLDATA . . . . . . . C ADDR 054DH SETLINEINTERFACEDATA . . . . . . C ADDR 0712H SETLINEINTR. . . . . . . . . . . C ADDR 08F1H NOT USED SETLINERINGSTATE . . . . . . . . C ADDR 0138H SETLINERNG . . . . . . . . . . . C ADDR 08B8H SETLINEWANT. . . . . . . . . . . C ADDR 0330H SETSWITCH. . . . . . . . . . . . C ADDR 0186H SETTRUNKCNCT . . . . . . . . . . C ADDR 091EH SHOWONLEDS . . . . . . . . . . . C ADDR 00E2H NOT USED SLCD0. . . . . . . . . . . . . . C ADDR 054FH NOT USED SLCD1. . . . . . . . . . . . . . C ADDR 0557H SLCD2. . . . . . . . . . . . . . C ADDR 055FH SLCD3. . . . . . . . . . . . . . C ADDR 0567H SLCD4. . . . . . . . . . . . . . C ADDR 056FH SLCDEND. . . . . . . . . . . . . C ADDR 056FH SLID0. . . . . . . . . . . . . . C ADDR 0714H NOT USED SLID1. . . . . . . . . . . . . . C ADDR 071EH SLID2. . . . . . . . . . . . . . C ADDR 0728H SLID3. . . . . . . . . . . . . . C ADDR 0732H SLID4. . . . . . . . . . . . . . C ADDR 073CH SLIDEND. . . . . . . . . . . . . C ADDR 073CH SLINTR0. . . . . . . . . . . . . C ADDR 08F3H NOT USED SLINTR1. . . . . . . . . . . . . C ADDR 08FDH SLINTR2. . . . . . . . . . . . . C ADDR 0907H SLINTR3. . . . . . . . . . . . . C ADDR 0911H SLINTR4. . . . . . . . . . . . . C ADDR 091BH SLINTREND. . . . . . . . . . . . C ADDR 091DH SLRNG0 . . . . . . . . . . . . . C ADDR 08C4H NOT USED SLRNG1 . . . . . . . . . . . . . C ADDR 08CEH SLRNG2 . . . . . . . . . . . . . C ADDR 08D8H SLRNG3 . . . . . . . . . . . . . C ADDR 08E2H SLRNG4 . . . . . . . . . . . . . C ADDR 08ECH SLRNGEND . . . . . . . . . . . . C ADDR 08EEH SLRS0. . . . . . . . . . . . . . C ADDR 013AH NOT USED SLRS1. . . . . . . . . . . . . . C ADDR 0144H SLRS2. . . . . . . . . . . . . . C ADDR 014EH SLRS3. . . . . . . . . . . . . . C ADDR 0158H SLRS4. . . . . . . . . . . . . . C ADDR 0162H SLRSEND. . . . . . . . . . . . . C ADDR 0164H SLW0 . . . . . . . . . . . . . . C ADDR 0332H NOT USED SLW1 . . . . . . . . . . . . . . C ADDR 033AH SLW2 . . . . . . . . . . . . . . C ADDR 0342H SLW3 . . . . . . . . . . . . . . C ADDR 034AH SLW4 . . . . . . . . . . . . . . C ADDR 0352H SLWEND . . . . . . . . . . . . . C ADDR 0352H SP . . . . . . . . . . . . . . . D ADDR 0081H PREDEFINED SSCHK0 . . . . . . . . . . . . . C ADDR 0188H NOT USED SSCHK0_0 . . . . . . . . . . . . C ADDR 018BH NOT USED SSCHK0_1 . . . . . . . . . . . . C ADDR 0195H SSCHK0_2 . . . . . . . . . . . . C ADDR 019FH SSCHK0_3 . . . . . . . . . . . . C ADDR 01A9H SSCHK1 . . . . . . . . . . . . . C ADDR 01B3H SSCHK1_0 . . . . . . . . . . . . C ADDR 01B6H NOT USED SSCHK1_1 . . . . . . . . . . . . C ADDR 01C0H SSCHK1_2 . . . . . . . . . . . . C ADDR 01CAH SSCHK1_3 . . . . . . . . . . . . C ADDR 01D4H SSCHK2 . . . . . . . . . . . . . C ADDR 01DEH SSCHK2_0 . . . . . . . . . . . . C ADDR 01E1H NOT USED SSCHK2_1 . . . . . . . . . . . . C ADDR 01EBH SSCHK2_2 . . . . . . . . . . . . C ADDR 01F5H SSCHK2_3 . . . . . . . . . . . . C ADDR 01FFH SSEND. . . . . . . . . . . . . . C ADDR 0210H SSERROR. . . . . . . . . . . . . C ADDR 0209H START. . . . . . . . . . . . . . C ADDR 0038H STATE. . . . . . . . . . . . . . REG7 STATEAR. . . . . . . . . . . . . NUMB 0007H STBUSYTONE . . . . . . . . . . . NUMB 0003H STCNCT0. . . . . . . . . . . . . C ADDR 0920H NOT USED STCNCT1. . . . . . . . . . . . . C ADDR 092AH STCNCTEND. . . . . . . . . . . . C ADDR 092CH STDIALING. . . . . . . . . . . . NUMB 0008H STDIALTONE . . . . . . . . . . . NUMB 0001H STDOWN . . . . . . . . . . . . . NUMB 0000H STHIGH1. . . . . . . . . . . . . NUMB 0006H STHIGH2. . . . . . . . . . . . . NUMB 0007H STHIGH3. . . . . . . . . . . . . NUMB 0008H STHIGH4. . . . . . . . . . . . . NUMB 0009H STIDLE . . . . . . . . . . . . . NUMB 0000H STINVALIDTONE. . . . . . . . . . NUMB 0002H STLOW1 . . . . . . . . . . . . . NUMB 0002H STLOW2 . . . . . . . . . . . . . NUMB 0003H STLOW3 . . . . . . . . . . . . . NUMB 0004H STLOW4 . . . . . . . . . . . . . NUMB 0005H STRING . . . . . . . . . . . . . NUMB 0006H STRINGBACKTONE . . . . . . . . . NUMB 0004H STTALK . . . . . . . . . . . . . NUMB 0007H STTRUNK. . . . . . . . . . . . . NUMB 0005H STUP . . . . . . . . . . . . . . NUMB 0001H SWITCHCONTROL. . . . . . . . . . C ADDR 02A7H T. . . . . . . . . . . . . . . . REG3 T0_CNCT. . . . . . . . . . . . . NUMB 00B3H T0_RDTCT . . . . . . . . . . . . NUMB 00B4H T2CON. . . . . . . . . . . . . . D ADDR 00C8H PREDEFINED T2ISR. . . . . . . . . . . . . . C ADDR 002BH NOT USED TAR. . . . . . . . . . . . . . . NUMB 0003H NOT USED TC0. . . . . . . . . . . . . . . C ADDR 04A5H NOT USED TC0_0. . . . . . . . . . . . . . C ADDR 04A8H NOT USED TC0_1. . . . . . . . . . . . . . C ADDR 04BCH TC0_2. . . . . . . . . . . . . . C ADDR 04CCH TC1. . . . . . . . . . . . . . . C ADDR 04D1H TC1_0. . . . . . . . . . . . . . C ADDR 04D4H NOT USED TC1_1. . . . . . . . . . . . . . C ADDR 04E2H TC2. . . . . . . . . . . . . . . C ADDR 04E7H TC2_0. . . . . . . . . . . . . . C ADDR 04EAH NOT USED TC2_0CHK . . . . . . . . . . . . C ADDR 04F7H TC2_1. . . . . . . . . . . . . . C ADDR 0503H TC2_2. . . . . . . . . . . . . . C ADDR 0511H TC3. . . . . . . . . . . . . . . C ADDR 0516H TCDEFAULTSTATE . . . . . . . . . NUMB 0000H TCEND. . . . . . . . . . . . . . C ADDR 051FH TCSTATE. . . . . . . . . . . . . D ADDR 0049H TF2. . . . . . . . . . . . . . . B ADDR 00CFH PREDEFINED TNBUSY . . . . . . . . . . . . . NUMB 0002H TNDEFAULT. . . . . . . . . . . . NUMB 0000H TNDIAL . . . . . . . . . . . . . NUMB 0001H TNINVALID. . . . . . . . . . . . NUMB 0003H TNNO . . . . . . . . . . . . . . NUMB 0000H TNRINGBACK . . . . . . . . . . . NUMB 0004H TR2. . . . . . . . . . . . . . . B ADDR 00CAH PREDEFINED TRUNKCONTROL . . . . . . . . . . C ADDR 049BH TRUNKWANT. . . . . . . . . . . . D ADDR 0048H TRUNKWANTDEFAULT . . . . . . . . NUMB FFFFH WLOOP. . . . . . . . . . . . . . C ADDR 00D2H