home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG019.ARK / LINK73.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  17KB  |  534 lines

  1.  
  2. ;         LINK - SUPPORT COMMUNICATIONS LINK WITH CYBER 
  3. ;         L.E. HUGHES     EDCAM     JULY, 1977
  4.   
  5. ;         BDOS ENTRY POINT AND FUNCTION CODES 
  6.   
  7.  BDOS     EQU    0005H
  8.  OFFC     EQU    15             ;OPEN FILE
  9.  CFFC     EQU    16             ;CLOSE FILE 
  10.  DFFC     EQU    19             ;DELETE FILE
  11.  RRFC     EQU    20             ;READ RECORD
  12.  WRFC     EQU    21             ;WRITE RECORD 
  13.  MFFC     EQU    22             ;MAKE FILE
  14.   
  15. ;         DEFAULT FCB AND FIELD DEFINITIONS 
  16.   
  17.  FCB      EQU    5CH
  18.  FN       EQU    1              ;FILE NAME FIELD (REL)
  19.  FT       EQU    9              ;FILE TYPE FIELD (REL)
  20.  NR       EQU    32             ;NEXT RECORD FIELD (REL)
  21.  DBUF     EQU    80H            ;DEFAULT DISK BUFFER ADDRESS
  22.   
  23. ;         ASCII CONTROL CHARACTERS
  24.   
  25.  LF       EQU    012Q           ;LINE FEED
  26.  CR       EQU    015Q           ;CARRIAGE RETURN
  27.  DEL      EQU    177Q           ;DELETE 
  28.   
  29. ;         I/O PORT ADDRESSES
  30.   
  31.  COND     EQU    012H           ;CONSOLE DATA PORT
  32.  CONS     EQU    013H           ;CONSOLE STATUS PORT
  33.  MODD     EQU    014H           ;MODEM DATA PORT
  34.  MODS     EQU    015H           ;MODEM STATUS PORT
  35.  CONT     EQU    018H           ;SIO CONTROL PORT FOR MODEM
  36.   
  37. ;         STATUS PORT BIT DEFINITIONS 
  38.   
  39.  TBE      EQU    001Q           ;TRANSMIT BUFFER READY FOR ANOTHER BYTE 
  40.  RDA      EQU    002Q           ;READ DATA AVAILABLE
  41.  
  42. ;         MAIN PROGRAM
  43.   
  44.           ORG    100H 
  45.  LINK:    LXI    H,0            ;SAVE OLD STACK POINTER 
  46.           DAD    SP 
  47.           SHLD   OLDSP
  48.           LXI    SP,STACK+64    ;CREATE LOCAL STACK 
  49.  LINKM:   IN     CONT           ;CHECK CTS TO SEE IF NEED INTERNAL RESET
  50.           ANI    080H           ;CTS INVERTED AT THIS PORT
  51.           JZ     LINKC          ;DONOT NEED RESET
  52.  
  53.           LXI    H,APPS         ;INITIALIZE PORTS 
  54.           MVI    B,5
  55.  LINK1:   MOV    A,M
  56.           INX    H
  57.           OUT    MODS 
  58.           DCR    B
  59.           JNZ    LINK1
  60.           IN     MODD 
  61.           IN     MODD 
  62.           MVI    A,047Q         ;SEND MODEM RTS AND DTR 
  63.           OUT    MODS           ;  AND ENABLE RECEIVER AND TRANSMITTER
  64.  LINKC:   LXI    H,APPS         ;INITIALIZE PORTS 
  65.           MVI    B,5
  66.  LINKD:   MOV    A,M
  67.           INX    H
  68.           OUT    CONS 
  69.           DCR    B
  70.           JNZ    LINKD
  71.           IN     COND           ;CLEAR USART READ BUFFERS 
  72.           IN     COND 
  73.           MVI    A,047Q         ;SEND CONSOLE CTS AND DSR,
  74.           OUT    CONS           ;  AND ENABLE RECEIVER AND TRANSMITTER
  75.  LINK2:   XRA    A              ;CLEAR CHAR BUFFERS 
  76.           STA    INCH 
  77.           STA    OUTCH
  78.           STA    FLAG           ;CLEAR TEXT SAVE FLAG 
  79.           LXI    H,TBUF         ;SET PTR TO TBUF
  80.           SHLD   PTR
  81.           LXI    H,0            ;SIZE = 0 
  82.           SHLD   SIZE 
  83.           CALL   WCCR           ;WRITE CR/LF TO CONSOLE 
  84.           MVI    A,7            ;RING BELL ON CONSOLE, TO LET 
  85.           CALL   WCC            ;  CLONE KNOW WE'RE READY 
  86.   
  87. ;         MAIN LOOP 
  88.   
  89.  LINK3:   IN     CONS           ;JUMP IF NO DATA FROM CONSOLE 
  90.           ANI    RDA
  91.           JZ     LINK4
  92.           IN     COND           ;ELSE READ CONSOLE DATA 
  93.           ANI    177Q           ;CALL PCC IF CONTROL CHAR 
  94.           CPI    40Q
  95.           CC     PCC
  96.           JC     LINK4          ;JUMP IF PCC HANDLED CHAR 
  97.           ORI    200Q           ;ELSE SET VALID DATA BIT
  98.           STA    INCH           ;AND STORE IN INPUT CHAR BUFFER 
  99.  LINK4:   IN     CONS           ;JUMP IF CONSOLE XMIT BUFFER BUSY 
  100.           ANI    TBE
  101.           JZ     LINK5
  102.           LDA    OUTCH          ;JUMP IF NO DATA FOR CONSOLE
  103.           ORA    A
  104.           JP     LINK5
  105.           ANI    177Q           ;ELSE DISCARD VALID DATA BIT
  106.           OUT    COND           ;  AND OUTPUT CHAR TO CONSOLE 
  107.           XRA    A              ;  THEN CLEAR OUTPUT CHAR BUFFER
  108.           STA    OUTCH
  109.  LINK5:   IN     MODS           ;JUMP IF NO DATA FROM MODEM 
  110.           ANI    RDA
  111.           JZ     LINK6
  112.           IN     MODD           ;ELSE READ MODEM DATA 
  113.           ANI    177Q           ;DISCARD PARITY BIT 
  114.           CALL   SAVE           ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
  115.           ORI    200Q           ;SET DATA VALID BIT 
  116.           STA    OUTCH          ;STORE IN OUTPUT CHAR BUFFER
  117.  LINK6:   IN     MODS           ;JUMP IF MODEM XMIT BUFFER BUSY 
  118.           ANI    TBE
  119.           JZ     LINK7
  120.           LDA    INCH           ;JUMP IF NO DATA FOR MODEM
  121.           ORA    A
  122.           JP     LINK7
  123.           ANI    177Q           ;ELSE DISCARD VALID DATA BIT
  124.           OUT    MODD           ;  AND OUTPUT CHAR TO MODEM 
  125.           XRA    A              ;  THEN CLEAR INPUT CHAR BUFFER 
  126.           STA    INCH 
  127.  LINK7:   JMP    LINK3          ;END OF MAIN LOOP 
  128.   
  129. ;         PCC - PROCESS CONTROL CHARACTER 
  130.   
  131.  PCC:     CPI    'X'-100Q       ;JUMP IF NOT CONTROL-X
  132.           JNZ    PCC1 
  133.           LHLD   OLDSP          ;ELSE CLEAN UP ACT AND GO HOME
  134.           SPHL
  135.           RET 
  136.  PCC1:    CPI    'S'-100Q       ;JUMP IF NOT CONTROL-S
  137.           JNZ    PCC2 
  138.           CALL   STF            ;SEND TEXT FILE TO MODEM
  139.           STC                   ;TELL LINK TO IGNORE THIS CHARACTER 
  140.           RET 
  141.  PCC2:    CPI    'R'-100Q       ;JUMP IF NOT CONTROL-R
  142.           JNZ    PCC3 
  143.           MVI    A,1            ;TURN ON TEXT SAVE FLAG 
  144.           STA    FLAG 
  145.           STC 
  146.           RET 
  147.  PCC3:    CPI    'Q'-100Q       ;JUMP IF NOT CONTROL-Q
  148.           JNZ    PCC4 
  149.           XRA    A              ;TURN OFF TEXT SAVE FLAG
  150.           STA    FLAG 
  151.           CALL   WTB            ;WRITE TEXT BUFFER TO DISK
  152.           LXI    H,TBUF         ;CLEAR TEXT BUFFER
  153.           SHLD   PTR
  154.           LXI    H,0
  155.           SHLD   SIZE 
  156.           STC 
  157.           RET 
  158.  PCC4:    STC                   ;LET LINK HANDLE ALL OTHER CONTROL CODES
  159.           CMC 
  160.           RET 
  161.         
  162. ;         STF - SEND TEXT FILE (TO MODEM) 
  163.   
  164.  STF:     CALL   GFN            ;GET NAME OF DISK FILE TO SEND
  165.           JC     STF6           ;JUMP IF FILE NAME ERROR
  166.           CALL   OPEN           ;TRY TO OPEN SPECIFIED FILE 
  167.           CPI    255            ;JUMP IF FILE NOT FOUND 
  168.           JZ     STF7 
  169.           XRA    A              ;ELSE REWIND FILE AND GET ON WITH IT
  170.           STA    FCB+NR 
  171.  STF1:    CALL   READ           ;READ NEXT RECORD INTO DBUF 
  172.           CPI    1              ;JUMP IF END-OF-FILE
  173.           JZ     STF5 
  174.           LXI    H,DBUF         ;POINT TO DISK BUFFER 
  175.           MVI    C,128
  176.  STF2:    MOV    A,M            ;FETCH NEXT CHAR FROM DBUF
  177.           INX    H
  178.           CPI    'Z'-100Q       ;JUMP IF END-OF-FILE CHARACTER
  179.           JZ     STF5 
  180.           CPI    LF             ;IGNORE LINE FEEDS
  181.           JZ     STF4 
  182.           CALL   WMC            ;WRITE CHARACTER TO MODEM 
  183.           CALL   WCC            ;WRITE CHARACTER TO CONSOLE 
  184.           CPI    CR             ;JUMP IF NOT CARRIAGE RETURN
  185.           JNZ    STF4 
  186.  STF3:    CALL   RMC            ;AWAIT LINE FEED FROM MODEM 
  187.           CPI    LF 
  188.           JNZ    STF3 
  189.           CALL   WCC            ;ECHO LINE FEED TO CONSOLE
  190.  STF4:    DCR    C              ;LOOP THRU REST OF DBUF 
  191.           JNZ    STF2 
  192.           JMP    STF1           ;GO GET NEXT RECORD FROM DISK 
  193.  STF5:    CALL   CLOSE          ;CLEAN UP ACT AND GO HOME 
  194.           RET 
  195.  STF6:    LXI    H,STFS1        ;PRINT 'FILE NAME ERROR'
  196.           CALL   WCS
  197.           RET 
  198.  STF7:    LXI    H,STFS2        ;PRINT 'FILE NOT FOUND' 
  199.           CALL   WCS
  200.           RET 
  201.   
  202.  STFS1:   DB     'FILE NAME ERROR',CR,LF,0
  203.  STFS2:   DB     'FILE NOT FOUND',CR,LF,0 
  204.   
  205. ;         SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  206. ;         ENTRY CONDITIONS
  207. ;            A - CHARACTER TO SAVE
  208.   
  209.  SAVE:    PUSH   PSW
  210.           LDA    FLAG 
  211.           ORA    A
  212.           JNZ    SAVE1
  213.           POP    PSW
  214.           RET 
  215.  SAVE1:   POP    PSW
  216.           PUSH   H
  217.           LHLD   PTR
  218.           MOV    M,A
  219.           INX    H
  220.           SHLD   PTR
  221.           LHLD   SIZE           ;SIZE = SIZE + 1
  222.           INX    H
  223.           SHLD   SIZE 
  224.           POP    H
  225.           RET 
  226.   
  227. ;         WTB - WRITE TEXT BUFFER TO DISK 
  228.   
  229.  WTB:     LHLD   SIZE           ;JUMP IF TEXT BUFFER EMPTY
  230.           MOV    A,L
  231.           ORA    H
  232.           JZ     WTB5 
  233.           CALL   GFN            ;GET FILE NAME
  234.           JC     WTB6           ;JUMP IF FILE NAME ERROR
  235.           CALL   DELT           ;DELETE OLD FILE, IF ANY
  236.           CALL   MAKE           ;MAKE NEW FILE
  237.           XRA    A              ;REWIND FILE
  238.           STA    FCB+NR 
  239.           LHLD   SIZE           ;DE = TBUF SIZE 
  240.           XCHG
  241.           LXI    H,DBUF         ;TOP OF STACK POINTS TO DBUF
  242.           PUSH   H
  243.           LXI    H,TBUF         ;HL POINTS TO TBUF
  244.  WTB1:    MVI    C,128          ;DISK BUFFER SIZE 
  245.  WTB2:    MOV    A,M            ;FETCH NEXT BYTE OF TBUF
  246.           INX    H
  247.           XTHL
  248.           MOV    M,A            ;STORE IN DBUF
  249.           INX    H
  250.           XTHL
  251.           DCX    D              ;SIZE = SIZE - 1
  252.           MOV    A,D            ;EXIT LOOP IF SIZE = 0
  253.           ORA    E
  254.           JZ     WTB3 
  255.           DCR    C              ;LOOP UNTIL DBUF FULL 
  256.           JNZ    WTB2 
  257.           CALL   WRITE          ;WRITE FULL DBUF TO DISK
  258.           XTHL                  ;TOP OF STACK POINTS TO DBUF
  259.           LXI    H,DBUF 
  260.           XTHL
  261.           JMP    WTB1           ;LOOP UNTIL END OF TBUF 
  262.  WTB3:    POP    H              ;HL POINTS TO CURRENT PLACE IN DBUF 
  263.  WTB4:    MVI    M,'Z'-100Q     ;STORE EOF CODE 
  264.           INX    H
  265.           DCR    C              ;LOOP THRU REST OF DBUF 
  266.           JNZ    WTB4 
  267.           CALL   WRITE          ;WRITE LAST SECTOR TO DISK
  268.           CALL   CLOSE          ;CLEAN UP ACT AND GO HOME 
  269.           RET 
  270.  WTB5:    LXI    H,WTBS1        ;PRINT 'TEXT BUFFER EMPTY'
  271.           CALL   WCS
  272.           RET 
  273.  WTB6:    LXI    H,WTBS2        ;PRINT 'FILE NAME ERROR'
  274.           CALL   WCS
  275.           RET 
  276.   
  277.  WTBS1:   DB     'TEXT BUFFER EMPTY',CR,LF,0
  278.  WTBS2:   DB     'FILE NAME ERROR',CR,LF,0
  279.   
  280. ;         WCS - WRITE CONSOLE STRING
  281.   
  282. ;         ENTRY CONDITIONS
  283. ;            HL - POINTS TO STRING (TERM BY ZERO BYTE)
  284.   
  285.  WCS:     MOV    A,M
  286.           INX    H
  287.           ORA    A
  288.           RZ
  289.           CALL   WCC
  290.           JMP    WCS
  291.   
  292. ;         WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
  293.   
  294.  WCCR:    MVI    A,CR 
  295.           CALL   WCC
  296.           MVI    A,LF 
  297.   
  298. ;         WCC - WRITE CONSOLE CHARACTER 
  299. ;         ENTRY CONDITIONS: 
  300. ;            A - CHARACTER TO WRITE 
  301.   
  302.  WCC:     PUSH   PSW
  303.           IN     CONS 
  304.           ANI    TBE
  305.           JZ     $-4
  306.           POP    PSW
  307.           OUT    COND 
  308.           RET 
  309.   
  310. ;         RCS - READ CONSOLE STRING (WITH ECHO) 
  311. ;         EXIT CONDITIONS 
  312. ;            B - NUMBER OF CHARACTERS READ (<255) 
  313. ;            HL - POINTS TO LAST CHAR STORED (CR) 
  314.   
  315.  RCS:     LXI    H,IBUF 
  316.           MVI    B,0
  317.  RCS1:    CALL   RCC            ;READ NEXT CHAR FROM CONSOLE
  318.           CPI    DEL            ;JUMP IF NOT DEL
  319.           JNZ    RCS2 
  320.           INR    B              ;IGNORE DEL IF IBUF ALREADY EMPTY 
  321.           DCR    B
  322.           JZ     RCS1 
  323.           DCX    H              ;ELSE DISCARD LAST CHAR 
  324.           MOV    A,M            ;ECHO DISCARDED CHAR TO CONSOLE 
  325.           CALL   WCC
  326.           DCR    B              ;DECREMENT COUNT
  327.           JMP    RCS1           ;  AND LOOP 
  328.  RCS2:    CPI    'U'-100Q       ;JUMP IF NOT CONTROL-U
  329.           JNZ    RCS3 
  330.           CALL   WCCR           ;ELSE ABORT CURRENT LINE
  331.           JMP    RCS            ;  AND START OVER 
  332.  RCS3:    CALL   WCC            ;ECHO CHAR TO CONSOLE 
  333.           MOV    M,A            ;STORE CHAR IN IBUF 
  334.           INR    B              ;INCREMENT COUNT
  335.           CPI    CR             ;JUMP IF CARRIAGE RETURN
  336.           JZ     RCS4 
  337.           INX    H              ;ELSE ADVANCE POINTER 
  338.           JMP    RCS1           ;  AND LOOP 
  339.  RCS4:    MVI    A,LF           ;ISSUE LINE FEED AND RETURN 
  340.           CALL   WCC
  341.           RET 
  342.   
  343. ;         RCC - READ CONSOLE CHARACTER
  344. ;         EXIT CONDITIONS 
  345. ;            A - CHARACTER READ 
  346.   
  347.  RCC:     IN     CONS 
  348.           ANI    RDA
  349.           JZ     $-4
  350.           IN     COND 
  351.           ANI    177Q 
  352.           RET 
  353.   
  354. ;         WMC - WRITE MODEM CHARACTER 
  355. ;         ENTRY CONDITIONS
  356. ;            A - CHARACTER TO WRITE 
  357.   
  358.  WMC:     PUSH   PSW
  359.           IN     MODS 
  360.           ANI    TBE
  361.           JZ     $-4
  362.           POP    PSW
  363.           OUT    MODD 
  364.           RET 
  365.   
  366. ;         RMC - READ MODEM CHARACTER
  367. ;         EXIT CONDITIONS:
  368. ;            A - CHARACTER READ 
  369.   
  370.  RMC:     IN     MODS 
  371.           ANI    RDA
  372.           JZ     $-4
  373.           IN     MODD 
  374.           ANI    177Q 
  375.           RET 
  376.   
  377. ;         GFN - GET FILE NAME 
  378.   
  379.  GFN:     CALL   WCCR 
  380.           LXI    H,GFNS1        ;PRINT 'FILENAME? ' 
  381.           CALL   WCS
  382.           CALL   RCS            ;READ RESPONSE INTO IBUF
  383.           LXI    H,FCB+FN       ;BLANK FILL FN AND FT FIELDS
  384.           MVI    C,11 
  385.  GFN1:    MVI    M,' '
  386.           INX    H
  387.           DCR    C
  388.           JNZ    GFN1 
  389.           LXI    H,IBUF         ;POINT TO INPUT BUFFER
  390.           LXI    D,FCB+FN       ;SCAN OFF FN FIELD
  391.           MVI    C,9
  392.  GFN2:    MOV    A,M            ;FETCH NEXT CHAR FROM IBUF
  393.           INX    H
  394.           CPI    141Q           ;IF LC, CONVERT TO UC 
  395.           JC     $+5
  396.           SUI    40Q
  397.           CPI    CR             ;JUMP IF END OF LINE
  398.           JZ     GFN5 
  399.           CPI    '.'            ;JUMP IF END OF NAME
  400.           JZ     GFN3 
  401.           STAX   D              ;ELSE STORE CHAR IN FN FIELD
  402.           INX    D
  403.           DCR    C              ;LOOP IF 8 OR LESS CHARS SO FAR 
  404.           JNZ    GFN2 
  405.           JMP    GFN6           ;ELSE TAKE ERROR EXIT 
  406.  GFN3:    LXI    D,FCB+FT       ;SCAN OFF FT FIELD
  407.           MVI    C,4
  408.  GFN4:    MOV    A,M            ;FETCH NEXT CHAR FROM IBUF
  409.           INX    H
  410.           CPI    141Q           ;IF LC, CONVERT TO UC 
  411.           JC     $+5
  412.           SUI    40Q
  413.           CPI    CR             ;JUMP IF END OF LINE
  414.           JZ     GFN5 
  415.           STAX   D              ;ELSE STORE CHAR IN FT FIELD
  416.           INX    D
  417.           DCR    C              ;LOOP IF 3 OR LESS CHARS SO FAR 
  418.           JNZ    GFN4 
  419.           JMP    GFN6           ;ELSE TAKE ERROR EXIT 
  420.  GFN5:    STC                   ;CLEAR ERROR FLAG AND RETURN
  421.           CMC 
  422.           RET 
  423.  GFN6:    STC                   ;SET ERROR FLAG AND RETURN
  424.           RET 
  425.   
  426.  GFNS1:   DB     'FILENAME? ',0 
  427.   
  428. ;         OPEN - OPEN DISK FILE 
  429.   
  430.  OPEN:    PUSH   H
  431.           PUSH   D
  432.           PUSH   B
  433.           LXI    D,FCB
  434.           MVI    C,OFFC 
  435.           CALL   BDOS 
  436.           POP    B
  437.           POP    D
  438.           POP    H
  439.           RET 
  440.   
  441. ;         READ - READ RECORD FROM DISK FILE 
  442.   
  443.  READ:    PUSH   H
  444.           PUSH   D
  445.           PUSH   B
  446.           LXI    D,FCB
  447.           MVI    C,RRFC 
  448.           CALL   BDOS 
  449.           POP    B
  450.           POP    D
  451.           POP    H
  452.           RET 
  453.   
  454. ;         CLOSE - CLOSE DISK FILE 
  455.   
  456.  CLOSE:   PUSH   H
  457.           PUSH   D
  458.           PUSH   B
  459.           LXI    D,FCB
  460.           MVI    C,CFFC 
  461.           CALL   BDOS 
  462.           POP    B
  463.           POP    D
  464.           POP    H
  465.           RET 
  466.   
  467. ;         DELT - DELETE DISK FILE 
  468.   
  469.  DELT:    PUSH   H
  470.           PUSH   D
  471.           PUSH   B
  472.           LXI    D,FCB
  473.           MVI    C,DFFC 
  474.           CALL   BDOS 
  475.           POP    B
  476.           POP    D
  477.           POP    H
  478.           RET 
  479.   
  480. ;         WRITE - WRITE RECORD TO DISK
  481.   
  482.  WRITE:   PUSH   H
  483.           PUSH   D
  484.           PUSH   B
  485.           LXI    D,FCB
  486.           MVI    C,WRFC 
  487.           CALL   BDOS 
  488.           POP    B
  489.           POP    D
  490.           POP    H
  491.           RET 
  492.   
  493. ;         MAKE - MAKE NEW DISK FILE 
  494.   
  495.  MAKE:    PUSH   H
  496.           PUSH   D
  497.           PUSH   B
  498.           LXI    D,FCB
  499.           MVI    C,MFFC
  500.           CALL   BDOS 
  501.           POP    B
  502.           POP    D
  503.           POP    H
  504.           RET 
  505.   
  506. ;         DATA AREA 
  507.   
  508.  APPS:    DB     000Q,000Q,000Q,100Q,156Q 
  509.   
  510.  INCH:    DS     1              ;INPUT CHAR BUFFER (TO CYBER) 
  511.  OUTCH:   DS     1              ;OUTPUT CHAR BUFFER (FROM CYBER)
  512.   
  513.  OLDSP:   DS     2              ;OLD STACK POINTER
  514.  STACK:   DS     64             ;LOCAL STACK
  515.   
  516.  IBUF:    DS     256            ;INPUT BUFFER 
  517.   
  518. ;         TEXT BUFFER 
  519.   
  520.  FLAG:    DS     1              ;TEXT SAVE FLAG 
  521.  PTR:     DS     2              ;TEXT BUFFER POINTER
  522.  SIZE:    DS     2              ;TEXT BUFFER SIZE 
  523.  TBUF     EQU    $              ;START OF TEXT BUFFER 
  524.   
  525.           END    LINK 
  526.