home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / ATCOM / ATESP.INC < prev    next >
Text File  |  1995-04-14  |  19KB  |  607 lines

  1. ;*DDK*************************************************************************/
  2. ;
  3. ; COPYRIGHT    Copyright (C) 1995 IBM Corporation
  4. ;
  5. ;    The following IBM OS/2 WARP source code is provided to you solely for
  6. ;    the purpose of assisting you in your development of OS/2 WARP device
  7. ;    drivers. You may use this code in accordance with the IBM License
  8. ;    Agreement provided in the IBM Device Driver Source Kit for OS/2. This
  9. ;    Copyright statement may not be removed.;
  10. ;*****************************************************************************/
  11. ;       SCCSID = @(#)atesp.inc    6.2 91/04/08
  12. ; ABIOS.INC contents
  13.  
  14. DEVICE_ID_DMA   EQU     0Fh
  15.  
  16. ABIOS_FUNC_ALLOCARB     EQU     0Bh
  17. ABIOS_FUNC_DEALLOCARB   EQU     0Ch
  18. ABIOS_FUNC_DISABLEARB   EQU     0Dh
  19. ABIOS_FUNC_XFERSTATUS   EQU     0Eh
  20. ABIOS_FUNC_ABORT        EQU     0Fh
  21. ABIOS_FUNC_READMEM      EQU     10h
  22. ABIOS_FUNC_WRITEMEM     EQU     11h
  23. ABIOS_FUNC_RETURNPARMS  EQU     01h
  24.  
  25. GetParmsRB      struc
  26.         len     dw      (?)             ; (00h) IN
  27.         lid     dw      (?)             ; (02h) IN
  28.         unit    dw      (?)             ; (04h) IN
  29.         func    dw      (?)             ; (06h) IN
  30.         res     dd      0               ; (08h) IN
  31.         retval  dw      (?)             ; (0Ch) IN/OUT
  32.         timeout dw      (?)             ; (0Eh) OUT
  33.         irq     db      (?)             ; (10h) OUT
  34.         getarb  db      (?)             ; (11h) OUT
  35.         id      dw      (?)             ; (12h) OUT
  36.         units   dw      (?)             ; (14h) OUT
  37.         lidflag dw      (?)             ; (16h) OUT
  38.         rblen   dw      (?)             ; (18h) OUT
  39.         secndid db      (?)             ; (1Ah) IN/OUT
  40.         rev     db      (?)             ; (1Bh) IN/OUT
  41.         getres  dd      0               ; (1Ch) IN/OUT
  42. GetParmsRB       ends
  43.  
  44. ArbLevelRB      struc
  45.         arblen  dw      (?)             ; (00h) IN
  46.         arblid  dw      (?)             ; (02h) IN
  47.         arbunit dw      (?)             ; (04h) IN
  48.         arbfunc dw      (?)             ; (06h) IN
  49.         arbres1 dd      0               ; (08h) IN
  50.         arbrval dw      0FFFFh          ; (0Ch) IN/OUT
  51.         arbtime dw      (?)             ; (0Eh) OUT
  52.         arbres2 dw      0               ; (10h)
  53.         arbp1   dd      (?)             ; (12h) IN
  54.         arbres3 dd      0               ; (16h)
  55.         arbp2   dd      (?)             ; (1Ah) IN
  56.         arbres4 db      0               ; (1Eh) IN
  57.         arb     db      (?)             ; (1Fh) IN
  58. ArbLevelRB      ends    ; 16 byte len
  59.  
  60. TransCountRB    struc
  61.         tclen   dw      (?)             ; (00h) IN
  62.         tclid   dw      (?)             ; (02h) IN
  63.         tcunit  dw      (?)             ; (04h) IN
  64.         tcfunc  dw      (?)             ; (06h) IN
  65.         tcres1  dd      0               ; (08h) IN
  66.         tcrval  dw      0FFFFh          ; (0Ch) IN/OUT
  67.         tctime  dw      (?)             ; (0Eh) OUT
  68.         tcaddr  dw      0               ; (10h) IN/OUT
  69.         tcp1    dd      (?)             ; (12h) IN
  70.         tcres3  dw      0               ; (16h) IN
  71.         tcount  dd      (?)             ; (18h) OUT
  72.         tcres4  db      3 DUP (0)       ; (1Ch) IN
  73.         tcarb   db      (?)             ; (1Fh) IN
  74. TransCountRB    ends    ; 16 byte len
  75.  
  76. ReadWriteRB     struc
  77.         rwlen   dw      (?)             ; (00h) IN
  78.         rwlid   dw      (?)             ; (02h) IN
  79.         rwunit  dw      (?)             ; (04h) IN
  80.         rwfunc  dw      (?)             ; (06h) IN
  81.         rwres1  dd      0               ; (08h) IN
  82.         rwrval  dw      0FFFFh          ; (0Ch) IN/OUT
  83.         rwtime  dw      (?)             ; (0Eh) OUT
  84.         memaddr dd      (?)             ; (10h)
  85.         ioaddr  dd      (?)             ; (14h)
  86.         count   dd      (?)             ; (18h)
  87.         mode    db      (?)             ; (1Ch)
  88.         rwtc1   db      (?)             ; (1Dh)
  89.         rwtc2   db      (?)             ; (1Eh)
  90.         rwarb   db      (?)             ; (1Fh)
  91. ReadWriteRB     ends
  92.  
  93. DEVICE_ID_POS   EQU     10h
  94.  
  95. ABIOS_FUNC_READPOS      EQU     0Bh
  96.  
  97. ReadPOSRB         struc
  98.         rplen   dw      (?)             ; (00h) IN
  99.         rplid   dw      (?)             ; (02h) IN
  100.         rpunit  dw      0               ; (04h) IN
  101.         rpfunc  dw      (?)             ; (06h) IN
  102.         rpres1  dd      0               ; (08h) IN
  103.         rprval  dw      0FFFFh          ; (0Ch) IN/OUT
  104.         rptime  dw      (?)             ; (0Eh) OUT
  105.         rpslot  db      (?)             ; (10h) IN      *
  106.         rpres2  db      (?)             ; (11h)
  107.         rpid    dd      (?)             ; (12h) IN      *
  108.         rpdata  dd      (?)             ; (16h) OUT     *
  109.         rpfill  db      6 DUP (?)       ; (1A-1F)
  110. ReadPOSRB     ends
  111.  
  112. ; AT.INC contents
  113.  
  114. ; DMA controller addresses and commands
  115. AT_DMA_PAGE_CH1         EQU     83h
  116. AT_DMA_PAGE_CH3         EQU     82h
  117. AT_DMA_COUNT_CH1        EQU     03h
  118. AT_DMA_COUNT_CH3        EQU     07h
  119. AT_DMA_MODE        EQU     0Bh
  120. AT_DMA_MODE_READ        EQU     08h
  121. AT_DMA_MODE_WRITE       EQU     04h
  122. AT_DMA_MASK        EQU     0Ah
  123. AT_DMA_CLEAR        EQU     0Ch
  124.  
  125. IOWait  MACRO
  126.         local   l1
  127.         local   l2
  128.         jmp     short   l1
  129. l1      label   near
  130.         jmp     short   l2
  131. l2      label   near
  132.         ENDM
  133.  
  134.  
  135. ;
  136.  
  137.  
  138. MAX_ESPS                EQU     2
  139. ESP_BUF_SIZE            EQU     1024
  140.  
  141. ; Bit Masks for DIP switches on ESP-AT
  142. ESP_DIP_PORT1   EQU     00000111b
  143. ESP_DIP_PORT2   EQU     01110000b
  144.  
  145. ; POS register definitions for ESP-PS/2
  146. ESP_POS2_DMA            EQU     00011110b
  147. ESP_POS2_IRQ            EQU     11000000b
  148. ESP_POS2_IRQ_ENABLE     EQU     00100000b
  149. ESP_POS3_PORT1_ENABLE   EQU     00000001b
  150. ESP_POS3_STDADDR        EQU     00001110b
  151. ESP_POS4_PORT2_ENABLE   EQU     00000001b
  152. ESP_POS4_STDADDR        EQU     00001110b
  153. ESP_POS5_ENH_ENABLE     EQU     00000001b
  154. ESP_POS5_EADDR          EQU     00001110b
  155. ESP_ID                  EQU     6F04h
  156.  
  157. ; ESP register offsets
  158. ESP_R_RDY       EQU     0
  159. ESP_R_SID       EQU     1
  160. ESP_R_RX1       EQU     2
  161. ESP_R_TX1       EQU     2
  162. ESP_R_RX2       EQU     3
  163. ESP_R_TX2       EQU     3
  164. ESP_R_STATUS1   EQU     4
  165. ESP_R_CMD1      EQU     4
  166. ESP_R_STATUS2   EQU     5
  167. ESP_R_CMD2      EQU     5
  168. ESP_R_DMA_RX    EQU     6
  169. ESP_R_DMA_TX    EQU     6
  170.  
  171. ; Ready Register bit masks
  172. ESP_RDY_RX1     EQU     00000001b
  173. ESP_RDY_TX1     EQU     00000010b
  174. ESP_RDY_RX2     EQU     00000100b
  175. ESP_RDY_TX2     EQU     00001000b
  176. ESP_RDY_STATUS1 EQU     00010000b
  177. ESP_RDY_CMD1    EQU     00100000b
  178. ESP_RDY_STATUS2 EQU     01000000b
  179. ESP_RDY_CMD2    EQU     10000000b
  180.  
  181. ; Service ID bit masks
  182. ESP_SID_RX1     EQU     00000001b
  183. ESP_SID_TX1     EQU     00000010b
  184. ESP_SID_ERROR1  EQU     00000100b
  185. ESP_SID_DMAFIN  EQU     00001000b
  186. ESP_SID_RX2     EQU     00010000b
  187. ESP_SID_TX2     EQU     00100000b
  188. ESP_SID_ERROR2  EQU     01000000b
  189. ESP_SID_DMATO   EQU     10000000b
  190. ESP_SID_RXBOTH  EQU     00010001b
  191. ESP_SID_TXBOTH  EQU     00100010b
  192. ESP_SID_PORT1   EQU     00000111b
  193. ESP_SID_PORT2   EQU     01110000b
  194.  
  195. ; Error Status bit masks
  196. ESP_ERR1_RXTO    EQU    00000001b
  197. ESP_ERR1_RXOF    EQU    00000010b
  198. ESP_ERR1_PARITY  EQU    00000100b
  199. ESP_ERR1_FRAME   EQU    00001000b
  200. ESP_ERR1_BRK     EQU    00010000b
  201. ESP_ERR1_MSR     EQU    00100000b
  202. ESP_ERR1_FLOWTO  EQU    01000000b
  203. ESP_ERR1_BRKFIN  EQU    10000000b
  204. ESP_ERR2_OFFREMOTE      EQU     00000001b
  205. ESP_ERR2_OFFLOCAL       EQU     00000010b
  206. ESP_ERR2_ONLOCAL        EQU     00000100b
  207.  
  208. ; Bit masks to build parameter for Set Mode command
  209. ESP_MODE_S              EQU     00000000b
  210. ESP_MODE_ENHANCED       EQU     00000001b
  211. ESP_MODE_RX_DMA         EQU     00010000b
  212. ESP_MODE_TX_DMA         EQU     00100000b
  213. ESP_MODE_INIT           EQU     ESP_MODE_ENHANCED OR ESP_MODE_RX_DMA OR ESP_MODE_TX_DMA
  214.  
  215. ; Bit masks to build paramters for Set IRQ command
  216. ESP_IRQ_MASK            EQU     11000000b
  217. ESP_DMA_MASK            EQU     00011110b
  218. ESP_INT_ENABLE          EQU     00000001b
  219. ESP_INT_DISABLE         EQU     00000000b
  220.  
  221. ; ESP Command Codes
  222. ESP_CMD_RESET           EQU     00h
  223. ESP_CMD_GETTEST         EQU     01h
  224. ESP_CMD_GDIPS           EQU     02h
  225. ESP_CMD_DLOAD           EQU     03h
  226. ESP_CMD_SETIRQ          EQU     04h
  227. ESP_CMD_SETDMATIME      EQU     05h
  228. ESP_CMD_SETSVCMASK      EQU     06h
  229. ESP_CMD_SETERRMASK      EQU     07h
  230. ESP_CMD_SETFCTYPE       EQU     08h
  231. ESP_CMD_SETFCCHAR       EQU     09h
  232. ESP_CMD_SETFCLEVEL      EQU     0Ah
  233. ESP_CMD_SETTRIGGER      EQU     0Bh
  234. ESP_CMD_SETRXTIME       EQU     0Ch
  235. ESP_CMD_SETFCTIME       EQU     0Dh
  236. ESP_CMD_WRITEUART       EQU     0Eh
  237. ESP_CMD_READUART        EQU     0Fh
  238. ESP_CMD_SETMODE         EQU     10h
  239. ESP_CMD_CLEARDMAREQ     EQU     11h
  240. ESP_CMD_GETERRS         EQU     12h
  241. ESP_CMD_GETUARTS        EQU     13h
  242. ESP_CMD_GETRXBYTES      EQU     14h
  243. ESP_CMD_GETTXBYTES      EQU     15h
  244. ESP_CMD_DMARX           EQU     16h
  245. ESP_CMD_DMATX           EQU     17h
  246. ESP_CMD_XOFFLOCAL       EQU     18h
  247. ESP_CMD_XONLOCAL        EQU     19h
  248. ESP_CMD_BREAK           EQU     1Ah
  249. ESP_CMD_FLUSHRX         EQU     1Bh
  250. ESP_CMD_FLUSHTX         EQU     1Ch
  251. ESP_CMD_SETBAUD         EQU     1Dh
  252.  
  253. ; Add these offsets commands to get port-specific command code
  254. ESP_OFFSET_PORT1        EQU     00h
  255. ESP_OFFSET_PORT2        EQU     80h
  256.  
  257.  
  258. ; Bit masks to build parameters for Set FCType command
  259. ESP_FC1_RX_XO            EQU     00000001b
  260. ESP_FC1_XPARENT_XO       EQU     00000010b
  261. ESP_FC1_RX_RTS           EQU     00000100b
  262. ESP_FC1_RX_DTR           EQU     00001000b
  263. ESP_FC1_ON_RTS           EQU     00010000b
  264. ESP_FC1_ON_DTR           EQU     00100000b
  265. ESP_FC1_LOOP             EQU     01000000b
  266. ESP_FC1_TX_XO            EQU     10000000b
  267. ESP_FC2_TX_CTS           EQU     00010000b
  268. ESP_FC2_TX_DSR           EQU     00100000b
  269.  
  270. ; Bit masks to build parameters for SetSvcMask command
  271. ESP_SVC_MASK_ALL        EQU     11111111b
  272. ESP_SVC_MASK_NONE       EQU     00000000b
  273. ESP_SVC_MASK_PORT1      EQU     00000111b
  274. ESP_SVC_MASK_PORT2      EQU     01110000b
  275. ESP_SVC_MASK_TX1        EQU     00000010b
  276. ESP_SVC_MASK_TX2        EQU     00100000b
  277.  
  278. ESP_DEF_BAUD            EQU     1200
  279. ESP_DEF_RX_TIME         EQU     4*8     ; 4 char times at 1200 baud
  280. ESP_DEF_DMA_TIME        EQU     100
  281.  
  282. ESP_DEF_ERR1    EQU     ESP_ERR1_RXTO or ESP_ERR1_RXOF or ESP_ERR1_PARITY or ESP_ERR1_FRAME
  283. ESP_DEF_ERR2    EQU     ESP_ERR2_OFFLOCAL or ESP_ERR2_ONLOCAL
  284.  
  285. ESP_DEF_FLOW_OFF        EQU     60
  286. ESP_DEF_FC_LEVEL_OFF    EQU     768             ; (3/4 buffer size)
  287. ESP_FC_LEVEL_OFF    EQU     768             ; (3/4 buffer size)
  288. ESP_DEF_FC_LEVEL_ON     EQU     512             ; (1/2 buffer size)
  289. ESP_FC_LEVEL_ON     EQU     512             ; (1/2 buffer size)
  290. ESP_DEF_TRIGGER_RX      EQU     256             ; (1/4 buffer size)
  291. ESP_DEF_TRIGGER_TX      EQU     768             ; (3/4 buffer size)
  292. ESP_TRIGGER_TX_EMPTY    EQU     1023            ; room for 1023 bytes = buffer empty
  293.  
  294. DC1     EQU     11h
  295. DC3     EQU     13h
  296. DLE     EQU     7Fh
  297. XMASK   EQU     21h
  298. PMASK   EQU     0FFh
  299.  
  300. ; The macros PWRITE, PREAD, and ISSUE may be used at interrupt time to
  301. ; communicate with the ESP.
  302. PWRITE  MACRO   reg,value
  303.         LOCAL   Loop
  304.  
  305. IF (reg EQ ESP_R_CMD1)
  306.    bit = ESP_RDY_CMD1
  307. ENDIF
  308.  
  309. IF (reg EQ ESP_R_CMD2)
  310.    bit = ESP_RDY_CMD2
  311. ENDIF
  312.  
  313.         mov     dx,[di].pi_address
  314. Loop:   in      al,dx
  315.         test    al,bit
  316.         jz      Loop
  317.  
  318.         add     dx,reg
  319.         mov     al,value
  320.         out     dx,al
  321.  
  322. ENDM
  323.  
  324. PREAD   MACRO   reg
  325.         LOCAL   Loop
  326.  
  327. IF (reg EQ ESP_R_STATUS1)
  328.    bit = ESP_RDY_STATUS1
  329. ENDIF
  330.  
  331. IF (reg EQ ESP_R_STATUS2)
  332.    bit = ESP_RDY_STATUS2
  333. ENDIF
  334.  
  335. ; no waiting for RR or SID
  336. IFE (reg EQ ESP_R_RDY) OR (reg EQ ESP_R_SID)
  337.         mov     dx,[di].pi_address
  338. Loop:   in      al,dx
  339.         test    al,bit
  340.         jz      Loop
  341. ENDIF
  342.         add     dx,reg
  343.         in      al,dx
  344. ENDM
  345.  
  346. ISSUE   MACRO   cmd,cmd2,cmd3,cmd4,cmd5
  347.  
  348.         PWRITE  ESP_R_CMD1,cmd
  349.  
  350. IFNB    <cmd2>
  351.         PWRITE  ESP_R_CMD2,cmd2
  352. ENDIF
  353.  
  354. IFNB    <cmd3>
  355.         PWRITE  ESP_R_CMD2,cmd3
  356. ENDIF
  357.  
  358. IFNB    <cmd4>
  359.         PWRITE  ESP_R_CMD2,cmd4
  360. ENDIF
  361.  
  362. IFNB    <cmd5>
  363.         PWRITE  ESP_R_CMD2,cmd5
  364. ENDIF
  365.  
  366. ENDM
  367.  
  368. GetAddressDIPs  MACRO
  369.         TalkToESP     ESP_CMD_GDIPS,0,1
  370. ENDM
  371.  
  372. SetIRQ  MACRO           irq
  373.         TalkToESP     ESP_CMD_SETIRQ,1,0,irq
  374. ENDM
  375.  
  376. SetDMATimeout   MACRO   to
  377.         TalkToESP     ESP_CMD_SETDMATIME,1,0,to
  378. ENDM
  379.  
  380. SetSvcMask      MACRO           mask
  381.         TalkToESP     ESP_CMD_SETSVCMASK,1,0,mask
  382. ENDM
  383.  
  384. SetErrorMask    MACRO           mask1,mask2
  385.         TalkToESP     ESP_CMD_SETERRMASK,2,0,mask1,mask2
  386. ENDM
  387.  
  388. SetFCType       MACRO           fc1,fc2
  389.         TalkToESP     ESP_CMD_SETFCTYPE,2,0,fc1,fc2
  390. ENDM
  391.  
  392. SetFCChar       MACRO           on,off,escape,exor,parity
  393.         TalkToESP    ESP_CMD_SETFCCHAR,5,0,on,off,escape,exor,parity
  394. ENDM
  395.  
  396. SetFCLevel      MACRO           msboff,lsboff,msbon,lsbon
  397.         TalkToESP    ESP_CMD_SETFCLEVEL,4,0,msboff,lsboff,msbon,lsbon
  398. ENDM
  399.  
  400. SetTriggers     MACRO           msbrx,lsbrx,msbtx,lsbtx
  401.         TalkToESP    ESP_CMD_SETTRIGGER,4,0,msbrx,lsbrx,msbtx,lsbtx
  402. ENDM
  403.  
  404. SetRxTimeout    MACRO           timeout
  405.         TalkToESP     ESP_CMD_SETRXTIME,1,0,timeout
  406. ENDM
  407.  
  408. SetFlowOffTimeout MACRO         timeout
  409.         TalkToESP     ESP_CMD_SETFCTIME,1,0,timeout
  410. ENDM
  411.  
  412. SetMode         MACRO           mode
  413.         TalkToESP     ESP_CMD_SETMODE,1,0,mode
  414. ENDM
  415.  
  416. WriteToUART     MACRO           reg,val
  417.         TalkToESP     ESP_CMD_WRITEUART,2,0,reg,val
  418. ENDM
  419.  
  420. ReadFromUART    MACRO           reg
  421.         TalkToESP     ESP_CMD_READUART,1,1,reg
  422. ENDM
  423.  
  424. GetErrorStatus  MACRO
  425.         TalkToESP       ESP_CMD_GETERRS,0,2
  426. ENDM
  427.  
  428. GetUARTStatus   MACRO
  429.         TalkToESP     ESP_CMD_GETUARTS,0,2
  430. ENDM
  431.  
  432. FlushRxFIFO     MACRO
  433.         TalkToESP     ESP_CMD_FLUSHRX,0,0
  434. ENDM
  435.  
  436. FlushTxFIFO     MACRO
  437.         TalkToESP     ESP_CMD_FLUSHTX,0,0
  438. ENDM
  439.  
  440. LocalXon        MACRO
  441.         TalkToESP     ESP_CMD_XONLOCAL,0,0
  442. ENDM
  443.  
  444. LocalXoff       MACRO
  445.         TalkToESP     ESP_CMD_XOFFLOCAL,0,0
  446. ENDM
  447.  
  448. GetRxBytes      MACRO
  449.         TalkToESP     ESP_CMD_GETRXBYTES,0,2
  450. ENDM
  451.  
  452. GetTxBytes      MACRO
  453.         TalkToESP     ESP_CMD_GETTXBYTES,0,2
  454. ENDM
  455.  
  456. ChangeBaud      MACRO           msbdiv,lsbdiv
  457.         TalkToESP     ESP_CMD_SETBAUD,2,0,msbdiv,lsbdiv
  458. ENDM
  459.  
  460. SendBreak       MACRO           duration
  461.         TalkToESP     ESP_CMD_BREAK,1,0,duration
  462. ENDM
  463.  
  464. TalkToESP     MACRO   cmd,nwrites,nreads,w1,w2,w3,w4,w5
  465.                 LOCAL   noadd
  466.  
  467.         SaveReg         <ax>
  468.         mov     al,cmd
  469.         cmp     al,ESP_CMD_SETSVCMASK
  470.         jbe     noadd
  471.         cmp     al,ESP_CMD_CLEARDMAREQ
  472.         je      noadd
  473.         ; All other commands have different codes for each ESP port
  474.         add     al,[si].ci_cmd_offset
  475. noadd:  mov     [si].ci_parm_area.cmd_code,al
  476.         RestoreReg      <ax>
  477.         mov     [si].ci_parm_area.num_writes,nwrites
  478.         mov     [si].ci_parm_area.num_reads,nreads
  479.         IFIDN   <nwrites>,<1>
  480.                 IFB   <w1>
  481.                 .ERR
  482.                 %OUT  ERROR - Missing 1st write parameter
  483.                 ELSE
  484.                 mov     [si].ci_parm_area.writes,w1
  485.                 ENDIF
  486.         ENDIF
  487.  
  488.         IFIDN   <nwrites>,<2>
  489.                   IFB   <w1>
  490.                   .ERR
  491.                   %OUT  ERROR - Missing  1st write parameter
  492.                   ELSE
  493.                   mov     [si].ci_parm_area.writes,w1
  494.                   ENDIF
  495.  
  496.                   IFB   <w2>
  497.                   .ERR
  498.                   %OUT  ERROR - Missing 2nd write parameter
  499.                   ELSE
  500.                  mov     [si].ci_parm_area.writes+1,w2
  501.                   ENDIF
  502.                 ENDIF
  503.  
  504.                 IFIDN   <nwrites>,<3>
  505.                   IFB   <w1>
  506.                   .ERR
  507.                   %OUT  ERROR - Missing 1st write parameter
  508.                   ELSE
  509.                   mov     [si].ci_parm_area.writes,w1
  510.                   ENDIF
  511.  
  512.                   IFB   <w2>
  513.                   .ERR
  514.                   %OUT  ERROR - Missing 2nd write parameter
  515.                   ELSE
  516.                   mov     [si].ci_parm_area.writes+1,w2
  517.                   ENDIF
  518.  
  519.                   IFB   <w3>
  520.                   .ERR
  521.                   %OUT  ERROR - Missing 3rd write parameter
  522.                   ELSE
  523.                   mov     [si].ci_parm_area.writes+2,w3
  524.                   ENDIF
  525.                 ENDIF
  526.  
  527.                IFIDN   <nwrites>,<4>
  528.                   IFB   <w1>
  529.                   .ERR
  530.                   %OUT  ERROR - Missing 1st write parameter
  531.                   ELSE
  532.                   mov     [si].ci_parm_area.writes,w1
  533.                   ENDIF
  534.  
  535.                   IFB   <w2>
  536.                   .ERR
  537.                   %OUT  ERROR - Missing 2nd write parameter
  538.                   ELSE
  539.                   mov     [si].ci_parm_area.writes+1,w2
  540.                   ENDIF
  541.  
  542.                   IFB   <w3>
  543.                    .ERR
  544.                   %OUT  ERROR - Missing 3rd write parameter
  545.                   ELSE
  546.                   mov     [si].ci_parm_area.writes+2,w3
  547.                   ENDIF
  548.  
  549.                   IFB   <w4>
  550.                  .ERR
  551.                   %OUT  ERROR - Missing 4th write parameter
  552.                   ELSE
  553.                   mov     [si].ci_parm_area.writes+3,w4
  554.                   ENDIF
  555.                 ENDIF
  556.  
  557.                IFIDN   <nwrites>,<5>
  558.                   IFB   <w1>
  559.                  .ERR
  560.                   %OUT  ERROR - Missing 1st write parameter
  561.                   ELSE
  562.                   mov     [si].ci_parm_area.writes,w1
  563.                   ENDIF
  564.  
  565.                   IFB   <w2>
  566.                   .ERR
  567.                   %OUT  ERROR - Missing 2nd write parameter
  568.                   ELSE
  569.                   mov     [si].ci_parm_area.writes+1,w2
  570.                   ENDIF
  571.  
  572.                   IFB   <w3>
  573.                   .ERR
  574.                   %OUT  ERROR - Missing 3rd write parameter
  575.                   ELSE
  576.                   mov     [si].ci_parm_area.writes+2,w3
  577.                   ENDIF
  578.  
  579.                   IFB   <w4>
  580.                   .ERR
  581.                   %OUT  ERROR - Missing 4th write parameter
  582.                   ELSE
  583.                   mov     [si].ci_parm_area.writes+3,w4
  584.                   ENDIF
  585.  
  586.                   IFB   <w5>
  587.                   .ERR
  588.                   %OUT  ERROR - Missing 5th write parameter
  589.                   ELSE
  590.                   mov     [si].ci_parm_area.writes+4,w5
  591.                   ENDIF
  592.  
  593.                 ENDIF
  594.  
  595.                 CALL    IssueESPCmd
  596.  
  597.                 IFIDN   <nreads>,<1>
  598.                 mov     al,[si].ci_parm_area.reads
  599.                 ENDIF
  600.  
  601.                 IFIDN   <nreads>,<2>
  602.                 mov     al,[si].ci_parm_area.reads
  603.                 mov     ah,[si].ci_parm_area.reads+1
  604.                 ENDIF
  605. ENDM
  606.  
  607.