[74] | 1 | Index: Src/Device/IDE/IdePioBlock.asm
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- Src/Device/IDE/IdePioBlock.asm (revision 588)
|
---|
| 4 | +++ Src/Device/IDE/IdePioBlock.asm (working copy)
|
---|
| 5 | @@ -76,6 +76,36 @@
|
---|
| 6 | rep insb
|
---|
| 7 | ret
|
---|
| 8 | %else ; 808x
|
---|
| 9 | + %ifdef USE_BIRD ; insane bird rollout
|
---|
| 10 | + push bx
|
---|
| 11 | +.NextSector:
|
---|
| 12 | + pushf
|
---|
| 13 | + cli
|
---|
| 14 | + %if 0 ;; @todo 8086+ only, anyone at all? - does not seem to work...
|
---|
| 15 | + ; (nominal ticks / expected instruction fetch ticks / -<instr bytes consumed> +<added>
|
---|
| 16 | + ; 8088 - iAPX88 BOOK (Intel Order No. 210200-002)
|
---|
| 17 | + %rep 256 ; 8086 - iAPX 86,88 User Manual (Intel Order No. 210201-001), TASM Quick Ref v4
|
---|
| 18 | + in al, dx ; 8/+4/-1+1 8/+4/-1+2 1 byte Note! 8086 will only be empty half of the time here, but too
|
---|
| 19 | + xchg bx, ax ; 3/+1/-1+1 3/+1/-1+2 1 byte tired to calculate that now. Probably this comes out as
|
---|
| 20 | + in al, dx ; 8/+4/-1+1 8/--/-1 1 byte a 0 or 1 cycle win in reality...
|
---|
| 21 | + xchg bx, ax ; 3/+1/-1+1 3/+1/-1+2 1 byte
|
---|
| 22 | + mov ah, bl ; 2/+6/-2+2 2/+2/-2+2 2 bytes
|
---|
| 23 | + stosw ; 15/+4/-1+1 11/--/-1 1 byte
|
---|
| 24 | + %endrep ; sum 39/+20 =59 35/+12=47 7 bytes
|
---|
| 25 | + ; save -1/ -7 3/ -1 -3 bytes
|
---|
| 26 | + %else
|
---|
| 27 | + %rep 512
|
---|
| 28 | + in al, dx ; 8/+4/-1+1 8/+4/-1+2 1 byte
|
---|
| 29 | + stosb ; 11/+4/-1+4 11/--/-1 1 byte
|
---|
| 30 | + %endrep ; sum 19/+8 =26 19/+4=23 2 bytes
|
---|
| 31 | + %endif ; x2 38/+16 =52 38/+8=46 4 bytes
|
---|
| 32 | + popf
|
---|
| 33 | + dec cx
|
---|
| 34 | + jnz .NextSector
|
---|
| 35 | + pop bx
|
---|
| 36 | + ret
|
---|
| 37 | +
|
---|
| 38 | + %else ; !USE_BIRD
|
---|
| 39 | UNROLL_SECTORS_IN_CX_TO_OWORDS
|
---|
| 40 | ALIGN JUMP_ALIGN
|
---|
| 41 | .ReadNextOword:
|
---|
| 42 | @@ -85,6 +115,7 @@
|
---|
| 43 | %endrep
|
---|
| 44 | loop .ReadNextOword
|
---|
| 45 | ret
|
---|
| 46 | + %endif ; !USE_BIRD
|
---|
| 47 | %endif
|
---|
| 48 |
|
---|
| 49 | %endif ; MODULE_8BIT_IDE
|
---|
| 50 | @@ -112,6 +143,20 @@
|
---|
| 51 | ret
|
---|
| 52 |
|
---|
| 53 | %else ; 808x
|
---|
| 54 | + %ifdef USE_BIRD ; insane bird rollout.
|
---|
| 55 | +.NextSector:
|
---|
| 56 | + pushf
|
---|
| 57 | + cli
|
---|
| 58 | + %rep 256 ; WORDs
|
---|
| 59 | + in ax, dx ; Read WORD
|
---|
| 60 | + stosw ; Store WORD to [ES:DI]
|
---|
| 61 | + %endrep
|
---|
| 62 | + popf
|
---|
| 63 | + dec cx
|
---|
| 64 | + jnz .NextSector
|
---|
| 65 | + ret
|
---|
| 66 | +
|
---|
| 67 | + %else ; !USE_BIRD
|
---|
| 68 | UNROLL_SECTORS_IN_CX_TO_OWORDS
|
---|
| 69 | ALIGN JUMP_ALIGN
|
---|
| 70 | .ReadNextOword:
|
---|
| 71 | @@ -121,6 +166,7 @@
|
---|
| 72 | %endrep
|
---|
| 73 | loop .ReadNextOword
|
---|
| 74 | ret
|
---|
| 75 | + %endif ; !USE_BIRD
|
---|
| 76 | %endif
|
---|
| 77 |
|
---|
| 78 |
|
---|
| 79 | @@ -220,6 +266,37 @@
|
---|
| 80 | ret
|
---|
| 81 |
|
---|
| 82 | %else ; 808x
|
---|
| 83 | + %ifdef USE_BIRD ; crazy bird loop unrolling
|
---|
| 84 | + push ds
|
---|
| 85 | + push es
|
---|
| 86 | + pop ds
|
---|
| 87 | +
|
---|
| 88 | +.NextSector:
|
---|
| 89 | + pushf
|
---|
| 90 | + cli
|
---|
| 91 | + %if 1
|
---|
| 92 | + ; 8088 - iAPX88 BOOK (Intel Order No. 210200-002)
|
---|
| 93 | + %rep 256 ; 8086 - iAPX 86,88 User Manual (Intel Order No. 210201-001), TASM Quick Ref v4
|
---|
| 94 | + lodsw ; 16/+4/-1+1 12/+4|--/-1+2|+0 1 byte - Note! 8086 doesn't need instr fetch half of the time.
|
---|
| 95 | + out dx, al ; 8/+4/-1+1 8/-- /-1 1 byte
|
---|
| 96 | + mov al, ah ; 2/+10/-2+3 2/+6 /-2+4 2 bytes
|
---|
| 97 | + out dx, al ; 8/--/-1 8/-- /-1 1 byte
|
---|
| 98 | + %endrep ; sum 34/+18=52 30/+10|+6=40|36~=38 5 bytes
|
---|
| 99 | + ; save 6/ 4 10/ 8|12~=10 -1 byte
|
---|
| 100 | + %else
|
---|
| 101 | + %rep 512
|
---|
| 102 | + lodsb ; 12/+4/-1+1 12/+4/-1+2 1 byte
|
---|
| 103 | + out dx, al ; 8/+4/-1+1 8/--/-1 1 byte
|
---|
| 104 | + %endrep ; sum 20/+8 =28 20/+4 =24 2 bytes
|
---|
| 105 | + %endif ; x2 40/+16 =56 40/+8 =48 4 bytes
|
---|
| 106 | + popf
|
---|
| 107 | + dec cx
|
---|
| 108 | + jnz .NextSector
|
---|
| 109 | +
|
---|
| 110 | + pop ds
|
---|
| 111 | + ret
|
---|
| 112 | +
|
---|
| 113 | + %else ; !USE_BIRD
|
---|
| 114 | UNROLL_SECTORS_IN_CX_TO_QWORDS
|
---|
| 115 | push ds
|
---|
| 116 | push es
|
---|
| 117 | @@ -233,6 +310,7 @@
|
---|
| 118 | loop .WriteNextQword
|
---|
| 119 | pop ds
|
---|
| 120 | ret
|
---|
| 121 | + %endif ; !USE_BIRD
|
---|
| 122 | %endif
|
---|
| 123 |
|
---|
| 124 | %endif ; MODULE_8BIT_IDE
|
---|
| 125 | @@ -259,6 +337,28 @@
|
---|
| 126 | ret
|
---|
| 127 |
|
---|
| 128 | %else ; 808x
|
---|
| 129 | + %ifdef USE_BIRD ; crazy bird loop unrolling
|
---|
| 130 | + push bx
|
---|
| 131 | + push ds
|
---|
| 132 | + push es
|
---|
| 133 | + pop ds
|
---|
| 134 | +
|
---|
| 135 | +.NextSector:
|
---|
| 136 | + pushf
|
---|
| 137 | + cli
|
---|
| 138 | + %rep 256 ; WORDs
|
---|
| 139 | + lodsw ; Load WORD from [DS:SI]
|
---|
| 140 | + out dx, ax ; Write WORD
|
---|
| 141 | + %endrep
|
---|
| 142 | + popf
|
---|
| 143 | + dec cx
|
---|
| 144 | + jnz .NextSector
|
---|
| 145 | +
|
---|
| 146 | + pop ds
|
---|
| 147 | + pop bx
|
---|
| 148 | + ret
|
---|
| 149 | +
|
---|
| 150 | + %else ; !USE_BIRD
|
---|
| 151 | UNROLL_SECTORS_IN_CX_TO_QWORDS
|
---|
| 152 | push ds
|
---|
| 153 | push es
|
---|
| 154 | @@ -272,6 +372,7 @@
|
---|
| 155 | loop .WriteNextQword
|
---|
| 156 | pop ds
|
---|
| 157 | ret
|
---|
| 158 | + %endif ; !USE_BIRD
|
---|
| 159 | %endif
|
---|
| 160 |
|
---|
| 161 | ;--------------------------------------------------------------------
|
---|
| 162 | Index: Src/Handlers/Int13h/AH9h_HInit.asm
|
---|
| 163 | ===================================================================
|
---|
| 164 | --- Src/Handlers/Int13h/AH9h_HInit.asm (revision 588)
|
---|
| 165 | +++ Src/Handlers/Int13h/AH9h_HInit.asm (working copy)
|
---|
| 166 | @@ -175,6 +175,18 @@
|
---|
| 167 | .SupportedBlockSizeFound:
|
---|
| 168 |
|
---|
| 169 |
|
---|
| 170 | +%if 0 ; bird
|
---|
| 171 | +;;; InitializePioMode - disable IORDY and use default mode.
|
---|
| 172 | +%if 0
|
---|
| 173 | + mov dl, PIO_DEFAULT_MODE_DISABLE_IORDY
|
---|
| 174 | +%else
|
---|
| 175 | + mov dl, PIO_FLOW_CONTROL_MODE_xxx | 0
|
---|
| 176 | +%endif
|
---|
| 177 | + mov si, FEATURE_SET_TRANSFER_MODE
|
---|
| 178 | + call AH23h_SetControllerFeatures
|
---|
| 179 | + STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_PIO_MODE
|
---|
| 180 | +
|
---|
| 181 | +%else ; !bird
|
---|
| 182 | %ifdef MODULE_ADVANCED_ATA
|
---|
| 183 | ;;; InitializePioMode
|
---|
| 184 | ; Initialize fastest supported PIO mode
|
---|
| 185 | @@ -190,7 +202,9 @@
|
---|
| 186 | mov si, FEATURE_SET_TRANSFER_MODE
|
---|
| 187 | call AH23h_SetControllerFeatures
|
---|
| 188 | STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_PIO_MODE
|
---|
| 189 | +
|
---|
| 190 | %endif ; MODULE_ADVANCED_ATA
|
---|
| 191 | +%endif ; !bird
|
---|
| 192 |
|
---|
| 193 |
|
---|
| 194 | %ifdef MODULE_POWER_MANAGEMENT
|
---|
| 195 | Index: Src/Initialization/DetectDrives.asm
|
---|
| 196 | ===================================================================
|
---|
| 197 | --- Src/Initialization/DetectDrives.asm (revision 588)
|
---|
| 198 | +++ Src/Initialization/DetectDrives.asm (working copy)
|
---|
| 199 | @@ -241,4 +241,29 @@
|
---|
| 200 | call CreateDPT_FromAtaInformation
|
---|
| 201 | jc SHORT DetectDrives_DriveNotFound
|
---|
| 202 | call DriveDetectInfo_CreateForHardDisk
|
---|
| 203 | +%ifdef USE_BIRD
|
---|
| 204 | + call DetectPrint_DriveNameFromDrvDetectInfoInESBX
|
---|
| 205 | + call TestBufferXfers
|
---|
| 206 | + ret
|
---|
| 207 | +%else ; !USE_BIRD
|
---|
| 208 | jmp SHORT DetectPrint_DriveNameFromDrvDetectInfoInESBX
|
---|
| 209 | +%endif ; !USE_BIRD
|
---|
| 210 | +
|
---|
| 211 | +
|
---|
| 212 | +%ifdef USE_BIRD
|
---|
| 213 | +;--------------------------------------------------------------------
|
---|
| 214 | +; TestBufferXfers
|
---|
| 215 | +; Parameters:
|
---|
| 216 | +; Returns:
|
---|
| 217 | +; Nothing
|
---|
| 218 | +; Corrupts registers:
|
---|
| 219 | +;--------------------------------------------------------------------
|
---|
| 220 | +TestBufferXfers:
|
---|
| 221 | + ;; @todo later. The idea is to write to the sector buffer, then read back
|
---|
| 222 | + ;; what we just wrote and check that the data is as expected. This would
|
---|
| 223 | + ;; help detect problems with the PIO Data Write, and in NO_ATAID_VALIDATION
|
---|
| 224 | + ;; mode, also with PIO Data Read. Preventing the user from totally screwing
|
---|
| 225 | + ;; up his CF card in the former case.
|
---|
| 226 | + ret
|
---|
| 227 | +%endif
|
---|
| 228 | +
|
---|
| 229 | Index: makefile
|
---|
| 230 | ===================================================================
|
---|
| 231 | --- makefile (revision 588)
|
---|
| 232 | +++ makefile (working copy)
|
---|
| 233 | @@ -40,6 +40,8 @@
|
---|
| 234 | # USE_386 Use instructions supported by 386 and later (defines USE_286) #
|
---|
| 235 | # USE_AT Use features supported on AT and later systems (not available on XT) #
|
---|
| 236 | # USE_UNDOC_INTEL Optimizations for Intel CPU:s - do NOT use on NEC V20/V30/Sony CPU:s #
|
---|
| 237 | +# USE_BIRD Bird stuff #
|
---|
| 238 | +# USE_BIRD_8086 Use code sequences favoring 8086+ over 8088. #
|
---|
| 239 | # #
|
---|
| 240 | # ** AT Builds only (when USE_AT is defined) #
|
---|
| 241 | # *** Use this only when certain known good drives are not being detected (eg WD Caviars) #
|
---|
| 242 | @@ -102,12 +104,13 @@
|
---|
| 243 | #################################################################
|
---|
| 244 | # Assembler preprocessor defines. #
|
---|
| 245 | #################################################################
|
---|
| 246 | -DEFINES_COMMON = MODULE_STRINGS_COMPRESSED MODULE_HOTKEYS MODULE_8BIT_IDE MODULE_EBIOS MODULE_SERIAL MODULE_SERIAL_FLOPPY MODULE_POWER_MANAGEMENT RESERVE_DIAGNOSTIC_CYLINDER NO_ATAID_VALIDATION
|
---|
| 247 | +#DEFINES_COMMON = MODULE_STRINGS_COMPRESSED MODULE_HOTKEYS MODULE_8BIT_IDE MODULE_EBIOS MODULE_SERIAL MODULE_SERIAL_FLOPPY MODULE_POWER_MANAGEMENT RESERVE_DIAGNOSTIC_CYLINDER NO_ATAID_VALIDATION
|
---|
| 248 | +DEFINES_COMMON = MODULE_STRINGS_COMPRESSED MODULE_HOTKEYS MODULE_8BIT_IDE MODULE_EBIOS MODULE_POWER_MANAGEMENT RESERVE_DIAGNOSTIC_CYLINDER
|
---|
| 249 | DEFINES_COMMON_LARGE = MODULE_BOOT_MENU MODULE_8BIT_IDE_ADVANCED MODULE_COMPATIBLE_TABLES
|
---|
| 250 |
|
---|
| 251 | -DEFINES_XT = $(DEFINES_COMMON) ELIMINATE_CGA_SNOW MODULE_8BIT_IDE_ADVANCED
|
---|
| 252 | +DEFINES_XT = $(DEFINES_COMMON) ELIMINATE_CGA_SNOW MODULE_8BIT_IDE_ADVANCED USE_BIRD USE_BIRD_8086
|
---|
| 253 | DEFINES_XTPLUS = $(DEFINES_XT) USE_186
|
---|
| 254 | -DEFINES_AT = $(DEFINES_COMMON) USE_AT USE_286 MODULE_IRQ MODULE_ADVANCED_ATA MODULE_COMPATIBLE_TABLES
|
---|
| 255 | +DEFINES_AT = $(DEFINES_COMMON) USE_AT USE_286 MODULE_IRQ MODULE_ADVANCED_ATA MODULE_COMPATIBLE_TABLES USE_BIRD USE_BIRD_8086
|
---|
| 256 |
|
---|
| 257 | DEFINES_XT_LARGE = $(DEFINES_XT) $(DEFINES_COMMON_LARGE)
|
---|
| 258 | DEFINES_XTPLUS_LARGE = $(DEFINES_XTPLUS) $(DEFINES_COMMON_LARGE)
|
---|
| 259 | @@ -126,6 +129,7 @@
|
---|
| 260 |
|
---|
| 261 | # Target size of the ROM, used in main.asm for number of 512B blocks and by checksum Perl script below
|
---|
| 262 | BIOS_SIZE = 8192 # For BIOS header (use even multiplier!)
|
---|
| 263 | +BIOS_SIZE = 12288 # For BIOS header (use even multiplier!)
|
---|
| 264 | ROMSIZE = $(BIOS_SIZE) # Size of binary to build when building with make checksum
|
---|
| 265 | BIOS_SIZE_LARGE = 12288
|
---|
| 266 | ROMSIZE_LARGE = $(BIOS_SIZE_LARGE)
|
---|