LS-DOS 6.3.1 - COM Serial Port Driver Assembly Listing (HTML format version)

[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]

Valid HTML 4.01!