page ,132 title IOM_Skeleton - I/O Map Skeleton .model small,c .code assume cs:@Code,ds:@Code,es:@Code,ss:nothing ; -------------------------------------------------------------------- ; Note that this program is assumed to be loaded at 0000 in the ; current segment. ; ; This overlay can be compiled with - ; ; ML /Fe ioskel.iom ioskel.asm /link /T ; ; An IOMAP overlay must begin with the following header: ; --------------------------------------------------------------------- IOMAP_MAX_SIZE equ 32767 ; size of largest I/O map processor IOMAP_SIGNATURE equ 'MI' ; IO Map signature ; Layout of an IOMap comm block. IOMAPB struc iom_ident dw ? ; identifier of IOM iom_init dw ? ; offset of initialization routine iom_deinit dw ? ; offset of de-init routine iom_input dw ? ; offset of input routine iom_output dw ? ; offset of output routine iom_interrupt dd ? ; interrupt callback vector iom_reserved dw 8 dup (?) ; reserved, zero IOMAPB ends ; Note that routines not used need not have "stubs"; an all-zero ; offset will be ignored by 22Nice. IOMAPB <IOMAP_SIGNATURE, offset Init, offset DeInit, offset Input,\ offset Output, 0> ; The Init routine is called before any program code is actually ; executed. Init proc far ret Init endp ; The DeInit routine is called after the program execution has ; terminated. Both normal and error termination go through here. DeInit proc far ret DeInit endp ; I/O processors have the I/O port in (bl) and the data byte in (al). ; Any registers may be used, but the stack must be preserved. Output ; preserves (AL), and Input expects the I/O data to be returned in ; (AL). Input proc far ret Input endp Output proc far ret Output endp ; The interrupt callback vector is used by 80x86 interrupt servicers ; that want to emulate a Z-80 or 8080 interrupt. To enable the ; interrupt handling, the iom_interrupt field in the IOMAPB block ; must be assembled as non-zero to show that interrupt emulation ; processing is required by this map. ; ; After 22nice has completed loading the emulated program, a ; doubleword pointer to a two-byte word will be inserted in the ; iom_interrupt field. ; ; When an interrupt is processed by the 80x86 handler, a Z-80 or ; 8080 interrupt may be emulated by storing the Z-80 or 8080 ; P-counter value into the word pointed to by iom_interrupt. ; The emulation software will read this value, simulate an ; interrupt and set the value pointed to by iom_interrupt to zero. ; This means that you can interrupt to any location except 0000. end