| version 1.1, 2004/08/01 05:31:32 | version 1.8, 2004/08/11 16:09:04 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 |  | #include        "z80core.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
| #include        "x1_io.h" | #include        "ievent.h" | 
| #include        "x1_fdc.h" |  | 
 |  |  | 
 |  |  | 
 | void z80dmap(void) { | void z80dmap(void) { | 
 | #if 0 |  | 
 | UINT8   al; |  | 
 |  |  | 
| al = dma.DMA_CMND; | UINT16  *off1; | 
| if ((al & 3) == 0) return; | UINT16  *off2; | 
| if (dma.DMA_ENBL == 0) return; | REG8    flag1; | 
| if (dma.ENDB_FLG != 0) return; | REG8    flag2; | 
| if (al & 2) { | UINT    addr; | 
| if (dma.MACH_FLG != 0) return; | REG8    dat; | 
| } |  | 
| if (dma.DMA_MODE != 1) { |  | 
| al = dma.WR[5] ^ dma.DMA_REDY |  | 
| if (al & 8) return; |  | 
| } |  | 
 |  |  | 
 |  | if (!dma.working) { | 
 |  | return; | 
 |  | } | 
 |  |  | 
 |  | if (dma.WR[0] & 4) { | 
 |  | off1 = &dma.CNT_A.w; | 
 |  | flag1 = dma.WR[1]; | 
 |  | off2 = &dma.CNT_B.w; | 
 |  | flag2 = dma.WR[2]; | 
 |  | } | 
 |  | else { | 
 |  | off2 = &dma.CNT_A.w; | 
 |  | flag2 = dma.WR[1]; | 
 |  | off1 = &dma.CNT_B.w; | 
 |  | flag1 = dma.WR[2]; | 
 |  | } | 
 |  |  | 
| #if 0 | do {            // dma_lp | 
| dmaintmain:             push    ebx | addr = *off1; | 
| mov             ebx, offset dma.CNT_A | if (flag1 & 8) { | 
| mov             ecx, offset dma.CNT_B | dat = iocore_inp(addr); | 
|  | } | 
| mov             dx, word ptr (dma.WR[1]) | else { | 
| test    dma.WR[0], 4 | dat = mem_read8(addr); | 
| jne             dma_lp | } | 
| xchg    ebx, ecx | if (dma.cmd & 1) { | 
| xchg    dl, dh | addr = *off2; | 
|  | if (flag2 & 8) { | 
| dma_lp:                 cmp             dma.ENDB_FLG, 0 | iocore_out(addr, dat); | 
| jne             dmalpend | } | 
| test    dma.DMA_CMND, 2 | else { | 
| je              dma_lpst | mem_write8(addr, dat); | 
| cmp             dma.MACH_FLG, 0 | } | 
| jne             dmalpend | } | 
| dma_lpst: | if (dma.cmd & 2) { | 
| push    ecx | if (!((dat ^ dma.MACH_BYT) & (~dma.MASK_BYT))) { | 
| movzx   ecx, word ptr [ebx] | dma.working = FALSE; | 
| test    dl, 8 | dma.MACH_FLG = 1; | 
| jne             dma_inport | } | 
| call    fast_RDMEM | } | 
| dmasrcend:              pop             ecx | if (dma.mode != 1) { | 
|  | dma.DMA_STOP = (dma.WR[5] ^ dma.ready) & 8; | 
| test    dma.DMA_CMND, 1 | if (dma.DMA_STOP) { | 
| je              dmadstend | dma.working = FALSE;                    // 既にセットされてる筈だが | 
|  | goto dma_stop; | 
| push    eax | } | 
| push    ecx | } | 
| push    edx | if (!(flag1 & 0x20)) { | 
| movzx   ecx, word ptr [ecx] | *off1 += (flag1 & 0x10)?1:-1; | 
| mov             dl, al | } | 
| test    dh, 8 | if (!(flag2 & 0x20)) { | 
| jne             dma_outport | *off2 += (flag2 & 0x10)?1:-1; | 
| call    fast_WRMEM | } | 
| dmadstend:              pop             edx |  | 
| pop             ecx | dma_stop: | 
| pop             eax | dma.BYT_N.w++; | 
|  | if (dma.BYT_N.w == 0) { | 
| test    dma.DMA_CMND, 2 | dma.working = FALSE; | 
| je              dmamachcend | dma.ENDB_FLG = 1; | 
| xor             al, dma.MACH_BYT | goto intr; | 
| mov             ah,     dma.MASK_BYT | } | 
| not             ah | if ((dma.BYT_L.w) && (dma.BYT_L.w != 0xffff) && (dma.BYT_N.w >= (dma.BYT_L.w + 1))) { | 
| and             al, ah | dma.working = FALSE; | 
| jne             short dmamachcend | dma.ENDB_FLG = 1; | 
| mov             dma.MACH_FLG, 1 | goto intr; | 
| dmamachcend: | } | 
| cmp             dma.DMA_MODE, 1 | if (!dma.working) { | 
| je              forcesrcaddr | goto intr; | 
| mov             al, dma.WR[5] | } | 
| xor             al, dma.DMA_REDY | } while(dma.mode); | 
| and             al, 8 | return; | 
| mov             dma.DMA_STOP, al |  | 
| jne             dmadststpend | intr: | 
|  | if (dma.INT_ENBL) { | 
| forcesrcaddr:   test    dl, 20h | ievent_set(IEVENT_DMA); | 
| jne             dmasrcstpend | } | 
| test    dl, 10h |  | 
| je              dmasrcdec |  | 
| inc             word ptr [ebx] |  | 
| jmp             dmasrcstpend |  | 
| dmasrcdec:                      dec             word ptr [ebx] |  | 
| dmasrcstpend: |  | 
| test    dh, 20h |  | 
| jne             dmadststpend |  | 
| test    dh, 10h |  | 
| je              dmadstdec |  | 
| inc             word ptr [ecx] |  | 
| jmp             dmadststpend |  | 
| dmadstdec:                      dec             word ptr [ecx] |  | 
| dmadststpend: |  | 
| inc             dma.BYT_N.w |  | 
| je              dmaforceend |  | 
| mov             ax, dma.BYT_L.w |  | 
| or              ax, ax |  | 
| je              dmplpedch                               // BYT_L == 0なら無制限? |  | 
| inc             ax |  | 
| je              dmplpedch                               // ver0.25 |  | 
| cmp             ax, dma.BYT_N.w |  | 
| ja              dmplpedch |  | 
| dmaforceend:    mov             dma.ENDB_FLG, 1 |  | 
| jmp             dmalpend |  | 
|  |  | 
| dmplpedch:              cmp             dma.DMA_MODE, 0 |  | 
| jne             dma_lp |  | 
| dmalpend: |  | 
| pop             ebx |  | 
| cmp             dma.INT_ENBL, 0 |  | 
| je              dmaintrptend |  | 
| mov             dl, 2 |  | 
| mov             al, dma.INT_FLG |  | 
| test    al, 1 |  | 
| je              dmaintrpt2ck |  | 
| cmp             dma.MACH_FLG, 0 |  | 
| jne             dmaintrptcall |  | 
| dmaintrpt2ck:   mov             dl, 4 |  | 
| test    al, 2 |  | 
| je              dmaintrptend |  | 
| cmp             dma.ENDB_FLG, 0 |  | 
| je              dmaintrptend |  | 
| dmaintrptcall:  movzx   ecx, dma.INT_VCT |  | 
| test    al, 20h |  | 
| je              dma_intrpt |  | 
| and             cl, 0f9h |  | 
| or              cl, dl |  | 
| dma_intrpt:             jmp             z80x_interrupt |  | 
| dmaintrptend:   ret |  | 
|  |  | 
|  |  | 
| dma_inport:             push    edx |  | 
| push    ebx |  | 
| cmp             cx, 0ffbh |  | 
| jne             Z80inport |  | 
| //                              cmp             s8255.IO_MODE, 0 |  | 
| //                              jne             Z80inport |  | 
| mov             fdcdummyread, 0 |  | 
| Z80inport:              call    Z80_In |  | 
| pop             ebx |  | 
| pop             edx |  | 
| jmp             dmasrcend |  | 
|  |  | 
| dma_outport:    push    ebx |  | 
| cmp             cx, 0ffbh |  | 
| jne             Z80outport |  | 
| cmp             s8255.IO_MODE, 0 |  | 
| jne             Z80outport |  | 
| mov             fdcdummyread, 0 |  | 
| Z80outport:             call    Z80_Out |  | 
| pop             ebx |  | 
| jmp             dmadstend |  | 
| #endif |  | 
| #endif |  | 
 | } | } | 
 |  |  |