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