home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 2: Collection B / 17Bit_Collection_B.iso / files / 1794.dms / in.adf / Extensions_Sources / Extension_Sources.Lzh / _serial.s < prev    next >
Encoding:
Text File  |  1992-02-01  |  15.4 KB  |  764 lines

  1. ;---------------------------------------------------------------------
  2. ;    **   **   **  ***   ***   ****     **    ***  **  ****
  3. ;   ****  *** *** ** ** **     ** **   ****  **    ** **  **
  4. ;  **  ** ** * ** ** **  ***   *****  **  **  ***  ** **
  5. ;  ****** **   ** ** **    **  **  ** ******    ** ** **
  6. ;  **  ** **   ** ** ** *  **  **  ** **  ** *  ** ** **  **
  7. ;  **  ** **   **  ***   ***   *****  **  **  ***  **  ****
  8. ;---------------------------------------------------------------------
  9. ; Serial extension source code, V1.1
  10. ; By François Lionet
  11. ; AMOS and AMOS Compiler (c) Europress Software 1991
  12. ; To be used with AMOS1.3 and over
  13. ;--------------------------------------------------------------------- 
  14. ; This file is public domain
  15. ;---------------------------------------------------------------------
  16. ;
  17. ; Please refer to the _Music.s file for more informations...
  18. ;
  19. ;---------------------------------------------------------------------
  20.  
  21.         XREF        _LVOOpenDevice
  22.         XREF        _LVOCloseDevice
  23.         XREF        _LVOCheckIO
  24.         XREF        _LVOWaitIO
  25.         XREF        _LVOAbortIO
  26.         XREF        _LVOSendIO
  27.         XREF        _LVODoIO
  28.  
  29. * AMIGA's includes
  30.         INCDIR        ":Includes/I/"
  31.         INCLUDE        "Exec/Types.I"
  32.         INCLUDE        "Exec/Exec.I"
  33.         INCLUDE     "Devices/Serial.I"
  34.  
  35. *************** AMOS includes
  36. ExtNb        equ    6-1
  37.  
  38.         INCDIR        ":AMOS1.3/Comp/"
  39.          Include    "_Equ.s"
  40.         RsSet    DataLong
  41.         Include "_Pointe.s"
  42.         Include    "_WEqu.s"
  43.         Include "_CEqu.s"
  44.         Include    "_LEqu.s"
  45.  
  46. Dlea        MACRO
  47.         move.l    ExtAdr+ExtNb*16(a5),\2
  48.         add.w    #\1-DT,\2
  49.         ENDM
  50. Dload        MACRO
  51.         move.l    ExtAdr+ExtNb*16(a5),\1
  52.         ENDM
  53.  
  54. * Number of serial channels allowed
  55. NSerial        equ    4
  56.  
  57. ******************************************************************
  58. *    Header
  59. Start    dc.l    C_Tk-C_Off
  60.     dc.l    C_Lib-C_Tk
  61.     dc.l    C_Title-C_Lib
  62.     dc.l    C_End-C_Title
  63.     dc.w    0    
  64.  
  65. ******************************************************************
  66. *    Offsets to library
  67. C_Off   dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
  68.         dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
  69.         dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
  70.         dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
  71.         dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
  72.         dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2,(L24-L23)/2
  73.         dc.w (L25-L24)/2,(L26-L25)/2,(L27-L26)/2,(L28-L27)/2
  74.         dc.w (L29-L28)/2,(L30-L29)/2,(L31-L30)/2,(L32-L31)/2
  75.         dc.w (L33-L32)/2,(L34-L33)/2,(L35-L34)/2
  76.  
  77. ******************************************************************
  78. *    TOKEN TABLE
  79. C_Tk    dc.w     1,0
  80.     dc.b     $80,-1
  81.     dc.w    L_SerOp2,-1
  82.     dc.b    "!serial ope","n"+$80,"I0,0",-2
  83.     dc.w    L_SerOp5,-1
  84.     dc.b    $80,"I0,0,0,0,0",-1
  85.     dc.w    L_SerClo0,-1
  86.     dc.b    "!serial clos","e"+$80,"I",-2
  87.     dc.w    L_SerClo1,-1
  88.     dc.b    $80,"I0",-1
  89.     dc.w    L_SerSp,-1
  90.     dc.b    "serial spee","d"+$80,"I0,0",-1
  91.     dc.w    -1,L_SerChk
  92.     dc.b    "serial chec","k"+$80,"00",-1
  93.     dc.w     L_SerSend,-1
  94.     dc.b    "serial sen","d"+$80,"I0,2",-1
  95.     dc.w     L_SerSp,-1
  96.     dc.b    "serial spee","d"+$80,"I0,0",-1
  97.     dc.w     L_SerBit,-1
  98.     dc.b    "serial bit","s"+$80,"I0,0,0",-1
  99.     dc.w     L_SerX,-1
  100.     dc.b    "serial ","x"+$80,"I0,0",-1
  101.     dc.w     L_SerBuf,-1
  102.     dc.b    "serial bu","f"+$80,"I0,0",-1
  103.     dc.w     L_SerPar,-1
  104.     dc.b    "serial parit","y"+$80,"I0,0",-1
  105.     dc.w    -1,L_SerGet
  106.     dc.b    "serial ge","t"+$80,"00",-1
  107.     dc.w    -1,L_SerInp
  108.     dc.b    "serial input","$"+$80,"20",-1
  109.     dc.w    L_SerFast,-1
  110.     dc.b    "serial fas","t"+$80,"I0",-1
  111.     dc.w    L_SerSlow,-1
  112.     dc.b    "serial slo","w"+$80,"I0",-1
  113.     dc.w    -1,L_SerE
  114.     dc.b    "serial erro","r"+$80,"00",-1
  115.     dc.w    L_SerOut,-1
  116.     dc.b    "serial ou","t"+$80,"I0,0,0",-1
  117.     dc.w    0
  118. C_Lib
  119.  
  120. ******************************************************************
  121. *        COLD START
  122. L0    movem.l    a3-a6,-(sp)
  123.     lea    DT(pc),a3
  124.     move.l    a3,ExtAdr+ExtNb*16(a5)
  125.     lea    SerDef(pc),a0
  126.     move.l    a0,ExtAdr+ExtNb*16+4(a5)
  127.     lea    SerEnd(pc),a0
  128.     move.l    a0,ExtAdr+ExtNb*16+8(a5)
  129.     movem.l    (sp)+,a3-a6
  130.     moveq    #ExtNb,d0        * NO ERRORS
  131.     rts
  132.  
  133. ******* SCREEN RESET
  134. SerDef    
  135. ******* QUIT
  136. SerEnd    Rbra    L_SCloseA
  137.  
  138. *************** Data zone
  139. DT
  140. SerialIO    ds.l    NSerial*2
  141. BufIn        dc.l    0
  142.         dc.l    0
  143. SerName        SERIALNAME
  144.         even
  145.  
  146. L1
  147. L2
  148.  
  149. ***********************************************************
  150. *    OPEN SERIAL DEVICE
  151.  
  152. ******* Seropen logicnumber,physicnumber[,shared,xdisabled,7wires]    
  153. L_SerOp2    equ    3
  154. L3    clr.l    -(a3)
  155.     clr.l    -(a3)
  156.     clr.l    -(a3)
  157.     Rbra    L_SerOp5
  158. L_SerOp5    equ    4
  159. L4    movem.l    a4-a6,-(sp)
  160.     move.l    16(a3),d0
  161.     Rbsr    L_GetSerial
  162.     tst.l    (a2)
  163.     Rbne    L_SerAOp
  164. ; Opens communication port
  165.     clr.l    -(sp)
  166.     clr.l    -(sp)
  167.     moveq    #0,d0
  168.     Rbsr    L_Amiga.Lib
  169.     addq.l    #8,sp
  170.     move.l    d0,4(a2)
  171.     Rbeq    L_SerOpE
  172. ; Opens IO structure
  173.     move.l    #IOEXTSER_SIZE,-(sp)
  174.     move.l    d0,-(sp)
  175.     moveq    #2,d0
  176.     Rbsr    L_Amiga.Lib
  177.     addq.l    #8,sp
  178.     move.l    d0,(a2)
  179.     Rbeq    L_SerOpE
  180. ; Opening parameters
  181.     move.l    d0,a1
  182.     tst.l    (a3)+
  183.     beq.s    SerOpA
  184.     bset    #SERB_7WIRE,IO_SERFLAGS(a1)
  185. SerOpA    bset    #SERB_XDISABLED,IO_SERFLAGS(a1)
  186.     tst.l    (a3)+
  187.     beq.s    SerOpB
  188.     bclr    #SERB_XDISABLED,IO_SERFLAGS(a1)
  189. SerOpB  tst.l    (a3)+
  190.     beq.s    SerOpC
  191.     bset    #SERB_SHARED,IO_SERFLAGS(a1)
  192. SerOpC    
  193.     Dlea    SerName,a0
  194.     move.l    (a3),d0
  195.     moveq    #0,d1
  196.     move.l    $4.w,a6
  197.     jsr    _LVOOpenDevice(a6)
  198.     tst.l    d0
  199.     Rbne    L_SerOpE
  200.     bset    #7,4(a2)
  201.     move.l    (a3)+,d0
  202.     addq.l    #4,a3
  203.     beq.s    .PaSet
  204. * If NOT user-serial (#0),
  205. * default settings for French MINITEL: 1200/7/1 Stop/EVEN parity
  206.     move.l    (a2),a1
  207.     move.l    #1200,IO_BAUD(a1)
  208.     move.b    #7,IO_READLEN(a1)
  209.     move.b    #7,IO_WRITELEN(a1)
  210.     move.b    #1,IO_STOPBITS(a1)
  211.     bset    #SERB_XDISABLED,IO_SERFLAGS(a1)
  212.     bset    #SERB_PARTY_ON,IO_SERFLAGS(a1)
  213.     bclr    #SERB_PARTY_ODD,IO_SERFLAGS(a1)
  214.     bclr    #SEXTB_MSPON,IO_EXTFLAGS+3(a1)
  215.     bclr    #SEXTB_MARK,IO_EXTFLAGS+3(a1)
  216.     Rbsr    L_Stpar
  217. .PaSet    movem.l    (sp)+,a4-a6
  218.     rts
  219.  
  220. ***********************************************************
  221. *    Serclose [N]
  222. L_SerClo1    equ    5
  223. L5    move.l    (a3)+,d0
  224.     Rbsr    L_GetSerial
  225.     tst.l    (a2)
  226.     Rbeq    L_SerNOp
  227.     Rbne    L_SClose
  228. ;-----> Close ALL channels
  229. L_SerClo0    equ    6    
  230. L_SCloseA    equ    6
  231. L6    Dlea    SerialIO,a2
  232.     moveq    #NSerial-1,d2
  233. SCloA1    Rbsr    L_SClose
  234.     lea    8(a2),a2
  235.     dbra    d2,SCloA1
  236.     rts
  237. ;-----> Close channel A2
  238. L_SClose    equ    7
  239. L7    movem.l    a0-a6/d0-d7,-(sp)
  240.     move.l    4.w,a6
  241. ; Close device
  242.     bclr    #7,4(a2)
  243.     beq.s    SClo1
  244.     move.l    (a2),a1
  245.     jsr    _LVOAbortIO(a6)
  246.     move.l    (a2),a1
  247.     jsr    _LVOWaitIO(a6)
  248.     move.l    (a2),a1
  249.     jsr    _LVOCloseDevice(a6)
  250. ; Delete IO structure
  251. SClo1    tst.l    (a2)
  252.     beq.s    SClo2    
  253.     move.l    (a2),-(sp)
  254.     clr.l    (a2)    
  255.     moveq    #3,d0
  256.     Rbsr    L_Amiga.Lib
  257.     addq.l    #4,sp
  258. ; Remove message port
  259. SClo2    tst.l    4(a2)
  260.     beq.s    SClo3
  261.     move.l    4(a2),-(sp)
  262.     clr.l    4(a2)
  263.     moveq    #1,d0
  264.     Rbsr    L_Amiga.Lib
  265.     addq.l    #4,sp
  266. SClo3    movem.l    (sp)+,d0-d7/a0-a6
  267.     rts
  268.  
  269. ***********************************************************
  270. *    Serial Send ser,A$
  271. L_SerSend    equ    8
  272. L8    move.l    (a3)+,d1
  273.     move.l    (a3)+,d0
  274.     Rbsr    L_GetSerA1
  275.     move.l    d1,a2
  276.     moveq    #0,d0
  277.     move.w    (a2)+,d0
  278.     Rbeq    L_IFonc
  279.     move.l    d0,IO_LENGTH(a1)
  280.     move.l    a2,IO_DATA(a1)
  281.     moveq    #CMD_WRITE,d0
  282.     Rbra    L_DoSENDIO
  283. ***********************************************************
  284. *    Serial Out ser,address,length
  285. L_SerOut    equ    9
  286. L9    move.l    (a3)+,d2
  287.     Rbmi    L_IFonc
  288.     Rbeq    L_IFonc
  289.     move.l    (a3)+,d1
  290.     move.l    (a3)+,d0
  291.     Rbsr    L_GetSerA1
  292.     move.l    d1,IO_DATA(a1)
  293.     move.l    d2,IO_LENGTH(a1)
  294.     moveq    #CMD_WRITE,d0
  295.     Rbra    L_DoSENDIO
  296. ***********************************************************
  297. *    =Serial Get(ser)
  298. L_SerGet    equ    10
  299. L10    move.l    (a3)+,d0
  300.     Rbsr    L_GetSerA1
  301.     move.w    #SDCMD_QUERY,d0
  302.     Rbsr    L_DoDOIO
  303.     moveq    #-1,d3
  304.     move.l    IO_ACTUAL(a1),d0
  305.     beq.s    SerINo
  306.     Dlea    BufIn,a2
  307.     move.l    a2,IO_DATA(a1)
  308.     move.l    #1,IO_LENGTH(a1)
  309.     moveq    #CMD_READ,d0
  310.     Rbsr    L_DoDOIO
  311.     moveq    #0,d3
  312.     move.b    (a2),d3
  313. SerINo    moveq    #0,d2
  314.     rts
  315. ***********************************************************
  316. *    =Serial Input$(Ser) 
  317. L_SerInp    equ    11
  318. L11    move.l    (a3)+,d0
  319.     Rbsr    L_GetSerA1
  320.     moveq    #SDCMD_QUERY,d0
  321.     Rbsr    L_DoDOIO
  322.     move.l    IO_ACTUAL(a1),d4
  323.     beq.s    SInpNo
  324.     cmp.l    #65530,d4
  325.     Rbcc    L_IFonc
  326. * Ask for string space...
  327.     move.l    a1,-(sp)
  328.     move.l    d4,d3
  329.     and.w    #$FFFE,d3        * Only EVEN!
  330.     addq.w    #2,d3
  331.     Rjsr    L_Demande
  332.     lea    2(a1,d3.w),a1
  333.     move.l    a1,HiChaine(a5)
  334. * Send to device...
  335.     move.l    (sp)+,a1
  336.     move.l    a0,d3
  337.     move.w    d4,(a0)+
  338.     move.l    a0,IO_DATA(a1)
  339.     move.l    d4,IO_LENGTH(a1)
  340.     moveq    #CMD_READ,d0
  341.     Rbsr    L_DoDOIO
  342.     moveq    #2,d2
  343.     rts
  344. * Nothing to return
  345. SInpNo    move.l    ChVide(a5),d3        * Empty string
  346.     moveq    #2,d2
  347.     rts
  348.  
  349. ***********************************************************
  350. *    Serial Speed ser,baud
  351. L_SerSp        equ    12
  352. L12    move.l    (a3)+,d1
  353.     move.l    (a3)+,d0
  354.     Rbsr    L_GetSerA1
  355.     move.l    d1,IO_BAUD(a1)
  356.     Rbra    L_Stpar
  357. L_Stpar        equ    13
  358. L13    
  359.     move.w    #SDCMD_SETPARAMS,d0
  360.     Rbsr    L_DoDOIO
  361.     Rbne    L_SerError
  362.     rts
  363. ***********************************************************
  364. *    Serial Bit ser,number,stop
  365. L_SerBit    equ    14
  366. L14    move.l    (a3)+,d2
  367.     move.l    (a3)+,d1
  368.     move.l    (a3)+,d0
  369.     Rbsr    L_GetSerA1
  370.     move.b    d1,IO_READLEN(a1)
  371.     move.b    d1,IO_WRITELEN(a1)
  372.     move.b    d2,IO_STOPBITS(a1)
  373.     Rbra    L_Stpar
  374. ***********************************************************
  375. *    Serial Parity ser,on/off/odd/even/mspon
  376. L_SerPar    equ    15
  377. L15    move.l    (a3)+,d1
  378.     move.l    (a3)+,d0
  379.     Rbsr    L_GetSerA1
  380.     bclr    #SERB_PARTY_ON,IO_SERFLAGS(a1)
  381.     bclr    #SERB_PARTY_ODD,IO_SERFLAGS(a1)
  382.     bclr    #SEXTB_MSPON,IO_EXTFLAGS+3(a1)
  383.     bclr    #SEXTB_MARK,IO_EXTFLAGS+3(a1)
  384. ; -1-> NO PARITY
  385.     tst.w    d1
  386.     bmi.s    .parX
  387. ; 0--> EVEN
  388.     bne.s    .par1
  389.     bset    #SERB_PARTY_ON,IO_SERFLAGS(a1)
  390.     bra.s    .parX
  391. ; 1--> ODD
  392. .par1    cmp.w    #1,d1
  393.     bne.s    .par2
  394.     bset    #SERB_PARTY_ON,IO_SERFLAGS(a1)
  395.     bset    #SERB_PARTY_ODD,IO_SERFLAGS(a1)
  396.     bra.s    .parX
  397. ; 2--> SPACE
  398. .par2    cmp.w    #2,d1
  399.     bne.s    .par3
  400.     bset    #SEXTB_MSPON,IO_EXTFLAGS+3(a1)
  401.     bra.s    .parX
  402. ; 3--> MARK
  403. .par3    cmp.w    #3,d1
  404.     bne.s    .parX
  405.     bset    #SEXTB_MSPON,IO_EXTFLAGS+3(a1)
  406.     bset    #SEXTB_MARK,IO_EXTFLAGS+3(a1)
  407. ; Envoie
  408. .parX    Rbra    L_Stpar    
  409. **********************************************************
  410. *    Serial X ser,value
  411. L_SerX        equ    16
  412. L16    move.l    (a3)+,d1
  413.     move.l    (a3)+,d0
  414.     Rbsr    L_GetSerA1
  415.     bset    #SERB_XDISABLED,IO_SERFLAGS(a1)
  416.     cmp.l    #-1,d1
  417.     Rbeq    L_Stpar
  418.     bclr    #SERB_XDISABLED,IO_SERFLAGS(a1)
  419.     move.l    d1,IO_CTLCHAR(a1)
  420.     Rbra    L_Stpar
  421. **********************************************************
  422. *    Serial Buffer ser,length
  423. L_SerBuf    equ    17
  424. L17    move.l    (a3)+,d1
  425.     move.l    (a3)+,d0
  426.     Rbsr    L_GetSerA1
  427.     move.l    d1,IO_RBUFLEN(a1)
  428.     Rbra    L_Stpar
  429. **********************************************************
  430. *    Serial Fast ser
  431. L_SerFast    equ    18
  432. L18    move.l    (a3)+,d0
  433.     Rbsr    L_GetSerA1
  434.     bclr    #SERB_PARTY_ON,IO_SERFLAGS(a1)
  435.     bclr    #SEXTB_MSPON,IO_EXTFLAGS+3(a1)
  436.     bset    #SERB_XDISABLED,IO_SERFLAGS(a1)
  437.     move.b    #8,IO_READLEN(a1)
  438.     move.b    #8,IO_WRITELEN(a1)
  439.     bset    #SERB_RAD_BOOGIE,IO_SERFLAGS(a1)
  440.     Rbra    L_Stpar
  441. **********************************************************
  442. *    Serial Slow Ser
  443. L_SerSlow    equ    19
  444. L19    move.l    (a3)+,d0
  445.     Rbsr    L_GetSerA1
  446.     bclr    #SERB_RAD_BOOGIE,IO_SERFLAGS(a1)
  447.     Rbra    L_Stpar
  448. **********************************************************
  449. *    =Serial Check(N)
  450. L_SerChk    equ    20
  451. L20    move.l    (a3)+,d0
  452.     Rbsr    L_GetSerA1
  453.     move.l    a6,-(sp)
  454.     move.l    $4.w,a6
  455.     jsr    _LVOCheckIO(a6)
  456.     move.l    (sp)+,a6
  457.     move.l    d0,d3
  458.     beq.s    SerChk1
  459.     moveq    #-1,d3
  460. SerChk1    moveq    #0,d2    
  461.     rts
  462. **********************************************************
  463. *    =Serial Error(n)
  464. L_SerE        equ    21
  465. L21    move.l    (a3)+,d0
  466.     Rbsr    L_GetSerA1
  467.     moveq    #0,d3
  468.     move.b    IO_ERROR(a1),d3
  469.     moveq    #0,d2
  470.     rts
  471.  
  472. * DOIO function
  473. L_DoDOIO    equ    22
  474. L22    movem.l    a1/a2/a6,-(sp)
  475.     move.w    d0,IO_COMMAND(a1)
  476.     move.l    $4.w,a6
  477.     jsr    _LVODoIO(a6)
  478.     tst.l    d0
  479.     movem.l    (sp)+,a1/a2/a6
  480.     rts
  481. * SENDIO function
  482. L_DoSENDIO    equ    23
  483. L23    movem.l    a1/a2/a6,-(sp)
  484.     move.w    d0,IO_COMMAND(a1)
  485.     move.l    $4.w,a6
  486.     jsr    _LVOSendIO(a6)
  487.     tst.l    d0
  488.     movem.l    (sp)+,a1/a2/a6
  489.     rts
  490.     
  491. ;-----> IO #D0 to A1/a2
  492. L_GetSerA1    equ    24
  493. L24    move.l    d0,-(sp)
  494.     Rbsr    L_GetSerial
  495.     move.l    (a2),d0
  496.     Rbeq    L_SerNOp
  497.     move.l    d0,a1
  498.     move.l    (sp)+,d0
  499.     rts
  500. ;-----> Find IO address > D0
  501. L_GetSerial    equ    25
  502. L25    cmp.l    #NSerial,d0
  503.     Rbcc    L_IFonc
  504.     lsl.w    #3,d0
  505.     Dlea    SerialIO,a2
  506.     add.w    d0,a2
  507.     rts
  508.  
  509. *********************************************************************
  510. *    AMIGA.LIB linked code. 
  511. *    In order to make it relocatable, I have been
  512. *    obliged to disassemble the code and include it in this 
  513. *    routine.
  514. L_Amiga.Lib    equ    26
  515. L26    lsl.w    #2,d0
  516.     lea    JJJmp(pc),a0
  517.     jmp    0(a0,d0.w)
  518. JJJmp    bra    _CreatePort
  519.     bra    _DeletePort
  520.     bra    _CreateExtIO
  521.     bra    _DeleteExtIO
  522.  
  523. _CreatePort
  524.     MOVEM.L    D2-7/A2,-(A7)
  525.     MOVE.L    $20(A7),D4
  526.     MOVE.B    $27(A7),D3
  527.     MOVE.L    #$FFFFFFFF,-(A7)
  528.     BSR    L7C7DB14
  529.     MOVE.L    D0,D5
  530.     MOVE.L    D5,D6
  531.     MOVEQ    #-1,D2
  532.     CMP.L    D5,D2
  533.     ADDQ.L    #4,A7
  534.     BNE.S    L7C7D97A
  535.     MOVEQ    #0,D0
  536.     BRA    L7C7D9E6
  537. L7C7D97A    MOVE.L    #$10001,-(A7)
  538.     PEA    $22.W
  539.     BSR    L7C7DAD0
  540.     MOVEA.L    D0,A2
  541.     EXG    D7,A2
  542.     TST.L    D7
  543.     EXG    D7,A2
  544.     ADDQ.L    #8,A7
  545.     BNE.S    L7C7D9A4
  546.     MOVE.L    D6,-(A7)
  547.     BSR    L7C7DB28
  548.     MOVEQ    #0,D0
  549.     ADDQ.L    #4,A7
  550.     BRA.S    L7C7D9E6
  551. L7C7D9A4    MOVE.L    D4,$A(A2)
  552.     MOVE.B    D3,9(A2)
  553.     MOVE.B    #4,8(A2)
  554.     CLR.B    $E(A2)
  555.     MOVE.B    D6,$F(A2)
  556.     CLR.L    -(A7)
  557.     BSR    L7C7DB00
  558.     MOVE.L    D0,$10(A2)
  559.     TST.L    D4
  560.     ADDQ.L    #4,A7
  561.     BEQ.S    L7C7D9D8
  562.     MOVE.L    A2,-(A7)
  563.     BSR    L7C7DB3C
  564.     ADDQ.L    #4,A7
  565.     BRA.S    L7C7D9E4
  566. L7C7D9D8    PEA    $14(A2)
  567.     BSR    _NewList
  568.     ADDQ.L    #4,A7
  569. L7C7D9E4    MOVE.L    A2,D0
  570. L7C7D9E6    MOVEM.L    (A7)+,D2-7/A2
  571.     RTS
  572.  
  573. _DeletePort
  574.     MOVEM.L    D2/A2,-(A7)
  575.     MOVEA.L    $C(A7),A2
  576.     TST.L    $A(A2)
  577.     BEQ.S    L7C7DA04
  578.     MOVE.L    A2,-(A7)
  579.     BSR    L7C7DB50
  580.     ADDQ.L    #4,A7
  581. L7C7DA04    MOVE.B    #$FF,8(A2)
  582.     MOVEQ    #-1,D2
  583.     MOVE.L    D2,$14(A2)
  584.     MOVEQ    #0,D2
  585.     MOVE.B    $F(A2),D2
  586.     MOVE.L    D2,-(A7)
  587.     BSR    L7C7DB28
  588.     PEA    $22.W
  589.     MOVE.L    A2,-(A7)
  590.     BSR    L7C7DAE8
  591.     LEA    $C(A7),A7
  592.     MOVEM.L    (A7)+,D2/A2
  593.     RTS
  594. _CreateExtIO
  595.     MOVEM.L    D2-4,-(A7)
  596.     MOVE.L    $10(A7),D2
  597.     MOVE.L    $14(A7),D3
  598.     TST.L    D2
  599.     BNE.S    L7C7DA54
  600.     MOVEQ    #0,D0
  601.     BRA.S    L7C7DA82
  602. L7C7DA54    MOVE.L    #$10001,-(A7)
  603.     MOVE.L    D3,-(A7)
  604.     BSR    L7C7DAD0
  605.     MOVEA.L    D0,A0
  606.     EXG    D4,A0
  607.     TST.L    D4
  608.     EXG    D4,A0
  609.     ADDQ.L    #8,A7
  610.     BNE.S    L7C7DA72
  611.     MOVEQ    #0,D0
  612.     BRA.S    L7C7DA82
  613. L7C7DA72    MOVE.B    #5,8(A0)
  614.     MOVE.W    D3,$12(A0)
  615.     MOVE.L    D2,$E(A0)
  616.     MOVE.L    A0,D0
  617. L7C7DA82    MOVEM.L    (A7)+,D2-4
  618.     RTS
  619.  
  620. _DeleteExtIO
  621.     MOVEM.L    D2-3,-(A7)
  622.     MOVEA.L    $C(A7),A0
  623.     EXG    D3,A0
  624.     TST.L    D3
  625.     EXG    D3,A0
  626.     BEQ    L7C7DABE
  627.     MOVE.B    #$FF,8(A0)
  628.     MOVEQ    #-1,D2
  629.     MOVE.L    D2,$14(A0)
  630.     MOVEQ    #-1,D2
  631.     MOVE.L    D2,$18(A0)
  632.     MOVEQ    #0,D2
  633.     MOVE.W    $12(A0),D2
  634.     MOVE.L    D2,-(A7)
  635.     MOVE.L    A0,-(A7)
  636.     BSR    L7C7DAE8
  637.     ADDQ.L    #8,A7
  638. L7C7DABE    MOVEM.L    (A7)+,D2-3
  639.     RTS
  640. L7C7DAD0
  641.     MOVE.L    A6,-(A7)
  642.     MOVEA.L    $4.w,A6
  643.     MOVEM.L    8(A7),D0-1
  644.     JSR    -$C6(A6)
  645.     MOVEA.L    (A7)+,A6
  646.     RTS
  647. L7C7DAE8
  648.     MOVE.L    A6,-(A7)
  649.     MOVEA.L    $4.w,A6
  650.     MOVEA.L    8(A7),A1
  651.     MOVE.L    $C(A7),D0
  652.     JSR    -$D2(A6)
  653.     MOVEA.L    (A7)+,A6
  654.     RTS
  655. L7C7DB00
  656.     MOVE.L    A6,-(A7)
  657.     MOVEA.L    $4.w,A6
  658.     MOVEA.L    8(A7),A1
  659.     JSR    -$126(A6)
  660.     MOVEA.L    (A7)+,A6
  661.     RTS
  662. L7C7DB14
  663.     MOVE.L    A6,-(A7)
  664.     MOVEA.L    $4.w,A6
  665.     MOVE.L    8(A7),D0
  666.     JSR    -$14A(A6)
  667.     MOVEA.L    (A7)+,A6
  668.     RTS
  669. L7C7DB28
  670.     MOVE.L    A6,-(A7)
  671.     MOVEA.L    $4.w,A6
  672.     MOVE.L    8(A7),D0
  673.     JSR    -$150(A6)
  674.     MOVEA.L    (A7)+,A6
  675.     RTS
  676. L7C7DB3C
  677.     MOVE.L    A6,-(A7)
  678.     MOVEA.L    $4.w,A6
  679.     MOVEA.L    8(A7),A1
  680.     JSR    -$162(A6)
  681.     MOVEA.L    (A7)+,A6
  682.     RTS
  683. L7C7DB50
  684.     MOVE.L    A6,-(A7)
  685.     MOVEA.L    $4.w,A6
  686.     MOVEA.L    8(A7),A1
  687.     JSR    -$168(A6)
  688.     MOVEA.L    (A7)+,A6
  689.     RTS
  690. _NewList
  691.     move.l    4(a7),a0
  692.     move.l    a0,(a0)
  693.     addq.l    #4,(a0)
  694.     clr.l    4(a0)
  695.     move.l    a0,8(a0)
  696.     rts
  697.  
  698. L27
  699. L28
  700. *********************************************************************
  701. *    ERRORS
  702. L_SerOpE    equ    29
  703. L_IFonc        equ    29
  704. L29    moveq    #23,d0            * Illegal function call
  705.     Rjmp    L_Error
  706. ******* Custom errors
  707. L_SerNOp    equ    30    
  708. L30    moveq    #16,d0
  709.     Rbra    L_Custom
  710. L_SerAOp    equ    31
  711. L31    moveq    #17,d0
  712.     Rbra    L_Custom
  713. * General serial error
  714. L_SerError    equ    32
  715. L32    subq.l    #1,d0
  716.     cmp.l    #16,d0
  717.     Rbcs    L_Custom
  718.     moveq    #18,d0
  719.     Rbra    L_Custom
  720.  
  721. ******* Main routine.
  722. L_Custom    equ    33
  723. L33    lea    ErrMess(pc),a0
  724.     moveq    #0,d1            * Can be trapped
  725.     moveq    #ExtNb,d2        * Number of extension
  726.     moveq    #0,d3            * IMPORTANT!!!
  727.     Rjmp    L_ErrorExt        * Jump to routine...
  728. ErrMess
  729.     dc.b    "Device already in use",0        * 0
  730.     dc.b    0                    * 1
  731.     dc.b    "Invalid baud rate",0            * 2
  732.     dc.b    "Out of memory (serial device)",0    * 3
  733.     dc.b    "Bad parameter",0            * 4
  734.     dc.b    "Hardware data overrun",0        * 5
  735.     dc.b     0                    * 6
  736.     dc.b    0                    * 7
  737.     dc.b    0                    * 8
  738.     dc.b    0                    * 9
  739.     dc.b    "Timer error",0                * 10
  740.     dc.b    "Buffer overflow",0            * 11
  741.     dc.b    "No data set ready",0            * 12
  742.     dc.b    "No clear to send",0            * 13
  743.     dc.b    0                    * 14
  744.     dc.b    0                    * 15        
  745.     dc.b    "Serial port not opened",0        * 16    
  746.     dc.b    "Serial port already opened",0        * 17
  747.     dc.b    "Serial error",0            * 18
  748.     even
  749.  
  750. ******* "No errors" routine
  751. L34    moveq    #0,d1
  752.     moveq    #ExtNb,d2
  753.     moveq    #-1,d3
  754.     Rjmp    L_ErrorExt
  755. L35
  756. *********************************************************************
  757.  
  758. ******* TITLE MESSAGE
  759. C_Title    dc.b    31,"Serial extension V1.1",0
  760.  
  761. ******* END OF THE EXTENSION
  762. C_End    dc.w    0
  763.     even
  764.