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 #include <dos.h>
00034 #include "clib/hwapi.h"
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 void pfe_enable_bus (unsigned mask, unsigned char ale)
00048 {
00049
00050 asm mov ah, PFE_ENABLE_DATA_BUS
00051 asm mov al, ale
00052 asm mov dx, mask
00053 asm int PFE_INT
00054 }
00055
00056
00057
00058
00059 void pfe_enable_adr (unsigned char adr)
00060 {
00061
00062 asm mov ah, PFE_ENABLE_NON_MULTI_ADDR_BUS;
00063 asm mov dx, 1
00064 asm mov cl, adr
00065 asm shl dx, cl ;
00066 asm int PFE_INT
00067 }
00068
00069
00070
00071
00072 void pfe_enable_pcs (unsigned char pcs)
00073 {
00074
00075 asm mov ah, PFE_ENABLE_PCS;
00076 asm mov dx, 1
00077 asm mov cl, pcs
00078 asm shl dx, cl ;
00079 asm int PFE_INT
00080 }
00081
00082
00083
00084
00085 void pfe_enable_int (unsigned char irq)
00086 {
00087
00088 asm mov ah, PFE_ENABLE_EXTERNAL_IRQ;
00089 asm mov dx, 1
00090 asm mov cl, irq
00091 asm shl dx, cl ;
00092 asm int PFE_INT
00093 }
00094
00095
00096
00097
00098 void pfe_enable_timer (unsigned mode)
00099 {
00100
00101 asm mov ah, PFE_ENABLE_EXTERNAL_TIMER;
00102 asm mov dx, mode
00103 asm int PFE_INT
00104 }
00105
00106
00107
00108
00109 void pfe_set_edge_level_intr_mode(unsigned char mode, unsigned mask)
00110 {
00111
00112 asm mov ah, PFE_SET_EDGE_LEVEL_INTR_MODE;
00113 asm mov al, mode
00114 asm mov dx, mask
00115 asm int PFE_INT
00116 }
00117
00118
00119
00120
00121
00122 void pfe_enable_pwd(void)
00123 {
00124
00125 asm mov ah, PFE_ENABLE_PWD;
00126 asm int PFE_INT
00127 }
00128
00129
00130
00131
00132 int pfe_enable_external_dma( unsigned char channel)
00133 {
00134 int retval;
00135
00136
00137 asm mov ah, PFE_ENABLE_EXTERNAL_DMA;
00138 asm mov al, channel
00139 asm int PFE_INT
00140 asm mov retval, ax
00141 return retval;
00142 }
00143
00144
00145
00146
00147
00148 void pfe_enable_int_cascade_mode(void)
00149 {
00150
00151 asm mov ah, PFE_ENABLE_INT_CASCADE_MODE;
00152 asm int PFE_INT
00153 }
00154
00155
00156
00157
00158
00159
00160 void pfe_enable_pio (unsigned pio, unsigned char mode)
00161 {
00162 pio = 1 << pio;
00163
00164
00165 asm mov ah, PFE_ENABLE_PIO;
00166 asm mov al, mode
00167 asm mov dx, pio
00168 asm int PFE_INT
00169 }
00170
00171
00172
00173
00174 void pfe_get_pio_state (unsigned *wPio, unsigned *wInp, unsigned *wOut)
00175 {
00176 unsigned p, i, o;
00177
00178 asm mov ah, PFE_ENABLE_PIO;
00179 asm mov al, 0
00180 asm int PFE_INT
00181 asm mov p, ax
00182 asm mov i, dx
00183 asm mov o, cx
00184
00185 *wPio = p;
00186 *wInp = i;
00187 *wOut = o;
00188 }
00189
00190
00191
00192
00193 void hal_get_pio_output_state (unsigned *pins, unsigned wOut)
00194 {
00195 unsigned p;
00196
00197
00198 asm mov ah, PFE_ENABLE_PIO;
00199 asm mov bx, 0xFFFF
00200 asm xor cx, cx ;
00201 asm int HAL_INT
00202 asm and ax, wOut
00203 asm mov p, ax
00204
00205 *pins = p;
00206 }
00207
00208
00209
00210
00211 unsigned char hal_read_bus (unsigned adr, unsigned wAND, unsigned wXOR)
00212 {
00213 unsigned char retval;
00214
00215
00216 asm mov ah, HAL_READ_DATA_BUS;
00217 asm mov di, adr
00218 asm mov bx, wAND
00219 asm mov cx, wXOR
00220 asm int HAL_INT
00221 asm mov retval, al
00222
00223 return retval;
00224 }
00225
00226
00227
00228
00229 void hal_write_bus (unsigned adr, unsigned char value, unsigned wAND, unsigned wXOR)
00230 {
00231
00232 asm mov ah, HAL_WRITE_DATA_BUS;
00233 asm mov di, adr
00234 asm mov dh, 0
00235 asm mov dl, value
00236 asm mov bx, wAND
00237 asm mov cx, wXOR
00238 asm int HAL_INT
00239 }
00240
00241
00242
00243
00244 void hal_readblock_bus (unsigned adr0, unsigned adr1, unsigned char *buf, unsigned cnt)
00245 {
00246
00247 _ES = FP_SEG(buf);
00248 _BX = FP_OFF(buf);
00249 asm mov ah, HAL_BLOCK_READ_DATA_BUS;
00250 asm mov di, adr0
00251 asm mov si, adr1
00252 asm mov cx, cnt
00253 asm int HAL_INT
00254 }
00255
00256
00257
00258
00259 void hal_writeblock_bus (unsigned adr0, unsigned adr1, unsigned char *buf, unsigned cnt)
00260 {
00261
00262 _ES = FP_SEG(buf);
00263 _BX = FP_OFF(buf);
00264 asm mov ah, HAL_BLOCK_WRITE_DATA_BUS;
00265 asm mov di, adr0
00266 asm mov si, adr1
00267 asm mov cx, cnt
00268 asm int HAL_INT
00269 }
00270
00271
00272
00273
00274 unsigned hal_read_pios (unsigned wAND, unsigned wXOR)
00275 {
00276 unsigned retval;
00277
00278
00279 asm mov ah, HAL_READ_PIO
00280 asm mov bx, wAND
00281 asm mov cx, wXOR
00282 asm int HAL_INT
00283 asm mov retval, ax
00284
00285 return retval;
00286 }
00287
00288
00289
00290
00291 void hal_write_pios (unsigned value, unsigned wAND, unsigned wXOR)
00292 {
00293
00294 asm mov ah, HAL_WRITE_PIO
00295 asm mov dx, value
00296 asm mov bx, wAND
00297 asm mov cx, wXOR
00298 asm int HAL_INT
00299 }
00300
00301
00302
00303
00304 unsigned char hal_read_pio (unsigned char pio)
00305 {
00306 unsigned retval;
00307
00308 asm mov ah, HAL_READ_SPECIFIC_PIO
00309 asm mov al, pio
00310 asm int HAL_INT
00311 asm mov retval, ax
00312
00313 if (retval) return 1;
00314 else return 0;
00315 }
00316
00317
00318
00319
00320 void hal_write_pio (unsigned char pio, unsigned value)
00321 {
00322 asm mov ah, HAL_WRITE_SPECIFIC_PIO
00323 asm mov al, pio
00324 asm mov dx, value
00325 asm int HAL_INT
00326 }
00327
00328
00329
00330
00331 InterruptHandler hal_install_isr (unsigned irq, unsigned count, InterruptHandler handler)
00332 {
00333 InterruptHandler oldhandler;
00334 unsigned rbx, res;
00335
00336
00337 asm les bx, handler ;
00338 asm mov ah, HAL_INSTALL_ISR;
00339 asm mov dx, irq
00340 asm mov cx, count
00341 asm int HAL_INT
00342 asm mov rbx, bx
00343 asm mov res, es
00344
00345 oldhandler = (InterruptHandler) MK_FP(res,rbx);
00346
00347 return oldhandler;
00348 }
00349
00350
00351
00352
00353 void hal_init_timer (unsigned char timer, unsigned mode, unsigned divider)
00354 {
00355
00356 asm mov ah, HAL_INIT_TIMER;
00357 asm mov al, timer
00358 asm mov dx, mode
00359 asm mov cx, divider
00360 asm int HAL_INT
00361 }
00362
00363
00364
00365
00366 void hal_start_timer (unsigned char timer)
00367 {
00368
00369 asm mov ah, HAL_START_TIMER;
00370 asm mov al, timer
00371 asm int HAL_INT
00372 }
00373
00374
00375
00376
00377 void hal_stop_timer (unsigned char timer)
00378 {
00379
00380 asm mov ah, HAL_STOP_TIMER;
00381 asm mov al, timer
00382 asm int HAL_INT
00383 }
00384
00385
00386
00387
00388 unsigned hal_read_timer_count (unsigned char timer, unsigned far *maxcount)
00389 {
00390 unsigned retval, count;
00391
00392
00393 asm mov ah, HAL_READ_TIMER_COUNT;
00394 asm mov al, timer
00395 asm int HAL_INT
00396 asm mov count, dx
00397 asm mov retval, ax
00398
00399 *maxcount = count;
00400 return retval;
00401 }
00402
00403
00404
00405
00406 void hal_write_timer_count (unsigned char timer, unsigned counter)
00407 {
00408
00409 asm mov ah, HAL_WRITE_TIMER_COUNT;
00410 asm mov al, timer
00411 asm mov dx, counter
00412 asm int HAL_INT
00413 }
00414
00415
00416
00417
00418 unsigned char hal_set_watchdog_mode (unsigned char mode)
00419 {
00420 unsigned char retval;
00421
00422
00423 asm mov ah, HAL_GET_SET_WATCHDOG_MODE;
00424 asm mov al, mode
00425 asm int HAL_INT
00426 asm mov retval, al
00427
00428 return retval;
00429 }
00430
00431
00432
00433
00434 void hal_refresh_watchdog (void)
00435 {
00436
00437 asm mov ah, HAL_REFRESH_WATCHDOG;
00438 asm int HAL_INT
00439 }
00440
00441
00442
00443
00444
00445 unsigned long hal_get_frequencies( unsigned char frq )
00446 {
00447 unsigned hword, lword;
00448
00449
00450 asm mov ah, HAL_GET_FREQUENCIES;
00451 asm mov al, frq
00452 asm int HAL_INT
00453
00454 asm mov hword, dx
00455 asm mov lword, ax
00456
00457 return ((unsigned long)hword<<16)+lword;
00458 }
00459
00460
00461
00462
00463
00464 void hal_set_duty_cycle_waveform( unsigned char timer, int mode,
00465 unsigned clock_divider )
00466 {
00467
00468 asm mov ah, HAL_SET_DUTY_CYCLE_WAVEFORM;
00469 asm mov al, timer
00470 asm mov dx, mode
00471 asm mov cx, clock_divider
00472 asm int HAL_INT
00473
00474 return;
00475 }
00476
00477
00478
00479
00480 void hal_give_eoi( unsigned char intr_no )
00481 {
00482
00483 asm mov ah, HAL_GIVE_EOI;
00484 asm mov al, intr_no
00485 asm int HAL_INT
00486 return;
00487 }
00488
00489
00490
00491
00492
00493 void hal_start_dma( unsigned char channel, Dma_Info *dmaInfo )
00494 {
00495 unsigned long src;
00496 unsigned long dest;
00497 struct SREGS segregs;
00498 union REGS regs;
00499
00500
00501 if ( dmaInfo->ctrl_reg&DMA_SRCMEM )
00502 {
00503 src = FP_SEG(dmaInfo->src.mem);
00504 src *= 0x10;
00505 src += FP_OFF(dmaInfo->src.mem);
00506 }
00507 else src = dmaInfo->src.io;
00508
00509
00510 if ( dmaInfo->ctrl_reg&DMA_DESTMEM )
00511 {
00512 dest = FP_SEG(dmaInfo->dest.mem);
00513 dest *= 0x10;
00514 dest += FP_OFF(dmaInfo->dest.mem);
00515 }
00516 else dest = dmaInfo->dest.io;
00517
00518
00519 regs.h.ah = HAL_START_DMA;
00520 regs.h.al = channel;
00521 regs.x.cx = dmaInfo->count;
00522 regs.x.dx = dmaInfo->ctrl_reg;
00523 regs.x.bx = FP_SEG(&src);
00524 regs.x.si = FP_OFF(&src);
00525 segregs.es = FP_SEG(&dest);
00526 regs.x.di = FP_OFF(&dest);
00527 int86x( HAL_INT, ®s, ®s, &segregs );
00528 return;
00529 }
00530
00531
00532
00533
00534 int hal_stop_dma( unsigned char channel )
00535 {
00536 int retval;
00537
00538 asm mov ah, HAL_STOP_DMA
00539 asm mov al, channel
00540 asm int HAL_INT
00541 asm mov retval, ax
00542 return retval;
00543 }
00544
00545
00546
00547
00548
00549 int hal_get_dma_info( unsigned char channel, Dma_Info *dmaInfo )
00550 {
00551 unsigned long src;
00552 unsigned long dest;
00553 unsigned ioff, iseg;
00554 struct SREGS segregs;
00555 union REGS regs;
00556
00557
00558 regs.h.ah = HAL_GET_DMA_INFO;
00559 regs.h.al = channel;
00560 regs.x.bx = FP_SEG(&src);
00561 regs.x.si = FP_OFF(&src);
00562 segregs.es = FP_SEG(&dest);
00563 regs.x.di = FP_OFF(&dest);
00564 int86x( HAL_INT, ®s, ®s, &segregs );
00565
00566 dmaInfo->ctrl_reg = regs.x.dx;
00567 dmaInfo->count = regs.x.cx;
00568
00569
00570 if ( dmaInfo->ctrl_reg&DMA_SRCMEM )
00571 {
00572 iseg = (unsigned)(src/0x10);
00573 ioff = (unsigned)(src-((unsigned long)iseg*0x10));
00574 dmaInfo->src.mem = MK_FP( iseg, ioff );
00575 }
00576 else dmaInfo->src.io = (unsigned)src;
00577
00578
00579 if ( dmaInfo->ctrl_reg&DMA_DESTMEM )
00580 {
00581 iseg = (unsigned)(src/0x10);
00582 ioff = (unsigned)(src-((unsigned long)iseg*0x10));
00583 dmaInfo->dest.mem = MK_FP( iseg, ioff );
00584 }
00585 else dmaInfo->dest.io = (unsigned)dest;
00586
00587 return regs.x.ax;
00588 }
00589
00590
00591
00592
00593
00594 int hal_init_restore_non_volatile_data( Remop *remop )
00595 {
00596 int retval;
00597
00598 asm les bx, remop
00599 asm mov ah, HAL_INIT_REST_NON_VOLATILE_DATA
00600 asm int HAL_INT
00601 asm mov retval, ax
00602 return retval;
00603 }
00604
00605
00606
00607
00608
00609 void hal_save_non_volatile_data(void)
00610 {
00611 asm mov ah, HAL_SAVE_NON_VOLATILE_DATA
00612 asm int HAL_INT
00613 }
00614
00615
00616
00617
00618
00619 int hal_get_reboot_reason(void)
00620 {
00621 int retval;
00622
00623 asm mov ah, HAL_GET_REBOOT_REASON
00624 asm int HAL_INT
00625 asm mov retval, ax
00626 return retval;
00627 }
00628
00629
00630
00631
00632
00633
00634