|
|
1.1 ! root 1: | ! 2: ! 3: | interrupt wrapping routines; these should just save registers and call ! 4: ! 5: | the appropriate C handlers, unless speed is a major problem ! 6: ! 7: | ! 8: ! 9: ! 10: ! 11: | ! 12: ! 13: | first, utilities for setting processor status level ! 14: ! 15: | ! 16: ! 17: .globl _spl7, _spl ! 18: ! 19: _spl7: ! 20: ! 21: movew sr, d0 ! 22: ! 23: oriw #0x0700, sr ! 24: ! 25: rts ! 26: ! 27: _spl: ! 28: ! 29: movew sp@(4), d0 ! 30: ! 31: movew d0, sr ! 32: ! 33: rts ! 34: ! 35: ! 36: ! 37: .globl _mint_5ms ! 38: ! 39: .globl _mint_timer ! 40: ! 41: .globl _mint_vbl ! 42: ! 43: .globl _timeout | C time routine ! 44: ! 45: .globl _old_timer | old GEMDOS time vector ! 46: ! 47: .globl _old_vbl | old GEMDOS vbl vector ! 48: ! 49: .globl _old_5ms ! 50: ! 51: .globl _build_context ! 52: ! 53: .globl _restore_context ! 54: ! 55: .globl _proc_clock | controls process' allocation of CPU time ! 56: ! 57: .globl _curproc ! 58: ! 59: .globl _in_kernel ! 60: ! 61: ! 62: ! 63: | AKP: this code is hit once every 5ms; it updates the time fields of curproc. ! 64: ! 65: _mint_5ms: ! 66: ! 67: movel a0,sp@- ! 68: ! 69: movel _curproc,a0 ! 70: ! 71: addw #0x364,a0 | $364 is offset to curproc->systime; ! 72: ! 73: tstw _in_kernel ! 74: ! 75: bne L_5a | usrtime is the branch-not-taken case ! 76: ! 77: addql #4,a0 ! 78: ! 79: L_5a: addql #5,a0@ ! 80: ! 81: movel sp@+,a0 ! 82: ! 83: movel _old_5ms+8,sp@- ! 84: ! 85: rts ! 86: ! 87: ! 88: ! 89: _mint_timer: ! 90: ! 91: moveml d0-d2/a0-a2, sp@- | save C registers ! 92: ! 93: jsr _timeout ! 94: ! 95: moveml sp@+, d0-d2/a0-a2 ! 96: ! 97: movel _old_timer+8, sp@- | jump to GEMDOS time vector ! 98: ! 99: rts ! 100: ! 101: ! 102: ! 103: _mint_vbl: ! 104: ! 105: tstw 0x59e | test longframe (AKP) ! 106: ! 107: beq L_short1 ! 108: ! 109: clrw sp@- | yes, long frames: push a frame word ! 110: ! 111: L_short1: ! 112: ! 113: pea L_comeback | push fake PC ! 114: ! 115: movew sr, sp@- | push status register ! 116: ! 117: movel _old_vbl+8, sp@- | go service the interrupt ! 118: ! 119: rts ! 120: ! 121: ! 122: ! 123: L_comeback: ! 124: ! 125: tstw _proc_clock | has time expired yet? ! 126: ! 127: beq L_expired | yes -- maybe go switch processes ! 128: ! 129: L_out: ! 130: ! 131: rte | no -- just return ! 132: ! 133: ! 134: ! 135: L_expired: ! 136: ! 137: btst #13, sp@ | user mode? ! 138: ! 139: bne L_out | no -- switching is not possible ! 140: ! 141: L_switch: ! 142: ! 143: movel _curproc, sp@- ! 144: ! 145: addl #4, sp@ | to get &curproc->ctxt[SYSCALL] ! 146: ! 147: jsr _build_context | build context ! 148: ! 149: movel _curproc, a0 ! 150: ! 151: movel a0@, sp | use curproc->sysstack ! 152: ! 153: jsr _enter_kernel | enter kernel ! 154: ! 155: jsr _preempt | yield processor ! 156: ! 157: oriw #0x0700, sr | spl7() ! 158: ! 159: jsr _leave_kernel | restore vectors ! 160: ! 161: movel _curproc, a0 ! 162: ! 163: pea a0@(4) ! 164: ! 165: jsr _restore_context | back to user ! 166: ! 167: | ! 168: ! 169: | reset routine -- called on a warm boot. Note that TOS sends the ! 170: ! 171: | address to which we should return in register a6. Also note that ! 172: ! 173: | the stack pointer is in an unknown state, so we set up our own ! 174: ! 175: | ! 176: ! 177: .globl _reset ! 178: ! 179: .globl _tmpstack | see main.c ! 180: ! 181: ! 182: ! 183: _reset: ! 184: ! 185: movew #0x2700, sr | avoid interruption here ! 186: ! 187: movel sp, _tmpstack | save A7 ! 188: ! 189: lea _tmpstack, sp | set up temporary stack ! 190: ! 191: lea sp@(256), sp ! 192: ! 193: moveml d0-d2/a0-a2, sp@- | save C registers ! 194: ! 195: jsr _restr_intr | restore interrupts ! 196: ! 197: moveml sp@+, d0-d2/a0-a2 | restore registers ! 198: ! 199: movel _tmpstack, sp ! 200: ! 201: jmp a6@ | reset again ! 202: ! 203: ! 204: ! 205: | ! 206: ! 207: | routine for doing a reboot ! 208: ! 209: | ! 210: ! 211: .globl _reboot ! 212: ! 213: _reboot: ! 214: ! 215: movew #0x2700, sr | avoid interrupts ! 216: ! 217: movel 0x00, sp | get sp after reboot ! 218: ! 219: movel 0x04, a6 | get new reboot address ! 220: ! 221: jmp _reset ! 222: ! 223: ! 224: ! 225: | ! 226: ! 227: | routine for mouse packet handling ! 228: ! 229: | ! 230: ! 231: .globl _newmvec ! 232: ! 233: _newmvec: ! 234: ! 235: movel a0, sp@- ! 236: ! 237: jsr _mouse_handler ! 238: ! 239: movel sp@+, a0 ! 240: ! 241: rts ! 242: ! 243: ! 244: ! 245: | ! 246: ! 247: | new ikbd keyboard interrupt vector ! 248: ! 249: | kintr is a global variable that should be non-zero if a keyboard ! 250: ! 251: | event occured ! 252: ! 253: | ! 254: ! 255: .globl _new_ikbd ! 256: ! 257: _new_ikbd: ! 258: ! 259: movew #1, _kintr ! 260: ! 261: movel _old_ikbd+8, sp@- ! 262: ! 263: rts | jump to system interrupt routine ! 264: ! 265: ! 266: ! 267: | ! 268: ! 269: | simple signal handlers ! 270: ! 271: | global variables referenced: ! 272: ! 273: | in_kernel: (main.c): flag to indicate that we're in the MiNT kernel ! 274: ! 275: | sig_routine: (signal.c): pointer to which signal catching routine to ! 276: ! 277: | call (e.g. for SIGBUS, or whatever) ! 278: ! 279: | ! 280: ! 281: .globl _new_bus, _new_addr, _new_ill, _new_divzero, _new_priv ! 282: ! 283: .globl _new_trace ! 284: ! 285: .globl _in_kernel, _sig_routine ! 286: ! 287: _new_bus: ! 288: ! 289: movel #_sigbus, _sig_routine ! 290: ! 291: Do_sig: ! 292: ! 293: tstw _in_kernel | are we already in the kernel? ! 294: ! 295: bne Kernel | yes ! 296: ! 297: movel _curproc, sp@- ! 298: ! 299: addl #4, sp@ | push offset of save area ! 300: ! 301: jsr _build_context ! 302: ! 303: movel _curproc, a4 ! 304: ! 305: movel a4@, sp | put us in the system stack ! 306: ! 307: jsr _enter_kernel | set up kernel vectors ! 308: ! 309: movel _sig_routine, a1 | get signal handling routine ! 310: ! 311: jsr a1@ | go do it ! 312: ! 313: oriw #0x0700, sr | spl7() ! 314: ! 315: jsr _leave_kernel | leave kernel ! 316: ! 317: lea a4@(4), a4 | get context save area address ! 318: ! 319: movel a4, sp@- | push it ! 320: ! 321: jsr _restore_context | restore the context ! 322: ! 323: | ! 324: ! 325: | here's what we do if we already were in the kernel ! 326: ! 327: | ! 328: ! 329: Kernel: ! 330: ! 331: moveml d0-d2/a0-a2, sp@- | save reggies ! 332: ! 333: movel _sig_routine, a1 | get handler ! 334: ! 335: jsr a1@ | go do it ! 336: ! 337: moveml sp@+, d0-d2/a0-a2 ! 338: ! 339: rte ! 340: ! 341: _new_addr: ! 342: ! 343: movel #_sigaddr, _sig_routine ! 344: ! 345: bra Do_sig ! 346: ! 347: _new_ill: ! 348: ! 349: movel #_sigill, _sig_routine ! 350: ! 351: bra Do_sig ! 352: ! 353: _new_divzero: ! 354: ! 355: movel #_sigfpe, _sig_routine ! 356: ! 357: bra Do_sig ! 358: ! 359: _new_priv: ! 360: ! 361: movel #_sigpriv, _sig_routine ! 362: ! 363: bra Do_sig ! 364: ! 365: _new_trace: ! 366: ! 367: movel #_sigtrap, _sig_routine ! 368: ! 369: bra Do_sig ! 370: ! 371: ! 372: ! 373: | ! 374: ! 375: | BIOS disk vectors for pseudo-disks like U: and X:; these are present ! 376: ! 377: | just in case some program (foolishly) attempts to access these drives ! 378: ! 379: | directly and gets horribly confused ! 380: ! 381: | ! 382: ! 383: .globl _old_getbpb | old Getbpb vector ! 384: ! 385: .globl _old_mediach | old Mediach vector ! 386: ! 387: .globl _old_rwabs | old Rwabs vector ! 388: ! 389: ! 390: ! 391: .globl _new_getbpb ! 392: ! 393: _new_getbpb: ! 394: ! 395: movew sp@(4), d0 | check the drive ! 396: ! 397: cmpw #0x10, d0 | drive Q:? ! 398: ! 399: beq nobpb | yes, no BPB available ! 400: ! 401: cmpw #0x14, d0 | drive U:? ! 402: ! 403: beq nobpb | yes, no BPB available ! 404: ! 405: cmpw #0x15, d0 | drive V:? ! 406: ! 407: beq nobpb ! 408: ! 409: cmpw #0x17, d0 | drive X:? ! 410: ! 411: beq nobpb ! 412: ! 413: movel _old_getbpb+8, a0 | not our drive ! 414: ! 415: jmp a0@ | call the old vector for it ! 416: ! 417: nobpb: ! 418: ! 419: moveql #0, d0 | 0 means "no BPB read" ! 420: ! 421: rts ! 422: ! 423: ! 424: ! 425: .globl _new_mediach ! 426: ! 427: _new_mediach: ! 428: ! 429: movew sp@(4), d0 | check the drive ! 430: ! 431: cmpw #0x10, d0 | drive Q:? ! 432: ! 433: beq nochng | yes, no change ! 434: ! 435: cmpw #0x14, d0 | drive U:? ! 436: ! 437: beq nochng | yes, no change ! 438: ! 439: cmpw #0x15, d0 | drive V:? ! 440: ! 441: beq nochng ! 442: ! 443: cmpw #0x17, d0 | drive X:? ! 444: ! 445: beq nochng ! 446: ! 447: movel _old_mediach+8, a0 | not our drive ! 448: ! 449: jmp a0@ | call the old vector for it ! 450: ! 451: nochng: ! 452: ! 453: moveql #0, d0 | 0 means "definitely no change" ! 454: ! 455: rts ! 456: ! 457: ! 458: ! 459: .globl _new_rwabs ! 460: ! 461: _new_rwabs: ! 462: ! 463: movew sp@(0xe), d0 | check the drive ! 464: ! 465: cmpw #0x10, d0 | drive Q:? ! 466: ! 467: beq rwdone | yes, fake a successful I/O operation ! 468: ! 469: cmpw #0x14, d0 | drive U:? ! 470: ! 471: beq rwdone | yes, fake it ! 472: ! 473: cmpw #0x15, d0 | drive V:? ! 474: ! 475: beq rwdone ! 476: ! 477: cmpw #0x17, d0 | drive X:? ! 478: ! 479: beq rwdone ! 480: ! 481: movel _old_rwabs+8, a0 | not our drive ! 482: ! 483: jmp a0@ | call the old vector for it ! 484: ! 485: rwdone: ! 486: ! 487: moveql #0, d0 | 0 means "successful operation" ! 488: ! 489: rts ! 490:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.