[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/19/99 21:14:54 COM/DVR - LS-DOS 6.2 Page 00001 00001 ;COM/ASM - RS232 Driver Program 00003 ; 000A 00004 LF EQU 10 000D 00005 CR EQU 13 00006 ; 0000 00007 *GET COPYCOM:3 ;Copyright message 00008 ; COPYCOM - File for Copyright COMment block 00009 ; 0000 00010 *GET BUILDVER/ASM:3 00011 ; 00012 ; Buildver/asm is a bit of a kludge since not all utilities can load 00013 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00014 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00015 ; for programs that can use that. 00016 ; FFFF 00017 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00018 ; These switches activate patches made since the 1B release. 00019 ; It is important that all earlier patches be enabled when a higher 00020 ; patch is enabled. 00021 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00022 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00023 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00024 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00025 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00026 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00027 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00028 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00029 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00030 ; 00031 ;End of BUILDVER/ASM 00032 IF @BLD631 00034 ELSE 00035 COM '<*(C) 1982,3,4,6 by LSI*>' 00036 ENDIF 0000 00037 *GET SVCMAC:3 ;SVC Macro equivalents 00038 ;SVCMAC/ASM - LS-DOS Version VI 00039 *LIST OFF 00431 *LIST ON 00433 ; 2400 00434 ORG 2400H 00435 ; 00436 BEGIN 2400 00437 @@CKBRKC 2400+3E6A 00438 LD A,106 2402+EF 00439 RST 40 2403 2804 00440 JR Z,BEGINA ;Continue if no BREAK 2405 21FFFF 00441 LD HL,-1 2408 C9 00442 RET ;Return with abort code 00443 ; 2409 D5 00444 BEGINA PUSH DE ;Save DCB address 240A DDE1 00445 POP IX ; in index reg 240C ED539626 00446 LD (CLDCB),DE ; and in driver header 2410 00447 @@DSPLY HELLO$ ;Welcome the user 00448 IFEQ 01H,1 2410+217225 00449 LD HL,HELLO$ 00450 ENDIF 2413+3E0A 00451 LD A,10 2415+EF 00452 RST 40 00453 ; 00454 ; Check if entry from SET command 00455 ; 2416 00456 @@FLAGS ;IY => flag table base 2416+3E65 00457 LD A,101 2418+EF 00458 RST 40 2419 FDCB025E 00459 BIT 3,(IY+'C'-'A') ;System request? 241D CA4A25 00460 JP Z,VIASET ;"Install with Set 00461 ; 00462 ; Grab system dependent vectors 00463 ; 2420 FDE5 00464 PUSH IY ;Set DE to flag base 2422 D1 00465 POP DE 2423 210A00 00466 LD HL,'K'-'A' ;KFLAG$ 2426 19 00467 ADD HL,DE 2427 223D27 00468 LD (KFLAG),HL ;Save keyboard flag locn 242A 211200 00469 LD HL,'S'-'A' ;SFLAG$ 242D 19 00470 ADD HL,DE 242E 225F27 00471 LD (SFLAG),HL ;Save system flag location 2431 211600 00472 LD HL,'W'-'A' ;WRINT$ 2434 19 00473 ADD HL,DE 00474 IF @BLD631 2435 222025 00475 LD (L2520),HL ;<631>Save int mask 00476 ENDIF 2438 22A126 00477 LD (WRINT),HL ;Save int mask 243B 21DEFF 00478 LD HL,10-44 ;INTVC$+10 243E 19 00479 ADD HL,DE ;Save for receive int 243F 221D25 00480 LD (INTVC),HL ; vector 00481 ; 00482 ; Move @ICNFG vector into driver 00483 ; 2442 FD7E1C 00484 LD A,(IY+28) ;Get current opcode 2445 32A826 00485 LD (LINK),A ;Save in driver 2448 FD6E1D 00486 LD L,(IY+29) ;Get current address 244B FD661E 00487 LD H,(IY+30) ;Put in driver code 244E 22A926 00488 LD (LINK+1),HL 00489 ; 00490 ; Check if driver alread resident 00491 ; 2451 116E25 00492 LD DE,CL$ ;Check if driver is 2454 00493 @@GTMOD ; already resident 2454+3E53 00494 LD A,83 2456+EF 00495 RST 40 2457 EB 00496 EX DE,HL ;Put DCB ptr to HL 2458 201A 00497 JR NZ,NOTRES ;Go if not 00498 ; 00499 ; Make sure that the new DCB is same as the old 00500 ; 245A 4E 00501 LD C,(HL) ;P/u DCB pointer LSB 245B 23 00502 INC HL 245C 46 00503 LD B,(HL) ;P/u DCB pointer MSB 245D 210600 00504 LD HL,6 ;Get old DCB name & 2460 09 00505 ADD HL,BC ; stuff into error 2461 7E 00506 LD A,(HL) ; message in case 2462 2C 00507 INC L ; a different DCB 2463 66 00508 LD H,(HL) ; is referenced 2464 6F 00509 LD L,A 2465 223426 00510 LD (DCBNAM$),HL ;Stuff message with spec 2468 2A9626 00511 LD HL,(CLDCB) ;P/u DCB existing DCB 246B B7 00512 OR A ; pointer 246C ED42 00513 SBC HL,BC ;Same DCB pointer? 246E C24E25 00514 JP NZ,DCBERR ;Can't install if diff 2471 C32B25 00515 JP ISRES 2474 114B49 00516 NOTRES LD DE,'IK' 2477 00517 @@GTDCB ;Locate low memory ptr 2477+3E52 00518 LD A,82 2479+EF 00519 RST 40 247A C25F25 00520 JP NZ,IOERR ;Go if not found 247D 2D 00521 DEC L 247E 56 00522 LD D,(HL) ;P/u pointer to 247F 2D 00523 DEC L ; start of free 2480 5E 00524 LD E,(HL) ; low core 2481 22FD24 00525 LD (LCPTR+1),HL ;Save ptr for later 2484 21E400 00526 LD HL,CLEND-CLDVR-1 2487 19 00527 ADD HL,DE ;Start + driver length 2488 22C724 00528 LD (SVEND+1),HL 248B 010013 00529 LD BC,1300H ;Max addr + 1 248E AF 00530 XOR A 248F ED42 00531 SBC HL,BC ;See if room low 2491 382D 00532 JR C,PUTLOW ; and install there if so 00533 ; 00534 ; Check if high memory available 00535 ; 2493 FDCB0246 00536 BIT 0,(IY+'C'-'A') ;Memory frozen? 2497 C25225 00537 JP NZ,NOROOM ;Can't install if so 249A 210000 00538 LD HL,0 249D 45 00539 LD B,L ;Get HIGH$ 249E 00540 @@HIGH$ 249E+3E64 00541 LD A,100 24A0+EF 00542 RST 40 24A1 22C724 00543 LD (SVEND+1),HL ;Top of driver 24A4 B7 00544 OR A 24A5 01E500 00545 LD BC,CLEND-CLDVR ; minus length 24A8 ED42 00546 SBC HL,BC 24AA 0600 00547 LD B,0 24AC E5 00548 PUSH HL 24AD 00549 @@HIGH$ ; is new HIGH$ 24AD+3E64 00550 LD A,100 24AF+EF 00551 RST 40 24B0 E1 00552 POP HL 24B1 23 00553 INC HL ;Plus one is start 24B2 226C25 00554 LD (HCPTR),HL ;Save it 24B5 216C25 00555 LD HL,HCPTR ; and point to it 24B8 22FD24 00556 LD (LCPTR+1),HL 24BB 3EFF 00557 LD A,0FFH ;Flag himem used 24BD 323C25 00558 LD (HGHFLG),A 00559 ; 00560 ; Relocate internal references in driver 00561 ; 24C0 DDE5 00562 PUTLOW PUSH IX 24C2 DD217327 00563 LD IX,RELTAB ;Point to relocation tbl 24C6 210000 00564 SVEND LD HL,$-$ ;Find distance to move 24C9 229026 00565 LD (CLDVR+2),HL ;Set last byte used 24CC 117227 00566 LD DE,CLEND-1 24CF B7 00567 OR A ;Clear carry flag 24D0 ED52 00568 SBC HL,DE 24D2 44 00569 LD B,H ;Move to BC 24D3 4D 00570 LD C,L 24D4 3E0E 00571 LD A,TABLEN ;Get table length 24D6 DD6E00 00572 RLOOP LD L,(IX) ;Get address to change 24D9 DD6601 00573 LD H,(IX+1) 24DC 5E 00574 LD E,(HL) ;P/U address 24DD 23 00575 INC HL 24DE 56 00576 LD D,(HL) 24DF EB 00577 EX DE,HL ;Offset it 24E0 09 00578 ADD HL,BC 24E1 EB 00579 EX DE,HL 24E2 72 00580 LD (HL),D ;Put it back 24E3 2B 00581 DEC HL 24E4 73 00582 LD (HL),E 24E5 DD23 00583 INC IX 24E7 DD23 00584 INC IX 24E9 3D 00585 DEC A 24EA 20EA 00586 JR NZ,RLOOP ;Loop till done 24EC DDE1 00587 POP IX ;Restore DCB 00588 ; 00589 ; Set up @ICNFG 00590 ; 24EE 21A026 00591 LD HL,INIT ;Get (relocated) 24EF 00592 RX01 EQU $-2 24F1 FD751D 00593 LD (IY+29),L ; init address & put 24F4 FD741E 00594 LD (IY+30),H ; into system ICNFG area 24F7 3EC3 00595 LD A,0C3H ;Get JP instruction 24F9 FD771C 00596 LD (IY+28),A ;Turn on ICNFG 00597 ; 00598 ; Move driver 00599 ; 24FC 210000 00600 LCPTR LD HL,$-$ ;Low core or himem pointer 24FF 5E 00601 LD E,(HL) 2500 2C 00602 INC L 2501 56 00603 LD D,(HL) 2502 D5 00604 PUSH DE ;Save start 2503 218E26 00605 LD HL,CLDVR 2506 01E500 00606 LD BC,CLEND-CLDVR ;Calc driver length 2509 EDB0 00607 LDIR ;Move into place 250B 2AFD24 00608 LD HL,(LCPTR+1) ;If driver went low, 250E 73 00609 LD (HL),E ; need to update new 250F 2C 00610 INC L ; driver zone pointer 2510 72 00611 LD (HL),D 00612 ; 00613 ; Initialize the driver 00614 ; 2511 21A826 00615 LD HL,LINK ;Pt to ICFG link 2512 00616 RX20 EQU $-2 2514 5E 00617 LD E,(HL) ;Save what's there 2515 36C9 00618 LD (HL),0C9H ;Make a ret. 2517 E5 00619 PUSH HL 2518 F3 00620 DI 00621 IF @BLD631 251A 00622 RX02: EQU $+1 ;<631> 2519 212527 00623 LD HL,RECVINT ;<631> 251D 00624 INTVC: EQU $+1 ;<631> 251C 220000 00625 LD (0000H),HL ;<631> 2520 00626 L2520: EQU $+1 ;<631> 251F 210000 00627 LD HL,0000H ;<631>Get interrupt mask 2522 CBEE 00628 SET 5,(HL) ;<631> 00629 ENDIF 2524 CDA026 00630 CALL INIT ;Init the UART 2525 00631 RX11 EQU $-2 2527 FB 00632 EI 2528 E1 00633 POP HL 2529 73 00634 LD (HL),E ;Restore icnfg chain 00635 ; 252A D1 00636 POP DE ;Pop filter start 00637 ; 252B 213726 00638 ISRES LD HL,CLACT$ ;Advise COM/DVR installed 252E DD360007 00639 LD (IX),7 ;Init DCB type to "C/P/G" 2532 DD7301 00640 LD (IX+1),E ; & stuff the driver 2535 DD7202 00641 LD (IX+2),D ; address 2538 00642 @@LOGOT 00643 IFEQ 00H,1 00644 LD HL, 00645 ENDIF 2538+3E0C 00646 LD A,12 253A+EF 00647 RST 40 253B 3E00 00648 LD A,$-$ ;Did it use high memory? 253C 00649 HGHFLG EQU $-1 253D B7 00650 OR A ;NZ if high 253E 2806 00651 JR Z,NTHGH 2540 216726 00652 LD HL,HMEM$ ;"Driver in himem... 2543 00653 @@LOGOT 00654 IFEQ 00H,1 00655 LD HL, 00656 ENDIF 2543+3E0C 00657 LD A,12 2545+EF 00658 RST 40 2546 210000 00659 NTHGH LD HL,0 ;Init on error code 2549 C9 00660 RET ; and exit 00661 ; 00662 ; Error exits 00663 ; 254A 215226 00664 VIASET LD HL,VIASET$ ;"Install with Set 254D DD 00665 DB 0DDH 254E 211826 00666 DCBERR LD HL,DCBERR$ ;"Driver being used already 2551 DD 00667 DB 0DDH 2552 21FE25 00668 NOROOM LD HL,NOROOM$ ;"Memory frozen 2555 00669 @@LOGOT 00670 IFEQ 00H,1 00671 LD HL, 00672 ENDIF 2555+3E0C 00673 LD A,12 2557+EF 00674 RST 40 2558 21FFFF 00675 LD HL,-1 ;Set abort code 255B 00676 @@CKBRKC ;Clear any break 255B+3E6A 00677 LD A,106 255D+EF 00678 RST 40 255E C9 00679 RET 00680 ; 255F 6F 00681 IOERR LD L,A ;Error code to HL 2560 2600 00682 LD H,0 2562 F6C0 00683 OR 0C0H ;Set short,return 2564 4F 00684 LD C,A ;Error to C 2565 00685 @@ERROR ; for error dsply 2565+3E1A 00686 LD A,26 2567+EF 00687 RST 40 2568 00688 @@CKBRKC ;Clear any break 2568+3E6A 00689 LD A,106 256A+EF 00690 RST 40 256B C9 00691 RET 00692 ; 00693 ; Messages & Data tables 00694 ; 256C 0000 00695 HCPTR DW 0 ;Save start if going to HIGH$ 256E 24 00696 CL$ DB '$CL',3 43 4C 03 2572 52 00697 HELLO$ DB 'RS-232 Driver' 53 2D 32 33 32 20 44 72 69 76 65 72 00698 ; 257F 00699 *GET CLIENT:3 00700 ;CLIENT/ASM - File to establish sign-on headers 00701 ; and version numbers. 00702 ; 00703 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 00704 ; 00705 IF @BLD631 00706 ; 12345678901234567890123456789012345678901234567890 257F 20 00707 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 25B1 49 00708 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 00709 ELSE 00710 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 00711 DB 'ems, Inc. ',10 00712 ENDIF 00713 ; 00714 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 00715 ; DB 'Corporation.',10,13 00716 ; 00717 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 00718 ; DB 'STRIBUTE !! ',10,13 00719 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 00720 ; DB 'ukee, Wisc. ',10,13 25BE 41 00721 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 25F0 72 00722 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 00723 ; 25FE 4E 00724 NOROOM$ DB 'No memory space available',CR 6F 20 6D 65 6D 6F 72 79 20 73 70 61 63 65 20 61 76 61 69 6C 61 62 6C 65 0D 2618 44 00725 DCBERR$ DB 'Driver already attached to *xx',CR 72 69 76 65 72 20 61 6C 72 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6F 20 2A 78 78 0D 2634 00726 DCBNAM$ EQU $-3 2637 43 00727 CLACT$ DB 'COM driver is now resident',CR 4F 4D 20 64 72 69 76 65 72 20 69 73 20 6E 6F 77 20 72 65 73 69 64 65 6E 74 0D 2652 4D 00728 VIASET$ DB 'Must install via SET',CR 75 73 74 20 69 6E 73 74 61 6C 6C 20 76 69 61 20 53 45 54 0D 2667 0A 00729 HMEM$ DB LF,'Note: driver installed in high memory',CR 4E 6F 74 65 3A 20 64 72 69 76 65 72 20 69 6E 73 74 61 6C 6C 65 64 20 69 6E 20 68 69 67 68 20 6D 65 6D 6F 72 79 0D 00730 ; 00E0 00731 @WRINT EQU 0E0H 0080 00732 WRINT$ EQU 80H 00733 ; 00E8 00734 MASRES EQU 0E8H ;RS232 ports 00E8 00735 MODSTAT EQU 0E8H 00E9 00736 BAUDSET EQU 0E9H 00EA 00737 UARTCTL EQU 0EAH 00EA 00738 UARTST EQU 0EAH 00EB 00739 DATAREG EQU 0EBH 00740 ; 00741 ; Actual driver 00742 ; 268E 00743 CLDVR EQU $ 268E 1828 00744 JR CLBGN ;Branch around linkage 2690 7327 00745 DW CLEND ;Last byte used 2692 03 00746 DB 3,'$CL' 24 43 4C 2696 0000 00747 CLDCB DW $-$ 2698 0000 00748 DW 0 269A 00749 CLDATA$ EQU $ 0000 00750 MSMASK EQU $-CLDATA$ 269A 00 00751 DB 0 00752 ; 00753 ; UART control port image 00754 ; 00755 ; bit 7: 1 = even parity, 0 = odd parity 00756 ; bits 6,5: word length <00=5, 10=6, 01=7, 11=8> 00757 ; bit 4: 1 = 2 stop bits, 0 = 1 stop bit 00758 ; bit 3: 1 = disable parity, 0 = enable parity 00759 ; bit 2: 1 = enable transmit data, 0 = break 00760 ; bit 1: 0 = Data Terminal Ready 00761 ; bit 0: 0 = Request to Send 00762 ; 0001 00763 UCIMAGE EQU $-CLDATA$ 269B A5 00764 DB 0A5H 269C 55 00765 BAUDRT DB 55H ;Init 300 baud 0003 00766 LOGBRK EQU $-CLDATA$ 269D 03 00767 DB 3 ;Default is Control-C 0004 00768 CLFLG EQU $-CLDATA$ 269E 00 00769 DB 0 ;Init no char in buf 0005 00770 CLBUF EQU $-CLDATA$ 269F 00 00771 DB 0 ;One-char buffer 00772 ; 00773 ; CL initialization routine. Set up DR interrupt 00774 ; vector & initialize the hardware 00775 ; 00776 IF @BLD631 26A1 00777 WRINT: EQU $+1 ;<631> 26A0 3A0000 00778 INIT LD A,(0000H) ;<631>Interrupt enable mask 00779 ELSE 00780 INIT LD HL,RECVINT ;Vector address 00781 RX02 EQU $-2 00782 LD ($-$),HL ;INTVC$+10 00783 INTVC EQU $-2 00784 LD HL,WRINT$ ;Interrupt enable mask 00785 WRINT EQU $-2 00786 SET 5,(HL) ;Enable RS232 DR 00787 LD A,(HL) 00788 ENDIF 26A3 D3E0 00789 OUT (@WRINT),A 26A5 CDAB26 00790 CALL CTL2 ;Init the hardware 26A6 00791 RX03 EQU $-2 26A8 C9 00792 LINK RET ;Link back thru any 26A9 00 00793 DB 0,0 ; existing ICNFG 00 00794 ; 00795 ; Initialize the UART & BRG 00796 ; 26AB ED4B9B26 00797 CTL2 LD BC,(CLDATA$+UCIMAGE) ;P/u values from DCB 26AD 00798 RX04 EQU $-2 26AF D3E8 00799 OUT (MASRES),A ;Reprime UART 26B1 79 00800 LD A,C 26B2 D3EA 00801 OUT (UARTCTL),A 26B4 78 00802 LD A,B 26B5 D3E9 00803 OUT (BAUDSET),A 26B7 C9 00804 RET 00805 ; 26B8 DD219A26 00806 CLBGN LD IX,CLDATA$ ;Point to data area 26BA 00807 RX05 EQU $-2 26BC 3854 00808 JR C,RECV ;Go if @GET request 26BE 2840 00809 JR Z,SEND ;Go if @PUT request 26C0 79 00810 LD A,C ;P/U @CTL byte 26C1 B7 00811 OR A ;@CTL 00 ? 26C2 2825 00812 JR Z,CANISND ;Go if so 26C4 3D 00813 DEC A ;@CTL 01 ? 26C5 2856 00814 JR Z,CTL1 ;Go if so 26C7 3D 00815 DEC A ;Was it CTL-2 "INIT UART" 26C8 28E1 00816 JR Z,CTL2 ;Go if so 26CA FE02 00817 CP 4-2 ;Wakeup feature? 26CC 2802 00818 JR Z,CTL4 ;Go if wakeup feature 26CE AF 00819 XOR A 26CF C9 00820 RET 00821 ; 26D0 FDE5 00822 CTL4 PUSH IY ;Transfer pointer to HL 00823 IF @BLD631 26D2 D1 00824 POP DE ;<631> 26D3 7A 00825 LD A,D ;<631>Test if set or reset 26D4 B3 00826 OR E ;<631> 26D5 3EC9 00827 LD A,0C9H ;<631>Init disable wakeup 26D8 00828 RX06: EQU $+1 ;<631> 26D7 2A2E27 00829 LD HL,(WAKEADR+1) ;<631>P/u old address 00830 ELSE 00831 POP HL 00832 LD A,H ;Test if set or reset 00833 OR L 00834 LD A,0C9H ;Init disable wakeup 00835 EX DE,HL ;Switch new value to DE 00836 LD HL,(WAKEADR+1) ; & p/u old in HL 00837 RX06 EQU $-2 00838 ENDIF 26DA 2802 00839 JR Z,SETWAK ;Jump if disable 26DC 3EC3 00840 LD A,0C3H ;Make enable 26DE 322D27 00841 SETWAK LD (WAKEADR),A ;Load the opcode 26DF 00842 RX07 EQU $-2 26E1 ED532E27 00843 LD (WAKEADR+1),DE ;Then the address 26E3 00844 RX08 EQU $-2 26E5 E5 00845 PUSH HL ;Transfer pointer to IY 26E6 FDE1 00846 POP IY 26E8 C9 00847 RET 00848 ; 00849 ; Check if ready to send 00850 ; 26E9 DBEA 00851 CANISND IN A,(UARTST) ;Look at TX empty bit 26EB 2F 00852 CPL ;Flip it 26EC E640 00853 AND 40H ;Mask out all else 26EE DBE8 00854 IN A,(MODSTAT) ;P/U modem status reg 26F0 C0 00855 RET NZ ;Return if can't send 26F1 47 00856 LD B,A ;Save modem status reg 26F2 DDAE00 00857 XOR (IX+MSMASK) ;Mask for which to flip 26F5 1F 00858 RRA ;Move into bits 0-3 26F6 1F 00859 RRA 26F7 1F 00860 RRA 26F8 1F 00861 RRA 26F9 DDA600 00862 AND (IX+MSMASK) ;Mask for which to check 26FC E60F 00863 AND 0FH ;Mask off garbage 26FE 78 00864 LD A,B ;Get back reg 26FF C9 00865 RET ;Ret with Z or NZ 00866 ; 00867 ; Send character 00868 ; 2700 DD7E01 00869 SEND LD A,(IX+UCIMAGE) ;Get UART ctrl reg 2703 D3EA 00870 OUT (UARTCTL),A ;Put it (clears BREAK) 2705 CDE926 00871 SWAIT CALL CANISND ;Poll 2706 00872 RX09 EQU $-2 2708 20FB 00873 JR NZ,SWAIT ; until ready 270A 79 00874 LD A,C ;Get byte to send 270B D3EB 00875 OUT (DATAREG),A ;Send it with Z-flag 270D C9 00876 RET ; unchanged for return 00877 ; 00878 ; Receive character - Get from buffer if available 00879 ; 270E CD3027 00880 RECV1 CALL CKINP ;Ck if avail from port 270F 00881 RX10 EQU $-2 2711 C0 00882 RET NZ ;Back if none 2712 DDCB0426 00883 RECV SLA (IX+CLFLG) ;Ck if avail from buf 2716 30F6 00884 JR NC,RECV1 ;Go if none avail 2718 DD7E05 00885 LD A,(IX+CLBUF) ;Get the char 271B BF 00886 CP A ;Set Z-flag & exit 271C C9 00887 RET 00888 ; 00889 ; Break request 00890 ; 271D DD7E01 00891 CTL1 LD A,(IX+UCIMAGE) ;Pick up UART ctl image 2720 CB97 00892 RES 2,A ;Show BREAK bit 2722 D3EA 00893 OUT (UARTCTL),A 2724 C9 00894 RET ;With Z-flag 00895 ; 00896 ; Data received interrupt handler 00897 ; 2725 DD219A26 00898 RECVINT LD IX,CLDATA$ ;Base of data area 2727 00899 RX13 EQU $-2 2729 CD3027 00900 CALL CKINP ;See if available from port 272A 00901 RX12 EQU $-2 272C 78 00902 LD A,B 272D C9 00903 WAKEADR RET ;Wakeup if enabled 272E 0000 00904 DW 0 ;Space for address 00905 ; 00906 ; Routine to check on a received character 00907 ; 2730 DBEA 00908 CKINP IN A,(UARTST) ;Check if actually RX 2732 47 00909 LD B,A ;Save status 00910 IF @BLD631 2733 2F 00911 CPL ;<631>Invert bit 7 2734 E680 00912 AND 80H ;<631>Set NZ if none avail 00913 ELSE 00914 AND 80H ;Mask Data Received bit 00915 XOR 80H ;Set NZ if none avail 00916 ENDIF 2736 3E00 00917 LD A,0 ;Set "No error" 2738 C0 00918 RET NZ ;Return if none 2739 DBEB 00919 IN A,(DATAREG) ;Pick up character 273B 4F 00920 LD C,A ;Save tempy in reg-C 00921 ; 00922 ; Break, Pause & Enter handler routine 00923 ; 273C 210000 00924 LD HL,$-$ ;KFLAG$ 273D 00925 KFLAG EQU $-2 273F FE0D 00926 CP CR ;ENTER char received? 2741 2004 00927 JR NZ,PAWSCK ;Go if not 2743 CBD6 00928 SET 2,(HL) ;Set ENTER bit 2745 1823 00929 JR RECVEX 00930 ; 2747 FE60 00931 PAWSCK CP 60H ;Pause char received? 2749 2004 00932 JR NZ,BRKCHK ;Go if not 274B CBCE 00933 SET 1,(HL) ;Set pause bit 274D 181B 00934 JR RECVEX 00935 ; 274F DD7E03 00936 BRKCHK LD A,(IX+LOGBRK) ;Break char received? 2752 B7 00937 OR A ;Check if LOGBRK=0 2753 2815 00938 JR Z,RECVEX ;No valid break if =0 2755 B9 00939 CP C ;Check if a valid BREAK 2756 2806 00940 JR Z,BRKRECD ;Go if so 2758 DBEA 00941 IN A,(UARTST) ;Check for framing error 00942 IF @BLD631 275A E610 00943 AND 10H ;<631> 00944 ELSE 00945 BIT 4,A 00946 ENDIF 275C 280C 00947 JR Z,RECVEX ;Quit if none 00948 ; 00949 ; A BREAK was received, ck system's BREAK disable 00950 ; 275E 3A0000 00951 BRKRECD LD A,($-$) ;Check if break key 275F 00952 SFLAG EQU $-2 2761 E610 00953 AND 10H ; is disabled 2763 3E00 00954 LD A,0 ;Return NZ & A=0 if 2765 C0 00955 RET NZ ; the BREAK is disabled 2766 CBC6 00956 SET 0,(HL) ;Else set break bit 2768 0E80 00957 LD C,80H ; & reset BREAK code 276A DD7105 00958 RECVEX LD (IX+CLBUF),C ;Put char into 1-char buf 276D DD360480 00959 LD (IX+CLFLG),80H ; & set char available 2771 AF 00960 XOR A ;Set Z flag 2772 C9 00961 RET 2773 00962 CLEND EQU $ 00963 ; 00964 IF @BLD631 2773 EF24 00965 RELTAB DW RX01,RX02,RX03,RX04,RX05,RX06,RX07,RX08 ;<631> 1A25 A626 AD26 BA26 D826 DF26 E326 00966 ELSE 00967 RELTAB DW RX01,RX02,RX03,RX04,RX05,RX06,RX07,RX08 00968 ENDIF 2783 0627 00969 DW RX09,RX10,RX11,RX12,RX13,RX20 0F27 2525 2A27 2727 1225 000E 00970 TABLEN EQU $-RELTAB/2 00971 ; 2400 00972 END BEGIN 2400 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]