Annotation of ntddk/src/vdd/vdmints/16bits/16bits.asm, revision 1.1.1.1

1.1       root        1:     TITLE Sample 16 Bits DOS application
                      2: ;---------------------------------------------------------------;
                      3: ;
                      4:     include 16bits.inc
                      5: 
                      6:     DOSSEG
                      7:     .MODEL SMALL
                      8: 
                      9:     .STACK 100h
                     10: 
                     11:     .DATA
                     12: 
                     13: 
                     14: DMAWriteBuffer label   byte
                     15:            db      64 dup (?)
                     16: DMA_BUFFER_SIZE     equ $ - DMAWriteBuffer
                     17: 
                     18: DMAReadBuffer   label   byte
                     19:            db      DMA_BUFFER_SIZE dup (?)
                     20: 
                     21: MIOPattern  label   byte
                     22:            db      00, 0FFh, 0AAh, 055h
                     23: MIOPATTERN_SIZE equ    $ - MIOPattern
                     24: 
                     25: public start
                     26: 
                     27:     .CODE
                     28: start:
                     29:     jmp     short RealStart
                     30: OldVector   label   dword
                     31:     dd     ?
                     32: DMACompleted db     ?
                     33: 
                     34: RealStart:
                     35:     mov     ax,@DATA
                     36:     mov     ds,ax
                     37:     mov     es,ax
                     38:     assume  ds:@DATA, es:@DATA
                     39: 
                     40: ;Hook interrupt(DMA terminate count notification)
                     41:     push    ds
                     42:     mov     al, DMA_INTERRUPT
                     43:     mov     ah, 35h
                     44:     int     21h
                     45:     mov     word ptr cs:OldVector, bx
                     46:     mov     word ptr cs:OldVector + 2, es
                     47:     mov     dx, offset ISRDMACompleted
                     48:     mov     ax, cs
                     49:     mov     ds, ax
                     50:     mov     al, DMA_INTERRUPT
                     51:     mov     ah, 25h
                     52:     int     21h
                     53:     pop     ds
                     54: 
                     55: 
                     56: ;VDD operation.
                     57: ;(1). Hook the I/O port.
                     58: ;(2). Keep the port status up-to-date if a write operation is performed
                     59: ;     by 16 bits application(this program).
                     60: ;(3). Simulate DMA operation and generate a fake interrupt for 16bits
                     61: ;     applicatiion if the DMA operation reaches its TC.
                     62: ;
                     63: ;
                     64: ;16bits application
                     65: ;(1). Output one byte to the port and then request DMA operation.
                     66: ;(2). Wait for DMA operation completed.
                     67: ;(3). goto step (1) if there are more data to be transferred.
                     68: ;Note that the given I/O must be a R/W port.
                     69: 
                     70: ;Here we do a DMA write operation upon I/O mapped I/O
                     71:     mov     cx, DMA_BUFFER_SIZE
                     72:     mov     si, offset DMAWriteBuffer
                     73: DMATransferLoop_Fast:
                     74:     mov     dx, IO_PORT_DMA
                     75:     mov     al, cl
                     76:     out     dx, al                     ;write I/O the current count
                     77:     cli
                     78:     mov     cs:DMACompleted, FALSE     ;reset TC flag
                     79:     sti
                     80: ;channel #1, write op, no auto init, addr inc, single transfer
                     81:     mov     al, 01000101B
                     82:     call    SetupDMAOperation
                     83: ;Fire the DMA WRITE operation, this will cause VDD to gain control
                     84: ;and start DMA operation.
                     85:     mov     dx, IO_PORT_FIRE_DMA_FAST
                     86:     out     dx, al
                     87: ;In real world(there is a real hardware adapter), we won't do this
                     88: ;idle loop, rather, we can do something useful(like, read the DMA current
                     89: ;count and display the progress and so forth)provided that we can regain
                     90: ;control while DMA operation is in progress(VDD spawns a new thread to
                     91: ;handle DMA operation and returns to us immediately)
                     92: ;
                     93: ;Since we are simulating DMA operation without hardware, we always
                     94: ;start the DMA operation with transfer count set to 1 byte. In reality
                     95: ;this is should not be the case because it will slow down the data transfer.
                     96: 
                     97: WaitForDMA_Fast:
                     98:     cmp     cs:DMACompleted, TRUE
                     99:     jnz            WaitForDMA_Fast
                    100:     inc     si
                    101:     loop    DMATransferLoop_Fast
                    102: ;
                    103: ;Now do a DMA read operation
                    104:     mov     cx, DMA_BUFFER_SIZE
                    105:     mov     si, offset DMAWriteBuffer
                    106:     mov     di, offset DMAReadBuffer
                    107: DMATransferLoop_Slow:
                    108: ;channel #1, read op, no auto init, addr inc, single transfer
                    109:     mov     al, 01001001B
                    110:     cli
                    111:     mov     cs:DMACompleted, FALSE
                    112:     sti
                    113:     call    SetupDMAOperation
                    114: ;Fire the DMA READ operation
                    115:     mov     dx, IO_PORT_FIRE_DMA_SLOW
                    116:     out     dx, al
                    117: WaitForDMA_Slow:
                    118:     cmp     cs:DMACompleted, TRUE
                    119:     jne     WaitForDMA_Slow
                    120:     mov     dx, IO_PORT_DMA
                    121:     in     al, dx
                    122:     mov     [di], al
                    123:     inc     di                         ;advance our buffer
                    124:     inc     si                         ;and the DMA buffer
                    125:     loop    DMATransferLoop_Slow
                    126: ;
                    127: ;The DMAWriteBuffer and DMAReadBuffer should have the same contents.
                    128: ;If they don't, it failed. ....
                    129: 
                    130: 
                    131: ;Memory mapped I/O
                    132:     mov     ax, MIO_SEGMENT
                    133:     mov     es, ax
                    134:     mov     bx, MIOPATTERN_SIZE
                    135:     mov     si, offset MIOPattern
                    136: 
                    137: MIO_Loop:
                    138:     cld
                    139:     lodsb                              ;get next pattern
                    140:     mov     cx, MIO_PORT_RANGE
                    141:     mov     di, MIO_PORT_FIRST
                    142: rep stosb                              ;fill all I/O with the pattern
                    143:     mov     cx, MIO_PORT_RANGE
                    144:     dec     di
                    145:     std
                    146: repe   scasb                           ;
                    147:     je     @F
                    148: ;   call    ErrorMIO                   ;if any i/o failed,
                    149: @@:
                    150:     dec     bx                         ;next pattern
                    151:     jnz     MIO_Loop
                    152: 
                    153: ;Before terminate, retsore everything we have touched
                    154:     push    ds
                    155:     lds     dx, cs:OldVector
                    156:     mov     al, DMA_INTERRUPT
                    157:     mov     ah, 25h
                    158:     int     21h
                    159:     pop     ds
                    160:     mov     ah, 04Ch
                    161:     int     21h
                    162: 
                    163: ;-------------------------------------------------------;
                    164: ;Setup DMA operation
                    165: ;Input: ds:si = seg:offset of memeory address
                    166: ;      al = DMA mode
                    167: ;output: NONE
                    168: ;Modified: AX, DX
                    169: ;-------------------------------------------------------;
                    170: SetupDMAOperation proc
                    171:     push    cx
                    172:     mov     dx, DMA_PORT_FLIPFLOP
                    173:     out     dx, al
                    174:     mov     dx, DMA_PORT_MODE              ;more register
                    175:     out     dx, al
                    176:     mov     ax, ds                         ;transfer address -> page:offset
                    177:     mov     cl, 4                          ;page: A16 ~ A19, offset A0 ~ A15
                    178:     rol     ax, cl
                    179:     mov     ch, al
                    180:     and     al, 0F0h
                    181:     add     ax, si
                    182:     jnc     @F
                    183:     inc     ch
                    184: @@:
                    185:     mov     dx, DMA_PORT_ADDR
                    186:     out     dx, al                         ;offset lower byte
                    187:     mov     al, ah
                    188:     out     dx, al                         ;and higher byte
                    189:     mov     dx, DMA_PORT_PAGE              ;page register
                    190:     mov     al, ch
                    191:     and     al, 0Fh                        ;only 4 bits allowed
                    192:     out     dx, al
                    193:     mov     al, 1                          ;single transfer, one byte
                    194:     mov     dx, DMA_PORT_COUNT
                    195:     out     dx, al
                    196:     dec     al
                    197:     out     dx, al                         ;higher byte set to 0
                    198:     mov     dx, DMA_PORT_REQUEST           ;request channel #1
                    199:     mov     al, 00000101B
                    200:     out     dx, al
                    201:     mov     dx, DMA_PORT_SNGLE_MASK        ;start DMA transfer
                    202:     mov     al, 00000001B
                    203:     out     dx, al
                    204:     pop     cx
                    205:     ret
                    206: SetupDMAOperation endp
                    207: 
                    208: 
                    209: ISRDMACompleted proc   far
                    210:     mov     byte ptr DMACompleted, TRUE
                    211:     mov al, 20h
                    212:     out 20h, al
                    213:     out 0A0h, al
                    214:     iret
                    215: ISRDMACompleted        endp
                    216: 
                    217: END start

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.