├── .gitignore ├── .gitmodules ├── ISA_EMS-cache.lib ├── ISA_EMS.kicad_pcb ├── ISA_EMS.kicad_pro ├── ISA_EMS.kicad_sch ├── ISA_EMS.pdf ├── README.md ├── fp-lib-table ├── gerbers └── rev_10.zip ├── libraries └── custom_libs │ ├── custom_components.dcm │ ├── custom_components.lib │ └── footprints │ └── ISA_DualUART.pretty │ └── Oscillator_DIP-14-8.kicad_mod ├── pics └── ISA_EMS.png ├── software ├── LTEMM.ASM ├── LTEMM.INC ├── LTHCK.EXE └── README.TXT └── sym-lib-table /.gitignore: -------------------------------------------------------------------------------- 1 | # ---> KiCad 2 | # For PCBs designed using KiCad: http://www.kicad.org/ 3 | # Format documentation: http://kicad.org/help/file-formats/ 4 | 5 | # Temporary files 6 | *.000 7 | *.bak 8 | *.bck 9 | *.kicad_pcb-bak 10 | *.kicad_sch-bak 11 | *.kicad_prl 12 | *.sch-bak 13 | *~ 14 | _autosave-* 15 | *.tmp 16 | *-save.pro 17 | *-save.kicad_pcb 18 | fp-info-cache 19 | 20 | # Netlist files (exported from Eeschema) 21 | *.net 22 | 23 | # Autorouter files (exported from Pcbnew) 24 | *.dsn 25 | *.ses 26 | 27 | # Exported BOM files 28 | *.xml 29 | *.csv 30 | 31 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "libraries/master"] 2 | path = libraries/master 3 | url = https://github.com/skiselev/my_kicad_library 4 | [submodule "libraries/my_kicad_library"] 5 | path = libraries/my_kicad_library 6 | url = https://github.com/skiselev/my_kicad_library.git 7 | -------------------------------------------------------------------------------- /ISA_EMS-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # 74xx_74HCT04 5 | # 6 | DEF 74xx_74HCT04 U 0 20 Y Y 7 L N 7 | F0 "U" 0 50 50 H V C CNN 8 | F1 "74xx_74HCT04" 0 -50 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | ALIAS 74HC04 74HCT04 74AHC04 74AHCT04 12 | $FPLIST 13 | DIP*W7.62mm* 14 | SSOP?14* 15 | TSSOP?14* 16 | $ENDFPLIST 17 | DRAW 18 | S -200 300 200 -300 7 1 10 f 19 | P 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f 20 | P 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f 21 | P 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f 22 | P 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f 23 | P 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f 24 | P 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f 25 | X ~ 1 -300 0 150 R 50 50 1 0 I 26 | X ~ 2 300 0 150 L 50 50 1 0 O I 27 | X ~ 3 -300 0 150 R 50 50 2 0 I 28 | X ~ 4 300 0 150 L 50 50 2 0 O I 29 | X ~ 5 -300 0 150 R 50 50 3 0 I 30 | X ~ 6 300 0 150 L 50 50 3 0 O I 31 | X ~ 8 300 0 150 L 50 50 4 0 O I 32 | X ~ 9 -300 0 150 R 50 50 4 0 I 33 | X ~ 10 300 0 150 L 50 50 5 0 O I 34 | X ~ 11 -300 0 150 R 50 50 5 0 I 35 | X ~ 12 300 0 150 L 50 50 6 0 O I 36 | X ~ 13 -300 0 150 R 50 50 6 0 I 37 | X VCC 14 0 500 200 D 50 50 7 0 W 38 | X GND 7 0 -500 200 U 50 50 7 0 W 39 | ENDDRAW 40 | ENDDEF 41 | # 42 | # 74xx_74HCT688 43 | # 44 | DEF 74xx_74HCT688 U 0 20 Y Y 1 F N 45 | F0 "U" -300 1050 50 H V C CNN 46 | F1 "74xx_74HCT688" -300 -1050 50 H V C CNN 47 | F2 "" 0 0 50 H I C CNN 48 | F3 "" 0 0 50 H I C CNN 49 | ALIAS 74HC688 74HCT688 50 | $FPLIST 51 | DIP?20* 52 | SOIC?20* 53 | SO?20* 54 | TSSOP?20* 55 | $ENDFPLIST 56 | DRAW 57 | S -300 1000 300 -1000 1 1 10 f 58 | X G 1 -500 -900 200 R 50 50 1 0 I I 59 | X GND 10 0 -1200 200 U 50 50 1 0 W 60 | X P4 11 -500 500 200 R 50 50 1 0 I 61 | X R4 12 -500 -400 200 R 50 50 1 0 I 62 | X P5 13 -500 400 200 R 50 50 1 0 I 63 | X R5 14 -500 -500 200 R 50 50 1 0 I 64 | X P6 15 -500 300 200 R 50 50 1 0 I 65 | X R6 16 -500 -600 200 R 50 50 1 0 I 66 | X P7 17 -500 200 200 R 50 50 1 0 I 67 | X R7 18 -500 -700 200 R 50 50 1 0 I 68 | X P=R 19 500 900 200 L 50 50 1 0 O I 69 | X P0 2 -500 900 200 R 50 50 1 0 I 70 | X VCC 20 0 1200 200 D 50 50 1 0 W 71 | X R0 3 -500 0 200 R 50 50 1 0 I 72 | X P1 4 -500 800 200 R 50 50 1 0 I 73 | X R1 5 -500 -100 200 R 50 50 1 0 I 74 | X P2 6 -500 700 200 R 50 50 1 0 I 75 | X R2 7 -500 -200 200 R 50 50 1 0 I 76 | X P3 8 -500 600 200 R 50 50 1 0 I 77 | X R3 9 -500 -300 200 R 50 50 1 0 I 78 | ENDDRAW 79 | ENDDEF 80 | # 81 | # 74xx_74LS138 82 | # 83 | DEF 74xx_74LS138 U 0 40 Y Y 1 L N 84 | F0 "U" -300 450 50 H V C CNN 85 | F1 "74xx_74LS138" -300 -550 50 H V C CNN 86 | F2 "" 0 0 50 H I C CNN 87 | F3 "" 0 0 50 H I C CNN 88 | $FPLIST 89 | DIP?16* 90 | $ENDFPLIST 91 | DRAW 92 | S -300 400 300 -500 1 1 10 f 93 | X A0 1 -500 300 200 R 50 50 1 0 I 94 | X O5 10 500 -200 200 L 50 50 1 0 O V 95 | X O4 11 500 -100 200 L 50 50 1 0 O V 96 | X O3 12 500 0 200 L 50 50 1 0 O V 97 | X O2 13 500 100 200 L 50 50 1 0 O V 98 | X O1 14 500 200 200 L 50 50 1 0 O V 99 | X O0 15 500 300 200 L 50 50 1 0 O V 100 | X VCC 16 0 600 200 D 50 50 1 0 W 101 | X A1 2 -500 200 200 R 50 50 1 0 I 102 | X A2 3 -500 100 200 R 50 50 1 0 I 103 | X E1 4 -500 -400 200 R 50 50 1 0 I L 104 | X E2 5 -500 -300 200 R 50 50 1 0 I L 105 | X E3 6 -500 -200 200 R 50 50 1 0 I 106 | X O7 7 500 -400 200 L 50 50 1 0 O V 107 | X GND 8 0 -700 200 U 50 50 1 0 W 108 | X O6 9 500 -300 200 L 50 50 1 0 O V 109 | ENDDRAW 110 | ENDDEF 111 | # 112 | # 74xx_74LS139 113 | # 114 | DEF 74xx_74LS139 U 0 40 Y Y 3 L N 115 | F0 "U" -300 350 50 H V C CNN 116 | F1 "74xx_74LS139" -300 -350 50 H V C CNN 117 | F2 "" 0 0 50 H I C CNN 118 | F3 "" 0 0 50 H I C CNN 119 | $FPLIST 120 | DIP?16* 121 | $ENDFPLIST 122 | DRAW 123 | S -300 200 300 -300 1 1 10 f 124 | S -300 200 300 -300 2 1 10 f 125 | S -200 300 200 -300 3 1 10 f 126 | X E 1 -500 -200 200 R 50 50 1 0 I I 127 | X A0 2 -500 0 200 R 50 50 1 0 I 128 | X A1 3 -500 100 200 R 50 50 1 0 I 129 | X O0 4 500 100 200 L 50 50 1 0 O I 130 | X O1 5 500 0 200 L 50 50 1 0 O I 131 | X O2 6 500 -100 200 L 50 50 1 0 O I 132 | X O3 7 500 -200 200 L 50 50 1 0 O I 133 | X O2 10 500 -100 200 L 50 50 2 0 O I 134 | X O1 11 500 0 200 L 50 50 2 0 O I 135 | X O0 12 500 100 200 L 50 50 2 0 O I 136 | X A1 13 -500 100 200 R 50 50 2 0 I 137 | X A0 14 -500 0 200 R 50 50 2 0 I 138 | X E 15 -500 -200 200 R 50 50 2 0 I I 139 | X O3 9 500 -200 200 L 50 50 2 0 O I 140 | X VCC 16 0 500 200 D 50 50 3 0 W 141 | X GND 8 0 -500 200 U 50 50 3 0 W 142 | ENDDRAW 143 | ENDDEF 144 | # 145 | # 74xx_74LS245 146 | # 147 | DEF 74xx_74LS245 U 0 40 Y Y 1 L N 148 | F0 "U" -300 650 50 H V C CNN 149 | F1 "74xx_74LS245" -300 -650 50 H V C CNN 150 | F2 "" 0 0 50 H I C CNN 151 | F3 "" 0 0 50 H I C CNN 152 | ALIAS 74HC245 153 | $FPLIST 154 | DIP?20* 155 | $ENDFPLIST 156 | DRAW 157 | S -300 600 300 -600 1 1 10 f 158 | P 3 1 0 0 -25 -50 -25 50 25 50 N 159 | P 4 1 0 0 -50 -50 25 -50 25 50 50 50 N 160 | X A->B 1 -500 -400 200 R 50 50 1 0 I 161 | X GND 10 0 -800 200 U 50 50 1 0 W 162 | X B7 11 500 -200 200 L 50 50 1 0 T 163 | X B6 12 500 -100 200 L 50 50 1 0 T 164 | X B5 13 500 0 200 L 50 50 1 0 T 165 | X B4 14 500 100 200 L 50 50 1 0 T 166 | X B3 15 500 200 200 L 50 50 1 0 T 167 | X B2 16 500 300 200 L 50 50 1 0 T 168 | X B1 17 500 400 200 L 50 50 1 0 T 169 | X B0 18 500 500 200 L 50 50 1 0 T 170 | X CE 19 -500 -500 200 R 50 50 1 0 I I 171 | X A0 2 -500 500 200 R 50 50 1 0 T 172 | X VCC 20 0 800 200 D 50 50 1 0 W 173 | X A1 3 -500 400 200 R 50 50 1 0 T 174 | X A2 4 -500 300 200 R 50 50 1 0 T 175 | X A3 5 -500 200 200 R 50 50 1 0 T 176 | X A4 6 -500 100 200 R 50 50 1 0 T 177 | X A5 7 -500 0 200 R 50 50 1 0 T 178 | X A6 8 -500 -100 200 R 50 50 1 0 T 179 | X A7 9 -500 -200 200 R 50 50 1 0 T 180 | ENDDRAW 181 | ENDDEF 182 | # 183 | # 74xx_74LS32 184 | # 185 | DEF 74xx_74LS32 U 0 40 Y Y 5 L N 186 | F0 "U" 0 50 50 H V C CNN 187 | F1 "74xx_74LS32" 0 -50 50 H V C CNN 188 | F2 "" 0 0 50 H I C CNN 189 | F3 "" 0 0 50 H I C CNN 190 | $FPLIST 191 | DIP?14* 192 | $ENDFPLIST 193 | DRAW 194 | A -360 0 258 354 -354 1 1 10 N -150 150 -150 -150 195 | A -47 -52 204 150 837 1 1 10 f 150 0 -24 150 196 | A -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150 197 | A -360 0 258 354 -354 2 1 10 N -150 150 -150 -150 198 | A -47 -52 204 150 837 2 1 10 f 150 0 -24 150 199 | A -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150 200 | A -360 0 258 354 -354 3 1 10 N -150 150 -150 -150 201 | A -47 -52 204 150 837 3 1 10 f 150 0 -24 150 202 | A -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150 203 | A -360 0 258 354 -354 4 1 10 N -150 150 -150 -150 204 | A -47 -52 204 150 837 4 1 10 f 150 0 -24 150 205 | A -47 52 204 -150 -837 4 1 10 f 150 0 -24 -150 206 | A 0 0 150 -899 899 1 2 10 f 0 -150 0 150 207 | A 0 0 150 -899 899 2 2 10 f 0 -150 0 150 208 | A 0 0 150 -899 899 3 2 10 f 0 -150 0 150 209 | A 0 0 150 -899 899 4 2 10 f 0 -150 0 150 210 | S -200 300 200 -300 5 1 10 f 211 | P 2 1 1 10 -150 -150 -25 -150 f 212 | P 2 1 1 10 -150 150 -25 150 f 213 | P 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 214 | P 2 2 1 10 -150 -150 -25 -150 f 215 | P 2 2 1 10 -150 150 -25 150 f 216 | P 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 217 | P 2 3 1 10 -150 -150 -25 -150 f 218 | P 2 3 1 10 -150 150 -25 150 f 219 | P 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 220 | P 2 4 1 10 -150 -150 -25 -150 f 221 | P 2 4 1 10 -150 150 -25 150 f 222 | P 12 4 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 223 | P 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f 224 | P 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f 225 | P 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f 226 | P 4 4 2 10 0 150 -150 150 -150 -150 0 -150 f 227 | X VCC 14 0 500 200 D 50 50 5 0 W 228 | X GND 7 0 -500 200 U 50 50 5 0 W 229 | X ~ 1 -300 100 170 R 50 50 1 1 I 230 | X ~ 2 -300 -100 170 R 50 50 1 1 I 231 | X ~ 3 300 0 150 L 50 50 1 1 O 232 | X ~ 4 -300 100 170 R 50 50 2 1 I 233 | X ~ 5 -300 -100 170 R 50 50 2 1 I 234 | X ~ 6 300 0 150 L 50 50 2 1 O 235 | X ~ 10 -300 -100 170 R 50 50 3 1 I 236 | X ~ 8 300 0 150 L 50 50 3 1 O 237 | X ~ 9 -300 100 170 R 50 50 3 1 I 238 | X ~ 11 300 0 150 L 50 50 4 1 O 239 | X ~ 12 -300 100 170 R 50 50 4 1 I 240 | X ~ 13 -300 -100 170 R 50 50 4 1 I 241 | X ~ 1 -300 100 150 R 50 50 1 2 I I 242 | X ~ 2 -300 -100 150 R 50 50 1 2 I I 243 | X ~ 3 300 0 150 L 50 50 1 2 O I 244 | X ~ 4 -300 100 150 R 50 50 2 2 I I 245 | X ~ 5 -300 -100 150 R 50 50 2 2 I I 246 | X ~ 6 300 0 150 L 50 50 2 2 O I 247 | X ~ 10 -300 -100 150 R 50 50 3 2 I I 248 | X ~ 8 300 0 150 L 50 50 3 2 O I 249 | X ~ 9 -300 100 150 R 50 50 3 2 I I 250 | X ~ 11 300 0 150 L 50 50 4 2 O I 251 | X ~ 12 -300 100 150 R 50 50 4 2 I I 252 | X ~ 13 -300 -100 150 R 50 50 4 2 I I 253 | ENDDRAW 254 | ENDDEF 255 | # 256 | # 74xx_74LS573 257 | # 258 | DEF 74xx_74LS573 U 0 40 Y Y 1 L N 259 | F0 "U" -300 650 50 H V C CNN 260 | F1 "74xx_74LS573" -300 -650 50 H V C CNN 261 | F2 "" 0 0 50 H I C CNN 262 | F3 "" 0 0 50 H I C CNN 263 | $FPLIST 264 | DIP?20* 265 | $ENDFPLIST 266 | DRAW 267 | S -300 600 300 -600 1 1 10 f 268 | X OE 1 -500 -500 200 R 50 50 1 0 I I 269 | X GND 10 0 -800 200 U 50 50 1 0 W 270 | X Load 11 -500 -400 200 R 50 50 1 0 I 271 | X Q7 12 500 -200 200 L 50 50 1 0 T 272 | X Q6 13 500 -100 200 L 50 50 1 0 T 273 | X Q5 14 500 0 200 L 50 50 1 0 T 274 | X Q4 15 500 100 200 L 50 50 1 0 T 275 | X Q3 16 500 200 200 L 50 50 1 0 T 276 | X Q2 17 500 300 200 L 50 50 1 0 T 277 | X Q1 18 500 400 200 L 50 50 1 0 T 278 | X Q0 19 500 500 200 L 50 50 1 0 T 279 | X D0 2 -500 500 200 R 50 50 1 0 I 280 | X VCC 20 0 800 200 D 50 50 1 0 W 281 | X D1 3 -500 400 200 R 50 50 1 0 I 282 | X D2 4 -500 300 200 R 50 50 1 0 I 283 | X D3 5 -500 200 200 R 50 50 1 0 I 284 | X D4 6 -500 100 200 R 50 50 1 0 I 285 | X D5 7 -500 0 200 R 50 50 1 0 I 286 | X D6 8 -500 -100 200 R 50 50 1 0 I 287 | X D7 9 -500 -200 200 R 50 50 1 0 I 288 | ENDDRAW 289 | ENDDEF 290 | # 291 | # Connector_Bus_ISA_8bit 292 | # 293 | DEF Connector_Bus_ISA_8bit J 0 20 Y Y 1 F N 294 | F0 "J" 0 1675 50 H V C CNN 295 | F1 "Connector_Bus_ISA_8bit" 0 -1675 50 H V C CNN 296 | F2 "" 0 0 50 H I C CNN 297 | F3 "" 0 0 50 H I C CNN 298 | DRAW 299 | S -600 -1600 600 1600 0 1 10 f 300 | X GND 1 -700 1500 100 R 50 50 1 1 W 301 | X GND 10 -700 600 100 R 50 50 1 1 W 302 | X ~SMEMW 11 -700 500 100 R 50 50 1 1 O 303 | X ~SMEMR 12 -700 400 100 R 50 50 1 1 O 304 | X ~IOW 13 -700 300 100 R 50 50 1 1 O 305 | X ~IOR 14 -700 200 100 R 50 50 1 1 O 306 | X ~DACK3 15 -700 100 100 R 50 50 1 1 P 307 | X DRQ3 16 -700 0 100 R 50 50 1 1 P 308 | X ~DACK1 17 -700 -100 100 R 50 50 1 1 P 309 | X DRQ1 18 -700 -200 100 R 50 50 1 1 P 310 | X ~DACK0 19 -700 -300 100 R 50 50 1 1 P 311 | X RESET 2 -700 1400 100 R 50 50 1 1 O 312 | X CLK 20 -700 -400 100 R 50 50 1 1 O 313 | X IRQ7 21 -700 -500 100 R 50 50 1 1 P 314 | X IRQ6 22 -700 -600 100 R 50 50 1 1 P 315 | X IRQ5 23 -700 -700 100 R 50 50 1 1 P 316 | X IRQ4 24 -700 -800 100 R 50 50 1 1 P 317 | X IRQ3 25 -700 -900 100 R 50 50 1 1 P 318 | X ~DACK2 26 -700 -1000 100 R 50 50 1 1 P 319 | X TC 27 -700 -1100 100 R 50 50 1 1 P 320 | X ALE 28 -700 -1200 100 R 50 50 1 1 O 321 | X VCC 29 -700 -1300 100 R 50 50 1 1 W 322 | X VCC 3 -700 1300 100 R 50 50 1 1 W 323 | X OSC 30 -700 -1400 100 R 50 50 1 1 O 324 | X GND 31 -700 -1500 100 R 50 50 1 1 W 325 | X IO 32 700 1500 100 L 50 50 1 1 P 326 | X DB7 33 700 1400 100 L 50 50 1 1 T 327 | X DB6 34 700 1300 100 L 50 50 1 1 T 328 | X DB5 35 700 1200 100 L 50 50 1 1 T 329 | X DB4 36 700 1100 100 L 50 50 1 1 T 330 | X DB3 37 700 1000 100 L 50 50 1 1 T 331 | X DB2 38 700 900 100 L 50 50 1 1 T 332 | X DB1 39 700 800 100 L 50 50 1 1 T 333 | X IRQ2 4 -700 1200 100 R 50 50 1 1 P 334 | X DB0 40 700 700 100 L 50 50 1 1 T 335 | X IO_READY 41 700 600 100 L 50 50 1 1 P 336 | X AEN 42 700 500 100 L 50 50 1 1 O 337 | X BA19 43 700 400 100 L 50 50 1 1 T 338 | X BA18 44 700 300 100 L 50 50 1 1 T 339 | X BA17 45 700 200 100 L 50 50 1 1 T 340 | X BA16 46 700 100 100 L 50 50 1 1 T 341 | X BA15 47 700 0 100 L 50 50 1 1 T 342 | X BA14 48 700 -100 100 L 50 50 1 1 T 343 | X BA13 49 700 -200 100 L 50 50 1 1 T 344 | X -5V 5 -700 1100 100 R 50 50 1 1 W 345 | X BA12 50 700 -300 100 L 50 50 1 1 T 346 | X BA11 51 700 -400 100 L 50 50 1 1 T 347 | X BA10 52 700 -500 100 L 50 50 1 1 T 348 | X BA09 53 700 -600 100 L 50 50 1 1 T 349 | X BA08 54 700 -700 100 L 50 50 1 1 T 350 | X BA07 55 700 -800 100 L 50 50 1 1 T 351 | X BA06 56 700 -900 100 L 50 50 1 1 T 352 | X BA05 57 700 -1000 100 L 50 50 1 1 T 353 | X BA04 58 700 -1100 100 L 50 50 1 1 T 354 | X BA03 59 700 -1200 100 L 50 50 1 1 T 355 | X DRQ2 6 -700 1000 100 R 50 50 1 1 P 356 | X BA02 60 700 -1300 100 L 50 50 1 1 T 357 | X BA01 61 700 -1400 100 L 50 50 1 1 T 358 | X BA00 62 700 -1500 100 L 50 50 1 1 T 359 | X -12V 7 -700 900 100 R 50 50 1 1 W 360 | X UNUSED 8 -700 800 100 R 50 50 1 1 P 361 | X +12V 9 -700 700 100 R 50 50 1 1 W 362 | ENDDRAW 363 | ENDDEF 364 | # 365 | # Connector_Generic_Conn_02x04_Odd_Even 366 | # 367 | DEF Connector_Generic_Conn_02x04_Odd_Even J 0 40 Y N 1 F N 368 | F0 "J" 50 200 50 H V C CNN 369 | F1 "Connector_Generic_Conn_02x04_Odd_Even" 50 -300 50 H V C CNN 370 | F2 "" 0 0 50 H I C CNN 371 | F3 "" 0 0 50 H I C CNN 372 | $FPLIST 373 | Connector*:*_2x??_* 374 | $ENDFPLIST 375 | DRAW 376 | S -50 -195 0 -205 1 1 6 N 377 | S -50 -95 0 -105 1 1 6 N 378 | S -50 5 0 -5 1 1 6 N 379 | S -50 105 0 95 1 1 6 N 380 | S -50 150 150 -250 1 1 10 f 381 | S 150 -195 100 -205 1 1 6 N 382 | S 150 -95 100 -105 1 1 6 N 383 | S 150 5 100 -5 1 1 6 N 384 | S 150 105 100 95 1 1 6 N 385 | X Pin_1 1 -200 100 150 R 50 50 1 1 P 386 | X Pin_2 2 300 100 150 L 50 50 1 1 P 387 | X Pin_3 3 -200 0 150 R 50 50 1 1 P 388 | X Pin_4 4 300 0 150 L 50 50 1 1 P 389 | X Pin_5 5 -200 -100 150 R 50 50 1 1 P 390 | X Pin_6 6 300 -100 150 L 50 50 1 1 P 391 | X Pin_7 7 -200 -200 150 R 50 50 1 1 P 392 | X Pin_8 8 300 -200 150 L 50 50 1 1 P 393 | ENDDRAW 394 | ENDDEF 395 | # 396 | # Device_CP_Small 397 | # 398 | DEF Device_CP_Small C 0 10 N N 1 F N 399 | F0 "C" 10 70 50 H V L CNN 400 | F1 "Device_CP_Small" 10 -80 50 H V L CNN 401 | F2 "" 0 0 50 H I C CNN 402 | F3 "" 0 0 50 H I C CNN 403 | $FPLIST 404 | CP_* 405 | $ENDFPLIST 406 | DRAW 407 | S -60 -12 60 -27 0 1 0 F 408 | S -60 27 60 12 0 1 0 N 409 | P 2 0 1 0 -50 60 -30 60 N 410 | P 2 0 1 0 -40 50 -40 70 N 411 | X ~ 1 0 100 73 D 50 50 1 1 P 412 | X ~ 2 0 -100 73 U 50 50 1 1 P 413 | ENDDRAW 414 | ENDDEF 415 | # 416 | # Device_C_Small 417 | # 418 | DEF Device_C_Small C 0 10 N N 1 F N 419 | F0 "C" 10 70 50 H V L CNN 420 | F1 "Device_C_Small" 10 -80 50 H V L CNN 421 | F2 "" 0 0 50 H I C CNN 422 | F3 "" 0 0 50 H I C CNN 423 | $FPLIST 424 | C_* 425 | $ENDFPLIST 426 | DRAW 427 | P 2 0 1 13 -60 -20 60 -20 N 428 | P 2 0 1 12 -60 20 60 20 N 429 | X ~ 1 0 100 80 D 50 50 1 1 P 430 | X ~ 2 0 -100 80 U 50 50 1 1 P 431 | ENDDRAW 432 | ENDDEF 433 | # 434 | # Device_LED_Small 435 | # 436 | DEF Device_LED_Small D 0 10 N N 1 F N 437 | F0 "D" -50 125 50 H V L CNN 438 | F1 "Device_LED_Small" -175 -100 50 H V L CNN 439 | F2 "" 0 0 50 V I C CNN 440 | F3 "" 0 0 50 V I C CNN 441 | $FPLIST 442 | LED* 443 | LED_SMD:* 444 | LED_THT:* 445 | $ENDFPLIST 446 | DRAW 447 | P 2 0 1 10 -30 -40 -30 40 N 448 | P 2 0 1 0 40 0 -30 0 N 449 | P 4 0 1 10 30 -40 -30 0 30 40 30 -40 N 450 | P 5 0 1 0 0 30 -20 50 -10 50 -20 50 -20 40 N 451 | P 5 0 1 0 20 50 0 70 10 70 0 70 0 60 N 452 | X K 1 -100 0 70 R 50 50 1 1 P 453 | X A 2 100 0 70 L 50 50 1 1 P 454 | ENDDRAW 455 | ENDDEF 456 | # 457 | # Device_R_Network04 458 | # 459 | DEF Device_R_Network04 RN 0 0 Y N 1 F N 460 | F0 "RN" -300 0 50 V V C CNN 461 | F1 "Device_R_Network04" 200 0 50 V V C CNN 462 | F2 "Resistor_THT:R_Array_SIP5" 275 0 50 V I C CNN 463 | F3 "" 0 0 50 H I C CNN 464 | $FPLIST 465 | R?Array?SIP* 466 | $ENDFPLIST 467 | DRAW 468 | C -200 90 10 0 1 0 F 469 | C -100 90 10 0 1 0 F 470 | C 0 90 10 0 1 0 F 471 | S -250 -125 150 125 0 1 10 f 472 | S -230 60 -170 -100 0 1 10 N 473 | S -130 60 -70 -100 0 1 10 N 474 | S -30 60 30 -100 0 1 10 N 475 | S 70 60 130 -100 0 1 10 N 476 | P 2 0 1 0 -200 -100 -200 -150 N 477 | P 2 0 1 0 -100 -100 -100 -150 N 478 | P 2 0 1 0 0 -100 0 -150 N 479 | P 2 0 1 0 100 -100 100 -150 N 480 | P 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N 481 | P 4 0 1 0 -100 60 -100 90 0 90 0 60 N 482 | P 4 0 1 0 0 60 0 90 100 90 100 60 N 483 | X common 1 -200 200 100 D 50 50 1 1 P 484 | X R1 2 -200 -200 50 U 50 50 1 1 P 485 | X R2 3 -100 -200 50 U 50 50 1 1 P 486 | X R3 4 0 -200 50 U 50 50 1 1 P 487 | X R4 5 100 -200 50 U 50 50 1 1 P 488 | ENDDRAW 489 | ENDDEF 490 | # 491 | # Device_R_Network08 492 | # 493 | DEF Device_R_Network08 RN 0 0 Y N 1 F N 494 | F0 "RN" -500 0 50 V V C CNN 495 | F1 "Device_R_Network08" 400 0 50 V V C CNN 496 | F2 "Resistor_THT:R_Array_SIP9" 475 0 50 V I C CNN 497 | F3 "" 0 0 50 H I C CNN 498 | $FPLIST 499 | R?Array?SIP* 500 | $ENDFPLIST 501 | DRAW 502 | C -400 90 10 0 1 0 F 503 | C -300 90 10 0 1 0 F 504 | C -200 90 10 0 1 0 F 505 | C -100 90 10 0 1 0 F 506 | C 0 90 10 0 1 0 F 507 | C 100 90 10 0 1 0 F 508 | C 200 90 10 0 1 0 F 509 | S -450 -125 350 125 0 1 10 f 510 | S -430 60 -370 -100 0 1 10 N 511 | S -330 60 -270 -100 0 1 10 N 512 | S -230 60 -170 -100 0 1 10 N 513 | S -130 60 -70 -100 0 1 10 N 514 | S -30 60 30 -100 0 1 10 N 515 | S 70 60 130 -100 0 1 10 N 516 | S 170 60 230 -100 0 1 10 N 517 | S 270 60 330 -100 0 1 10 N 518 | P 2 0 1 0 -400 -100 -400 -150 N 519 | P 2 0 1 0 -300 -100 -300 -150 N 520 | P 2 0 1 0 -200 -100 -200 -150 N 521 | P 2 0 1 0 -100 -100 -100 -150 N 522 | P 2 0 1 0 0 -100 0 -150 N 523 | P 2 0 1 0 100 -100 100 -150 N 524 | P 2 0 1 0 200 -100 200 -150 N 525 | P 2 0 1 0 300 -100 300 -150 N 526 | P 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N 527 | P 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N 528 | P 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N 529 | P 4 0 1 0 -100 60 -100 90 0 90 0 60 N 530 | P 4 0 1 0 0 60 0 90 100 90 100 60 N 531 | P 4 0 1 0 100 60 100 90 200 90 200 60 N 532 | P 4 0 1 0 200 60 200 90 300 90 300 60 N 533 | X common 1 -400 200 100 D 50 50 1 1 P 534 | X R1 2 -400 -200 50 U 50 50 1 1 P 535 | X R2 3 -300 -200 50 U 50 50 1 1 P 536 | X R3 4 -200 -200 50 U 50 50 1 1 P 537 | X R4 5 -100 -200 50 U 50 50 1 1 P 538 | X R5 6 0 -200 50 U 50 50 1 1 P 539 | X R6 7 100 -200 50 U 50 50 1 1 P 540 | X R7 8 200 -200 50 U 50 50 1 1 P 541 | X R8 9 300 -200 50 U 50 50 1 1 P 542 | ENDDRAW 543 | ENDDEF 544 | # 545 | # Device_R_Small 546 | # 547 | DEF Device_R_Small R 0 10 N N 1 F N 548 | F0 "R" 30 20 50 H V L CNN 549 | F1 "Device_R_Small" 30 -40 50 H V L CNN 550 | F2 "" 0 0 50 H I C CNN 551 | F3 "" 0 0 50 H I C CNN 552 | $FPLIST 553 | R_* 554 | $ENDFPLIST 555 | DRAW 556 | S -30 70 30 -70 0 1 8 N 557 | X ~ 1 0 100 30 D 50 50 1 1 P 558 | X ~ 2 0 -100 30 U 50 50 1 1 P 559 | ENDDRAW 560 | ENDDEF 561 | # 562 | # Mechanical_MountingHole_Pad 563 | # 564 | DEF Mechanical_MountingHole_Pad H 0 40 N N 1 F N 565 | F0 "H" 0 250 50 H V C CNN 566 | F1 "Mechanical_MountingHole_Pad" 0 175 50 H V C CNN 567 | F2 "" 0 0 50 H I C CNN 568 | F3 "" 0 0 50 H I C CNN 569 | $FPLIST 570 | MountingHole*Pad* 571 | $ENDFPLIST 572 | DRAW 573 | C 0 50 50 0 1 50 N 574 | X 1 1 0 -100 100 U 50 50 1 1 I 575 | ENDDRAW 576 | ENDDEF 577 | # 578 | # Memory_RAM_AS6C4008-55PCN 579 | # 580 | DEF Memory_RAM_AS6C4008-55PCN U 0 20 Y Y 1 F N 581 | F0 "U" -400 1025 50 H V L BNN 582 | F1 "Memory_RAM_AS6C4008-55PCN" 100 1025 50 H V L BNN 583 | F2 "Package_DIP:DIP-32_W15.24mm" 0 100 50 H I C CNN 584 | F3 "" 0 100 50 H I C CNN 585 | $FPLIST 586 | DIP*W15.24mm* 587 | $ENDFPLIST 588 | DRAW 589 | S -400 1000 400 -1000 0 1 10 f 590 | X VSS 16 0 -1100 100 U 50 50 0 0 W 591 | X VCC 32 0 1100 100 D 50 50 0 0 W 592 | X A18 1 -500 -900 100 R 50 50 1 1 I 593 | X A2 10 -500 700 100 R 50 50 1 1 I 594 | X A1 11 -500 800 100 R 50 50 1 1 I 595 | X A0 12 -500 900 100 R 50 50 1 1 I 596 | X DQ0 13 500 900 100 L 50 50 1 1 T 597 | X DQ1 14 500 800 100 L 50 50 1 1 T 598 | X DQ2 15 500 700 100 L 50 50 1 1 T 599 | X DQ3 17 500 600 100 L 50 50 1 1 T 600 | X DQ4 18 500 500 100 L 50 50 1 1 T 601 | X DQ5 19 500 400 100 L 50 50 1 1 T 602 | X A16 2 -500 -700 100 R 50 50 1 1 I 603 | X DQ6 20 500 300 100 L 50 50 1 1 T 604 | X DQ7 21 500 200 100 L 50 50 1 1 T 605 | X CE# 22 500 -100 100 L 50 50 1 1 I 606 | X A10 23 -500 -100 100 R 50 50 1 1 I 607 | X OE# 24 500 -200 100 L 50 50 1 1 I 608 | X A11 25 -500 -200 100 R 50 50 1 1 I 609 | X A9 26 -500 0 100 R 50 50 1 1 I 610 | X A8 27 -500 100 100 R 50 50 1 1 I 611 | X A13 28 -500 -400 100 R 50 50 1 1 I 612 | X WE# 29 500 -300 100 L 50 50 1 1 I 613 | X A14 3 -500 -500 100 R 50 50 1 1 I 614 | X A17 30 -500 -800 100 R 50 50 1 1 I 615 | X A15 31 -500 -600 100 R 50 50 1 1 I 616 | X A12 4 -500 -300 100 R 50 50 1 1 I 617 | X A7 5 -500 200 100 R 50 50 1 1 I 618 | X A6 6 -500 300 100 R 50 50 1 1 I 619 | X A5 7 -500 400 100 R 50 50 1 1 I 620 | X A4 8 -500 500 100 R 50 50 1 1 I 621 | X A3 9 -500 600 100 R 50 50 1 1 I 622 | ENDDRAW 623 | ENDDEF 624 | # 625 | # power_+12V 626 | # 627 | DEF power_+12V #PWR 0 0 Y Y 1 F P 628 | F0 "#PWR" 0 -150 50 H I C CNN 629 | F1 "power_+12V" 0 140 50 H V C CNN 630 | F2 "" 0 0 50 H I C CNN 631 | F3 "" 0 0 50 H I C CNN 632 | DRAW 633 | P 2 0 1 0 -30 50 0 100 N 634 | P 2 0 1 0 0 0 0 100 N 635 | P 2 0 1 0 0 100 30 50 N 636 | X +12V 1 0 0 0 U 50 50 1 1 W N 637 | ENDDRAW 638 | ENDDEF 639 | # 640 | # power_-12V 641 | # 642 | DEF power_-12V #PWR 0 0 Y Y 1 F P 643 | F0 "#PWR" 0 100 50 H I C CNN 644 | F1 "power_-12V" 0 150 50 H V C CNN 645 | F2 "" 0 0 50 H I C CNN 646 | F3 "" 0 0 50 H I C CNN 647 | DRAW 648 | P 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F 649 | X -12V 1 0 0 0 U 50 50 0 0 W N 650 | ENDDRAW 651 | ENDDEF 652 | # 653 | # power_GND 654 | # 655 | DEF power_GND #PWR 0 0 Y Y 1 F P 656 | F0 "#PWR" 0 -250 50 H I C CNN 657 | F1 "power_GND" 0 -150 50 H V C CNN 658 | F2 "" 0 0 50 H I C CNN 659 | F3 "" 0 0 50 H I C CNN 660 | DRAW 661 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 662 | X GND 1 0 0 0 D 50 50 1 1 W N 663 | ENDDRAW 664 | ENDDEF 665 | # 666 | # power_VCC 667 | # 668 | DEF power_VCC #PWR 0 0 Y Y 1 F P 669 | F0 "#PWR" 0 -150 50 H I C CNN 670 | F1 "power_VCC" 0 150 50 H V C CNN 671 | F2 "" 0 0 50 H I C CNN 672 | F3 "" 0 0 50 H I C CNN 673 | DRAW 674 | P 2 0 1 0 -30 50 0 100 N 675 | P 2 0 1 0 0 0 0 100 N 676 | P 2 0 1 0 0 100 30 50 N 677 | X VCC 1 0 0 0 U 50 50 1 1 W N 678 | ENDDRAW 679 | ENDDEF 680 | # 681 | #End Library 682 | -------------------------------------------------------------------------------- /ISA_EMS.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "board_outline_line_width": 0.049999999999999996, 7 | "copper_line_width": 0.19999999999999998, 8 | "copper_text_italic": false, 9 | "copper_text_size_h": 1.5, 10 | "copper_text_size_v": 1.5, 11 | "copper_text_thickness": 0.3, 12 | "copper_text_upright": false, 13 | "courtyard_line_width": 0.049999999999999996, 14 | "dimension_precision": 4, 15 | "dimension_units": 3, 16 | "dimensions": { 17 | "arrow_length": 1270000, 18 | "extension_offset": 500000, 19 | "keep_text_aligned": true, 20 | "suppress_zeroes": false, 21 | "text_position": 0, 22 | "units_format": 1 23 | }, 24 | "fab_line_width": 0.09999999999999999, 25 | "fab_text_italic": false, 26 | "fab_text_size_h": 1.0, 27 | "fab_text_size_v": 1.0, 28 | "fab_text_thickness": 0.15, 29 | "fab_text_upright": false, 30 | "other_line_width": 0.09999999999999999, 31 | "other_text_italic": false, 32 | "other_text_size_h": 1.0, 33 | "other_text_size_v": 1.0, 34 | "other_text_thickness": 0.15, 35 | "other_text_upright": false, 36 | "pads": { 37 | "drill": 0.762, 38 | "height": 1.524, 39 | "width": 1.524 40 | }, 41 | "silk_line_width": 0.12, 42 | "silk_text_italic": false, 43 | "silk_text_size_h": 1.0, 44 | "silk_text_size_v": 1.0, 45 | "silk_text_thickness": 0.15, 46 | "silk_text_upright": false, 47 | "zones": { 48 | "min_clearance": 0.508 49 | } 50 | }, 51 | "diff_pair_dimensions": [], 52 | "drc_exclusions": [], 53 | "meta": { 54 | "filename": "board_design_settings.json", 55 | "version": 2 56 | }, 57 | "rule_severities": { 58 | "annular_width": "error", 59 | "clearance": "error", 60 | "connection_width": "warning", 61 | "copper_edge_clearance": "error", 62 | "copper_sliver": "warning", 63 | "courtyards_overlap": "error", 64 | "diff_pair_gap_out_of_range": "error", 65 | "diff_pair_uncoupled_length_too_long": "error", 66 | "drill_out_of_range": "error", 67 | "duplicate_footprints": "warning", 68 | "extra_footprint": "warning", 69 | "footprint": "error", 70 | "footprint_type_mismatch": "ignore", 71 | "hole_clearance": "error", 72 | "hole_near_hole": "error", 73 | "invalid_outline": "error", 74 | "isolated_copper": "warning", 75 | "item_on_disabled_layer": "error", 76 | "items_not_allowed": "error", 77 | "length_out_of_range": "error", 78 | "lib_footprint_issues": "warning", 79 | "lib_footprint_mismatch": "warning", 80 | "malformed_courtyard": "error", 81 | "microvia_drill_out_of_range": "error", 82 | "missing_courtyard": "ignore", 83 | "missing_footprint": "warning", 84 | "net_conflict": "warning", 85 | "npth_inside_courtyard": "ignore", 86 | "padstack": "warning", 87 | "pth_inside_courtyard": "ignore", 88 | "shorting_items": "error", 89 | "silk_edge_clearance": "warning", 90 | "silk_over_copper": "warning", 91 | "silk_overlap": "warning", 92 | "skew_out_of_range": "error", 93 | "solder_mask_bridge": "error", 94 | "starved_thermal": "error", 95 | "text_height": "warning", 96 | "text_thickness": "warning", 97 | "through_hole_pad_without_hole": "error", 98 | "too_many_vias": "error", 99 | "track_dangling": "warning", 100 | "track_width": "error", 101 | "tracks_crossing": "error", 102 | "unconnected_items": "error", 103 | "unresolved_variable": "error", 104 | "via_dangling": "warning", 105 | "zones_intersect": "error" 106 | }, 107 | "rule_severitieslegacy_courtyards_overlap": true, 108 | "rule_severitieslegacy_no_courtyard_defined": false, 109 | "rules": { 110 | "max_error": 0.005, 111 | "min_clearance": 0.0, 112 | "min_connection": 0.0, 113 | "min_copper_edge_clearance": 0.5, 114 | "min_hole_clearance": 0.25, 115 | "min_hole_to_hole": 0.25, 116 | "min_microvia_diameter": 0.19999999999999998, 117 | "min_microvia_drill": 0.09999999999999999, 118 | "min_resolved_spokes": 2, 119 | "min_silk_clearance": 0.0, 120 | "min_text_height": 0.7999999999999999, 121 | "min_text_thickness": 0.08, 122 | "min_through_hole_diameter": 0.3, 123 | "min_track_width": 0.19999999999999998, 124 | "min_via_annular_width": 0.09999999999999999, 125 | "min_via_diameter": 0.39999999999999997, 126 | "solder_mask_to_copper_clearance": 0.0, 127 | "use_height_for_length_calcs": true 128 | }, 129 | "teardrop_options": [ 130 | { 131 | "td_allow_use_two_tracks": true, 132 | "td_curve_segcount": 5, 133 | "td_on_pad_in_zone": false, 134 | "td_onpadsmd": true, 135 | "td_onroundshapesonly": false, 136 | "td_ontrackend": false, 137 | "td_onviapad": true 138 | } 139 | ], 140 | "teardrop_parameters": [ 141 | { 142 | "td_curve_segcount": 0, 143 | "td_height_ratio": 1.0, 144 | "td_length_ratio": 0.5, 145 | "td_maxheight": 2.0, 146 | "td_maxlen": 1.0, 147 | "td_target_name": "td_round_shape", 148 | "td_width_to_size_filter_ratio": 0.9 149 | }, 150 | { 151 | "td_curve_segcount": 0, 152 | "td_height_ratio": 1.0, 153 | "td_length_ratio": 0.5, 154 | "td_maxheight": 2.0, 155 | "td_maxlen": 1.0, 156 | "td_target_name": "td_rect_shape", 157 | "td_width_to_size_filter_ratio": 0.9 158 | }, 159 | { 160 | "td_curve_segcount": 0, 161 | "td_height_ratio": 1.0, 162 | "td_length_ratio": 0.5, 163 | "td_maxheight": 2.0, 164 | "td_maxlen": 1.0, 165 | "td_target_name": "td_track_end", 166 | "td_width_to_size_filter_ratio": 0.9 167 | } 168 | ], 169 | "track_widths": [], 170 | "via_dimensions": [], 171 | "zones_allow_external_fillets": false 172 | }, 173 | "layer_presets": [], 174 | "viewports": [] 175 | }, 176 | "boards": [], 177 | "cvpcb": { 178 | "equivalence_files": [] 179 | }, 180 | "erc": { 181 | "erc_exclusions": [], 182 | "meta": { 183 | "version": 0 184 | }, 185 | "pin_map": [ 186 | [ 187 | 0, 188 | 0, 189 | 0, 190 | 0, 191 | 0, 192 | 0, 193 | 1, 194 | 0, 195 | 0, 196 | 0, 197 | 0, 198 | 2 199 | ], 200 | [ 201 | 0, 202 | 2, 203 | 0, 204 | 1, 205 | 0, 206 | 0, 207 | 1, 208 | 0, 209 | 2, 210 | 2, 211 | 2, 212 | 2 213 | ], 214 | [ 215 | 0, 216 | 0, 217 | 0, 218 | 0, 219 | 0, 220 | 0, 221 | 1, 222 | 0, 223 | 1, 224 | 0, 225 | 1, 226 | 2 227 | ], 228 | [ 229 | 0, 230 | 1, 231 | 0, 232 | 0, 233 | 0, 234 | 0, 235 | 1, 236 | 1, 237 | 2, 238 | 1, 239 | 1, 240 | 2 241 | ], 242 | [ 243 | 0, 244 | 0, 245 | 0, 246 | 0, 247 | 0, 248 | 0, 249 | 1, 250 | 0, 251 | 0, 252 | 0, 253 | 0, 254 | 2 255 | ], 256 | [ 257 | 0, 258 | 0, 259 | 0, 260 | 0, 261 | 0, 262 | 0, 263 | 0, 264 | 0, 265 | 0, 266 | 0, 267 | 0, 268 | 2 269 | ], 270 | [ 271 | 1, 272 | 1, 273 | 1, 274 | 1, 275 | 1, 276 | 0, 277 | 1, 278 | 1, 279 | 1, 280 | 1, 281 | 1, 282 | 2 283 | ], 284 | [ 285 | 0, 286 | 0, 287 | 0, 288 | 1, 289 | 0, 290 | 0, 291 | 1, 292 | 0, 293 | 0, 294 | 0, 295 | 0, 296 | 2 297 | ], 298 | [ 299 | 0, 300 | 2, 301 | 1, 302 | 2, 303 | 0, 304 | 0, 305 | 1, 306 | 0, 307 | 2, 308 | 2, 309 | 2, 310 | 2 311 | ], 312 | [ 313 | 0, 314 | 2, 315 | 0, 316 | 1, 317 | 0, 318 | 0, 319 | 1, 320 | 0, 321 | 2, 322 | 0, 323 | 0, 324 | 2 325 | ], 326 | [ 327 | 0, 328 | 2, 329 | 1, 330 | 1, 331 | 0, 332 | 0, 333 | 1, 334 | 0, 335 | 2, 336 | 0, 337 | 0, 338 | 2 339 | ], 340 | [ 341 | 2, 342 | 2, 343 | 2, 344 | 2, 345 | 2, 346 | 2, 347 | 2, 348 | 2, 349 | 2, 350 | 2, 351 | 2, 352 | 2 353 | ] 354 | ], 355 | "rule_severities": { 356 | "bus_definition_conflict": "error", 357 | "bus_entry_needed": "error", 358 | "bus_to_bus_conflict": "error", 359 | "bus_to_net_conflict": "error", 360 | "conflicting_netclasses": "error", 361 | "different_unit_footprint": "error", 362 | "different_unit_net": "error", 363 | "duplicate_reference": "error", 364 | "duplicate_sheet_names": "error", 365 | "endpoint_off_grid": "warning", 366 | "extra_units": "error", 367 | "global_label_dangling": "warning", 368 | "hier_label_mismatch": "error", 369 | "label_dangling": "error", 370 | "lib_symbol_issues": "warning", 371 | "missing_bidi_pin": "warning", 372 | "missing_input_pin": "warning", 373 | "missing_power_pin": "error", 374 | "missing_unit": "warning", 375 | "multiple_net_names": "warning", 376 | "net_not_bus_member": "warning", 377 | "no_connect_connected": "warning", 378 | "no_connect_dangling": "warning", 379 | "pin_not_connected": "error", 380 | "pin_not_driven": "error", 381 | "pin_to_pin": "warning", 382 | "power_pin_not_driven": "error", 383 | "similar_labels": "warning", 384 | "simulation_model_issue": "ignore", 385 | "unannotated": "error", 386 | "unit_value_mismatch": "error", 387 | "unresolved_variable": "error", 388 | "wire_dangling": "error" 389 | } 390 | }, 391 | "libraries": { 392 | "pinned_footprint_libs": [], 393 | "pinned_symbol_libs": [] 394 | }, 395 | "meta": { 396 | "filename": "ISA_EMS.kicad_pro", 397 | "version": 1 398 | }, 399 | "net_settings": { 400 | "classes": [ 401 | { 402 | "bus_width": 12, 403 | "clearance": 0.2, 404 | "diff_pair_gap": 0.25, 405 | "diff_pair_via_gap": 0.25, 406 | "diff_pair_width": 0.2, 407 | "line_style": 0, 408 | "microvia_diameter": 0.3, 409 | "microvia_drill": 0.1, 410 | "name": "Default", 411 | "pcb_color": "rgba(0, 0, 0, 0.000)", 412 | "schematic_color": "rgba(0, 0, 0, 0.000)", 413 | "track_width": 0.25, 414 | "via_diameter": 0.8, 415 | "via_drill": 0.4, 416 | "wire_width": 6 417 | }, 418 | { 419 | "bus_width": 12, 420 | "clearance": 0.2, 421 | "diff_pair_gap": 0.25, 422 | "diff_pair_via_gap": 0.25, 423 | "diff_pair_width": 0.2, 424 | "line_style": 0, 425 | "microvia_diameter": 0.3, 426 | "microvia_drill": 0.1, 427 | "name": "POWER", 428 | "pcb_color": "rgba(0, 0, 0, 0.000)", 429 | "schematic_color": "rgba(0, 0, 0, 0.000)", 430 | "track_width": 0.6, 431 | "via_diameter": 0.8, 432 | "via_drill": 0.4, 433 | "wire_width": 6 434 | }, 435 | { 436 | "bus_width": 12, 437 | "clearance": 0.2, 438 | "diff_pair_gap": 0.25, 439 | "diff_pair_via_gap": 0.25, 440 | "diff_pair_width": 0.2, 441 | "line_style": 0, 442 | "microvia_diameter": 0.3, 443 | "microvia_drill": 0.1, 444 | "name": "POWR_SMALL", 445 | "pcb_color": "rgba(0, 0, 0, 0.000)", 446 | "schematic_color": "rgba(0, 0, 0, 0.000)", 447 | "track_width": 0.35, 448 | "via_diameter": 0.8, 449 | "via_drill": 0.4, 450 | "wire_width": 6 451 | } 452 | ], 453 | "meta": { 454 | "version": 3 455 | }, 456 | "net_colors": null, 457 | "netclass_assignments": null, 458 | "netclass_patterns": [ 459 | { 460 | "netclass": "Default", 461 | "pattern": "/A0" 462 | }, 463 | { 464 | "netclass": "Default", 465 | "pattern": "/A1" 466 | }, 467 | { 468 | "netclass": "Default", 469 | "pattern": "/A10" 470 | }, 471 | { 472 | "netclass": "Default", 473 | "pattern": "/A11" 474 | }, 475 | { 476 | "netclass": "Default", 477 | "pattern": "/A12" 478 | }, 479 | { 480 | "netclass": "Default", 481 | "pattern": "/A13" 482 | }, 483 | { 484 | "netclass": "Default", 485 | "pattern": "/A14" 486 | }, 487 | { 488 | "netclass": "Default", 489 | "pattern": "/A15" 490 | }, 491 | { 492 | "netclass": "Default", 493 | "pattern": "/A16" 494 | }, 495 | { 496 | "netclass": "Default", 497 | "pattern": "/A17" 498 | }, 499 | { 500 | "netclass": "Default", 501 | "pattern": "/A18" 502 | }, 503 | { 504 | "netclass": "Default", 505 | "pattern": "/A19" 506 | }, 507 | { 508 | "netclass": "Default", 509 | "pattern": "/A2" 510 | }, 511 | { 512 | "netclass": "Default", 513 | "pattern": "/A3" 514 | }, 515 | { 516 | "netclass": "Default", 517 | "pattern": "/A4" 518 | }, 519 | { 520 | "netclass": "Default", 521 | "pattern": "/A5" 522 | }, 523 | { 524 | "netclass": "Default", 525 | "pattern": "/A6" 526 | }, 527 | { 528 | "netclass": "Default", 529 | "pattern": "/A7" 530 | }, 531 | { 532 | "netclass": "Default", 533 | "pattern": "/A8" 534 | }, 535 | { 536 | "netclass": "Default", 537 | "pattern": "/A9" 538 | }, 539 | { 540 | "netclass": "Default", 541 | "pattern": "/AEN" 542 | }, 543 | { 544 | "netclass": "Default", 545 | "pattern": "/D0" 546 | }, 547 | { 548 | "netclass": "Default", 549 | "pattern": "/D1" 550 | }, 551 | { 552 | "netclass": "Default", 553 | "pattern": "/D2" 554 | }, 555 | { 556 | "netclass": "Default", 557 | "pattern": "/D3" 558 | }, 559 | { 560 | "netclass": "Default", 561 | "pattern": "/D4" 562 | }, 563 | { 564 | "netclass": "Default", 565 | "pattern": "/D5" 566 | }, 567 | { 568 | "netclass": "Default", 569 | "pattern": "/D6" 570 | }, 571 | { 572 | "netclass": "Default", 573 | "pattern": "/D7" 574 | }, 575 | { 576 | "netclass": "Default", 577 | "pattern": "/DB0" 578 | }, 579 | { 580 | "netclass": "Default", 581 | "pattern": "/DB1" 582 | }, 583 | { 584 | "netclass": "Default", 585 | "pattern": "/DB2" 586 | }, 587 | { 588 | "netclass": "Default", 589 | "pattern": "/DB3" 590 | }, 591 | { 592 | "netclass": "Default", 593 | "pattern": "/DB4" 594 | }, 595 | { 596 | "netclass": "Default", 597 | "pattern": "/DB5" 598 | }, 599 | { 600 | "netclass": "Default", 601 | "pattern": "/DB6" 602 | }, 603 | { 604 | "netclass": "Default", 605 | "pattern": "/DB7" 606 | }, 607 | { 608 | "netclass": "Default", 609 | "pattern": "/JP1" 610 | }, 611 | { 612 | "netclass": "Default", 613 | "pattern": "/JP2" 614 | }, 615 | { 616 | "netclass": "Default", 617 | "pattern": "/JP3" 618 | }, 619 | { 620 | "netclass": "Default", 621 | "pattern": "/JP4" 622 | }, 623 | { 624 | "netclass": "Default", 625 | "pattern": "/RAM-A14" 626 | }, 627 | { 628 | "netclass": "Default", 629 | "pattern": "/RAM-A15" 630 | }, 631 | { 632 | "netclass": "Default", 633 | "pattern": "/RAM-A16" 634 | }, 635 | { 636 | "netclass": "Default", 637 | "pattern": "/RAM-A17" 638 | }, 639 | { 640 | "netclass": "Default", 641 | "pattern": "/RAM-A18" 642 | }, 643 | { 644 | "netclass": "Default", 645 | "pattern": "/RAM-A19" 646 | }, 647 | { 648 | "netclass": "Default", 649 | "pattern": "/RAM-A20" 650 | }, 651 | { 652 | "netclass": "Default", 653 | "pattern": "/RAM-A21" 654 | }, 655 | { 656 | "netclass": "Default", 657 | "pattern": "/REG0-LOAD" 658 | }, 659 | { 660 | "netclass": "Default", 661 | "pattern": "/REG1-LOAD" 662 | }, 663 | { 664 | "netclass": "Default", 665 | "pattern": "/REG2-LOAD" 666 | }, 667 | { 668 | "netclass": "Default", 669 | "pattern": "/REG3-LOAD" 670 | }, 671 | { 672 | "netclass": "Default", 673 | "pattern": "/~{IOW}" 674 | }, 675 | { 676 | "netclass": "Default", 677 | "pattern": "/~{MEMR}" 678 | }, 679 | { 680 | "netclass": "Default", 681 | "pattern": "/~{MEMW}" 682 | }, 683 | { 684 | "netclass": "Default", 685 | "pattern": "/~{RAM-CS0}" 686 | }, 687 | { 688 | "netclass": "Default", 689 | "pattern": "/~{RAM-CS1}" 690 | }, 691 | { 692 | "netclass": "Default", 693 | "pattern": "/~{RAM-CS2}" 694 | }, 695 | { 696 | "netclass": "Default", 697 | "pattern": "/~{RAM-CS3}" 698 | }, 699 | { 700 | "netclass": "Default", 701 | "pattern": "/~{RAM-CS4}" 702 | }, 703 | { 704 | "netclass": "Default", 705 | "pattern": "/~{RAM-CS5}" 706 | }, 707 | { 708 | "netclass": "Default", 709 | "pattern": "/~{RAM-CS6}" 710 | }, 711 | { 712 | "netclass": "Default", 713 | "pattern": "/~{RAM-CS7}" 714 | }, 715 | { 716 | "netclass": "Default", 717 | "pattern": "/~{RAM-SELECT}" 718 | }, 719 | { 720 | "netclass": "Default", 721 | "pattern": "/~{REG0-OE}" 722 | }, 723 | { 724 | "netclass": "Default", 725 | "pattern": "/~{REG1-OE}" 726 | }, 727 | { 728 | "netclass": "Default", 729 | "pattern": "/~{REG2-OE}" 730 | }, 731 | { 732 | "netclass": "Default", 733 | "pattern": "/~{REG3-OE}" 734 | }, 735 | { 736 | "netclass": "Default", 737 | "pattern": "Net-(D1-Pad1)" 738 | }, 739 | { 740 | "netclass": "Default", 741 | "pattern": "Net-(U10-Pad1)" 742 | }, 743 | { 744 | "netclass": "Default", 745 | "pattern": "Net-(U10-Pad3)" 746 | }, 747 | { 748 | "netclass": "Default", 749 | "pattern": "Net-(U11-Pad1)" 750 | }, 751 | { 752 | "netclass": "Default", 753 | "pattern": "Net-(U11-Pad3)" 754 | }, 755 | { 756 | "netclass": "Default", 757 | "pattern": "Net-(U11-Pad5)" 758 | }, 759 | { 760 | "netclass": "Default", 761 | "pattern": "Net-(U11-Pad9)" 762 | }, 763 | { 764 | "netclass": "POWER", 765 | "pattern": "GND" 766 | }, 767 | { 768 | "netclass": "POWER", 769 | "pattern": "VCC" 770 | } 771 | ] 772 | }, 773 | "pcbnew": { 774 | "last_paths": { 775 | "gencad": "", 776 | "idf": "", 777 | "netlist": "", 778 | "specctra_dsn": "", 779 | "step": "", 780 | "vrml": "" 781 | }, 782 | "page_layout_descr_file": "" 783 | }, 784 | "schematic": { 785 | "annotate_start_num": 0, 786 | "drawing": { 787 | "dashed_lines_dash_length_ratio": 12.0, 788 | "dashed_lines_gap_length_ratio": 3.0, 789 | "default_line_thickness": 6.0, 790 | "default_text_size": 50.0, 791 | "field_names": [], 792 | "intersheets_ref_own_page": false, 793 | "intersheets_ref_prefix": "", 794 | "intersheets_ref_short": false, 795 | "intersheets_ref_show": false, 796 | "intersheets_ref_suffix": "", 797 | "junction_size_choice": 3, 798 | "label_size_ratio": 0.25, 799 | "pin_symbol_size": 0.0, 800 | "text_offset_ratio": 0.08 801 | }, 802 | "legacy_lib_dir": "", 803 | "legacy_lib_list": [], 804 | "meta": { 805 | "version": 1 806 | }, 807 | "net_format_name": "", 808 | "page_layout_descr_file": "", 809 | "plot_directory": "", 810 | "spice_current_sheet_as_root": false, 811 | "spice_external_command": "spice \"%I\"", 812 | "spice_model_current_sheet_as_root": true, 813 | "spice_save_all_currents": false, 814 | "spice_save_all_voltages": false, 815 | "subpart_first_id": 65, 816 | "subpart_id_separator": 0 817 | }, 818 | "sheets": [ 819 | [ 820 | "db0d59e5-913b-48ca-b79b-0695b750d0cf", 821 | "" 822 | ] 823 | ], 824 | "text_variables": {} 825 | } 826 | -------------------------------------------------------------------------------- /ISA_EMS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkzlab/ISA_EMS_4Mb/588682ac2cb9260f0a46a2837dc3b6a72e0f3f20/ISA_EMS.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ISA 4Mb EMS / ROM Adapter 2 | 3 | ## Introduction 4 | 5 | This is a reimplementation of the **lo-tech.co.uk** [2Mb ISA EMS board](https://www.lo-tech.co.uk/wiki/Lo-tech_2MB_EMS_Board) with small changes: 6 | 7 | - All components are thru-hole instead of SMD 8 | - Maximum installable memory expanded to 4Mb 9 | - Activity led to indicate when the memory is accessed 10 | - Optional ROM expansion (had some free space on the PCB...) 11 | 12 | ![Rev. 1.0 PCB](pics/ISA_EMS.png) 13 | 14 | ### Disclaimer 15 | 16 | I take NO responsibility for what happens if you decide to build and use this card. Your computer might crash, catch fire or be destroyed in other nasty ways. 17 | Also, as this card is mostly based on the work of others, You're encourauged to take what you deem fit from this, and use it in your projects! 18 | 19 | Additionally, do **NOT CONTACT lo-tech.co.uk FOR SUPPORT**, while this board is derived from their work, it is not their product, please do not waste their time. 20 | 21 | ## Configuration 22 | 23 | ### EMS 24 | 25 | To configure the EMS, jumpers on J2 header are used. 26 | 27 | Pins 1 and 2 configure the Page Frame base address, while 3 and 4 configure the IO Port base address. 28 | 29 | ```text 30 | 31 | EMS Page Frame Base 32 | 1 | 2 | Base | 33 | ---+---+-------+ 34 | X | X | C000h | 35 | ---+---+-------+ 36 | | X | D000h | 37 | ---+---+-------+ 38 | X | | E000h | 39 | ---+---+-------+ 40 | | | Inval | 41 | ---+---+-------+ 42 | 43 | EMS IO Port Base 44 | 3 | 4 | Base | 45 | ---+---+------------+ 46 | X | X | 260-263h | 47 | ---+---+------------+ 48 | | X | 264-267h | 49 | ---+---+------------+ 50 | X | | 268-26Bh | 51 | ---+---+------------+ 52 | | | 26C-26Fh | 53 | ---+---+------------+ 54 | 55 | ``` 56 | 57 | ### ROM 58 | 59 | To configure the expansion ROM, jumpers on J3 header are used. 60 | 61 | The `ENA` pin will enable the ROM when jumpered. 62 | 63 | When `32K` pin is jumpered, only 32Kb of the ROM will be used. The ROM can be made to appear at the following addresses: 64 | 65 | ```text 66 | | A18 | A17 | A16 | A15 | 67 | -------+-----+-----+-----+-----+ 68 | A000h | X | | X | X | 69 | -------+-----+-----+-----+-----+ 70 | A800h | X | | X | | (32K only) 71 | -------+-----+-----+-----+-----+ 72 | B000h | X | | | X | 73 | -------+-----+-----+-----+-----+ 74 | B800h | X | | | | (32K only) 75 | -------+-----+-----+-----+-----+ 76 | C000h | | X | X | X | 77 | -------+-----+-----+-----+-----+ 78 | C800h | | X | X | | (32K only) 79 | -------+-----+-----+-----+-----+ 80 | D000h | | X | | X | 81 | -------+-----+-----+-----+-----+ 82 | D800h | | X | | | (32K only) 83 | -------+-----+-----+-----+-----+ 84 | E000h | | | X | X | 85 | -------+-----+-----+-----+-----+ 86 | E800h | | | X | | (32K only) 87 | -------+-----+-----+-----+-----+ 88 | F000h | | | | X | 89 | -------+-----+-----+-----+-----+ 90 | F800h | | | | | (32K only) 91 | -------+-----+-----+-----+-----+ 92 | ``` 93 | 94 | 95 | ## Usage 96 | 97 | You need a **memory manager** to use this board. The original `LTEMM` driver provided by lo-tech only supports up to 2Mb. You can find a modified version under the `software` directory of this repository that supports up to 4Mb (actually 4080Kb or 255 pages, to support all 256 pages I need to rework the detection logic a bit... will get around to it in the future). 98 | 99 | ## Bill of Materials 100 | 101 | All ICs are in DIP package. 102 | 103 | If you don't need the expansion ROM feature, you can omit C19, C20, U1, U2, RN1, R1, R2 and J3. 104 | 105 | - U1, U7, U8: 74HCT688 106 | - U2: SST39SF010 107 | - U3, U4, U5, U6, U13, U14. U15, U16: AS6C4008 (You don't need to fill all sockets: fit as much memory as you need starting from socket 1!) 108 | - U11: 74HC04 (HCT is fine too) 109 | - U9: 74HCT139 110 | - U10: 74HCT32 111 | - U12: 74ACT245 112 | - U17: 74HCT138 113 | - U18, U19, U20, U21: 74HCT573 114 | - RN1: res. network, 10k, bussed, 6 pins 115 | - RN2: res. network, 10k, bussed, 5 pins 116 | - RN3: res. network, 10k, bussed, 9 pins. 117 | - R1, R2: 10k resistor 118 | - R3: ~470-1k resistor (depends on the type of LED mounted on D1 and desired brightness) 119 | - D1: 3.0mm or 5.0mm LED 120 | - J2 2x4 2.5mm breakable header 121 | - J3 2x7 2.5mm breakable header 122 | - C5, C6: 10uF / 50v electrolytic caps 123 | - Remaining caps: 22x 100nF, ceramic 124 | - ISA bracket: Keystone 9202, plus screws 125 | 126 | ## Known Issues 127 | 128 | I have received reports of this board being unstable when used with some homebrew PC clones, reports included the Xi8088 and NuXT. I have noted similar issues on a Micro8088. On the other hand, an all-CMOS board was tested fine on multiple AT clones I have. 129 | Replacing the following ICs with ones from the TTL family solved the issue for me and for others: U7, U8, U9, U10, U11, U12. 130 | 131 | Note that, for increased stability, I use an ISA terminator with these homebrew computers. 132 | 133 | Note that the EEPROM U2 has no buffers on the data output. This can cause instability on loaded/noisy buses. Support for the EEPROM will be removed in newer iterations of this board to produce a smaller variant. 134 | 135 | ## Credits 136 | 137 | - Thanks to [lo-tech.co.uk](https://www.lo-tech.co.uk/) for having published their schematics 138 | - Thanks to [Sergey](http://www.malinov.com/Home/sergeys-projects) for all his projects! 139 | 140 | -------------------------------------------------------------------------------- /fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name skiselev_footprints)(type KiCad)(uri ${KIPRJMOD}/libraries/my_kicad_library/My_Components.pretty)(options "")(descr "")) 3 | (lib (name ISA_DualUART)(type KiCad)(uri ${KIPRJMOD}/libraries/custom_libs/footprints/ISA_DualUART.pretty)(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /gerbers/rev_10.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkzlab/ISA_EMS_4Mb/588682ac2cb9260f0a46a2837dc3b6a72e0f3f20/gerbers/rev_10.zip -------------------------------------------------------------------------------- /libraries/custom_libs/custom_components.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP 16554 4 | D TL16C554 5 | K 4ch UART FIFO 6 | F http://www.ti.com/lit/ds/symlink/pc16550d.pdf 7 | $ENDCMP 8 | # 9 | #End Doc Library 10 | -------------------------------------------------------------------------------- /libraries/custom_libs/custom_components.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # 16554 5 | # 6 | DEF 16554 U 0 40 Y Y 1 F N 7 | F0 "U" -850 1600 50 H V L CNN 8 | F1 "16554" 600 1600 50 H V L CNN 9 | F2 "Package_LCC:PLCC-68_THT-Socket" 0 0 50 H I C CIN 10 | F3 "" 0 0 50 H I C CNN 11 | DRAW 12 | S -850 -2200 850 1550 0 1 10 f 13 | X D3 1 -1000 1100 150 R 50 50 1 1 B 14 | X ~DSRA 10 1000 1250 150 L 50 50 1 1 I 15 | X ~CTSA 11 1000 1150 150 L 50 50 1 1 I 16 | X ~DTRA 12 1000 1050 150 L 50 50 1 1 O 17 | X VCC 13 -150 1700 150 D 50 50 1 1 W 18 | X ~RTSA 14 1000 950 150 L 50 50 1 1 O 19 | X INTA 15 -1000 -1300 150 R 50 50 1 1 O 20 | X ~CSA 16 -1000 50 150 R 50 50 1 1 I 21 | X TXA 17 1000 750 150 L 50 50 1 1 O 22 | X ~WR~ 18 -1000 -500 150 R 50 50 1 1 I 23 | X TXB 19 1000 -200 150 L 50 50 1 1 O 24 | X D4 2 -1000 1000 150 R 50 50 1 1 B 25 | X ~CSB 20 -1000 -50 150 R 50 50 1 1 I 26 | X INTB 21 -1000 -1400 150 R 50 50 1 1 O 27 | X ~RTSB 22 1000 0 150 L 50 50 1 1 O 28 | X GND 23 -50 -2350 150 U 50 50 1 1 W 29 | X ~DTRB 24 1000 100 150 L 50 50 1 1 O 30 | X ~CTSB 25 1000 200 150 L 50 50 1 1 I 31 | X ~DSRB 26 1000 300 150 L 50 50 1 1 I 32 | X ~DCDB 27 1000 400 150 L 50 50 1 1 I 33 | X ~RIB 28 1000 500 150 L 50 50 1 1 I 34 | X RXB 29 1000 -100 150 L 50 50 1 1 I 35 | X D5 3 -1000 900 150 R 50 50 1 1 B 36 | X VCC 30 -50 1700 150 D 50 50 1 1 W 37 | X A2 32 -1000 300 150 R 50 50 1 1 I 38 | X A1 33 -1000 400 150 R 50 50 1 1 I 39 | X A0 34 -1000 500 150 R 50 50 1 1 I 40 | X XIN 35 -1000 -850 150 R 50 50 1 1 I 41 | X XOUT 36 -1000 -950 150 R 50 50 1 1 O 42 | X MR 37 -1000 -2100 150 R 50 50 1 1 I 43 | X ~RXRDY 38 -1000 -1800 150 R 50 50 1 1 O 44 | X ~TXRDY 39 -1000 -1900 150 R 50 50 1 1 O 45 | X D6 4 -1000 800 150 R 50 50 1 1 B 46 | X GND 40 50 -2350 150 U 50 50 1 1 W 47 | X RXC 41 1000 -1050 150 L 50 50 1 1 I 48 | X ~RIC 42 1000 -450 150 L 50 50 1 1 I 49 | X ~DCDC 43 1000 -550 150 L 50 50 1 1 I 50 | X ~DSRC 44 1000 -650 150 L 50 50 1 1 I 51 | X ~CTSC 45 1000 -750 150 L 50 50 1 1 I 52 | X ~DTRC 46 1000 -850 150 L 50 50 1 1 O 53 | X VCC 47 50 1700 150 D 50 50 1 1 W 54 | X ~RTSC 48 1000 -950 150 L 50 50 1 1 O 55 | X INTC 49 -1000 -1500 150 R 50 50 1 1 O 56 | X D7 5 -1000 700 150 R 50 50 1 1 B 57 | X ~CSC 50 -1000 -150 150 R 50 50 1 1 I 58 | X TXC 51 1000 -1150 150 L 50 50 1 1 O 59 | X ~RD~ 52 -1000 -600 150 R 50 50 1 1 I 60 | X TXD 53 1000 -2100 150 L 50 50 1 1 O 61 | X ~CSD 54 -1000 -250 150 R 50 50 1 1 I 62 | X INTD 55 -1000 -1600 150 R 50 50 1 1 O 63 | X ~RTSD 56 1000 -1900 150 L 50 50 1 1 O 64 | X GND 57 150 -2350 150 U 50 50 1 1 W 65 | X ~DTRD 58 1000 -1800 150 L 50 50 1 1 O 66 | X ~CTSD 59 1000 -1700 150 L 50 50 1 1 I 67 | X GND 6 -150 -2350 150 U 50 50 1 1 W 68 | X ~DSRD 60 1000 -1600 150 L 50 50 1 1 I 69 | X ~DCDD 61 1000 -1500 150 L 50 50 1 1 I 70 | X ~RID 62 1000 -1400 150 L 50 50 1 1 I 71 | X RXD 63 1000 -2000 150 L 50 50 1 1 I 72 | X VCC 64 150 1700 150 D 50 50 1 1 W 73 | X ~INTN 65 -1000 -1200 150 R 50 50 1 1 I 74 | X D0 66 -1000 1400 150 R 50 50 1 1 B 75 | X D1 67 -1000 1300 150 R 50 50 1 1 B 76 | X D2 68 -1000 1200 150 R 50 50 1 1 B 77 | X RXA 7 1000 850 150 L 50 50 1 1 I 78 | X ~RIA 8 1000 1450 150 L 50 50 1 1 I 79 | X ~DCDA 9 1000 1350 150 L 50 50 1 1 I 80 | ENDDRAW 81 | ENDDEF 82 | # 83 | #End Library 84 | -------------------------------------------------------------------------------- /libraries/custom_libs/footprints/ISA_DualUART.pretty/Oscillator_DIP-14-8.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Oscillator_DIP-14-8 (layer F.Cu) (tedit 60040353) 2 | (descr "Oscillator, DIP14, http://cdn-reichelt.de/documents/datenblatt/B400/OSZI.pdf") 3 | (tags oscillator) 4 | (fp_text reference REF** (at 7.62 -11.26) (layer F.SilkS) 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value Oscillator_DIP-14-8 (at 7.62 3.74) (layer F.Fab) 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_line (start -2.73 2.54) (end -2.73 -9.51) (layer F.Fab) (width 0.1)) 11 | (fp_line (start -2.08 -10.16) (end 17.32 -10.16) (layer F.Fab) (width 0.1)) 12 | (fp_line (start 17.97 -9.51) (end 17.97 1.89) (layer F.Fab) (width 0.1)) 13 | (fp_line (start -2.73 2.54) (end 17.32 2.54) (layer F.Fab) (width 0.1)) 14 | (fp_line (start -2.83 2.64) (end 17.32 2.64) (layer F.SilkS) (width 0.12)) 15 | (fp_line (start 18.07 1.89) (end 18.07 -9.51) (layer F.SilkS) (width 0.12)) 16 | (fp_line (start 17.32 -10.26) (end -2.08 -10.26) (layer F.SilkS) (width 0.12)) 17 | (fp_line (start -2.83 -9.51) (end -2.83 2.64) (layer F.SilkS) (width 0.12)) 18 | (fp_line (start -1.73 1.54) (end 16.62 1.54) (layer F.Fab) (width 0.1)) 19 | (fp_line (start -1.73 1.54) (end -1.73 -8.81) (layer F.Fab) (width 0.1)) 20 | (fp_line (start -1.38 -9.16) (end 16.62 -9.16) (layer F.Fab) (width 0.1)) 21 | (fp_line (start 16.97 1.19) (end 16.97 -8.81) (layer F.Fab) (width 0.1)) 22 | (fp_line (start -2.98 2.79) (end 18.22 2.79) (layer F.CrtYd) (width 0.05)) 23 | (fp_line (start -2.98 -10.41) (end -2.98 2.79) (layer F.CrtYd) (width 0.05)) 24 | (fp_line (start 18.22 -10.41) (end -2.98 -10.41) (layer F.CrtYd) (width 0.05)) 25 | (fp_line (start 18.22 2.79) (end 18.22 -10.41) (layer F.CrtYd) (width 0.05)) 26 | (fp_text user %R (at 7.62 -3.81) (layer F.Fab) 27 | (effects (font (size 1 1) (thickness 0.15))) 28 | ) 29 | (fp_arc (start 16.62 1.19) (end 16.97 1.19) (angle 90) (layer F.Fab) (width 0.1)) 30 | (fp_arc (start 16.62 -8.81) (end 16.62 -9.16) (angle 90) (layer F.Fab) (width 0.1)) 31 | (fp_arc (start -1.38 -8.81) (end -1.73 -8.81) (angle 90) (layer F.Fab) (width 0.1)) 32 | (fp_arc (start 17.32 1.89) (end 18.07 1.89) (angle 90) (layer F.SilkS) (width 0.12)) 33 | (fp_arc (start 17.32 -9.51) (end 17.32 -10.26) (angle 90) (layer F.SilkS) (width 0.12)) 34 | (fp_arc (start -2.08 -9.51) (end -2.83 -9.51) (angle 90) (layer F.SilkS) (width 0.12)) 35 | (fp_arc (start 17.32 1.89) (end 17.97 1.89) (angle 90) (layer F.Fab) (width 0.1)) 36 | (fp_arc (start 17.32 -9.51) (end 17.32 -10.16) (angle 90) (layer F.Fab) (width 0.1)) 37 | (fp_arc (start -2.08 -9.51) (end -2.73 -9.51) (angle 90) (layer F.Fab) (width 0.1)) 38 | (pad 1 thru_hole rect (at 0 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 39 | (pad 14 thru_hole circle (at 0 -7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 40 | (pad 8 thru_hole circle (at 15.24 -7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 41 | (pad 7 thru_hole circle (at 15.24 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 42 | (pad 14 thru_hole circle (at 7.62 -7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 43 | (pad 1 thru_hole rect (at 7.62 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 44 | (model ${KISYS3DMOD}/Oscillator.3dshapes/Oscillator_DIP-14.wrl 45 | (at (xyz 0 0 0)) 46 | (scale (xyz 1 1 1)) 47 | (rotate (xyz 0 0 0)) 48 | ) 49 | ) 50 | -------------------------------------------------------------------------------- /pics/ISA_EMS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkzlab/ISA_EMS_4Mb/588682ac2cb9260f0a46a2837dc3b6a72e0f3f20/pics/ISA_EMS.png -------------------------------------------------------------------------------- /software/LTEMM.ASM: -------------------------------------------------------------------------------- 1 | PAGE 90,132 2 | NAME LTEMM 3 | include LTEMM.MAC ; macros 4 | include LTEMM.INC ; structures 5 | ; 6 | ;************************************************************************ 7 | ;* * 8 | ;* EMS 4.0 Driver for Lo-tech 2MB EMS Board, rev.01, Mar-14 * 9 | ;* * 10 | ;* http://www.lo-tech.co.uk/wiki/2MB-EMS-Board * 11 | ;* http://www.lo-tech.co.uk/wiki/LTEMM.EXE * 12 | ;* * 13 | ;* This code is TASM source. * 14 | ;* * 15 | ;* Based on original works Copyright (c) 1988, Alex Tsourikov. * 16 | ;* All rights reserved. * 17 | ;* * 18 | ;* Original source kindly provided subject to the BSD 3-Clause * 19 | ;* License: http://opensource.org/licenses/BSD-3-Clause * 20 | ;* * 21 | ;* This software, as modified, is provided subject to the terms * 22 | ;* of use at: * 23 | ;* * 24 | ;* http://www.lo-tech.co.uk/wiki/lo-tech.co.uk:General_disclaimer * 25 | ;* * 26 | ;* No charge has been made for this software. * 27 | ;* * 28 | ;************************************************************************ 29 | 30 | code SEGMENT 31 | ASSUME CS:code 32 | 33 | ORG 0000H 34 | 35 | ; DEVICE header block 36 | emmdrv DW -1,-1 ;Link to next device (none) 37 | DW 8000H 38 | DW OFFSET emmstat 39 | DW OFFSET emmint 40 | DB 'EMMXXXX0' ; required - this is how apps 41 | ; detect EMS driver is present 42 | 43 | ptrsav LABEL DWORD 44 | parofs DW 0 45 | parseg DW 0 46 | 47 | ;-------------------------------------------------------------------- 48 | ; EMM driver work data area 49 | ;-------------------------------------------------------------------- 50 | emsio LABEL WORD 51 | ems_io DW 260h ;Default EMS i/o port address 52 | emm_flag db 0 ;EMM driver install status 53 | backup_count DB 0 ;mapping data backup count 54 | OSE_flag DW 0 ;OS/E function enable flag 55 | OSE_fast DW 0 ;OS/E fast access flag 56 | access_key_h DW 0 ;OS/E access key high 57 | access_key_l DW 0 ;OS/E access key low 58 | alter_map LABEL DWORD 59 | alter_map_off DW 0 60 | alter_map_seg DW 0 61 | page_ptr DW alloc_page ;allocate page buffer pointer. 62 | page_frame_seg DW 0E000h ;Default physical page frame address 63 | total_pages DW PAGE_MAX ;total logical page count 64 | un_alloc_pages DW PAGE_MAX ;unallocate logical page count 65 | handle_count DW 0 ;EMM handle used count 66 | jump_addr DW 0 ;EMM function jump address data area 67 | ; 68 | ; physical page status data area 69 | ; 70 | map_table LABEL phys_page_struct 71 | DB SIZE phys_page_struct * PHYS_PAGES DUP (-1) 72 | ; 73 | ; handle status flag buffer pointers (handle) 74 | ; 75 | alloc_page_count LABEL BYTE 76 | ; 77 | ; allocate page count buffer pointers (handle) 78 | ; 79 | handle_flag equ $+1 80 | dw HANDLE_CNT DUP(0) 81 | ; 82 | ; mapping data backup buffer pointers (handle) 83 | ; 84 | back_address LABEL WORD 85 | dw HANDLE_CNT DUP(0) 86 | ; 87 | ; allocate pages buffer pointers (handle) 88 | ; 89 | page_address LABEL WORD 90 | dw HANDLE_CNT DUP(0) 91 | ; 92 | ; mapping data backup area 93 | ; 94 | backup_map LABEL WORD 95 | db SIZE phys_page_struct * PHYS_PAGES * BACK_MAX DUP(-1) 96 | ; 97 | ; backup area status flags 98 | ; 99 | backup_flags LABEL BYTE 100 | db BACK_MAX DUP(0) 101 | ; 102 | ; allocate data area 103 | ; 104 | alloc_page LABEL WORD 105 | dw PAGE_MAX DUP(-1) 106 | ; 107 | ; logical page kanri data 108 | ; 55AAH:not used , 0 - 254:used , FFFFH:bad or non 109 | ; 110 | log_page LABEL WORD 111 | dw PAGE_MAX DUP(-1) 112 | ; 113 | ;==================================================================== 114 | ; 115 | ; Define offsets for io data packet 116 | ; 117 | iodat STRUC 118 | cmdlen DB ? ;LENGTH OF THIS COMMAND 119 | unit DB ? ;SUB UNIT SPECIFIER 120 | cmd DB ? ;COMMAND CODE 121 | status DW ? ;STATUS 122 | DB 8 DUP (?) 123 | media DB ? ;MEDIA DESCRIPTOR 124 | trans DD ? ;TRANSFER ADDRESS 125 | count DW ? ;COUNT OF BLOCKS OR CHARACTERS 126 | start DW ? ;FIRST BLOCK TO TRANSFER 127 | iodat ENDS 128 | 129 | ; 130 | ; Define offsets for io data packet 2 131 | ; 132 | iodat2 STRUC 133 | DB 13 DUP (?) 134 | DB ? 135 | brkoff DW ? ;BREAK ADDRESS (OFFSET) 136 | brkseg DW ? ;BREAK ADDRESS (SEGMENT) 137 | iodat2 ENDS 138 | 139 | ; 140 | ; Simplistic Strategy routine for non-multi-Tasking system. 141 | ; 142 | ; Currently just saves I/O packet pointers in PTRSAV for 143 | ; later processing by the individual interrupt routines. 144 | ; 145 | emmstat PROC FAR 146 | MOV CS:parofs,BX ; 147 | MOV CS:parseg,ES ; 148 | RET 149 | emmstat ENDP 150 | 151 | ; 152 | ; Common program for handling the simplistic I/O packet 153 | ; processing scheme in MSDOS 154 | ; 155 | emmint PROC FAR 156 | PUSH AX BX DS 157 | LDS BX,CS:ptrsav ;Retrieve pointer to I/O Packet. 158 | MOV AL,[BX].cmd ;Retrieve Command type. (1 => 16) 159 | CMP AL,10h ;Verify that not more than 16 commands. 160 | JA cmderr ;Ah, well, error out. 161 | OR AL,AL ;init. command? 162 | JNZ emmchk ;check EMS flag. 163 | JMP emminit ;EMS Driver initial. 164 | cmderr: 165 | MOV AL,3 ;Set unknown command error #. 166 | err_exit: ; 167 | MOV AH,10000001B ;Set error and done bits. 168 | JMP short exit1 ;Quick way out. 169 | ; 170 | ; EMM driver install check routine 171 | ; 172 | emmchk: 173 | CMP CS:emm_flag,1 ;EMM install flag on? 174 | JNZ err_exit ;no 175 | exit: 176 | MOV AH,00000001B ;Set done bit for MSDOS. 177 | exit1: 178 | LDS BX,CS:ptrsav ;Retrieve pointer to I/O Packet. 179 | MOV [BX].status,AX ;Save operation compete and status. 180 | POP DS BX AX 181 | RET 182 | emmint ENDP 183 | 184 | ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 185 | 186 | ;-------------------------------------------------------------------- 187 | ; int 67H EMM driver main routine 188 | ;-------------------------------------------------------------------- 189 | int67 PROC FAR 190 | CLI 191 | SUB SP,EMMWORK 192 | PUSH DS ES BP DI SI DX CX BX 193 | MOV BP,SP 194 | CLD 195 | PUSH CS 196 | POP DS 197 | 198 | ASSUME DS:code 199 | 200 | CMP AH,40H ; function code check 201 | JC err84 ; FUNCTION 1 - 30 ? 202 | f_max equ $+2 203 | CMP AH,5EH 204 | JNC err84 205 | PUSH BX 206 | MOV jump_addr,AX 207 | XCHG AH,AL 208 | AND AL,0BFH 209 | CBW 210 | SHL AX,1 211 | MOV BX,AX 212 | MOV AX,func_table[BX] 213 | XCHG AX,jump_addr 214 | POP BX 215 | JMP jump_addr ;---- jump to functions ----- 216 | noerr: ;normal return point. 217 | XOR AH,AH 218 | err_ret: ;error return point. 219 | POP BX CX DX SI DI BP ES DS 220 | ADD SP,EMMWORK 221 | IRET 222 | int67 ENDP 223 | 224 | ;-------------------------------------------------------------------- 225 | ; error status set routine 226 | ;-------------------------------------------------------------------- 227 | 228 | ;The manager detected a malfunction in the EMM software. 229 | err80: 230 | MOV AH,80H 231 | JMP err_ret 232 | 233 | ;The manager detected a malfunction in the expanded memory hardware. 234 | ;err81: 235 | ; MOV AH,81H 236 | ; JMP err_ret 237 | 238 | ;The EMM couldn't find the EMM handle your program specified. 239 | err83: 240 | MOV AH,83H 241 | JMP err_ret 242 | 243 | ;The function code passed to the EMM is not defined. 244 | err84: 245 | MOV AH,84H 246 | JMP err_ret 247 | 248 | ;All EMM handles are being used. 249 | err85: 250 | MOV AH,85H 251 | JMP err_ret 252 | 253 | ;The EMM detected a "save" or "restore" page mapping context error. 254 | err86: 255 | MOV AH,86H 256 | JMP err_ret 257 | 258 | ;There aren't enough expanded memory pages to satisfy your program's request. 259 | err87: 260 | MOV AH,87H 261 | JMP err_ret 262 | 263 | ;There aren't enough unallocated pages to satisfy your program's request. 264 | err88: 265 | MOV AH,88H 266 | JMP err_ret 267 | 268 | ;Can't allocate zero (0) pages. 269 | err89: 270 | MOV AH,89H 271 | JMP err_ret 272 | 273 | ;The logical page is out of the range of logical pages which are allocated to 274 | ;the EMM handle. 275 | err8a: 276 | MOV AH,8AH 277 | JMP err_ret 278 | 279 | ;The physical page to which the logical page is mapped is out of the range of 280 | ;physical pages. 281 | err8b: 282 | MOV AH,8BH 283 | JMP err_ret 284 | 285 | ;The page mapping hardware state save area is full. 286 | err8c: 287 | MOV AH,8CH 288 | JMP err_ret 289 | 290 | ;The page mapping hardware state save area already has a state associated with 291 | ;the EMM handle. 292 | err8d: 293 | MOV AH,8DH 294 | JMP err_ret 295 | 296 | ;The page mapping hardware state save area doesn't have a state associated with 297 | ;the EMM handle. 298 | err8e: 299 | MOV AH,8EH 300 | JMP err_ret 301 | 302 | ;The subfunction parameter passed to the function isn't defined. 303 | err8f: 304 | MOV AH,8FH 305 | JMP err_ret 306 | 307 | ;The attrbute type is undefined. 308 | err90: 309 | MOV AH,90H 310 | JMP err_ret 311 | 312 | ;The system configuration does not support non_volatility. 313 | err91: 314 | MOV AH,91H 315 | JMP err_ret 316 | 317 | ;The source and destination expanded memory region have the same handle and 318 | ;overlap. (move) 319 | err92: 320 | MOV AH,92H 321 | JMP err_ret 322 | 323 | ;The length of the specified source or destination expanded memory region 324 | ;exceeds the length of the expanded memory region allocated to the specified 325 | ;source or destination handle. 326 | err93: 327 | MOV AH,93H 328 | JMP err_ret 329 | 330 | ;The conventional memory region and expanded memory region overlap. 331 | err94: 332 | MOV AH,94H 333 | JMP err_ret 334 | 335 | ;The offset within the logical page exceeds the length of the logical page. 336 | err95: 337 | MOV AH,95H 338 | JMP err_ret 339 | 340 | ;Region length exceeds 1M_byte limit. 341 | err96: 342 | MOV AH,96H 343 | JMP err_ret 344 | 345 | ;The source and destination expanded memory region have the same handle and 346 | ;overlap. (exchanged) 347 | err97: 348 | MOV AH,97H 349 | JMP err_ret 350 | 351 | ;The memory source and destination type are undefined/not supported. 352 | err98: 353 | MOV AH,98H 354 | JMP err_ret 355 | 356 | ;Alternate map register serts are supported, but the alternate map register set 357 | ;specified is not support. 358 | err9a: 359 | MOV AH,9AH 360 | JMP err_ret 361 | 362 | ;Alternate map/DMA register sets are supported. However, all alternate map/DMA 363 | ;register sets are currently allocated. 364 | err9b: 365 | MOV AH,9BH 366 | JMP err_ret 367 | 368 | ;Alternate map/DMA register sets are not supported, and the alternate map/DMA 369 | ;register set specified is not zero. 370 | err9c: 371 | MOV AH,9CH 372 | JMP err_ret 373 | 374 | ;Alternate map register serts are supported, but the alternate map register set 375 | ;specified is not defined, not allocated, or is the currently allocated map 376 | ;register set. 377 | err9d: 378 | MOV AH,9DH 379 | JMP err_ret 380 | 381 | ;Dedicated DMA channels are not supported. 382 | err9e: 383 | MOV AH,9EH 384 | JMP err_ret 385 | 386 | ;Dedicated DMA channels are not supported. But the DMA channel specified is not 387 | ;supported. 388 | err9f: 389 | MOV AH,9FH 390 | JMP err_ret 391 | 392 | ;No corresponding handle value could be found for the handle name specified. 393 | erra0: 394 | MOV AH,0A0H 395 | JMP err_ret 396 | 397 | ;A handle with this name already exists. 398 | erra1: 399 | MOV AH,0A1H 400 | JMP err_ret 401 | 402 | ;An attempt was made to "wrap around" the 1M_byte address space during the 403 | ;move/exchange. 404 | erra2: 405 | MOV AH,0A2H 406 | JMP err_ret 407 | 408 | ;The contents of the data structure passed to the function have either been 409 | ;corrupted or are meaningless. 410 | erra3: 411 | MOV AH,0A3H 412 | JMP err_ret 413 | 414 | ;The operating system has denied access to the this function. 415 | erra4: 416 | MOV AH,0A4H 417 | JMP err_ret 418 | 419 | ;-------------------------------------------------------------------- 420 | ; EMM driver function jump table 421 | ; (40H - 5DH) 422 | ;-------------------------------------------------------------------- 423 | func_table LABEL WORD 424 | DW OFFSET noerr 425 | DW OFFSET func2 426 | DW OFFSET func3 427 | DW OFFSET func4 428 | DW OFFSET func5 429 | DW OFFSET func6 430 | DW OFFSET func7 431 | DW OFFSET func8 432 | DW OFFSET func9 433 | DW OFFSET err84 434 | DW OFFSET err84 435 | DW OFFSET func12 436 | DW OFFSET func13 437 | DW OFFSET func14 438 | DW OFFSET func15 439 | DW OFFSET func16 440 | DW OFFSET func17 441 | DW OFFSET func18 442 | DW OFFSET func19 443 | DW OFFSET func20 444 | DW OFFSET func21 445 | DW OFFSET func22 446 | DW OFFSET func23 447 | DW OFFSET func24 448 | DW OFFSET func25 449 | DW OFFSET func26 450 | DW OFFSET func27 451 | DW OFFSET func28 452 | DW OFFSET func29 453 | DW OFFSET func30 454 | 455 | ;======================================================================== 456 | 457 | ;-------------------------------------------------------------------- 458 | ; Set physical page map. 459 | ; output 460 | ; CF = 0 : OK 461 | ; CF = 1 : NG 462 | ;-------------------------------------------------------------------- 463 | set_pages_map PROC NEAR 464 | PUSH AX CX DX DI 465 | MOV DI,OFFSET map_table 466 | MOV CX,PHYS_PAGES 467 | set_pages_map2: 468 | MOV DX,CS:[DI].phys_page_port 469 | MOV AL,CS:[DI].log_page_data 470 | OUT DX,AL ;mapping physical pages... 471 | ADD DI,SIZE phys_page_struct 472 | LOOP set_pages_map2 473 | POP DI DX CX AX 474 | RET 475 | set_pages_map ENDP 476 | ;-------------------------------------------------------------------- 477 | ; Reset physical page. 478 | ; input 479 | ; AL : physical page no. 480 | ;-------------------------------------------------------------------- 481 | reset_phys_page PROC NEAR 482 | PUSH AX CX DX DI 483 | cbw 484 | MOV DI,OFFSET map_table 485 | MOV CL,SIZE phys_page_struct 486 | MUL CL 487 | ADD DI,AX 488 | MOV DX,CS:[DI].phys_page_port 489 | MOV AL,DIS_EMS 490 | OUT DX,AL 491 | MOV CS:[DI].emm_handle2,UNMAP 492 | MOV CS:[DI].log_page_data,AL;logical page no. 493 | POP DI DX CX AX 494 | RET 495 | reset_phys_page ENDP 496 | ;-------------------------------------------------------------------- 497 | ; Check mapping data. 498 | ; input 499 | ; ES:DI : pointer to mapping data 500 | ; output 501 | ; CF = 0 : OK 502 | ; CF = 1 : NG 503 | ;-------------------------------------------------------------------- 504 | check_map_data PROC NEAR 505 | PUSH AX CX SI DI 506 | MOV SI,OFFSET map_table 507 | MOV CX,PHYS_PAGES 508 | check_map_data3: 509 | MOV AX,ES:[DI].phys_page_port 510 | CMP AX,CS:[SI].phys_page_port 511 | jne check_map_data1 512 | MOV AX,ES:[DI].phys_seg_addr 513 | CMP AX,CS:[SI].phys_seg_addr 514 | jne check_map_data1 515 | ADD SI,SIZE phys_page_struct 516 | ADD DI,SIZE phys_page_struct 517 | LOOP check_map_data3 518 | CLC 519 | check_map_data2: 520 | POP DI SI CX AX 521 | RET 522 | check_map_data1: 523 | STC 524 | JMP check_map_data2 525 | check_map_data ENDP 526 | ;------ function 1 -------------------------------------------------- 527 | ; Get status 528 | ; output 529 | ; AH : status 530 | ;-------------------------------------------------------------------- 531 | ; Same as noerr 532 | ;------ function 2 -------------------------------------------------- 533 | ; Get page frame address 534 | ; output 535 | ; AH : status 536 | ; BX : page segment address 537 | ;-------------------------------------------------------------------- 538 | func2: 539 | STI 540 | MOV BX,page_frame_seg ;get EMM physical page segment 541 | f21: ; address. 542 | MOV [BP].bx_save,BX 543 | JMP noerr ;exit 544 | 545 | ;------ function 3 -------------------------------------------------- 546 | ; Get unallocated page count 547 | ; output 548 | ; AH : status 549 | ; BX : unallocate page 550 | ; DX : all page 551 | ;-------------------------------------------------------------------- 552 | func3: ;v0.5.... 553 | MOV DX,total_pages ;Get total page count 554 | MOV BX,un_alloc_pages ;Get unallocated page count 555 | MOV [BP].dx_save,DX ;Save all page count 556 | JMP f21 557 | 558 | ;------ function 4 -------------------------------------------------- 559 | ; Allocate pages 560 | ; input 561 | ; BX : request allocate page 562 | ; output 563 | ; AH : status 564 | ; DX : EMM handle 565 | ;-------------------------------------------------------------------- 566 | func4: ;v0.6.... 567 | OR BX,BX ;request page size 0 ? 568 | JZ f49 ;yes 569 | ;------ function 27 ------------------------------------------------- 570 | ; Allocate raw pages 571 | ; input 572 | ; BX : num_of_raw_pages_to_alloc 573 | ; output 574 | ; AH : status 575 | ; DX : raw handle 576 | ;-------------------------------------------------------------------- 577 | func27: 578 | 579 | f41: 580 | CMP total_pages,BX ;request total size over ? 581 | jb f42 ;yes 582 | CMP un_alloc_pages,BX ;request unallocate size over ? 583 | jb f43 ;yes 584 | XOR SI,SI 585 | MOV CX,HANDLE_CNT 586 | f45: 587 | CMP byte ptr [SI].handle_flag,0;not used EMM handle ? 588 | je f44 589 | ADD SI,FLAG_SIZE ;add handle flag size 590 | LOOP f45 591 | JMP err85 ;error exit 592 | f44: 593 | MOV DX,SI 594 | SHR DX,1 595 | MOV byte ptr [SI].handle_flag,1;handle active flag set 596 | INC handle_count ;used EMM handle count up 597 | SUB un_alloc_pages,BX ;unallocated page - BX 598 | MOV [SI].alloc_page_count,bl;EMM handle used page count set 599 | MOV [SI].back_address,0 ;backup address clear 600 | MOV DI,page_ptr 601 | MOV [SI].page_address,DI ;set page buffer pointer 602 | push cs 603 | pop es 604 | MOV SI,OFFSET log_page 605 | XOR AX,AX 606 | MOV CX,BX 607 | jcxz f48 608 | jmp short f47 609 | f4a: 610 | ADD SI,LOG_SIZE 611 | INC AX 612 | f47: 613 | CMP WORD PTR [SI],NOT_USE ;unallocated page ? 614 | JNZ f4a 615 | MOV [SI],DX ;EMM handle set 616 | STOSW ;logical page no. set 617 | LOOP f4a 618 | f48: 619 | MOV [BP].dx_save,DX ;return EMM handle 620 | MOV page_ptr,DI 621 | JMP noerr ;exit 622 | f49: 623 | JMP err89 ;error exit 624 | f42: 625 | JMP err87 ;error exit 626 | f43: 627 | JMP err88 ;error exit 628 | 629 | ;------ function 5 -------------------------------------------------- 630 | ; Map handle pages 631 | ; input 632 | ; AL : physical page no. 633 | ; BX : logical page no. (if BX=FFFFH then unmap) 634 | ; DX : EMM handle 635 | ; output 636 | ; AH : status 637 | ;-------------------------------------------------------------------- 638 | func5: ;v0.6.... 639 | CMP AL,PHYS_PAGES ;physical page no. ok ? 640 | jnb f51 ;no 641 | CMP DX,HANDLE_CNT ;check handle data... 642 | jnb f5a 643 | MOV SI,DX 644 | SHL SI,1 645 | CMP byte ptr [SI].handle_flag,0;active handle ? 646 | je f5a 647 | MOV DI,OFFSET map_table ;get phys_page_struct pointer.. 648 | mov cl,al 649 | MOV AX,SIZE phys_page_struct 650 | MUL CL 651 | ADD DI,AX 652 | CMP BX,UNMAP ;unmap ? 653 | JZ f57 654 | CMP bl,[SI].alloc_page_count;logical page no. OK ? 655 | jnb f53 656 | SHL BX,1 657 | ADD BX,[SI].page_address 658 | MOV AX,[BX] 659 | ; OR AL,80h 660 | f58: 661 | CMP DX,[DI] ;same handle ? 662 | JNZ f54 663 | CMP AL,[DI].log_page_data ;same page no. ? 664 | JZ f56 665 | f54: 666 | MOV [DI],DX ;set handle 667 | MOV [DI].log_page_data,AL ;set logical page no. data 668 | MOV DX,[DI].phys_page_port 669 | OUT DX,AL 670 | f56: 671 | JMP noerr ;exit 672 | f57: 673 | xor al,al 674 | MOV DX,bx 675 | JMP f58 676 | f51: 677 | JMP err8b ;error exit 678 | f53: 679 | JMP err8a ;error exit 680 | f5a: 681 | JMP err83 ;error exit 682 | 683 | ;------ function 6 -------------------------------------------------- 684 | ; Deallocate pages 685 | ; input 686 | ; DX : EMM handle 687 | ; output 688 | ; AH : status 689 | ;-------------------------------------------------------------------- 690 | f63: 691 | JMP err86 ;error exit 692 | func6: 693 | push CS 694 | pop ES 695 | CMP DX,HANDLE_CNT ;check handle data... 696 | JNC f5a 697 | MOV BX,DX 698 | SHL BX,1 699 | CMP byte ptr [BX].handle_flag,0;handle OK ? 700 | JZ f5a 701 | CMP [BX].back_address,0 ;backup used? 702 | JNZ f63 703 | MOV cl,[BX].alloc_page_count 704 | xor ch,ch 705 | JCXZ f6c ;page = 0 ? 706 | add un_alloc_pages,cx ;add unallocated pages 707 | MOV DI,[BX].page_address ;deallocate logical page... 708 | mov si,di 709 | PUSH BX 710 | f65: 711 | MOV BX,[si] 712 | SHL BX,1 713 | MOV [BX].log_page,NOT_USE 714 | add si,2 715 | LOOP f65 716 | POP BX 717 | MOV CX,page_ptr 718 | SUB CX,SI 719 | SHR CX,1 720 | JCXZ f62 721 | REPZ MOVSW 722 | f62: 723 | MOV cl,[BX].alloc_page_count 724 | xor ch,ch 725 | JCXZ f68 726 | MOV AX,UNALLOC 727 | REPZ STOSW 728 | f68: 729 | XOR DI,DI ;change page address.... 730 | MOV SI,[BX].page_address ;get page address. 731 | MOV al,[BX].alloc_page_count;get allocated page count. 732 | xor ah,ah 733 | SHL AX,1 734 | MOV CX,handle_count 735 | JMP short f66 736 | f6b: 737 | ADD DI,FLAG_SIZE 738 | f66: 739 | CMP byte ptr [DI].handle_flag,0;active handle ? 740 | JZ f6b 741 | CMP [DI].page_address,SI ;page_address > SI ? 742 | JNG f64 743 | SUB [DI].page_address,AX ;page address - AX 744 | f64: 745 | LOOP f6b 746 | SUB page_ptr,AX ;SUB page pointer 747 | MOV CX,PHYS_PAGES ;deallocate physical page... 748 | XOR AL,AL 749 | MOV SI,OFFSET map_table 750 | f6a: 751 | CMP [SI],DX ;same handle no.? 752 | JNZ f67 753 | CALL reset_phys_page ;reset physical page. 754 | f67: 755 | INC AL 756 | ADD SI,SIZE phys_page_struct 757 | LOOP f6a 758 | f6c: 759 | MOV word ptr [BX].alloc_page_count,0 760 | MOV [BX].page_address,0 ;clear handle page pointer 761 | MOV [BX].back_address,0 ;clear handle back pointer 762 | cmp byte ptr f7_ver,32h 763 | je f6e 764 | MOV DI,OFFSET handle_name ;clear handle name data... 765 | MOV AX,DX 766 | MOV CL,3 767 | SHL AX,CL 768 | ADD DI,AX 769 | xor ax,ax 770 | MOV CX,HANDLE_NAME_SIZE/2 771 | REPZ stosw 772 | f6e: 773 | OR DX,DX ;system handle? 774 | JZ f6d 775 | DEC handle_count ;not use handle count up 776 | JMP noerr ;exit 777 | f6d: 778 | MOV byte ptr [BX].handle_flag,1 779 | JMP noerr ;exit 780 | 781 | ;------ function 7 -------------------------------------------------- 782 | ; Get EMS version 783 | ; output 784 | ; AH : status 785 | ; AL : EMS version number 786 | ;-------------------------------------------------------------------- 787 | func7: 788 | STI 789 | f7_ver equ $+1 790 | MOV AL,40h ;get version no. 791 | JMP noerr 792 | 793 | ;------ function 8 -------------------------------------------------- 794 | ; Save page map 795 | ; input 796 | ; DX : EMM handle 797 | ; output 798 | ; AH : status 799 | ;-------------------------------------------------------------------- 800 | func8: ;v0.6.... 801 | push CS 802 | pop ES 803 | CMP DX,HANDLE_CNT ;check handle data 804 | JNC f81 805 | MOV SI,DX 806 | SHL SI,1 807 | CMP byte ptr [SI].handle_flag,1;handle OK ? 808 | JNZ f81 809 | CMP [SI].back_address,0 ;backup ? 810 | JNZ f82 811 | MOV AL,backup_count 812 | CMP AL,BACK_MAX 813 | jb f83 814 | f84: 815 | JMP err8c ;error exit 816 | f83: 817 | MOV DI,offset backup_flags ;copy mapping data -> [DI] 818 | mov cx,BACK_MAX ;v1.01 819 | xor al,al 820 | repnz scasb ;Search for free region 821 | jnz f84 822 | dec di 823 | mov byte ptr [di],1 ;Set busy flag 824 | sub di,offset backup_flags 825 | mov ax,di 826 | mov cl,CONTEXT_SIZE 827 | mul cl 828 | add ax,offset backup_map 829 | mov di,ax 830 | MOV [SI].back_address,DI 831 | MOV SI,OFFSET map_table 832 | MOV CX,CONTEXT_SIZE/2 833 | REPZ MOVSW 834 | INC backup_count 835 | JMP noerr 836 | f81: 837 | JMP err83 838 | f82: 839 | JMP err8d 840 | 841 | ;------ function 9 -------------------------------------------------- 842 | ; Restore page map 843 | ; input 844 | ; DX : EMM handle 845 | ; output 846 | ; AH : status 847 | ;-------------------------------------------------------------------- 848 | func9: 849 | push CS 850 | pop ES 851 | CMP DX,HANDLE_CNT ;check handle data 852 | JNC f81 853 | MOV BX,DX 854 | SHL BX,1 855 | CMP byte ptr [BX].handle_flag,1;handle OK ? 856 | JNZ f81 857 | CMP [BX].back_address,0 ;backup ? 858 | JZ f92 859 | MOV CX,CONTEXT_SIZE/2 ;move mapping data... 860 | MOV SI,[BX].back_address 861 | MOV DI,OFFSET map_table 862 | PUSH DI 863 | REPZ MOVSW 864 | POP DI 865 | CALL set_pages_map ;enable physical pages... 866 | DEC backup_count ;backup mapping count DEC 867 | MOV ax,[BX].back_address ;v1.01 868 | sub ax,offset backup_map 869 | mov cl,CONTEXT_SIZE 870 | div cl 871 | add ax,offset backup_flags 872 | mov di,ax 873 | mov byte ptr [di],0 ;Set free flag 874 | MOV [BX].back_address,0 875 | JMP noerr ;exit 876 | f92: 877 | JMP err8e 878 | 879 | ;------ function 10 ------------------------------------------------- 880 | ; Get page mapping register I/O port array 881 | ; input 882 | ; ES:DI : buffer address point 883 | ; output 884 | ; AH : status 885 | ; AL : board count 886 | ;-------------------------------------------------------------------- 887 | ; Not supported on 4.0 : err84 888 | ;------ function 11 ------------------------------------------------- 889 | ; Get logical-to-physical page translation array 890 | ; input 891 | ; DX : EMM handle 892 | ; ES:DI : buffer address point 893 | ; output 894 | ; AH : status code 895 | ; BX : number of pages allocated EMM handle. 896 | ;-------------------------------------------------------------------- 897 | ; Not supported on 4.0 : err84 898 | ;------ function 12 ------------------------------------------------- 899 | ; Get EMM handle count 900 | ; output 901 | ; AH : status 902 | ; BX : active EMM handles 903 | ;-------------------------------------------------------------------- 904 | func12: 905 | STI 906 | MOV BX,handle_count 907 | f121: 908 | MOV [BP].bx_save,BX 909 | JMP noerr ;exit 910 | 911 | ;------ function 13 ------------------------------------------------- 912 | ; Get EMM handle pages 913 | ; input 914 | ; DX : EMM handle 915 | ; output 916 | ; AH : status 917 | ; BX : pages EMM handle 918 | ;-------------------------------------------------------------------- 919 | func13: ;v0.6.... 920 | STI 921 | CMP DX,HANDLE_CNT ;check handle data 922 | jnb f131 923 | MOV SI,DX 924 | SHL SI,1 925 | CMP byte ptr [SI].handle_flag,1;handle OK ? 926 | jne f131 927 | MOV bl,[SI].alloc_page_count 928 | xor bh,bh 929 | jmp f121 ;exit 930 | f131: 931 | JMP err83 ;error exit 932 | ;------ function 14 ------------------------------------------------- 933 | ; Get all EMM handle pages 934 | ; input 935 | ; ES:DI : buffer address point 936 | ; output 937 | ; AH : status 938 | ; BX : number of active EMM handles 939 | ;-------------------------------------------------------------------- 940 | func14: 941 | STI 942 | XOR SI,SI 943 | MOV CX,HANDLE_CNT 944 | XOR BX,BX 945 | XOR DX,DX 946 | f142: 947 | CMP byte ptr [SI].handle_flag,0 948 | JZ f141 949 | MOV AX,DX 950 | STOSW 951 | MOV al,[SI].alloc_page_count;v0.5 952 | xor ah,ah 953 | STOSW 954 | INC BX 955 | f141: 956 | INC DX 957 | ADD SI,FLAG_SIZE 958 | LOOP f142 959 | JMP f121 960 | 961 | ;------ function 15 ------------------------------------------------- 962 | ; Get/set page map 963 | ; input 964 | ; AL : request subfunction no. 965 | ; ES:DI : mapping registers buffer address point 966 | ; output 967 | ; AH : status 968 | ;-------------------------------------------------------------------- 969 | func15: 970 | cbw 971 | dec ax 972 | js get_page_map ; 0 973 | jz set_page_map ; 1 974 | dec ax 975 | jz get_set_page_map ; 2 976 | dec ax 977 | jz get_size_page_map ; 3 978 | jmp err84 ;error exit 979 | 980 | ;-------------------------------------------------------------------- 981 | ; Get page map. 982 | ; input 983 | ; ES:DI : dest_page_map 984 | ; output 985 | ; AH : status 986 | ;-------------------------------------------------------------------- 987 | get_page_map: 988 | MOV SI,OFFSET map_table 989 | MOV CX,CONTEXT_SIZE/2 990 | REPZ MOVSW 991 | JMP noerr ;exit 992 | 993 | ;-------------------------------------------------------------------- 994 | ; Set page map. 995 | ; input 996 | ; DS:SI : source_page_map 997 | ; output 998 | ; AH : status 999 | ;-------------------------------------------------------------------- 1000 | set_page_map: 1001 | MOV AX,[BP].ds_save 1002 | MOV DS,AX 1003 | MOV CX,CONTEXT_SIZE/2 1004 | MOV AX,SS 1005 | MOV ES,AX 1006 | LEA DI,[BP].f15_map_data ;save map data. 1007 | REPZ MOVSW 1008 | set_page_map3: 1009 | LEA DI,[BP].f15_map_data 1010 | CALL check_map_data ;check map data (ES:DI) 1011 | JC set_page_map2 1012 | MOV AX,ES 1013 | MOV DS,AX 1014 | MOV SI,DI 1015 | push cs 1016 | pop es 1017 | MOV DI,OFFSET map_table 1018 | MOV CX,CONTEXT_SIZE/2 1019 | REPZ MOVSW 1020 | CALL set_pages_map ;mapping physical pages. 1021 | JMP noerr ;exit 1022 | set_page_map2: 1023 | JMP erra3 ;error exit 1024 | 1025 | ;-------------------------------------------------------------------- 1026 | ; Get & set page map. 1027 | ; input 1028 | ; DS:SI : source_page_map 1029 | ; ES:DI : dest_page_map 1030 | ; output 1031 | ; AH : status 1032 | ;-------------------------------------------------------------------- 1033 | get_set_page_map: 1034 | PUSH DI DS ES 1035 | MOV AX,[BP].ds_save 1036 | MOV DS,AX 1037 | MOV AX,SS 1038 | MOV ES,AX 1039 | LEA DI,[BP].f15_map_data 1040 | MOV CX,CONTEXT_SIZE/2 1041 | REPZ MOVSW 1042 | POP ES DS DI 1043 | MOV SI,OFFSET map_table ;move current map data... 1044 | MOV CX,CONTEXT_SIZE/2 1045 | REPZ MOVSW 1046 | MOV AX,SS 1047 | MOV ES,AX 1048 | JMP set_page_map3 1049 | 1050 | ;-------------------------------------------------------------------- 1051 | ; Get size of page map save array. 1052 | ; output 1053 | ; AH : status 1054 | ; AL : size_of_array 1055 | ;-------------------------------------------------------------------- 1056 | get_size_page_map: 1057 | MOV AL,CONTEXT_SIZE ;map data size set. 1058 | JMP noerr 1059 | ; 1060 | ; This is end of EMS 3 function set 1061 | ; 1062 | ;------ function 16 ------------------------------------------------- 1063 | ; Get/set partial page map 1064 | ;-------------------------------------------------------------------- 1065 | func16: 1066 | cbw 1067 | dec ax 1068 | js get_partial_map ; 0 1069 | jz set_partial_map ; 1 1070 | dec ax 1071 | jz get_size_partial_map ; 2 1072 | jmp err84 ;error exit 1073 | ;-------------------------------------------------------------------- 1074 | ; Get size of partial page map save array 1075 | ; input 1076 | ; BX : number of pages in the partial array 1077 | ; output 1078 | ; AH : status 1079 | ; AL : size_of_partial_save_array 1080 | ;-------------------------------------------------------------------- 1081 | get_size_partial_map: 1082 | OR BX,BX ;BX = 0? 1083 | JZ get_size_partial_map1 1084 | CMP BX,PHYS_PAGES ;BX > physical page count? 1085 | JG get_size_partial_map2 1086 | MOV AX,SIZE phys_page_struct;get size of partial map array. 1087 | MUL BL 1088 | ADD AX,2 1089 | JMP noerr ;exit 1090 | get_size_partial_map1: 1091 | JMP err8f ;error exit 1092 | get_size_partial_map2: 1093 | JMP err8b ;error exit 1094 | 1095 | ;-------------------------------------------------------------------- 1096 | ; Get partial page map 1097 | ; input 1098 | ; DS:SI : partial_page_map 1099 | ; ES:DI : dest_array 1100 | ; output 1101 | ; AH : status 1102 | ;-------------------------------------------------------------------- 1103 | get_partial_map: 1104 | MOV AX,[BP].ds_save 1105 | MOV DS,AX 1106 | LODSW 1107 | CMP AX,PHYS_PAGES 1108 | JG get_partial_map1 ;rel. 0.2 1109 | MOV CX,AX 1110 | JCXZ get_partial_map5 ;page count = 0? 1111 | STOSW 1112 | get_partial_map4: 1113 | LODSW 1114 | PUSH CX 1115 | MOV BX,OFFSET map_table 1116 | MOV CX,PHYS_PAGES 1117 | get_partial_map3: 1118 | CMP AX,CS:[BX].phys_seg_addr 1119 | JZ get_partial_map2 1120 | ADD BX,SIZE phys_page_struct 1121 | LOOP get_partial_map3 1122 | POP CX 1123 | JMP err8b ;error exit 1124 | get_partial_map2: 1125 | PUSH SI DS 1126 | PUSH CS 1127 | POP DS 1128 | MOV SI,BX 1129 | MOV CX,SIZE phys_page_struct 1130 | REPZ MOVSB 1131 | POP DS SI CX 1132 | LOOP get_partial_map4 1133 | get_partial_map5: 1134 | JMP noerr ;exit 1135 | get_partial_map1: 1136 | JMP erra4 ;error exit 1137 | 1138 | ;-------------------------------------------------------------------- 1139 | ; Set partial page map 1140 | ; input 1141 | ; DS:SI : source_array 1142 | ; output 1143 | ; AH : status 1144 | ;-------------------------------------------------------------------- 1145 | set_partial_map: 1146 | MOV AX,[BP].ds_save 1147 | MOV DS,AX 1148 | LODSW 1149 | MOV [BP].f16_map_len,AX ;save page map data length. 1150 | MOV CX,SIZE phys_page_struct 1151 | MUL CL 1152 | MOV CX,AX 1153 | JCXZ set_partial_map1 1154 | MOV AX,SS ;save page map data... 1155 | MOV ES,AX 1156 | LEA DI,[BP].f16_map_data 1157 | REPZ MOVSB 1158 | LEA SI,[BP].f16_map_data ;set page map data... 1159 | MOV AX,ES 1160 | MOV DS,AX 1161 | MOV AX,CS 1162 | MOV ES,AX 1163 | MOV CX,[BP].f16_map_len ;get page map data length. 1164 | set_partial_map4: 1165 | MOV AX,[SI].phys_seg_addr 1166 | CALL change_seg_page ;change segment -> phys_page_no 1167 | JC set_partial_map3 1168 | MOV DI,OFFSET map_table 1169 | PUSH CX 1170 | MOV CX,SIZE phys_page_struct 1171 | MUL CL 1172 | ADD DI,AX 1173 | REPZ MOVSB 1174 | POP CX 1175 | LOOP set_partial_map4 1176 | CALL set_pages_map ;mapping physical pages. 1177 | set_partial_map1: 1178 | JMP noerr ;exit 1179 | set_partial_map3: 1180 | JMP err8b ;error exit 1181 | 1182 | ;------ function 17 ------------------------------------------------- 1183 | ; Map/unmap multiple handle pages 1184 | ;-------------------------------------------------------------------- 1185 | func17: 1186 | STI 1187 | OR AL,AL 1188 | JZ log_phys_map 1189 | CMP AL,1 1190 | JZ log_phys_map 1191 | JMP err84 ;error exit 1192 | 1193 | ;-------------------------------------------------------------------- 1194 | ; Logical page/physical page/segment method 1195 | ; input 1196 | ; AL : physical page/segment selector 1197 | ; DX : EMM handle 1198 | ; CX : logical to physical map length 1199 | ; DS:SI : pointer to logical to physical/segment map array 1200 | ; output 1201 | ; AH : status 1202 | ;-------------------------------------------------------------------- 1203 | log_phys_map: 1204 | MOV [BP].f17_ax_save,AX 1205 | MOV AX,[BP].ds_save 1206 | MOV DS,AX 1207 | CALL check_handle ;check handle data. 1208 | JC log_phys_map2 1209 | CMP CX,PHYS_PAGES 1210 | ja log_phys_map1 1211 | JCXZ log_phys_map9 1212 | MOV [BP].f17_map_len,CX ;save page map data length. 1213 | MOV AX,SS 1214 | MOV ES,AX 1215 | LEA DI,[BP].f17_map_data ;save page map data. 1216 | SHL CX,1 1217 | REPZ MOVSW 1218 | MOV AX,SS 1219 | MOV DS,AX 1220 | LEA SI,[BP].f17_map_data ;set page map data pointer. 1221 | MOV CX,[BP].f17_map_len ;get page map data length. 1222 | log_phys_map7: 1223 | mov bx,[si].log_page_number1;get logical page no. 1224 | cmp bx,UNMAP ;unmapping? 1225 | je log_phys_map6 1226 | call check_log_page ;check logical page no. 1227 | jc log_phys_map3 ;error? 1228 | mov bx,ax ;set EMM logical page no. 1229 | log_phys_map6: 1230 | mov ax,[bp].f17_ax_save 1231 | or al,al ;subfunction 0? 1232 | jnz log_phys_map8 1233 | mov ax,[si].phys_page_number1;get physical page no. 1234 | cmp ax,PHYS_PAGES ;check physical page no. 1235 | jb log_phys_map4 1236 | log_phys_map1: 1237 | jmp err8b 1238 | log_phys_map8: 1239 | mov ax,[si].mappable_seg_addr;get mappable seg_address. 1240 | call change_seg_page ;change segment -> phys_page_no 1241 | jc log_phys_map1 1242 | log_phys_map4: 1243 | cmp bx,UNMAP ;unmapping? 1244 | jz log_phys_mapa 1245 | call set_phys_page ;set physical page 1246 | jmp short log_phys_map5 1247 | log_phys_mapa: 1248 | call reset_phys_page ;reset physical page 1249 | log_phys_map5: 1250 | add si,SIZE log_to_phys_map_struct; 1251 | loop log_phys_map7 1252 | log_phys_map9: 1253 | jmp noerr ;exit 1254 | log_phys_map2: 1255 | jmp err83 1256 | log_phys_map3: 1257 | jmp err8a 1258 | 1259 | ;------ function 18 ------------------------------------------------------ 1260 | ; Reallocate pages 1261 | ; input 1262 | ; DX : EMM handle 1263 | ; BX : reallocation count 1264 | ; output 1265 | ; AH : status 1266 | ; BX : number of pages allocated to handle after reallocation 1267 | ;------------------------------------------------------------------------- 1268 | f182: 1269 | JMP err87 1270 | f181: 1271 | MOV word ptr [BP].bx_save,0 1272 | JMP err83 1273 | func18: 1274 | push CS 1275 | pop ES 1276 | CMP DX,HANDLE_CNT ;check handle data... 1277 | jnb f181 1278 | MOV SI,DX 1279 | SHL SI,1 1280 | CMP byte ptr [SI].handle_flag,0 1281 | je f181 1282 | CMP total_pages,BX ;request total size over ? 1283 | JC f182 ;yes 1284 | MOV al,[SI].alloc_page_count;get page size to handle 1285 | xor ah,ah 1286 | OR BX,BX ;reallocate count = 0? 1287 | JNZ f184 1288 | MOV CX,AX 1289 | JCXZ f18a ;CX = 0 case? 1290 | MOV DI,[SI].page_address ;BX = 0 case... 1291 | add un_alloc_pages,ax ;add unallocated pages 1292 | PUSH BX 1293 | f185: 1294 | MOV BX,[DI] 1295 | SHL BX,1 1296 | MOV [BX].log_page,NOT_USE ;unallocate logical page 1297 | add di,2 1298 | LOOP f185 1299 | POP BX 1300 | JMP short f18l 1301 | f184: 1302 | CMP AX,BX ;check reallocation/allocated 1303 | JNZ f18c ;pages. 1304 | f18a: 1305 | JMP noerr ;same size case. 1306 | f18c: 1307 | JNC f183 ;BX < allocated count? 1308 | JMP f186 1309 | f183: 1310 | MOV CX,AX ;BX < allocated pages case... 1311 | SUB CX,BX 1312 | MOV DI,[SI].page_address ;BX = 0 case... 1313 | MOV AX,BX 1314 | SHL AX,1 1315 | ADD DI,AX 1316 | add un_alloc_pages,cx ;add unallocated pages 1317 | PUSH BX 1318 | f18b: 1319 | MOV BX,[DI] 1320 | SHL BX,1 1321 | MOV [BX].log_page,NOT_USE ;unallocate logical page 1322 | add di,2 1323 | LOOP f18b 1324 | POP BX 1325 | f18l: 1326 | MOV CX,page_ptr ;clear & sort page buffer... 1327 | MOV AX,BX 1328 | SHL AX,1 1329 | ADD AX,[SI].page_address 1330 | SUB CX,AX 1331 | PUSH SI 1332 | MOV DI,[SI].page_address 1333 | MOV AX,BX 1334 | SHL AX,1 1335 | ADD DI,AX 1336 | MOV al,[SI].alloc_page_count 1337 | xor ah,ah 1338 | MOV SI,[SI].page_address 1339 | SHL AX,1 1340 | ADD SI,AX 1341 | SHR CX,1 1342 | JCXZ f18e 1343 | REPZ MOVSW 1344 | f18e: 1345 | MOV CX,page_ptr 1346 | SUB CX,DI 1347 | SHR CX,1 1348 | JCXZ f18f 1349 | MOV AX,UNALLOC 1350 | REPZ STOSW 1351 | f18f: 1352 | POP SI 1353 | MOV al,[SI].alloc_page_count 1354 | xor ah,ah 1355 | MOV [SI].alloc_page_count,bl;set EMM handle used page count 1356 | XOR DI,DI ;change other handle page add- 1357 | SUB AX,BX ;ress.... 1358 | SHL AX,1 1359 | MOV BX,[SI].page_address 1360 | MOV CX,handle_count 1361 | JMP short f18j 1362 | f18k: 1363 | ADD DI,FLAG_SIZE 1364 | f18j: 1365 | CMP byte ptr [DI].handle_flag,0;active handle ? 1366 | JZ f18k 1367 | CMP [DI].page_address,BX ;page_address > BX ? 1368 | JNG f18m 1369 | SUB [DI].page_address,AX ;page_address - AX 1370 | f18m: 1371 | LOOP f18k 1372 | SUB page_ptr,AX ;page_ptr - AX 1373 | CMP [SI].alloc_page_count,0 ;allocate page count = 0 ? 1374 | JNZ f18o 1375 | MOV [SI].page_address,0 ;clear page buffer pointer 1376 | f18o: 1377 | JMP noerr ;exit. 1378 | f187: 1379 | MOV al,[SI].alloc_page_count 1380 | xor ah,ah 1381 | MOV [BP].bx_save,AX 1382 | JMP err88 ;error exit 1383 | f186: 1384 | MOV CX,BX ;BX > allocated pages case... 1385 | SUB CX,AX 1386 | cmp un_alloc_pages,cx ;request unallocate size over ? 1387 | jb f187 ;no 1388 | PUSH SI ;move page buffer... 1389 | MOV DI,page_ptr 1390 | CMP [SI].page_address,0 ;not poniter address? 1391 | JNZ f18p 1392 | MOV [SI].page_address,DI ;set page pointer 1393 | JMP short f18q 1394 | f18p: 1395 | DEC DI 1396 | MOV AX,CX 1397 | SHL AX,1 1398 | ADD DI,AX 1399 | MOV al,[SI].alloc_page_count 1400 | xor ah,ah 1401 | SHL AX,1 1402 | ADD AX,[SI].page_address 1403 | PUSH CX 1404 | MOV CX,page_ptr 1405 | SUB CX,AX 1406 | MOV SI,page_ptr 1407 | DEC SI 1408 | STD 1409 | JCXZ f18g 1410 | REPZ MOVSB 1411 | f18g: 1412 | POP CX 1413 | f18q: 1414 | SHL CX,1 1415 | ADD page_ptr,CX ;pointer add 1416 | POP SI 1417 | CLD 1418 | MOV DI,[SI].page_address ;allocate add pages... 1419 | MOV al,[SI].alloc_page_count 1420 | xor ah,ah 1421 | MOV CX,BX 1422 | SUB CX,AX 1423 | SHL AX,1 1424 | ADD DI,AX 1425 | PUSH SI 1426 | MOV SI,OFFSET log_page 1427 | XOR AX,AX 1428 | sub un_alloc_pages,cx 1429 | JMP short f188 1430 | f189: 1431 | ADD SI,LOG_SIZE 1432 | INC AX 1433 | f188: 1434 | CMP WORD PTR [SI],UNMAP ;logical page end? 1435 | JZ f18d 1436 | CMP WORD PTR [SI],NOT_USE ;unallocated page ? 1437 | JNZ f189 1438 | MOV WORD PTR [SI],DX 1439 | STOSW 1440 | LOOP f189 1441 | POP SI 1442 | MOV al,[SI].alloc_page_count 1443 | xor ah,ah 1444 | MOV [SI].alloc_page_count,bl;set EMM handle used page count 1445 | XOR DI,DI ;change other handle page add- 1446 | XCHG AX,BX ;ress.... 1447 | SUB AX,BX 1448 | SHL AX,1 1449 | MOV BX,[SI].page_address 1450 | MOV CX,handle_count 1451 | JMP short f18h 1452 | f18i: 1453 | ADD DI,FLAG_SIZE 1454 | f18h: 1455 | CMP byte ptr [DI].handle_flag,0 1456 | JZ f18i 1457 | CMP [DI].page_address,BX 1458 | JNG f18n 1459 | ADD [DI].page_address,AX 1460 | f18n: 1461 | LOOP f18i 1462 | JMP noerr ;exit 1463 | f18d: 1464 | POP SI 1465 | JMP err80 ;error exit 1466 | ;------ function 19 ------------------------------------------------- 1467 | ; Get/set handle attribute 1468 | ;-------------------------------------------------------------------- 1469 | func19: 1470 | sti 1471 | cbw 1472 | dec ax 1473 | js get_handle_attr ; 0 1474 | jz set_handle_attr ; 1 1475 | dec ax 1476 | jz get_attr_cap ; 2 1477 | jmp err84 ;error exit 1478 | ;-------------------------------------------------------------------- 1479 | ; Get handle attribute 1480 | ; input 1481 | ; DX : EMM handle 1482 | ; output 1483 | ; AH : status 1484 | ; AL : handle attribute 1485 | ;-------------------------------------------------------------------- 1486 | get_handle_attr: 1487 | CALL check_handle ;check handle data 1488 | JC get_handle_attr1 1489 | MOV AL,VOLATILE ;handle attribute set 1490 | JMP noerr ;exit 1491 | get_handle_attr1: 1492 | JMP err83 ;error exit 1493 | ;-------------------------------------------------------------------- 1494 | ; Set handle attribute 1495 | ; input 1496 | ; DX : EMM handle 1497 | ; BL : new handle attribute 1498 | ; output 1499 | ; AH : status 1500 | ;-------------------------------------------------------------------- 1501 | set_handle_attr: 1502 | JMP err91 ;error exit 1503 | ;-------------------------------------------------------------------- 1504 | ; Get attribute capability 1505 | ; output 1506 | ; AH : status 1507 | ; AL : attribute capability 1508 | ;-------------------------------------------------------------------- 1509 | get_attr_cap: 1510 | mov al,VOLATILE ;set attribute capability 1511 | jmp noerr ;exit 1512 | ;------ function 20 ------------------------------------------------- 1513 | ; Get/set handle name 1514 | ;-------------------------------------------------------------------- 1515 | func20: 1516 | dec al 1517 | js get_handle_name ; 0 1518 | jz set_handle_name ; 1 1519 | jmp err84 ;error exit 1520 | ;-------------------------------------------------------------------- 1521 | ; Get handle name 1522 | ; input 1523 | ; DX : EMM handle 1524 | ; ES:DI : pointer to handle name array 1525 | ; output 1526 | ; AH : status 1527 | ;-------------------------------------------------------------------- 1528 | get_handle_name: 1529 | CALL check_handle ;check handle data 1530 | JC get_handle_name1 1531 | MOV SI,OFFSET handle_name 1532 | MOV AX,DX 1533 | MOV CL,3 1534 | SHL AX,CL 1535 | ADD SI,AX 1536 | MOV CX,HANDLE_NAME_SIZE/2 1537 | REPZ MOVSW 1538 | JMP noerr ;exit 1539 | get_handle_name1: 1540 | JMP err83 ;error exit 1541 | ;-------------------------------------------------------------------- 1542 | ; Set handle name 1543 | ; input 1544 | ; DX : EMM handle 1545 | ; DS:SI : pointer to handle name 1546 | ; output 1547 | ; AH : status 1548 | ;-------------------------------------------------------------------- 1549 | set_handle_name: 1550 | call check_handle ;check handle data 1551 | jc get_handle_name1 1552 | push cs 1553 | pop es 1554 | mov ax,[bp].ds_save 1555 | mov ds,ax 1556 | mov cx,HANDLE_CNT ;check handle name... 1557 | mov di,offset handle_name 1558 | mov bx,offset handle_flag 1559 | set_handle_name2: 1560 | cmp byte ptr [bx],0 ;active handle ? 1561 | je set_handle_name3 1562 | push cx si 1563 | mov cx,HANDLE_NAME_SIZE/2 1564 | repz cmpsw ;compare handle name... 1565 | pop si cx 1566 | je set_handle_name4 ;found same handle name ? 1567 | set_handle_name3: 1568 | add bx,2 1569 | loop set_handle_name2 1570 | mov di,offset handle_name ;set handle name... 1571 | mov cl,3 1572 | shl dx,cl 1573 | add di,dx 1574 | mov cx,HANDLE_NAME_SIZE/2 1575 | rep movsw 1576 | jmp noerr ;exit 1577 | set_handle_name4: 1578 | jmp erra1 ;error exit 1579 | ;------ function 21 ------------------------------------------------- 1580 | ; Get handle directory 1581 | ;-------------------------------------------------------------------- 1582 | func21: 1583 | dec al 1584 | js get_handle_dir ; 0 1585 | JZ search_for_name ; 1 1586 | dec al 1587 | JZ get_total_handle ; 2 1588 | JMP err84 ;error exit 1589 | ;-------------------------------------------------------------------- 1590 | ; Get handle directory 1591 | ; input 1592 | ; ES:DI : pointer to handle_dir 1593 | ; output 1594 | ; AH : status 1595 | ; AL : number of entries in the handle_dir array 1596 | ;-------------------------------------------------------------------- 1597 | get_handle_dir: 1598 | MOV CX,HANDLE_CNT 1599 | MOV SI,OFFSET handle_name 1600 | XOR DX,DX 1601 | XOR BL,BL 1602 | get_handle_dir1: 1603 | CALL check_handle ;check handle data 1604 | JC get_handle_dir2 1605 | MOV AX,DX ;set EMM handle. 1606 | STOSW 1607 | PUSH CX SI ;set handle name... 1608 | MOV CX,HANDLE_NAME_SIZE/2 1609 | REPZ MOVSW 1610 | POP SI CX 1611 | INC BL ;inc handle count. 1612 | get_handle_dir2: 1613 | ADD SI,HANDLE_NAME_SIZE 1614 | INC DX 1615 | LOOP get_handle_dir1 1616 | MOV AL,BL 1617 | JMP noerr ;exit 1618 | ;-------------------------------------------------------------------- 1619 | ; Search for named handle 1620 | ; input 1621 | ; DS:SI : search handle_name pointer 1622 | ; output 1623 | ; AH : status 1624 | ; DX : EMM handle 1625 | ;-------------------------------------------------------------------- 1626 | search_for_name: 1627 | push CS 1628 | pop ES 1629 | MOV CX,HANDLE_CNT 1630 | MOV DI,OFFSET handle_name 1631 | MOV AX,[BP].ds_save 1632 | MOV DS,AX 1633 | XOR DX,DX 1634 | search_for_name1: 1635 | PUSH CX SI di 1636 | MOV CX,HANDLE_NAME_SIZE/2 1637 | repz cmpsw 1638 | POP di SI CX 1639 | JZ search_for_name2 1640 | add di,HANDLE_NAME_SIZE 1641 | inc dx 1642 | loop search_for_name1 1643 | jmp erra0 1644 | search_for_name2: 1645 | mov cx,HANDLE_NAME_SIZE/2 1646 | xor ax,ax 1647 | repz scasw 1648 | jnz search_for_name3 1649 | jmp erra1 ;error exit 1650 | search_for_name3: 1651 | push cx 1652 | pop ds 1653 | mov [bp].dx_save,dx 1654 | jmp noerr ;exit 1655 | ;-------------------------------------------------------------------- 1656 | ; Get total handle 1657 | ; output 1658 | ; AH : status 1659 | ; BX : total_handles 1660 | ;-------------------------------------------------------------------- 1661 | get_total_handle: 1662 | MOV BX,HANDLE_CNT ;set max handle count. 1663 | MOV [BP].bx_save,BX 1664 | JMP noerr ;exit 1665 | ;------ function 22 ------------------------------------------------- 1666 | ; Alter page map & jump. 1667 | ; input 1668 | ; AL : physical page number/segment selector 1669 | ; DX : EMM handle 1670 | ; DS:SI : pointer to map_and_jump structure 1671 | ; output 1672 | ; AH : status 1673 | ;-------------------------------------------------------------------- 1674 | f224: 1675 | JMP err8a 1676 | func22: 1677 | STI 1678 | cmp AL,0 1679 | je f220 1680 | cmp AL,1 1681 | je f220 1682 | JMP err8f 1683 | f220: 1684 | MOV [BP].f22_ax_save,AX 1685 | CALL check_handle ;check handle data. 1686 | JC f221 1687 | MOV AX,[BP].ds_save ;copy calling parameters... 1688 | MOV DS,AX 1689 | LES BX,[SI].target_address1 1690 | MOV AX,ES 1691 | MOV [BP].f22_target_off,BX ;offset 1692 | MOV [BP].f22_target_seg,AX ;segment 1693 | MOV CL,[SI].log_phys_map_len;get mapping data length. 1694 | XOR CH,CH 1695 | MOV [BP].f22_map_len,CX ;length 1696 | JCXZ f22a 1697 | LES BX,[SI].log_phys_map_ptr;get log_phys_map_ptr. 1698 | LEA DI,[BP].f22_map_data ;copy log_phys_map data... 1699 | SHL CX,1 1700 | f228: 1701 | MOV AX,ES:[BX] 1702 | MOV SS:[DI],AX 1703 | add DI,2 1704 | add BX,2 1705 | LOOP f228 1706 | f22a: 1707 | MOV AX,SS 1708 | MOV DS,AX 1709 | MOV CX,[BP].f22_map_len ;length 1710 | JCXZ f222 1711 | LEA DI,[BP].f22_map_data ;get mapping data pointer. 1712 | f223: 1713 | MOV BX,[DI].log_page_number1;get logical page no. 1714 | CMP BX,UNMAP ;unmapping? 1715 | JZ f22b 1716 | CALL check_log_page ;check logical page no. 1717 | JC f224 1718 | MOV BX,AX ;set EMM logical page no. 1719 | f22b: 1720 | MOV AX,[BP].f22_ax_save ;get phys_page_no/seg_selector. 1721 | OR AL,AL ;sub_function 0? 1722 | JNZ f229 1723 | MOV AX,[DI].phys_page_number1;get physical page no. 1724 | CMP AX,PHYS_PAGES 1725 | jb f225 1726 | f22c: 1727 | jmp err8b 1728 | f229: 1729 | MOV AX,[DI].mappable_seg_addr;get mappable segment. 1730 | CALL change_seg_page ;change segment -> phys_page_no. 1731 | JC f22c 1732 | f225: 1733 | CMP BX,UNMAP ;unmapping? 1734 | JZ f227 1735 | CALL set_phys_page ;set physical page 1736 | jmp short f226 1737 | f221: 1738 | JMP err83 1739 | f227: 1740 | CALL reset_phys_page ;reset physical page 1741 | f226: 1742 | ADD DI,SIZE log_to_phys_map_struct; 1743 | LOOP f223 1744 | f222: 1745 | MOV AX,[BP].f22_target_seg ;get target address. 1746 | MOV [BP].ret_segment,AX ;set FAR:JUMP segment. 1747 | MOV AX,[BP].f22_target_off ;get target address. 1748 | MOV [BP].ret_offset,AX ;set FAR:JUMP offset. 1749 | JMP noerr ;exit 1750 | ;------ function 23 ------------------------------------------------- 1751 | ; Alter page map & call 1752 | ;-------------------------------------------------------------------- 1753 | func23: 1754 | STI 1755 | or al,al 1756 | je f2300 1757 | cmp al,1 1758 | je f2300 1759 | cmp al,2 1760 | je get_page_map_stack 1761 | jmp err84 1762 | ;-------------------------------------------------------------------- 1763 | ; Get page map stack space size 1764 | ; output 1765 | ; AH : status 1766 | ; BX : stack space required 1767 | ;-------------------------------------------------------------------- 1768 | get_page_map_stack: 1769 | MOV BX,RET_SP ;set stack space... 1770 | MOV [BP].bx_save,BX 1771 | JMP noerr ;exit 1772 | ;-------------------------------------------------------------------- 1773 | ; Alter page map & call 1774 | ; input 1775 | ; AL : physical page number/segment selector 1776 | ; DX : EMM handle 1777 | ; DS:SI : pointer to map_and_call structure 1778 | ; output 1779 | ; AH : status 1780 | ; AL : number of entries in the handle_dir array 1781 | ;-------------------------------------------------------------------- 1782 | f2300: 1783 | MOV [BP].f23_ax_save,AX 1784 | CALL check_handle ;check handle data 1785 | JC f221 1786 | MOV AX,[BP].ds_save 1787 | MOV DS,AX 1788 | LES BX,[SI].target_address2 ;get FAR:CALL target_addr. 1789 | MOV [BP].f23_target_off,BX ;set offset. 1790 | MOV AX,ES ;get segment 1791 | MOV [BP].f23_target_seg,AX ;set segment. 1792 | MOV CL,[SI].new_page_map_len;get new_page_map_len. 1793 | XOR CH,CH 1794 | MOV [BP].f23_new_map_len,CX 1795 | LES BX,[SI].new_page_map_ptr;get new_page_map_ptr. 1796 | JCXZ f2303 1797 | LEA DI,[BP].f23_new_map_data; 1798 | SHL CX,1 1799 | f2302: 1800 | MOV AX,ES:[BX] 1801 | MOV SS:[DI],AX 1802 | add DI,2 1803 | add BX,2 1804 | LOOP f2302 1805 | f2303: 1806 | MOV CL,[SI].old_page_map_len;get old_page_map_len. 1807 | XOR CH,CH 1808 | MOV [BP].f23_old_map_len,CX 1809 | LES BX,[SI].old_page_map_ptr;get old_page_map_ptr. 1810 | JCXZ f2305 1811 | LEA DI,[BP].f23_old_map_data; 1812 | SHL CX,1 1813 | f2304: 1814 | MOV AX,ES:[BX] 1815 | MOV SS:[DI],AX 1816 | add DI,2 1817 | add BX,2 1818 | LOOP f2304 1819 | f2305: 1820 | MOV CX,[BP].f23_new_map_len ;get new_page_map_len. 1821 | JCXZ f2307 ;mapping page length = 0? 1822 | MOV AX,SS 1823 | MOV DS,AX 1824 | LEA SI,[BP].f23_new_map_data;get new_page_map_ptr. 1825 | f2306: 1826 | MOV BX,[SI].log_page_number2;get logical page no. 1827 | CMP BX,UNMAP ;unmapping? 1828 | JZ f2313 1829 | CALL check_log_page 1830 | JC f2309 1831 | MOV BX,AX 1832 | f2313: 1833 | MOV AX,[BP].f23_ax_save 1834 | OR AL,AL ;sub_function 0? 1835 | JZ f2310 1836 | MOV AX,[SI].mappable_seg_addr; 1837 | CALL change_seg_page ;change segment -> phys_page_no. 1838 | JC f2314 1839 | f2310: 1840 | MOV AX,[SI].phys_page_number1;get physical page no. 1841 | CMP AX,PHYS_PAGES 1842 | jnb f2314 1843 | f2311: 1844 | CMP BX,UNMAP ;unmapping? 1845 | JZ f2312 1846 | CALL set_phys_page ;set physical page 1847 | jmp short f2308 1848 | f2309: 1849 | JMP err8a 1850 | f2314: 1851 | JMP err8b 1852 | f2312: 1853 | CALL reset_phys_page ;reset physical page 1854 | f2308: 1855 | ADD SI,SIZE log_to_seg_map_struct; 1856 | LOOP f2306 1857 | f2307: 1858 | MOV BX,OFFSET f2350 ;get FAR:CALL return_addr 1859 | MOV [BP].f23_retoff,BX ;set offset. 1860 | MOV AX,CS 1861 | MOV [BP].f23_retseg,AX ;set segment. 1862 | MOV AX,[BP].ret_flag ;get flags. 1863 | MOV [BP].f23_flag,AX ;set flags. 1864 | MOV AH,0 1865 | POP BX CX DX SI DI BP ES DS 1866 | IRET ;FAR:CALL to target 1867 | 1868 | ; 1869 | ; far call return point 1870 | ; 1871 | f2350: 1872 | PUSHF ;push flags. 1873 | POP AX ;pop flags. 1874 | CLI 1875 | SUB SP,F23_RETSP 1876 | PUSH DS ES BP DI SI DX CX BX 1877 | MOV BP,SP 1878 | MOV [BP].ret_flag,AX ;set return_flags. 1879 | MOV CX,[BP].f23_old_map_len ;get old_page_map_len. 1880 | JCXZ f2351 ;mapping page length = 0? 1881 | MOV AX,SS 1882 | MOV DS,AX 1883 | LEA SI,[BP].f23_old_map_data;get old_page_map_ptr. 1884 | f2352: 1885 | MOV BX,[SI].log_page_number2;get logical page no. 1886 | CMP BX,UNMAP ;unmapping? 1887 | JZ f2359 1888 | CALL check_log_page 1889 | JC f2309 1890 | MOV BX,AX 1891 | f2359: 1892 | MOV AX,[BP].f23_ax_save 1893 | OR AL,AL 1894 | JZ f2354 1895 | MOV AX,[SI].mappable_seg_addr 1896 | CALL change_seg_page ;change segment -> phys_page_no. 1897 | jc f2314 1898 | f2354: 1899 | MOV AX,[SI].phys_page_number1;get physical page no. 1900 | CMP AX,PHYS_PAGES 1901 | jnb f2314 1902 | CMP BX,UNMAP ;unmapping? 1903 | JZ f2357 1904 | CALL set_phys_page ;set physical page 1905 | jmp short f2353 1906 | f2357: 1907 | CALL reset_phys_page ;reset physical page 1908 | f2353: 1909 | ADD SI,SIZE log_to_seg_map_struct 1910 | LOOP f2352 1911 | f2351: 1912 | JMP noerr 1913 | 1914 | ;------ Function 24 (57h) ------------------------------------------- 1915 | ; Move Memory Region 1916 | 1917 | ; This subfunction copies a region of memory in the following memory 1918 | ; source/destination combinations: 1919 | ; 1920 | ; o conventional memory to conventional memory 1921 | ; o conventional memory to expanded memory 1922 | ; o expanded memory to conventional memory 1923 | ; o expanded memory to expanded memory 1924 | ; 1925 | ; AL : Operation (0) 1926 | ; DS:SI : pointer to move_info 1927 | ; AH : Return code 1928 | ;-------------------------------------------------------------------- 1929 | func24: 1930 | or al,al 1931 | je f2400 1932 | cmp al,1 1933 | je f2400 1934 | jmp err84 ; 1935 | f2400: 1936 | mov [bp].f24_al_save,al 1937 | mov ax,[bp].ds_save 1938 | mov ds,ax 1939 | mov ax,[si].source_offset ; 1940 | mov [bp].source_off,ax 1941 | mov al,[si].source_type 1942 | mov [bp].source_type1,al 1943 | or al,al 1944 | je f2401 1945 | mov ax,[si].source_seg_page ; = EMS 1946 | mov [bp].source_page,ax 1947 | mov ax,cs:Page_Frame_Seg 1948 | mov [bp].source_seg,ax 1949 | mov ax,[si].source_handle1 1950 | mov [bp].source_handle2,ax 1951 | jmp short f2402 1952 | f2401: 1953 | mov ax,[si].source_seg_page ; = RAM 1954 | mov [bp].source_seg,ax 1955 | f2402: 1956 | mov ax,[si].dest_offset ; 1957 | mov [bp].dest_off,ax 1958 | mov al,[si].dest_type 1959 | mov [bp].dest_type1,al 1960 | or al,al 1961 | je f2403 1962 | mov ax,[si].dest_seg_page ; = EMS 1963 | mov [bp].dest_page,ax 1964 | mov ax,cs:Page_Frame_Seg 1965 | add ax,400H 1966 | mov [bp].dest_seg,ax 1967 | mov ax,[si].dest_handle1 1968 | mov [bp].dest_handle2,ax 1969 | jmp short f2404 1970 | f2403: 1971 | mov ax,[si].dest_seg_page ; = RAM 1972 | mov [bp].dest_seg,ax 1973 | f2404: 1974 | les di,[si].region_lenght ; 1975 | mov [bp].region_low,di 1976 | mov ax,es 1977 | mov [bp].region_high,ax 1978 | cmp ax,10h ; 1979 | jb f2405 1980 | jne f2407 1981 | or di,di 1982 | jnz f2407 1983 | 1984 | f2405: 1985 | cmp [si].source_type,0 1986 | jne f2408 ; = RAM 1987 | FarPtrAddress [bp].source_seg,[bp].source_off 1988 | cmp dx,10h ;... 1989 | jnb f2411 1990 | f2409: 1991 | Save32 [bp].source_ea_high,[bp].source_ea_low; 1992 | Add32 [bp].region_high,[bp].region_low 1993 | Sub32 0,1 ; 1994 | cmp dx,10h ; 1995 | jb f2410 1996 | jg f2411 1997 | or ax,ax 1998 | jz f2410 1999 | f2411: 2000 | jmp errA2 2001 | f2413: 2002 | jmp err8A 2003 | f2414: 2004 | jmp err95 2005 | f2410a: 2006 | jmp err93 2007 | f2412: 2008 | jmp err83 2009 | f2407: 2010 | jmp err96 2011 | f2418: 2012 | jmp errA2 2013 | f2408: 2014 | mov dx,[bp].source_handle2 ; = EMS 2015 | call check_handle ; 2016 | jc f2412 2017 | mov bx,[bp].source_page 2018 | call check_log_page ; 2019 | jc f2413 2020 | mov di,dx 2021 | mov ax,[bp].source_off 2022 | cmp ax,4000h 2023 | jnb f2414 2024 | xor dx,dx 2025 | Add32 [bp].region_high,[bp].region_low 2026 | Sub32 0,1 2027 | Shl32 2 2028 | add bx,dx 2029 | mov dx,di 2030 | call check_log_page ; 2031 | jc f2410a 2032 | f2410: 2033 | cmp [si].dest_type,0 2034 | jne f2415 ; = RAM 2035 | FarPtrAddress [bp].dest_seg,[bp].dest_off 2036 | cmp dx,10h ;. 2037 | jnb f2418 2038 | Save32 [bp].dest_ea_high, [bp].dest_ea_low 2039 | Add32 [bp].region_high,[bp].region_low 2040 | Sub32 0,1 ; 2041 | cmp dx,10h ; 2042 | jb f2417 2043 | jmp short f2418 2044 | f2419: 2045 | jmp err83 2046 | f2420: 2047 | jmp err8A 2048 | f2421: 2049 | jmp err95 ; 2050 | f2417a: 2051 | jmp err93 ; 2052 | f2415: 2053 | mov dx,[bp].dest_handle2 ; = EMS 2054 | call check_handle ; 2055 | jc f2419 2056 | mov bx,[bp].dest_page 2057 | call check_log_page ; 2058 | jc f2420 2059 | mov di,dx 2060 | mov ax,[bp].dest_off 2061 | cmp ax,4000h 2062 | jnb f2421 2063 | xor dx,dx 2064 | Add32 [bp].region_high, [bp].region_low 2065 | Sub32 0,1 2066 | Shl32 2 2067 | add bx,dx 2068 | mov dx,di 2069 | call check_log_page ; 2070 | jc f2417a 2071 | 2072 | f2417: 2073 | mov [bp].direct_move,0 2074 | mov al,[si].source_type 2075 | cmp al,[si].dest_type ; 2076 | jne f2423 2077 | f2422: 2078 | cmp al,1 2079 | je f2424 2080 | FLoad32 [bp].source_ea_low 2081 | mov bx,[bp].dest_ea_low ; = RAM 2082 | mov cx,[bp].dest_ea_high 2083 | jmp short f2430 2084 | f2424: 2085 | mov ax,[bp].source_handle2 ; = EMS 2086 | cmp ax,[bp].dest_handle2 2087 | jne f2423 2088 | mov dx,[bp].dest_page 2089 | xor ax,ax 2090 | Shr32 2 2091 | Add32 0,[bp].dest_off 2092 | mov bx,ax 2093 | mov cx,dx 2094 | mov dx,[bp].source_page 2095 | xor ax,ax 2096 | Shr32 2 2097 | Add32 0,[bp].source_off 2098 | f2430: 2099 | cmp dx,cx ;DX:AX = , CX:BX = 2100 | jne f2425 2101 | cmp ax,bx 2102 | f2425: 2103 | jae f2426 2104 | xchg bx,ax 2105 | xchg cx,dx 2106 | cmp [bp].f24_al_save,1 2107 | je f2426 2108 | or [bp].direct_move,1 ; 2109 | f2426: 2110 | sub ax,bx 2111 | sbb dx,cx 2112 | cmp dx,[bp].region_high 2113 | jne f2427 2114 | cmp ax,[bp].region_low 2115 | f2427: 2116 | jae f2423 2117 | cmp [bp].f24_al_save,1 2118 | je f2428 ; 2119 | or [bp].direct_move,2 ; 2120 | f2423: 2121 | mov [bp].zero_low,0 2122 | test [bp].direct_move,1 2123 | jnz f2429 2124 | cld 2125 | jmp f2435 2126 | f2428: 2127 | jmp err97 2128 | 2129 | f2429: 2130 | std 2131 | cmp [si].dest_type,1 ; = EMS ? 2132 | je f2432 2133 | 2134 | FLoad32 [bp].dest_ea_low 2135 | Add32 [bp].region_high,[bp].region_low 2136 | Sub32 0,1 2137 | mov bx,ax 2138 | and bx,000Fh 2139 | mov [bp].dest_off,bx 2140 | Shr32 4 2141 | mov [bp].dest_seg,ax 2142 | jmp short f2433 2143 | f2432: ; EMS... 2144 | FLoad32 [bp].region_low 2145 | Add32 0,[bp].dest_off 2146 | Sub32 0,1 2147 | mov bx,ax 2148 | and bx,3FFFh 2149 | mov [bp].dest_off,bx 2150 | Shl32 2 2151 | mov bx,[bp].dest_page 2152 | add bx,dx 2153 | mov [bp].dest_page,bx 2154 | mov dx,[bp].dest_handle2 2155 | call check_log_page 2156 | mov bx,ax 2157 | mov al,1 2158 | call set_phys_page 2159 | f2433: 2160 | cmp [si].source_type,1 ; = EMS ? 2161 | je f2434 2162 | ;... 2163 | FLoad32 [bp].source_ea_low 2164 | Add32 [bp].region_high,[bp].region_low 2165 | Sub32 0,1 2166 | mov bx,ax 2167 | and bx,000Fh 2168 | mov [bp].source_off,bx 2169 | Shr32 4 2170 | mov [bp].source_seg,ax 2171 | jmp short f2435 2172 | f2434: ; EMS... 2173 | FLoad32 [bp].region_low 2174 | Add32 0,[bp].source_off 2175 | Sub32 0,1 2176 | mov bx,ax 2177 | and bx,3FFFh 2178 | mov [bp].source_off,bx 2179 | Shl32 2 2180 | add [bp].source_page,dx 2181 | mov dx,[bp].source_handle2 2182 | call check_log_page 2183 | mov bx,ax 2184 | xor al,al 2185 | call set_phys_page 2186 | 2187 | 2188 | f2435: 2189 | mov al,[si].source_type ; 2190 | or al,[si].dest_type ; 2191 | jz f2436 2192 | mov cx,SIZE phys_page_struct 2193 | mov si,offset map_table 2194 | mov di,offset f24_data 2195 | mov ax,cs 2196 | mov ds,ax 2197 | mov es,ax 2198 | rep movsw 2199 | or [bp].direct_move,4 2200 | 2201 | f2436: 2202 | mov ax,[bp].region_low 2203 | or ax,[bp].region_high 2204 | jnz f2438 2205 | test [bp].direct_move,4 ; 2206 | jz f2439 2207 | mov cx,SIZE phys_page_struct 2208 | mov si,offset f24_data 2209 | mov di,offset map_table 2210 | f2440: 2211 | mov ax,cs 2212 | mov ds,ax 2213 | mov es,ax 2214 | rep movsw 2215 | call set_pages_map 2216 | f2439: 2217 | test [bp].direct_move,2 ; F24 !!! 2218 | jnz f2441 2219 | jmp noerr 2220 | f2441: 2221 | jmp err92 2222 | 2223 | 2224 | f2438: 2225 | cmp [bp].source_type1,1 2226 | je f2442 2227 | 2228 | FarPtrAddress [bp].source_seg,[bp].source_off 2229 | test [bp].direct_move,1 2230 | jnz f2443 2231 | Add32 [bp].zero_low,0 ; 2232 | mov bx,ax 2233 | and bx,000Fh 2234 | mov [bp].source_off,bx 2235 | Shr32 4 2236 | mov [bp].source_seg,ax 2237 | jmp short f2444 2238 | f2443: 2239 | Sub32 0,[bp].zero_low ; 2240 | mov bx,ax 2241 | or bx,0FFF0h 2242 | mov [bp].source_off,bx 2243 | Sub32 0,bx 2244 | Shr32 4 2245 | mov [bp].source_seg,ax 2246 | jmp short f2444 2247 | f2442: 2248 | mov ax,[bp].source_off ; EMS... 2249 | test [bp].direct_move,1 2250 | jnz f2445 2251 | add ax,[bp].zero_low ;... 2252 | cmp ax,4000h 2253 | jb f2446 2254 | inc [bp].source_page 2255 | mov [bp].source_off,0 2256 | jmp short f2446 2257 | f2445: 2258 | sub ax,[bp].zero_low ;... 2259 | jnc f2446 2260 | dec [bp].source_page 2261 | mov [bp].source_off,3FFFh 2262 | f2446: 2263 | mov dx,[bp].source_handle2 2264 | mov bx,[bp].source_page 2265 | call check_log_page 2266 | mov bx,ax 2267 | xor al,al 2268 | call set_phys_page 2269 | 2270 | 2271 | f2444: 2272 | test [bp].dest_type1,1 2273 | jnz f2447 2274 | 2275 | FarPtrAddress [bp].dest_seg,[bp].dest_off 2276 | test [bp].direct_move,1 2277 | jnz f2448 2278 | Add32 0,[bp].zero_low ; 2279 | mov bx,ax 2280 | and bx,000Fh 2281 | mov [bp].dest_off,bx 2282 | Shr32 4 2283 | mov [bp].dest_seg,ax 2284 | jmp short f2449 2285 | f2448: 2286 | Sub32 0,[bp].zero_low ;... 2287 | mov bx,ax 2288 | or bx,0FFF0h 2289 | mov [bp].dest_off,bx 2290 | Sub32 0,bx 2291 | Shr32 4 2292 | mov [bp].dest_seg,ax 2293 | jmp short f2449 2294 | f2447: 2295 | mov ax,[bp].dest_off ; EMS... 2296 | test [bp].direct_move,1 2297 | jnz f2450 2298 | add ax,[bp].zero_low ;... 2299 | cmp ax,4000h 2300 | jb f2451 2301 | inc [bp].dest_page 2302 | mov [bp].dest_off,0 2303 | jmp short f2451 2304 | f2450: 2305 | sub ax,[bp].zero_low ;... 2306 | jnc f2451 2307 | dec [bp].dest_page 2308 | mov [bp].dest_off,3FFFh 2309 | f2451: 2310 | mov dx,[bp].dest_handle2 2311 | mov bx,[bp].dest_page 2312 | call check_log_page 2313 | mov bx,ax 2314 | mov al,1 2315 | call set_phys_page 2316 | f2449: 2317 | mov bl,[bp].dest_type1 ;MAXLEN (dest)... 2318 | mov ax,[bp].dest_off 2319 | call maxlen 2320 | push ax 2321 | mov bl,[bp].source_type1 ;MAXLEN (source)... 2322 | mov ax,[bp].source_off 2323 | call maxlen 2324 | pop bx 2325 | mov cx,ax 2326 | FLoad32 [bp].region_low 2327 | cmp cx,bx ; 2328 | jb f2452 2329 | mov cx,bx 2330 | f2452: 2331 | or dx,dx 2332 | jnz f2453 2333 | cmp cx,ax 2334 | jb f2453 2335 | mov cx,ax 2336 | 2337 | 2338 | f2453: 2339 | mov [bp].zero_low,cx 2340 | mov ax,[bp].source_seg 2341 | mov ds,ax 2342 | mov ax,[bp].dest_seg 2343 | mov es,ax 2344 | mov si,[bp].source_off 2345 | mov di,[bp].dest_off 2346 | 2347 | cmp [bp].f24_al_save,1 2348 | je f2454 2349 | rep movsb ; 2350 | f2455: 2351 | FLoad32 [bp].region_low 2352 | Sub32 0,[bp].zero_low 2353 | Save32 [bp].region_high,[bp].region_low 2354 | jmp f2436 2355 | f2454: 2356 | Exbyte ;... 2357 | loop f2454 2358 | jmp f2455 2359 | ;------ function 25 ------------------------------------------------- 2360 | ; Get mappable physical address array 2361 | ;-------------------------------------------------------------------- 2362 | func25: 2363 | STI 2364 | DEC AL 2365 | js get_map_phys_addr ; 0 2366 | JZ get_map_phys_ent ; 1 2367 | JMP err84 ;error exit 2368 | ;-------------------------------------------------------------------- 2369 | ; Get mappable physical address array 2370 | ; input 2371 | ; ES:DI : mappable_phys_page 2372 | ; output 2373 | ; AH : status 2374 | ; CX : number of entries in the mappable_phys_page 2375 | ;-------------------------------------------------------------------- 2376 | get_map_phys_addr: 2377 | MOV AX,[BP].es_save 2378 | MOV ES,AX 2379 | MOV CX,PHYS_PAGES 2380 | MOV SI,OFFSET map_table 2381 | XOR DX,DX 2382 | get_map_phys_addr1: 2383 | MOV AX,[SI].phys_seg_addr 2384 | STOSW 2385 | MOV AX,DX 2386 | STOSW 2387 | INC DX 2388 | ADD SI,SIZE phys_page_struct 2389 | LOOP get_map_phys_addr1 2390 | ;-------------------------------------------------------------------- 2391 | ; Get mappable physcal address array entries 2392 | ; output 2393 | ; AH : status 2394 | ; CX : number of entries in the mappable_phys_page 2395 | ;-------------------------------------------------------------------- 2396 | get_map_phys_ent: 2397 | get_map_phys_addr2: 2398 | MOV CX,PHYS_PAGES 2399 | MOV [BP].cx_save,CX ;set segment addr entrie 2400 | JMP noerr ;exit 2401 | 2402 | ;------ function 26 ------------------------------------------------- 2403 | ; Get expanded memory hardware infomation 2404 | ;-------------------------------------------------------------------- 2405 | func26: 2406 | STI 2407 | DEC AL 2408 | js get_hardware_config ; 0 2409 | JZ get_unalloc_raw_page ; 1 2410 | JMP err84 ;error exit 2411 | ;-------------------------------------------------------------------- 2412 | ; Get hardware configration array 2413 | ; input 2414 | ; ES:DI : hardware_info 2415 | ; output 2416 | ; AH : status 2417 | ;-------------------------------------------------------------------- 2418 | get_hardware_config: 2419 | CMP OSE_flag,0 ;OS/E flag enable? 2420 | jne get_hardware_config1 2421 | MOV AX,[BP].es_save 2422 | MOV ES,AX 2423 | MOV AX,RAW_PAGES 2424 | STOSW 2425 | MOV AX,ALTER_REGS 2426 | STOSW 2427 | MOV AX,CONTEXT_SIZE 2428 | STOSW 2429 | MOV AX,DMA_REGS 2430 | STOSW 2431 | MOV AX,DMA_CHANNEL 2432 | STOSW 2433 | JMP noerr ;exit 2434 | get_hardware_config1: 2435 | JMP erra4 ;error exit 2436 | ;-------------------------------------------------------------------- 2437 | ; Get unallocated raw page count 2438 | ; output 2439 | ; AH : status 2440 | ; BX : unallocated raw pages 2441 | ; DX : total raw pages 2442 | ;-------------------------------------------------------------------- 2443 | get_unalloc_raw_page: 2444 | JMP func3 ;goto function 3 2445 | ;------ function 28 ------------------------------------------------- 2446 | ; Alternate map register set 2447 | ;-------------------------------------------------------------------- 2448 | f280: 2449 | JMP erra4 ;error exit 2450 | func28: 2451 | STI 2452 | CMP OSE_flag,0 ;OS/E flag enable? 2453 | jne f280 2454 | cbw 2455 | dec ax 2456 | js get_alter_map_reg ; 0 2457 | JZ set_alter_map_reg ; 1 2458 | dec ax 2459 | jz get_alter_map_size ; 2 2460 | dec ax 2461 | jz alloc_alter_map_reg ; 3 2462 | dec ax 2463 | jz dealloc_alter_map_reg ; 4 2464 | dec ax 2465 | jz alloc_DMA_reg ; 5 2466 | dec ax 2467 | jz enable_DMA_alter_reg ; 6 2468 | dec ax 2469 | jz disable_DMA_alter_reg ; 7 2470 | dec ax 2471 | jz dealloc_DMA_reg ; 8 2472 | jmp err84 ;error exit 2473 | ;-------------------------------------------------------------------- 2474 | ; Get alternate map save array size 2475 | ; output 2476 | ; AH : status 2477 | ; DX : size_of_array 2478 | ;-------------------------------------------------------------------- 2479 | get_alter_map_size: 2480 | MOV DX,CONTEXT_SIZE 2481 | MOV [BP].dx_save,DX 2482 | JMP noerr ;exit 2483 | ;-------------------------------------------------------------------- 2484 | ; Allocate alternate map register set 2485 | ; output 2486 | ; AH : status 2487 | ; BL : alternate map register set number 2488 | ;-------------------------------------------------------------------- 2489 | alloc_alter_map_reg: 2490 | ;-------------------------------------------------------------------- 2491 | ; Allocate DMA register set 2492 | ; output 2493 | ; AH : status 2494 | ; BL : DMA register set number 2495 | ;-------------------------------------------------------------------- 2496 | alloc_DMA_reg: 2497 | xor bx,bx 2498 | MOV [BP].bx_save,BX 2499 | JMP noerr ;exit 2500 | ;-------------------------------------------------------------------- 2501 | ; Deallocate alternate map register set 2502 | ; input 2503 | ; BL : alternate map register set number 2504 | ; output 2505 | ; AH : status 2506 | ;-------------------------------------------------------------------- 2507 | dealloc_alter_map_reg: 2508 | ;-------------------------------------------------------------------- 2509 | ; Enable DMA on alternate map register set 2510 | ; input 2511 | ; BL : DMA register set number 2512 | ; DL : DMA channel number 2513 | ; output 2514 | ; AH : status 2515 | ;-------------------------------------------------------------------- 2516 | enable_DMA_alter_reg: 2517 | ;-------------------------------------------------------------------- 2518 | ; Disable DMA on alternate map register set 2519 | ; input 2520 | ; BL : alternate register set number 2521 | ; output 2522 | ; AH : status 2523 | ;-------------------------------------------------------------------- 2524 | disable_DMA_alter_reg: 2525 | ;-------------------------------------------------------------------- 2526 | ; Deallocate DMA register set 2527 | ; input 2528 | ; BL : DMA register set number 2529 | ; output 2530 | ; AH : status 2531 | ;-------------------------------------------------------------------- 2532 | dealloc_DMA_reg: 2533 | OR BL,BL 2534 | jnz dealloc_alter_map_reg1 2535 | JMP noerr 2536 | dealloc_alter_map_reg1: 2537 | JMP err9c 2538 | ;-------------------------------------------------------------------- 2539 | ; Get alternate map register set 2540 | ; output 2541 | ; AH : status 2542 | ; BL : current active alternate map register set number 2543 | ; ES:DI : pointer to a map register context save area 2544 | ;-------------------------------------------------------------------- 2545 | get_alter_map_reg: 2546 | MOV DI,alter_map_off 2547 | MOV AX,alter_map_seg 2548 | MOV ES,AX 2549 | OR AX,DI 2550 | JZ get_alter_map_reg1 2551 | MOV SI,OFFSET map_table 2552 | PUSH CS 2553 | POP DS 2554 | MOV CX,CONTEXT_SIZE/2 2555 | REPZ MOVSW 2556 | get_alter_map_reg1: 2557 | MOV DI,CS:alter_map_off 2558 | MOV AX,CS:alter_map_seg 2559 | MOV [BP].di_save,DI 2560 | MOV [BP].es_save,AX 2561 | MOV BX,[BP].bx_save 2562 | xor bl,bl 2563 | MOV [BP].bx_save,BX 2564 | JMP noerr 2565 | ;-------------------------------------------------------------------- 2566 | ; Set alternate map register set 2567 | ; input 2568 | ; BL : new alternate map register set number 2569 | ; ES:DI : pointer to a map register context restore area 2570 | ; output 2571 | ; AH : status 2572 | ;-------------------------------------------------------------------- 2573 | set_alter_map_reg: 2574 | cli 2575 | or bl,bl 2576 | jnz set_alter_map_reg1 2577 | mov alter_map_off,di 2578 | mov ax,es 2579 | mov alter_map_seg,ax 2580 | or ax,di 2581 | jz set_alter_map_reg2 2582 | push es 2583 | pop ds 2584 | mov si,di 2585 | mov cx,CONTEXT_SIZE/2 2586 | mov ax,ss 2587 | mov es,ax 2588 | lea di,[bp].f28_map_data 2589 | rep movsw 2590 | lea di,[bp].f28_map_data 2591 | call check_map_data 2592 | jc set_alter_map_reg3 2593 | mov si,di 2594 | push es 2595 | pop ds 2596 | mov cx,CONTEXT_SIZE/2 2597 | mov di,offset map_table 2598 | push cs 2599 | pop es 2600 | rep movsw 2601 | call set_pages_map 2602 | set_alter_map_reg2: 2603 | jmp noerr 2604 | set_alter_map_reg1: 2605 | jmp err9c 2606 | set_alter_map_reg3: 2607 | jmp erra3 2608 | ;------ function 29 ------------------------------------------------- 2609 | ; Prepare expanded memory hardware for warm boot 2610 | ;-------------------------------------------------------------------- 2611 | func29: 2612 | MOV AX,CS 2613 | MOV ES,AX 2614 | MOV DS,AX 2615 | MOV DI,OFFSET map_table ;disable physical pages... 2616 | MOV CX,PHYS_PAGES 2617 | f291: 2618 | MOV [DI].emm_handle2,UNMAP 2619 | MOV [DI].log_page_data,0 2620 | ADD DI,SIZE phys_page_struct 2621 | loop f291 2622 | call set_pages_map 2623 | MOV DI,OFFSET alloc_page_count;clear all... 2624 | mov cx,HANDLE_CNT*3 2625 | xor ax,ax 2626 | rep stosw 2627 | MOV DI,OFFSET handle_name ;clear handles... 2628 | MOV CX,HANDLE_CNT*4 2629 | REPZ STOSW 2630 | MOV di,OFFSET backup_flags ;v1.01 2631 | mov cx,CONTEXT_SIZE/2 2632 | rep stosw 2633 | MOV DI,OFFSET alloc_page ;clear logical page buffer... 2634 | MOV CX,PAGE_MAX*2 2635 | dec ax ; set to -1 2636 | REPZ STOSW 2637 | MOV byte ptr handle_flag,1 ;set system handle flag... 2638 | MOV handle_count,1 ;set active handle count 2639 | MOV backup_count,0 ;set backup map count 2640 | MOV AX,total_pages 2641 | MOV un_alloc_pages,AX ;set unallocate page count 2642 | MOV AX,OFFSET alloc_page ;set page buffer pointer 2643 | MOV page_ptr,AX 2644 | JMP noerr ;exit 2645 | ;------ function 30 ------------------------------------------------- 2646 | ; Enable/disable OS/E function set functions 2647 | ; input 2648 | ; BX,CX : alternate register set number 2649 | ; output 2650 | ; AH : status 2651 | ; BX,CX : alternate register set number 2652 | ;-------------------------------------------------------------------- 2653 | func30: 2654 | sti 2655 | dec al 2656 | js enable_OSE_func ; 0 2657 | jz disable_OSE_func ; 1 2658 | dec al 2659 | jz return_access_key ; 2 2660 | jmp err84 ;error exit 2661 | 2662 | ;-------------------------------------------------------------------- 2663 | ; Enable OS/E function set 2664 | ; input 2665 | ; BX,CX : access_key 2666 | ; output 2667 | ; AH : status 2668 | ; BX,CX : access_key 2669 | ;-------------------------------------------------------------------- 2670 | enable_OSE_func: 2671 | CMP OSE_fast,0 ;OS/E fast access flag enable? 2672 | JZ enable_OSE_func1 2673 | CMP access_key_h,BX ;compare access key high 2674 | JNZ enable_OSE_func2 2675 | CMP access_key_l,CX ;compare access key low 2676 | jnz enable_OSE_func2 2677 | enable_OSE_func1: 2678 | MOV OSE_flag,0 ;enable OS/E function 2679 | MOV OSE_fast,0FFFFH ;set OS/E fast access flag 2680 | MOV BX,access_key_h 2681 | MOV [BP].bx_save,BX 2682 | MOV CX,access_key_l 2683 | MOV [BP].cx_save,CX 2684 | JMP noerr 2685 | enable_OSE_func2: 2686 | JMP erra4 2687 | ;-------------------------------------------------------------------- 2688 | ; Disable OS/E function set 2689 | ; input 2690 | ; BX,CX : access_key 2691 | ; output 2692 | ; AH : status 2693 | ; BX,CX : access_key 2694 | ;-------------------------------------------------------------------- 2695 | disable_OSE_func: 2696 | CMP OSE_fast,0 ;OS/E fast access flag enable? 2697 | JZ disable_OSE_func1 2698 | CMP access_key_h,BX ;compare access key high 2699 | JNZ enable_OSE_func2 2700 | CMP access_key_l,CX ;compare access key low 2701 | jnz enable_OSE_func2 2702 | disable_OSE_func1: 2703 | MOV OSE_flag,0FFFFH ;disable OS/E function 2704 | MOV OSE_fast,0FFFFH ;set OS/E fast access flag 2705 | MOV BX,access_key_h 2706 | MOV [BP].bx_save,BX 2707 | MOV CX,access_key_l 2708 | MOV [BP].cx_save,CX 2709 | JMP noerr 2710 | ;-------------------------------------------------------------------- 2711 | ; Return access key 2712 | ; input 2713 | ; BX,CX : access_key 2714 | ; output 2715 | ; AH : status 2716 | ;-------------------------------------------------------------------- 2717 | return_access_key: 2718 | CMP OSE_flag,0 ;OS/E flag enable? 2719 | jnz enable_OSE_func2 2720 | CMP access_key_h,BX ;compare access key high 2721 | jnz enable_OSE_func2 2722 | CMP access_key_l,CX ;compare access key low 2723 | jnz enable_OSE_func2 2724 | MOV OSE_flag,0 ;enable OS/E function 2725 | MOV OSE_fast,0 ;reset OS/E fast access flag 2726 | XOR AX,AX 2727 | MOV ES,AX 2728 | MOV AX,ES:[46CH] 2729 | ADD BX,AX ;make access key... 2730 | MOV access_key_h,BX 2731 | ADC AX,ES:[46EH] 2732 | ADD CX,AX 2733 | MOV access_key_l,CX 2734 | JMP noerr 2735 | ;......................................................................... 2736 | ;-------------------------------------------------------------------- 2737 | ; \82\EB\E7\A8᫥\AD\A8\A5 \AC\A0\AAᨬ\A0\AB쭮 \A2\AE\A7\AC\AE\A6\AD\AE\A9 \A4\AB\A8\AD\EB \A1\AB\AE筮\A9 \AF\A5\E0\A5\E1뫪\A8 2738 | ; \A2室 2739 | ; BL : ⨯ \AF\A0\AC\EF\E2\A8 (0=RAM,1=EMS) 2740 | ; AX : ᬥ饭\A8e \A1\AB\AE\AA\A0 2741 | ; \A2\EB室 2742 | ; AX : \A4\AB\A8\AD\A0 \AF\A5\E0\A5\E1뫪\A8 2743 | ;-------------------------------------------------------------------- 2744 | maxlen PROC NEAR 2745 | or bl,bl 2746 | jnz max1 2747 | test [bp].direct_move,1 ;\A4\AB\EF ᮢ\AC\A5\E1⨬\AE\A9 \AF\A0\AC\EF\E2\A8... 2748 | jnz max2 2749 | neg ax 2750 | jmp short max3 2751 | max2: 2752 | inc ax 2753 | max3: 2754 | or ax,ax 2755 | jnz max4 2756 | dec ax 2757 | ret 2758 | max1: 2759 | test [bp].direct_move,1 ;\A4\AB\EF EMS... 2760 | jnz max5 2761 | sub ax,4000h 2762 | neg ax 2763 | ret 2764 | max5: 2765 | inc ax 2766 | max4: 2767 | ret 2768 | maxlen ENDP 2769 | 2770 | ;-------------------------------------------------------------------- 2771 | ; Check logical page no. 2772 | ; input 2773 | ; BX : logical page number in handle 2774 | ; DX : EMM handle 2775 | ; output 2776 | ; AX : logical page number in EMM 2777 | ; CF = 0 : OK 2778 | ; CF = 1 : NG 2779 | ;-------------------------------------------------------------------- 2780 | check_log_page PROC NEAR 2781 | PUSH CX SI 2782 | MOV SI,DX 2783 | SHL SI,1 2784 | CMP bl,CS:[SI].alloc_page_count 2785 | jnb check_log_page2 2786 | MOV SI,CS:[SI].page_address 2787 | MOV AX,BX 2788 | SHL AX,1 2789 | ADD SI,AX 2790 | MOV AX,CS:[SI] ;get logical no. in EMM 2791 | CLC 2792 | check_log_page1: 2793 | POP SI CX 2794 | RET 2795 | check_log_page2: 2796 | STC 2797 | JMP short check_log_page1 2798 | check_log_page ENDP 2799 | ;-------------------------------------------------------------------- 2800 | ; Check EMM handle no. 2801 | ; input 2802 | ; DX : EMM handle 2803 | ; output 2804 | ; CF = 0 : OK 2805 | ; CF = 1 : NG 2806 | ;-------------------------------------------------------------------- 2807 | check_handle PROC NEAR 2808 | PUSH DI 2809 | CMP DX,HANDLE_CNT 2810 | jnb check_handle1 2811 | MOV DI,DX 2812 | SHL DI,1 2813 | cmp byte ptr CS:[DI].handle_flag,0 ;active handle ? 2814 | JZ check_handle1 2815 | CLC 2816 | check_handle2: 2817 | POP DI 2818 | RET 2819 | check_handle1: 2820 | STC 2821 | jmp check_handle2 2822 | check_handle ENDP 2823 | ;-------------------------------------------------------------------- 2824 | ; Set physical page. 2825 | ; input 2826 | ; AL : physical page no. 2827 | ; BX : logical page no. in EMM (if BX=FFFFH then unmap) 2828 | ; DX : EMM handle 2829 | ;-------------------------------------------------------------------- 2830 | set_phys_page PROC NEAR 2831 | PUSH AX CX DX DI 2832 | cbw 2833 | MOV DI,OFFSET map_table 2834 | MOV CL,SIZE phys_page_struct 2835 | MUL CL 2836 | ADD DI,AX 2837 | PUSH DX 2838 | MOV DX,CS:[DI].phys_page_port 2839 | MOV AX,BX 2840 | ; JJP OR AL,80h 2841 | OUT DX,AL 2842 | POP DX 2843 | MOV CS:[DI].emm_handle2,DX ;handle 2844 | MOV CS:[DI].log_page_data,AL;logical page no. 2845 | POP DI DX CX AX 2846 | RET 2847 | set_phys_page ENDP 2848 | ;-------------------------------------------------------------------- 2849 | ; Change mappable segment address to physical page number. 2850 | ; input 2851 | ; AX : mappable segment address 2852 | ; output 2853 | ; AX : physical page number 2854 | ;-------------------------------------------------------------------- 2855 | change_seg_page PROC NEAR 2856 | PUSH BX CX DI 2857 | XOR BX,BX 2858 | MOV DI,OFFSET map_table 2859 | MOV CX,PHYS_PAGES 2860 | CLC ;reset CF 2861 | change_seg_page2: 2862 | CMP AX,CS:[DI].phys_seg_addr 2863 | JZ change_seg_page1 2864 | ADD DI,SIZE phys_page_struct 2865 | INC BX 2866 | LOOP change_seg_page2 2867 | STC ;set CF 2868 | change_seg_page1: 2869 | MOV AX,BX 2870 | POP DI CX BX 2871 | RET 2872 | change_seg_page ENDP 2873 | 2874 | ; 2875 | ; EMS 4.0 Data 2876 | ; 2877 | ALIGN 2 2878 | ; 2879 | ; handle name buffer 2880 | ; 2881 | handle_name LABEL BYTE 2882 | DB HANDLE_NAME_SIZE * HANDLE_CNT DUP (0) 2883 | ; 2884 | ; f24 Save area 2885 | ; 2886 | f24_data DB SIZE phys_page_struct * 2 dup (0) 2887 | ; 2888 | ;-------------------------------------------------------------------- 2889 | ; EMM driver initilize program 2890 | ;-------------------------------------------------------------------- 2891 | emminit: 2892 | PUSH CX DX SI DI ES BP ;Store registers... 2893 | PUSH CS 2894 | POP DS 2895 | XOR AX,AX 2896 | MOV ES,AX 2897 | MOV SI,19CH 2898 | MOV WORD PTR ES:[SI],OFFSET int67;set int67 offset. 2899 | MOV ES:[SI+2],CS ;set int67 segment. 2900 | CALL getprm ;get parameters 2901 | test sysflg,1 2902 | jz emminit1 2903 | call set32 2904 | emminit1: 2905 | MOV SI,OFFSET start_msg ;display start messege. 2906 | CALL strdsp 2907 | CALL ckemsio ;check EMS i/o port 2908 | jc errems ;error ? 2909 | CALL ramchk ;check EMS memory 2910 | jc errems ;error ? 2911 | CALL instmsg ;display install message. 2912 | XOR AX,AX 2913 | MOV ES,AX 2914 | MOV AX,ES:[46CH] 2915 | ADD BX,AX ;make access key... 2916 | MOV access_key_h,BX 2917 | ADC AX,ES:[46EH] 2918 | ADD BX,AX 2919 | MOV access_key_l,BX 2920 | XOR DI,DI ;set system handle... 2921 | PUSH CS 2922 | POP ES 2923 | MOV byte ptr es:[DI].handle_flag,1;set system handle active. 2924 | INC es:handle_count ;handle count up 2925 | MOV AX,OFFSET emminit ;make 4.0 break address... 2926 | test sysflg,1 2927 | jz emminit2 2928 | MOV AX,OFFSET func16 ;make 3.2 break address... 2929 | emminit2: 2930 | ADD AX,0FH 2931 | MOV CL,4 2932 | SHR AX,CL 2933 | MOV CX,AX 2934 | MOV AX,CS 2935 | ADD AX,CX 2936 | MOV emm_flag,1 ;set EMM install flag. 2937 | LDS BX,ptrsav 2938 | MOV [BX].brkoff,0 ;break address offset set. 2939 | MOV [BX].brkseg,AX ;break address segment set. 2940 | JMP short emmint1 2941 | errems: 2942 | MOV SI,OFFSET notinst ;display error message 2943 | CALL strdsp 2944 | MOV emm_flag,0 ;reset EMM install flag. 2945 | PUSH CS 2946 | POP ES 2947 | MOV DI,OFFSET func_table 2948 | MOV AX,OFFSET err80 2949 | MOV CX,30 2950 | REPZ STOSW 2951 | LDS BX,ptrsav 2952 | MOV AX,OFFSET func2 ;set break address offset. 2953 | MOV [BX].brkoff,AX ;set break address offset. 2954 | MOV [BX].brkseg,CS ;set break address segment. 2955 | emmint1: 2956 | POP BP ES DI SI DX CX ;Restore registers... 2957 | JMP exit ;exit initial program. 2958 | ;-------------------------------------------------------------------- 2959 | ; Get CONFIG.SYS parameters. 2960 | ;-------------------------------------------------------------------- 2961 | getprm PROC NEAR 2962 | PUSH DS 2963 | LES BX,ptrsav 2964 | MOV DI,ES:[BX].count 2965 | MOV AX,ES:[BX].start 2966 | MOV ES,AX 2967 | XOR CL,CL 2968 | getpr2: 2969 | MOV AL,ES:[DI] 2970 | CMP AL,CR 2971 | JZ getpr4 2972 | CMP AL,'/' ;set page frame address? 2973 | jne getpr5 2974 | inc di 2975 | MOV AL,ES:[DI] 2976 | OR AL,20h ;tolower 2977 | CMP AL,'p' ;set page frame address? 2978 | JNZ getpr3 2979 | INC DI 2980 | MOV AL,ES:[DI] 2981 | CMP AL,':' 2982 | JNZ getpr5 2983 | INC DI 2984 | CALL ascbin2 ;change data ascii -> binary. 2985 | JNC getpr8 ;error ? 2986 | JMP getpr5 2987 | getpr8: 2988 | MOV page_frame_seg,AX 2989 | JMP getpr5 2990 | getpr3: 2991 | CMP AL,'i' ;set EMS i/o port address? 2992 | JNZ getpr6 2993 | INC DI 2994 | MOV AL,ES:[DI] 2995 | CMP AL,':' 2996 | JNZ getpr5 2997 | INC DI 2998 | CALL ascbin2 ;change data ascii -> binary. 2999 | MOV emsio,AX 3000 | JMP getpr5 3001 | getpr6: 3002 | CMP AL,'f' ;set EMS i/o port address? 3003 | JNZ getpr7 3004 | INC DI 3005 | MOV AL,ES:[DI] 3006 | CMP AL,':' 3007 | JNZ getpr5 3008 | INC DI 3009 | CALL ascbin1 ;change data ascii -> binary. 3010 | MOV pageofs,al 3011 | JMP getpr5 3012 | getpr7: 3013 | CMP AL,'q' ;set quiet mode 3014 | JNZ getpr1 3015 | OR CL,4 3016 | JMP getpr5 3017 | getpr1: 3018 | CMP AL,'n' ;set notest mode 3019 | JNZ getpr10 3020 | OR CL,8 3021 | JMP getpr5 3022 | getpr10: 3023 | CMP AL,'x' ;set extended memory test 3024 | JNZ getpr9 3025 | OR CL,2 3026 | JMP getpr5 3027 | getpr9: 3028 | CMP AL,'3' ;set 3.2 mode 3029 | JNZ getpr5 3030 | OR CL,1 3031 | getpr5: 3032 | INC DI 3033 | JMP getpr2 3034 | getpr4: 3035 | MOV sysflg,CL ;set system option flag. 3036 | POP DS 3037 | RET 3038 | getprm ENDP 3039 | ;-------------------------------------------------------------------- 3040 | ; Display EMM install opening message. 3041 | ;-------------------------------------------------------------------- 3042 | instmsg PROC NEAR 3043 | PUSH AX BX CX DI 3044 | PUSH CS 3045 | POP ES 3046 | MOV AX,page_frame_seg 3047 | MOV DI,OFFSET segadr 3048 | CALL hbinasc 3049 | MOV AX,total_pages 3050 | MOV DI,OFFSET total_pg 3051 | CALL dbinasc 3052 | MOV AX,emsio 3053 | MOV DI,OFFSET pioadr 3054 | CALL hbinasc 3055 | MOV AX,total_pages 3056 | mov cl,4 3057 | shl ax,cl ; Multiply to 16 3058 | MOV DI,OFFSET totmem 3059 | CALL dbinasc 3060 | MOV SI,OFFSET install_msg 3061 | CALL strdsp 3062 | POP DI CX BX AX 3063 | RET 3064 | instmsg ENDP 3065 | ;-------------------------------------------------------------------- 3066 | ; Check EMS i/o port. 3067 | ; output 3068 | ; for lo-tech EMS board, we cannot read from the page registers 3069 | ; hence we just return OK anyway. 3070 | ; cf = 0 : OK 3071 | ; cf = 1 : NG 3072 | ;-------------------------------------------------------------------- 3073 | ckemsio PROC NEAR 3074 | MOV DX,CS:EMSIO 3075 | ; JJP IN AL,DX 3076 | ; JJP CMP AL,255 ;check TRS flag 3077 | ; JJP JE ckems3 3078 | ckems4: 3079 | CLC ;reset CF 3080 | RET 3081 | ckems3: 3082 | MOV SI,OFFSET hard_w_err ;display hardware error messege. 3083 | CALL strdsp 3084 | STC ;set CF 3085 | RET 3086 | ckemsio ENDP 3087 | ;-------------------------------------------------------------------- 3088 | ; Check expanded memory. 3089 | ; output 3090 | ; cf = 0 : OK 3091 | ; cf = 1 : NG 3092 | ;-------------------------------------------------------------------- 3093 | ramchk PROC NEAR 3094 | PUSH AX BX CX DX BP 3095 | PUSH CS 3096 | POP DS 3097 | MOV DI,OFFSET map_table 3098 | MOV CX,PHYS_PAGES 3099 | MOV BX,emsio 3100 | MOV SI,page_frame_seg 3101 | ramch14: 3102 | MOV [DI].phys_page_port,BX 3103 | MOV [DI].log_page_data,0 3104 | MOV [DI].phys_seg_addr,SI 3105 | ADD DI,SIZE phys_page_struct 3106 | ADD SI,0400H 3107 | MOV DX,BX ;disable physical pages --- 3108 | MOV AL,DIS_EMS 3109 | OUT DX,AL 3110 | ; JJP ADD BX,4000h 3111 | INC BX ; lo-tech cards registers are sequential from base address 3112 | LOOP ramch14 3113 | MOV SI,OFFSET pagemsg ;display page test msg.. 3114 | CALL strdsp 3115 | IN AL,I8042+1 ;logical page test... 3116 | OR AL,4 ;system memory parity disable 3117 | and al,0feh 3118 | OUT I8042+1,AL 3119 | MOV DI,OFFSET log_page 3120 | MOV DX,emsio 3121 | MOV AL,pageofs ;get EMS logical page start no. 3122 | xor ah,ah 3123 | MOV CX,PAGE_MAX 3124 | sub cx,ax 3125 | jng ramch16 3126 | mov ah,al 3127 | XOR BX,BX 3128 | ramch9: 3129 | PUSH CX 3130 | MOV AL,AH 3131 | ; JJP OR AL,80h 3132 | OUT DX,AL 3133 | CALL imgchk ; checks the page is RAM 3134 | jc ramch17 3135 | test byte ptr sysflg,8 ;supress memory test 3136 | jne ramch2 3137 | call testkb ; check if user press ESC 3138 | jnc ramch6 3139 | or byte ptr sysflg,8 ;supress memory test 3140 | jmp short ramch2 3141 | ramch6: 3142 | test byte ptr sysflg,2 ;long memory test 3143 | jne ramch3 3144 | CALL pagetst 3145 | jmp short ramch4 3146 | ramch3: 3147 | CALL spagetst 3148 | ramch4: 3149 | jc ramch8 3150 | ramch2: 3151 | MOV [DI],NOT_USE 3152 | INC BX 3153 | ramch17: 3154 | ADD DI,LOG_SIZE 3155 | ramch8: 3156 | POP CX 3157 | INC AH 3158 | LOOP ramch9 3159 | ramch16: 3160 | MOV total_pages,BX 3161 | MOV un_alloc_pages,BX 3162 | MOV AL,DIS_EMS 3163 | OUT DX,AL 3164 | IN AL,I8042+1 ;enable system memory parity.. 3165 | AND AL,0FBH 3166 | or AL,1 3167 | OUT I8042+1,AL 3168 | CMP total_pages,0 ;total page zero? 3169 | JNZ ramch7 3170 | MOV SI,OFFSET nopage_err ;error message display 3171 | CALL strdsp 3172 | STC ;set CF 3173 | JMP ramch5 3174 | ramch7: 3175 | CLC 3176 | ramch5: 3177 | POP BP DX CX BX AX 3178 | RET 3179 | ramchk ENDP 3180 | ;-------------------------------------------------------------------- 3181 | ; check memory size (1024 KByte) 3182 | ;-------------------------------------------------------------------- 3183 | imgchk PROC NEAR 3184 | CLD 3185 | PUSH AX CX SI DI DS 3186 | PUSH CS ;set ES <- CS.. 3187 | POP ES 3188 | test ah,3 3189 | jnz imgchk2 3190 | IN AL,I8042+1 3191 | or AL,2 3192 | OUT I8042+1,AL 3193 | imgchk2: 3194 | MOV AL,AH 3195 | CBW 3196 | MOV DI,OFFSET tstpage 3197 | CALL dbinasc ;change binary -> ascii. 3198 | MOV SI,OFFSET tstpage ;display message.. 3199 | CALL strdsp 3200 | IN AL,I8042+1 3201 | and AL,0fdh 3202 | OUT I8042+1,AL 3203 | MOV AX,page_frame_seg 3204 | MOV ES,AX 3205 | MOV ax,chkchr 3206 | mov es:[0],ax 3207 | cmp es:[0],ax 3208 | jne imgch1 3209 | xor ax,ax 3210 | mov es:[0],ax 3211 | CLC 3212 | jmp imgch3 3213 | imgch1: 3214 | STC 3215 | imgch3: 3216 | POP DS DI SI CX AX 3217 | RET 3218 | imgchk ENDP 3219 | ;-------------------------------------------------------------------- 3220 | ; check logical page memory. 3221 | ; input 3222 | ; AX : logical page no. 3223 | ;-------------------------------------------------------------------- 3224 | pagetst PROC NEAR 3225 | CLD ;reset DF 3226 | PUSH AX BX CX DX DI 3227 | MOV AX,page_frame_seg ;set page frame address -> ES... 3228 | MOV ES,AX 3229 | MOV AX,chkchr 3230 | XOR DI,DI 3231 | MOV CX,2000h 3232 | REP STOSW 3233 | XOR DI,DI 3234 | MOV CX,2000h ;check pattan data... 3235 | REPZ SCASW 3236 | JZ pagets1 3237 | pagets2: 3238 | STC 3239 | JMP pagets5 3240 | pagets1: 3241 | XOR AX,AX ;clear expand memory... 3242 | XOR DI,DI 3243 | MOV CX,2000h 3244 | REP STOSW 3245 | CLC 3246 | pagets5: 3247 | POP DI DX CX BX AX 3248 | RET 3249 | pagetst ENDP 3250 | ;-------------------------------------------------------------------- 3251 | spagetst proc near 3252 | cld ;reset DF 3253 | push ax bx cx di ds 3254 | mov ax,page_frame_seg ;set page frame address -> ES... 3255 | mov es,ax 3256 | mov ds,ax 3257 | xor ax,ax 3258 | xor di,di 3259 | mov cx,2000h 3260 | rep stosw ;Fill area with zeros 3261 | mov bx,00ffh 3262 | ; Pass 1 3263 | xor di,di 3264 | mov cx,4000h 3265 | spagets3: 3266 | mov al,[di] 3267 | cmp al,bh 3268 | jne spagets2 3269 | mov [di],bl 3270 | inc di 3271 | loop spagets3 3272 | ; Pass 2 3273 | xor di,di 3274 | mov cx,4000h 3275 | xchg bl,bh 3276 | spagets4: 3277 | mov al,[di] 3278 | cmp al,bh 3279 | jne spagets2 3280 | mov [di],bl 3281 | inc di 3282 | loop spagets4 3283 | ; Pass 3 3284 | mov di,4000h 3285 | dec di 3286 | xchg bl,bh 3287 | spagets6: 3288 | mov al,[di] 3289 | cmp al,bh 3290 | jne spagets2 3291 | mov [di],bl 3292 | dec di 3293 | jns spagets6 3294 | ; Pass 4 3295 | mov di,4000h 3296 | dec di 3297 | xchg bl,bh 3298 | spagets7: 3299 | mov al,[di] 3300 | cmp al,bh 3301 | jne spagets2 3302 | mov [di],bl 3303 | dec di 3304 | jns spagets7 3305 | clc 3306 | spagets5: 3307 | pop ds di cx bx ax 3308 | ret 3309 | spagets2: 3310 | stc 3311 | jmp spagets5 3312 | spagetst endp 3313 | ;-------------------------------------------------------------------- 3314 | ; Change data BYNARY -> ASCII (DEC) 3315 | ; input 3316 | ; AX : binary data 3317 | ; output 3318 | ; ES:DI : ascii data (DEC) 3319 | ;-------------------------------------------------------------------- 3320 | dbinasc: 3321 | PUSH AX BX CX DX SI 3322 | MOV SI,DI 3323 | MOV CX,4 3324 | MOV BX,1000 3325 | XOR DX,DX 3326 | dbinas1: 3327 | DIV BX 3328 | OR AL,AL 3329 | JNZ dbinas2 3330 | CMP CL,4 3331 | JZ dbinas4 3332 | CMP BYTE PTR [SI],' ' 3333 | JNZ dbinas2 3334 | dbinas4: 3335 | MOV AL,' ' 3336 | CMP CL,1 3337 | JNZ dbinas3 3338 | XOR AL,AL 3339 | dbinas2: 3340 | ADD AL,'0' 3341 | dbinas3: 3342 | MOV SI,DI 3343 | STOSB 3344 | PUSH DX 3345 | XOR DX,DX 3346 | MOV AX,BX 3347 | MOV BX,10 3348 | DIV BX 3349 | MOV BX,AX 3350 | POP AX 3351 | LOOP dbinas1 3352 | POP SI DX CX BX AX 3353 | DEC DI 3354 | RET 3355 | ;-------------------------------------------------------------------- 3356 | ; Change data BYNARY -> ASCII (HEX) 3357 | ; input 3358 | ; AX : binary data 3359 | ; output 3360 | ; ES:DI : ascii data (HEX) 3361 | ;-------------------------------------------------------------------- 3362 | hbinasc: 3363 | PUSH AX BX CX DX SI 3364 | MOV SI,DI 3365 | MOV CX,4 3366 | MOV BX,1000H 3367 | XOR DX,DX 3368 | hbinas1: 3369 | DIV BX 3370 | CMP AL,10 3371 | JC hbinas2 3372 | ADD AL,7 3373 | hbinas2: 3374 | ADD AL,'0' 3375 | hbinas3: 3376 | MOV SI,DI 3377 | STOSB 3378 | PUSH DX 3379 | XOR DX,DX 3380 | MOV AX,BX 3381 | MOV BX,10H 3382 | DIV BX 3383 | MOV BX,AX 3384 | POP AX 3385 | LOOP hbinas1 3386 | POP SI DX CX BX AX 3387 | DEC DI 3388 | RET 3389 | ;-------------------------------------------------------------------- 3390 | ; Change data ASCII (DEC) -> BINARY 3391 | ; input 3392 | ; ES:DI = ascii data address (DEC) 3393 | ; output 3394 | ; AX = binary data 3395 | ;-------------------------------------------------------------------- 3396 | ascbin1: 3397 | PUSH BX CX DX 3398 | XOR DL,DL 3399 | MOV CX,4 3400 | XOR BX,BX 3401 | ascbin11: 3402 | MOV AL,ES:[DI] 3403 | CMP AL,' ' 3404 | JZ ascbin13 3405 | CMP AL,TAB 3406 | JNZ ascbin14 3407 | ascbin13: 3408 | OR DL,DL 3409 | JNZ ascbin12 3410 | INC DI 3411 | JMP ascbin11 3412 | ascbin12: 3413 | OR DL,DL 3414 | JNZ ascbin16 3415 | STC 3416 | JMP ascbin15 3417 | ascbin14: 3418 | CMP AL,'0' 3419 | JC ascbin12 3420 | CMP AL,':' 3421 | JNC ascbin12 3422 | MOV DL,1 3423 | SUB AL,'0' 3424 | XOR AH,AH 3425 | XCHG BX,AX 3426 | PUSH DX 3427 | MOV DX,10 3428 | MUL DX 3429 | ADD BX,AX 3430 | POP DX 3431 | INC DI 3432 | LOOP ascbin11 3433 | ascbin16: 3434 | MOV AX,BX 3435 | CLC 3436 | ascbin15: 3437 | POP DX CX BX 3438 | RET 3439 | ;-------------------------------------------------------------------- 3440 | ; Change data ASCII (HEX) -> BINARY 3441 | ; input 3442 | ; ES:DI = ascii data address (HEX) 3443 | ; output 3444 | ; AX = binary data 3445 | ;-------------------------------------------------------------------- 3446 | ascbin2: 3447 | PUSH BX CX DX 3448 | XOR DL,DL 3449 | MOV CX,4 3450 | XOR BX,BX 3451 | ascbin21: 3452 | MOV AL,ES:[DI] 3453 | CMP AL,' ' 3454 | JZ ascbin23 3455 | CMP AL,TAB 3456 | JNZ ascbin24 3457 | ascbin23: 3458 | OR DL,DL 3459 | JNZ ascbin22 3460 | INC DI 3461 | JMP ascbin21 3462 | ascbin22: 3463 | OR DL,DL 3464 | JNZ ascbin27 3465 | STC 3466 | JMP ascbin25 3467 | ascbin24: 3468 | CMP AL,'0' 3469 | JC ascbin22 3470 | CMP AL,':' 3471 | JC ascbin26 3472 | CMP AL,'A' 3473 | JC ascbin22 3474 | CMP AL,'G' 3475 | JNC ascbin22 3476 | SUB AL,7 3477 | ascbin26: 3478 | MOV DL,1 3479 | SUB AL,'0' 3480 | XOR AH,AH 3481 | XCHG BX,AX 3482 | PUSH DX 3483 | MOV DX,10H 3484 | MUL DX 3485 | ADD BX,AX 3486 | POP DX 3487 | INC DI 3488 | LOOP ascbin21 3489 | ascbin27: 3490 | MOV AX,BX 3491 | CLC 3492 | ascbin25: 3493 | POP DX CX BX 3494 | RET 3495 | ;-------------------------------------------------------------------- 3496 | ; STRINGS DISPLAY SUB 3497 | ; input 3498 | ; DS:SI : strings datas 3499 | ;-------------------------------------------------------------------- 3500 | strdsp: 3501 | test byte ptr cs:sysflg,4 ;supress output 3502 | jnz strdsp1 ;when in quet mode 3503 | PUSH AX DX ES 3504 | PUSH CS 3505 | POP ES 3506 | MOV DX,SI 3507 | MOV AH,9 3508 | INT 21H ;bdos call 3509 | POP ES DX AX 3510 | strdsp1: 3511 | RET 3512 | ; 3513 | ; Set EMS 3 mode 3514 | ; 3515 | set32: 3516 | mov byte ptr msg_ver,'3' 3517 | mov byte ptr msg_ver+2,'2' 3518 | mov byte ptr f7_ver,32h 3519 | mov byte ptr f_max,4fh 3520 | ret 3521 | ; 3522 | ; Test ESC from keyboard 3523 | ; 3524 | testkb: 3525 | push ax 3526 | mov ah,1 3527 | int 16h 3528 | jz testkb1 3529 | xor ah,ah 3530 | int 16h 3531 | cmp al,27 3532 | jne testkb1 3533 | stc 3534 | jmp short testkb2 3535 | testkb1: 3536 | clc 3537 | testkb2: 3538 | pop ax 3539 | ret 3540 | ;____________________________________________________________________ 3541 | ; 3542 | ; This is "EXE" part of this driver 3543 | ; 3544 | ;____________________________________________________________________ 3545 | info: 3546 | push cs 3547 | pop ds 3548 | mov si, offset start_msg ; Display title & version 3549 | call strdsp 3550 | mov si, offset info_msg ; Display switches 3551 | call strdsp 3552 | mov ax,4c00h ;Exit to DOS 3553 | int 21h 3554 | ;____________________________________________________________________ 3555 | 3556 | ;-------------------------------------------------------------------- 3557 | ; EMM driver initial routine work data area 3558 | ;-------------------------------------------------------------------- 3559 | start_msg db CR,LF 3560 | DB 'LTEMM: Lo-tech EMM Driver ' 3561 | msg_ver db 'r01' 3562 | DB CR,LF,'$' 3563 | install_msg label byte 3564 | page_msg DB 'Page frame specification: Frame Segment at ' 3565 | segadr DB '0000',CR,LF 3566 | total_pg DB '0000 pages found on EMS board at ' 3567 | pioadr DB '0000',CR,LF 3568 | db 'Installation completed - ' 3569 | totmem db '0000K RAM Available.',CR,LF,LF,'$' 3570 | hard_w_err DB 'No EMS board found.',CR,LF,'$' 3571 | nopage_err DB 'No EMS memory found.',CR,LF,'$' 3572 | notinst DB 'Installation failed - No EMS available.',CR,LF,LF,'$' 3573 | pagemsg DB '0000 Pages testing, Esc bypass test',CR,'$' 3574 | tstpage DB '0000',CR,'$' 3575 | info_msg db CR,LF 3576 | db 'Expanded Memory Manager for the Lo-tech 2MB EMS board.',CR,LF 3577 | db CR,LF 3578 | db 'Based on original works Copyright (c) 1988, Alex Tsourikov.',CR,LF 3579 | db 'All rights reserved.',CR,LF 3580 | db CR,LF 3581 | db 'http://www.lo-tech.co.uk/wiki/2MB-EMS-Board',CR,LF 3582 | db 'Syntax: DEVICE=LTEMM.EXE [/switches]',CR,LF 3583 | db CR,LF 3584 | db ' /p:nnnn - Page frame address(E000)',CR,LF 3585 | db ' /i:nnn - EMS i/o port base address(260)',CR,LF 3586 | db ' /h:nnn - Maximal number of handles(64)',CR,LF 3587 | db ' /d:nn - Depth of contest saves(5)',CR,LF 3588 | ; db ' /f:nnn - First page number(0)',CR,LF 3589 | db ' /n - Bypass memory test',CR,LF 3590 | db ' /x - Perform long memory test',CR,LF 3591 | db ' /3 - Use only EMS 3.2 functions',CR,LF 3592 | db ' /q - Quiet mode',CR,LF 3593 | db CR,LF 3594 | db 'Defaults in parentheses.',CR,LF,'$' 3595 | pageofs DB 0 ;logical page no. offset data 3596 | sysflg DB 0 ;system option flag 3597 | chkchr DW 55AAH 3598 | code ENDS 3599 | END INFO 3600 | -------------------------------------------------------------------------------- /software/LTEMM.INC: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkzlab/ISA_EMS_4Mb/588682ac2cb9260f0a46a2837dc3b6a72e0f3f20/software/LTEMM.INC -------------------------------------------------------------------------------- /software/LTHCK.EXE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hkzlab/ISA_EMS_4Mb/588682ac2cb9260f0a46a2837dc3b6a72e0f3f20/software/LTHCK.EXE -------------------------------------------------------------------------------- /software/README.TXT: -------------------------------------------------------------------------------- 1 | ************************************************************************* 2 | * * 3 | * EMS 4.0 Driver for Lo-tech 2MB EMS Board, rev.01, Mar-14 * 4 | * * 5 | * http://www.lo-tech.co.uk/wiki/2MB-EMS-Board * 6 | * http://www.lo-tech.co.uk/wiki/LTEMM.EXE * 7 | * * 8 | * This code is TASM source. * 9 | * * 10 | * Based on original works Copyright (c) 1988, Alex Tsourikov. * 11 | * All rights reserved. * 12 | * * 13 | * Original source kindly provided subject to the BSD 3-Clause * 14 | * License: http://opensource.org/licenses/BSD-3-Clause * 15 | * * 16 | * This software, as modified, is provided subject to the terms * 17 | * of use at: * 18 | * * 19 | * http://www.lo-tech.co.uk/wiki/lo-tech.co.uk:General_disclaimer * 20 | * * 21 | * No charge has been made for this software. * 22 | * * 23 | ************************************************************************* 24 | 25 | Syntax: DEVICE=LTEMM.EXE [/switches] 26 | /p:nnnn - Page frame address (E000) 27 | /i:nnn - EMS i/o port base address (260) 28 | /h:nnn - Maximal number of handles (64) 29 | /d:nn - Depth of contest saves (5) 30 | /f:nnn - First page number (0) 31 | /n - Bypass memory test 32 | /x - Perform long memory test 33 | /3 - Use only EMS 3.2 functions 34 | /q - Quiet mode 35 | 36 | Defaults in parentheses. This driver has been tested under MS-DOS 6.22. 37 | 38 | 39 | -------------------------------------------------------------------------------- /sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (version 7) 3 | (lib (name "skiselev_libraries")(type "Legacy")(uri "${KIPRJMOD}/libraries/my_kicad_library/library/my_components.lib")(options "")(descr "")) 4 | (lib (name "custom_components")(type "Legacy")(uri "${KIPRJMOD}/libraries/custom_libs/custom_components.lib")(options "")(descr "")) 5 | (lib (name "ISA_EMS-rescue")(type "KiCad")(uri "${KIPRJMOD}/ISA_EMS-rescue.kicad_sym")(options "")(descr "")) 6 | ) 7 | --------------------------------------------------------------------------------