00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include <dos.h>
00049 #include <stdio.h>
00050 #include "fossil.h"
00051
00052 #define FOSSILVECT 0x14
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 int fossil_init(int port)
00065 {
00066 union REGS inregs;
00067 union REGS outregs;
00068
00069 inregs.h.ah = 0x04;
00070 inregs.x.dx = port;
00071 int86(FOSSILVECT,&inregs,&outregs);
00072 if (outregs.x.ax==0x1954) return outregs.x.ax;
00073
00074 return 0;
00075 }
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 void fossil_deinit(int port)
00088 {
00089 union REGS inregs;
00090 union REGS outregs;
00091
00092 inregs.h.ah = 0x05;
00093 inregs.x.dx = port;
00094 int86( FOSSILVECT, &inregs, &outregs);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 int fossil_setbaud(int port, long baudrate, int parity, int wordlen, int stopbits)
00120 {
00121 union REGS inregs;
00122 union REGS outregs;
00123 long baudtab[8] = {19200l,38400l,300l,600l,1200l,2400l,4800l,9600l};
00124 int baud_idx;
00125 long baud_max,baud_div;
00126
00127
00128 for (baud_idx=0; baud_idx<=7; baud_idx++)
00129 {
00130 if (baudrate==baudtab[baud_idx]) break;
00131 }
00132
00133
00134 if (baud_idx<=7)
00135 {
00136
00137
00138 if (parity<0 || parity>2) return -1;
00139 if (parity==2) parity = 3;
00140 if (wordlen<7 || wordlen>8) return -1;
00141 wordlen = wordlen - 5;
00142 if (stopbits<1 || stopbits>2) return -1;
00143 stopbits--;
00144
00145 inregs.h.ah = 0x00;
00146 inregs.h.al = wordlen + (stopbits<<2) + (parity<<3) + (baud_idx<<5);
00147 inregs.x.dx = port;
00148 int86(0x14,&inregs,&outregs);
00149 }
00150 else
00151 {
00152
00153 if (parity<0 || parity>4) return -1;
00154 if (wordlen<7 || wordlen>8) return -1;
00155
00156
00157
00158 inregs.h.ah = 0x8A;
00159 inregs.h.al = 2;
00160 int86(0xA1,&inregs,&outregs);
00161 baud_max = (long) outregs.x.ax + ((long) outregs.x.dx << 16);
00162
00163
00164 baud_div = baud_max*10l / baudrate;
00165 if ((baud_div % 10l) < 5l) baud_div = baud_max / baudrate;
00166 else baud_div = baud_max / baudrate + 1;
00167
00168 inregs.x.cx = (unsigned int) baud_div;
00169 inregs.h.ah = 0x81;
00170 inregs.h.al = wordlen - 5;
00171 inregs.h.bh = parity;
00172 inregs.h.bl = stopbits - 1;
00173 inregs.x.dx = port;
00174 inregs.x.cx = (unsigned int) baud_div;
00175 int86(0x14,&inregs,&outregs);
00176
00177
00178 inregs.h.ah = 0x03;
00179 inregs.x.dx = port;
00180 int86(0x14,&inregs,&outregs);
00181 }
00182 return outregs.h.ah;
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 int fossil_putbyte_wait(int port, int ch)
00195 {
00196 union REGS inregs;
00197 union REGS outregs;
00198
00199 inregs.h.ah = 0x01;
00200 inregs.h.al = (char)ch;
00201 inregs.x.dx = port;
00202 int86( FOSSILVECT, &inregs, &outregs);
00203 return outregs.h.ah;
00204
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 int fossil_putbyte(int port, int ch)
00218 {
00219 union REGS inregs;
00220 union REGS outregs;
00221
00222 inregs.h.ah = 0x0B;
00223 inregs.h.al = (char)ch;
00224 inregs.x.dx = port;
00225 int86( FOSSILVECT, &inregs, &outregs);
00226 return outregs.x.ax;
00227
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 int fossil_getbyte_wait(int port)
00239 {
00240 union REGS inregs;
00241 union REGS outregs;
00242
00243 inregs.h.ah = 0x02;
00244 inregs.x.dx = port;
00245 int86( FOSSILVECT, &inregs, &outregs);
00246 return (int)outregs.h.al;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 int fossil_peek_input(int port)
00259 {
00260 union REGS inregs;
00261 union REGS outregs;
00262
00263 inregs.h.ah = 0x0C;
00264 inregs.x.dx = port;
00265 int86( FOSSILVECT, &inregs, &outregs);
00266 if (outregs.x.ax==0xFFFF) return -1;
00267
00268 return (int)outregs.h.al;
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 int fossil_status_request(int port)
00287 {
00288 union REGS inregs;
00289 union REGS outregs;
00290
00291 inregs.h.ah = 0x03;
00292 inregs.x.dx = port;
00293 int86( FOSSILVECT, &inregs, &outregs);
00294 return outregs.h.ah;
00295 }
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 void fossil_flush_output(int port)
00306 {
00307 union REGS inregs;
00308 union REGS outregs;
00309
00310 inregs.h.ah = 0x08;
00311 inregs.x.dx = port;
00312 int86( FOSSILVECT, &inregs, &outregs);
00313 }
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323 void fossil_purge_output(int port)
00324 {
00325 union REGS inregs;
00326 union REGS outregs;
00327
00328 inregs.h.ah = 0x09;
00329 inregs.x.dx = port;
00330 int86( FOSSILVECT, &inregs, &outregs);
00331 }
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341 void fossil_purge_input(int port)
00342 {
00343 union REGS inregs;
00344 union REGS outregs;
00345
00346 inregs.h.ah = 0x0A;
00347 inregs.x.dx = port;
00348 int86( FOSSILVECT, &inregs, &outregs);
00349 }
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 void fossil_set_flowcontrol(int port, int flowctrl)
00369 {
00370 union REGS inregs;
00371 union REGS outregs;
00372
00373 inregs.h.ah = 0x0F;
00374 inregs.h.al = flowctrl;
00375 inregs.x.dx = port;
00376 int86( FOSSILVECT, &inregs, &outregs);
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390 unsigned int fossil_readblock(int port, unsigned char *buffer, unsigned int count)
00391 {
00392 struct SREGS sregs;
00393 union REGS inregs;
00394 union REGS outregs;
00395
00396 inregs.h.ah = 0x18;
00397 inregs.x.cx = count;
00398 inregs.x.dx = port;
00399 sregs.es = FP_SEG(buffer);
00400 inregs.x.di = FP_OFF(buffer);
00401 int86x( FOSSILVECT, &inregs, &outregs, &sregs);
00402 return (unsigned int)outregs.x.ax;
00403 }
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416 unsigned int fossil_writeblock(int port, unsigned char *buffer, unsigned int count)
00417 {
00418 struct SREGS sregs;
00419 union REGS inregs;
00420 union REGS outregs;
00421
00422 inregs.h.ah = 0x19;
00423 inregs.x.cx = count;
00424 inregs.x.dx = port;
00425 sregs.es = FP_SEG(buffer);
00426 inregs.x.di = FP_OFF(buffer);
00427 int86x( FOSSILVECT, &inregs, &outregs, &sregs);
00428 return outregs.x.ax;
00429 }
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 void fossil_set_rs485(int port, int mode)
00448 {
00449 union REGS inregs;
00450 union REGS outregs;
00451
00452 inregs.h.ah = 0x80;
00453 inregs.h.al = mode;
00454 inregs.x.dx = port;
00455 int86( FOSSILVECT, &inregs, &outregs);
00456
00457 }
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474 void fossil_set_rs485_txenable(int port, int pin)
00475 {
00476 union REGS inregs;
00477 union REGS outregs;
00478
00479 inregs.h.ah = 0x82;
00480 inregs.h.al = pin;
00481 inregs.x.dx = port;
00482 int86( FOSSILVECT, &inregs, &outregs);
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503 void fossil_set_extctrl(int port, int baud_divider, int parity, int wordlen, int stopbits)
00504 {
00505 union REGS inregs;
00506 union REGS outregs;
00507
00508 if (parity<0 || parity>4) return;
00509 if (wordlen<7 || wordlen>8) return;
00510 if (stopbits<1 || stopbits>2) return;
00511
00512 inregs.h.ah = 0x81;
00513 inregs.h.al = wordlen-5;
00514 inregs.h.bh = parity;
00515 inregs.h.bl = stopbits-1;
00516 inregs.x.cx = baud_divider;
00517 inregs.x.dx = port;
00518 int86( FOSSILVECT, &inregs, &outregs);
00519 }
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532 int fossil_get_driver_info(int port, FossilDriverInfo_t *drv_info)
00533 {
00534 union REGS inregs;
00535 union REGS outregs;
00536 struct SREGS segregs;
00537
00538 inregs.h.ah = 0x1B;
00539 inregs.x.cx = sizeof(FossilDriverInfo_t);
00540 inregs.x.dx = port;
00541 segregs.es = FP_SEG(drv_info);
00542 inregs.x.di = FP_OFF(drv_info);
00543 int86( FOSSILVECT, &inregs, &outregs);
00544
00545 return outregs.x.ax;
00546 }
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560 void fossil_send_break(int port, unsigned char longbreak )
00561 {
00562 union REGS inregs;
00563
00564 inregs.h.ah = 0x83;
00565 inregs.h.al = longbreak;
00566 inregs.x.dx = port;
00567 int86(FOSSILVECT,&inregs,&outregs);
00568 return;
00569 }
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 int fossil_get_bytes_in_uart(int port)
00582 {
00583 union REGS inregs;
00584 union REGS outregs;
00585
00586 inregs.h.ah = 0xA0;
00587 inregs.x.dx = port;
00588 int86(FOSSILVECT,&inregs,&outregs);
00589 return outregs.x.ax;
00590 }
00591
00592
00593
00594
00595
00596