summaryrefslogtreecommitdiff
path: root/Exec.S
diff options
context:
space:
mode:
authorChristian A. Weber <chris@gna.ch>1992-04-16 23:00:42 +0000
committerChristian A. Weber <chris@gna.ch>1992-04-16 23:00:42 +0000
commit02a2dcac1a41872e1fec6d3b37ddd7ecae57eae4 (patch)
tree6c39deb2ce8713b42bad5917b870184ed1d73463 /Exec.S
parentab216e437899d244ad2ad43cdf2ad0b66b06ca42 (diff)
downloadgameexec-02a2dcac1a41872e1fec6d3b37ddd7ecae57eae4.tar.gz
gameexec-02a2dcac1a41872e1fec6d3b37ddd7ecae57eae4.tar.bz2
gameexec-02a2dcac1a41872e1fec6d3b37ddd7ecae57eae4.zip
Initial revision
Diffstat (limited to 'Exec.S')
-rw-r--r--Exec.S816
1 files changed, 816 insertions, 0 deletions
diff --git a/Exec.S b/Exec.S
new file mode 100644
index 0000000..dcdcd18
--- /dev/null
+++ b/Exec.S
@@ -0,0 +1,816 @@
+**************************************************************************
+** **
+** MYEXEC - Verschiedene Routinen die so manches Programm braucht **
+** **
+** by Christian A. Weber, Zurich/Switzwerland **
+** **
+**************************************************************************
+** **
+** Modification History **
+** -------------------- **
+** **
+** 18-May-89 CHW Recreated this file! **
+** 20-Jun-89 CHW Supports 1MB CHIP RAM **
+** 29-Jun-89 CHW Auf Genim2 umgeschrieben **
+** 22-Aug-89 CHW AddHead() added **
+** 27-Aug-89 CHW AddHead() rettet nun die Register (!^%#$@) **
+** 13-Sep-89 CHW CopyMem() rettet nun D0 (grmbl!) **
+** 06-Nov-89 CHW SetCache() added **
+** 27-Nov-89 CHW FastMem support routines added **
+** 04-Feb-90 CHW Zero-Handler & other Guru handlers added **
+** 11-Feb-90 CHW Supervisor-Stack ist jetzt im FAST-RAM **
+** 28-Mar-90 CHW ColdReboot() implementiert, ABORT springt dahin **
+** 18-Sep-90 CHW CheckMem() implementiert und so **
+** 20-Oct-90 CHW Config-File entfernt, MainPrg muss am Anfang sein **
+** 30-Dec-90 CHW Gecrunchte Files werden automatisch entcruncht **
+** 06-Jan-91 CHH BufLoadFile testet ob genug RAM vorhanden ist **
+** 11-Feb-91 CHH BufReadFile eingebaut **
+** 18-Feb-91 CHW Multitasking-fähige Version **
+** 06-May-91 CHW Diskroutine kann jetzt schreiben **
+** **
+**************************************************************************
+
+ IDNT Exec
+ SECTION text,CODE
+
+ INCLUDE "MyExec.i"
+ INCLUDE "exec/macros.i"
+ INCLUDE "zeropage.i"
+ INCLUDE "hardware/custom.i"
+ INCLUDE "hardware/dmabits.i"
+ INCLUDE "hardware/intbits.i"
+
+
+STACKSIZE: EQU 5432 ; Grösse des Super-Stacks
+
+ROMCRACKEXCEPT: EQU $fc2ff4+(2*6) ; ROMCrack Exception-Einspr.
+ROMCRACKSPEC: EQU $fc2ff4+(4*6) ; ROMCrack Special-Einsprung
+
+INITMAGIC: EQU 'INIT' ; steht vor InitExecFunc()
+FFSMAGIC: EQU $444f5301
+
+FN_MAINPRG: EQU $01030010 ; Disk 1, Track 3, 1. File
+
+**************************************************************************
+
+ XREF _custom,__H2_end
+
+ XREF InitChipMemFunc,InitFastMemFunc
+ XREF AllocMemFunc,AllocClearMemFunc
+ XREF AllocFastMemFunc,AllocFastClearMemFunc
+ XREF AvailMemFunc,AvailFastMemFunc,CheckMemFunc
+ XREF FreeMemFunc,ClearMemFunc,CopyMemQuickFunc,CopyMemFunc
+ XREF InitKeyFunc,GetKeyFunc,WaitKeyFunc,FlushKeyBufFunc
+ XREF SetMapFunc,SetResetHandlerFunc,SetCheatTextFunc
+ XREF RawDoFmtFunc,_RawPrintfFunc
+ XREF RandomizeFunc,RandomFunc
+
+ XREF InitDiskFunc,SetNoDiskHandlerFunc,ReadFileFunc
+ XREF WriteFileFunc,LoadFileFunc,LoadFastFileFunc
+ XREF LoadSegFunc,UnLoadSegFunc,SendPacketFunc
+ XREF InitRAMLib,BufReadFileFunc,BufLoadFileFunc
+ XREF DeleteFileNodeFunc,DeleteFileListFunc
+
+ XREF WaitBlit,InitDrawBob,AddBob,RemBob,RemAllBobs
+ XREF RestoreBobList,DrawBobList
+ XREF RestoreOneBob,DrawOneBob
+ XREF AnimateOneBob,MoveOneBob,TestPoint
+ XREF SetMovePrg,SetAnimPrg,SetGlobalClip
+ XREF HandleCollision,CollOneBob,FlashBob,GetBobData
+ IFD SYSTEM
+ XREF ExitKeyFunc
+ XREF InitCDFunc,ExitCDFunc,PlayCDTrackFunc,WaitCDTrackFunc
+ ENDC
+
+ XDEF __MyExecBase,_InitExec,_idstring
+
+ XDEF InitExecFunc,ColdRebootFunc,SetCacheFunc,DebugFunc
+ XDEF NewListFunc,EnqueueFunc,RemoveFunc
+ XDEF AddHeadFunc,AddTailFunc,RemHeadFunc
+ XDEF DisableFunc,EnableFunc
+
+**************************************************************************
+
+ *** Die Zero-Page mit den vielen Vektoren
+
+__MyExecBase:
+Null: DC.L 0 ; $00 := 0 für Sprites usw.
+ BRA.W JumpZero ; $04 Falls jemand nach 0 springt ...
+ DC.L Guru2Handler ; $08
+ DC.L Guru3Handler ; $0C
+ DC.L Guru4Handler ; $10
+ DC.L Guru5Handler ; $14
+ DC.L Guru6Handler ; $18
+ DC.L Guru7Handler ; $1C
+ DC.L Guru8Handler ; $20
+ DC.L Guru9Handler ; $24
+ DC.L GuruAHandler ; $28
+ DC.L GuruBHandler ; $2C
+ DC.L GuruCHandler ; $30
+ DC.L GuruDHandler ; $34
+ DC.L GuruEHandler ; $38
+ DC.L GuruFHandler ; $3C
+ DCB.L 9,0 ; $40-$60 ; Reserved exceptions
+ DC.L DebugFunc ; $64 ; Interrupt Level 1
+ DC.L CiaAServer ; $68 ; Interrupt Level 2
+ DC.L VBLServer ; $6C ; Interrupt Level 3
+ DC.L DebugFunc ; $70 ; Interrupt Level 4
+ DC.L DebugFunc ; $74 ; Interrupt Level 5
+ DC.L CiaBServer ; $78 ; Interrupt Level 6
+ DC.L ColdRebootFunc ; $7C ; Interrupt Level 7
+ DCB.L 16,0 ; $80-$BC ; Trap-Vectors 0-15
+ DC.B "CHW!" ; $C0 ; Kennung für Booter!
+ DCB.L 15,0 ; $C4-$FC ; Reserviert
+
+ *** Tada! Die ExecBase-Struktur
+
+ DC.L 0 ; Nicht debuggen!
+ DC.L 'ICH!' ; ROMCrackMagic für Mem
+ DC.L $1d0000 ; ROMCrackBSS
+ DC.L $1e0000 ; ROMCrackChipMem
+ DC.L ROMCrackText ; ROMCrack's Debug-Text
+
+ *** Private Einträge
+
+ DCB.B mh_SIZEOF,0 ; MemoryRegionHeader
+ DCB.B mh_SIZEOF,0 ; FastMemoryRegionHeader
+ DC.L 0 ; RAMDiskBase
+ DC.L 0 ; RAMDiskSize
+ DC.L FN_MAINPRG ; MainPrgName
+ DC.L $affebad,356789 ; LastRnd1,LastRnd2
+ DCB.B lh_SIZEOF,0 ; DiskList
+ DCB.B lh_SIZEOF,0 ; FileList (für RAMLib)
+ DC.W 0 ; Product-Code
+ DC.B -1 ; IDNestCnt
+ DC.B 0 ; ExecFlags
+
+ *** Erlaubte Einträge
+
+ DC.L 0 ; SuperStackUpper
+ DC.W 0 ; AttnFlags
+ DC.W 0 ; SystemBplcon0
+ DC.B 0 ; VBlankFrequency
+ DC.B 0 ; expad2
+
+ DC.B 0 ; ActualKey
+ DC.B 0 ; ActualQualifiers
+ DC.B 0 ; ActualASCIIKey
+ DC.B 0 ; CheatFlag
+
+ DCB.B lh_SIZEOF,0 ; BobList
+ DC.L 0 ; TripleScreen: Zeiger auf 3. BitMap
+ DC.W 0 ; SignalSet (für Bobroutine)
+
+ DC.L 0 ; UserData1
+ DC.L 0 ; UserData2
+
+ DCB.B 6,0 ; exreserved, pad auf LONG
+
+ DC.W 0 ; LONG-Align
+ DC.W $4EF9 ; VBL-Jmp
+ DC.L 0 ; VBL-Vektor
+
+ DC.W 0 ; LONG-Align
+ DC.W $4EF9 ; Copper-Jmp
+ DC.L 0 ; Copper-Vektor
+
+ DCB.L 2*5,0 ; Cia-Interruptvektoren
+
+ DC.L INITMAGIC ; Steht vor InitExecFunc()
+_InitExec:
+ BRA.W InitExecFunc ; MUSS 1. Funktion sein: FinalBooter.S
+ BRA.W ColdRebootFunc ; MUSS 2. Funktion sein: FinalBooter.S
+ BRA.W InitChipMemFunc
+ BRA.W InitFastMemFunc
+ BRA.W InitDiskFunc
+ BRA.W InitKeyFunc
+ BRA.W SetCacheFunc
+
+ BRA.W DebugFunc
+
+ BRA.W AllocMemFunc
+ BRA.W AllocClearMemFunc
+ BRA.W AllocFastMemFunc
+ BRA.W AllocFastClearMemFunc
+ BRA.W FreeMemFunc
+ BRA.W AvailMemFunc
+ BRA.W AvailFastMemFunc
+ BRA.W CheckMemFunc
+ BRA.W CopyMemFunc
+ BRA.W CopyMemQuickFunc
+ BRA.W ClearMemFunc
+
+ BRA.W DisableFunc
+ BRA.W EnableFunc
+ BRA.W OwnBlitterFunc
+ BRA.W DisownBlitterFunc
+
+ BRA.W NewListFunc
+ BRA.W EnqueueFunc
+ BRA.W RemoveFunc
+ BRA.W AddHeadFunc
+ BRA.W AddTailFunc
+ BRA.W RemHeadFunc
+
+ BRA.W GetKeyFunc
+ BRA.W WaitKeyFunc
+ BRA.W FlushKeyBufFunc
+ BRA.W SetMapFunc
+ BRA.W SetResetHandlerFunc
+ BRA.W SetCheatTextFunc
+
+ BRA.W RawDoFmtFunc
+ BRA.W _RawPrintfFunc
+ BRA.W PlayCDTrackFunc
+ BRA.W WaitCDTrackFunc
+
+ BRA.W RandomizeFunc
+ BRA.W RandomFunc
+
+ BRA.W SetNoDiskHandlerFunc
+ BRA.W ReadFileFunc
+ BRA.W WriteFileFunc
+ BRA.W LoadFileFunc
+ BRA.W LoadFastFileFunc
+ BRA.W LoadSegFunc
+ BRA.W UnLoadSegFunc
+ BRA.W BufReadFileFunc
+ BRA.W BufLoadFileFunc
+ BRA.W DeleteFileNodeFunc
+ BRA.W DeleteFileListFunc
+ BRA.W SendPacketFunc
+
+ BRA.W WaitBlit
+ BRA.W InitDrawBob
+ BRA.W AddBob
+ BRA.W RemBob
+ BRA.W RemAllBobs
+ BRA.W RestoreBobList
+ BRA.W DrawBobList
+ BRA.W RestoreOneBob
+ BRA.W DrawOneBob
+ BRA.W AnimateOneBob
+ BRA.W MoveOneBob
+ BRA.W TestPoint
+ BRA.W SetMovePrg
+ BRA.W SetAnimPrg
+ BRA.W SetGlobalClip
+ BRA.W HandleCollision
+ BRA.W CollOneBob
+ BRA.W FlashBob
+ BRA.W GetBobData
+
+
+ IFNE (*-Null)-__EXECBASESIZE
+ Fail "ExecBase structure size mismatch!"
+ ENDC
+
+
+ BRA.W UndefdFunc
+ BRA.W UndefdFunc
+ BRA.W UndefdFunc
+ BRA.W UndefdFunc
+
+
+ DCB.B 7,0
+VersTag: DC.B 0,"$VER: "
+
+_idstring:
+ROMCrackText: DC.B "GAME EXEC Operating System V4.4 (16-Apr-92)",0
+ DC.B "Copyright (c) 1989 - 1992 by Christian A. Weber,"
+ DC.B "Bruggerweg 2, CH-8037 Zuerich, Switzerland.",10,0
+ DC.B "All Rights Reserved.",10,0
+ DC.B "Greetings to Chris Haller, René Straub, Roman Werner",10,0
+ DCB.B 27,0
+
+ExceptText: DC.B "Exception "
+exno: DC.B "xx",0
+
+JumpZeroText: DC.B "Caught jump to 0",0
+UndefdText: DC.B "Undef'd routine",0
+ EVEN
+
+
+**************************************************************************
+** E X E C - I N I T I A L I S I E R U N G
+**************************************************************************
+
+ *** SYSTEM:
+ *** D0=AttnFlags, D1=SystemBplcon0, D2=VBlankFrequency,
+ *** D3=Product Code, A0=CHIPRAM-Base, A1=CHIPRAM-Ende,
+ *** A2=FASTRAM-Base, A3=FASTRAM-Ende D4=MainPrg-Name
+
+ *** SONST:
+ *** D0=AttnFlags, D1=SystemBplcon0, D2=VBlankFrequency,
+ *** D3=Product Code, A0=RAMDiskBase, A1=RAMDiskSize,
+ *** A2=FASTRAM-Base, A3=FASTRAM-Ende A7=CHIPRAM-Ende-8
+
+InitExecFunc:
+ IFND SYSTEM
+ move #$2700,sr
+ ENDC
+ lea _custom,a5
+ lea __MyExecBase(PC),a6
+
+ *** System-Status initialisieren (NUR 1x , NICHT BEI RESTART!)
+
+ tst.b meb_VBlankFrequency(a6) ; ExecBase schon installiert?
+ bne.s .NotFirst ; ja --->
+
+ move.w d0,meb_AttnFlags(a6)
+ move.w d1,meb_SystemBplcon0(a6)
+ move.b d2,meb_VBlankFrequency(a6)
+ move.w d3,meb_ProductCode(a6)
+ IFND DISKVERSION
+ move.l d4,meb_MainPrgName(a6)
+ ENDC
+
+ IFD SYSTEM
+ move.l (SP)+,ColdRebootJmp+2 ; Return-Adresse
+ move.l a0,meb_ChipMRHeader+mh_Lower(a6)
+ move.l a1,meb_ChipMRHeader+mh_Upper(a6)
+ ELSEIF
+ move.l a0,meb_RAMDiskBase(a6) ; Muss 0 sein falls kein RAM!
+ move.l a1,meb_RAMDiskSize(a6) ; Muss 0 sein falls kein RAM!
+
+ move.l #__H2_end,d0 ; Ende von Exec's BSS
+ addq.l #7,d0
+ andi.b #$f8,d0 ; Modulo-8 aufrunden
+ move.l d0,meb_ChipMRHeader+mh_Lower(a6)
+ move.l SP,meb_ChipMRHeader+mh_Upper(a6)
+ ENDC
+ move.l a2,meb_FastMRHeader+mh_Lower(a6)
+ move.l a3,meb_FastMRHeader+mh_Upper(a6)
+
+ *** StackPointer initialisieren (ins FAST-RAM falls vorhanden)
+
+ lea meb_FastMRHeader+mh_Upper(a6),a0
+ tst.l (a0)
+ bne.s 1$ ; FAST-RAM vorhanden --->
+ lea meb_ChipMRHeader+mh_Upper(a6),a0
+1$:
+ move.l (a0),d0 ; Alte Obergrenze
+ move.l d0,meb_SuperStackUpper(a6) ; nach StackPointer
+ sub.l #STACKSIZE,d0 ; Stack-Grösse wegzählen
+ move.l d0,(a0) ; Neue Obergrenze setzen
+
+ *** VBL und Copper-Interrupt-Server installieren falls SYSTEM
+
+ IFD SYSTEM
+ move.l a6,-(SP)
+ movea.l 4,a6
+
+ moveq #INTB_VERTB,d0
+ lea MyVertInt(PC),a1
+ JSRLIB AddIntServer
+
+ moveq #INTB_COPER,d0
+ lea MyCopInt(PC),a1
+ JSRLIB AddIntServer
+
+ movea.l (SP)+,a6
+
+ bsr InitCDFunc
+ ENDC
+
+.NotFirst:
+
+ *** Speicherverwaltung initialisieren
+
+ movea.l meb_SuperStackUpper(a6),SP ; StackPointer holen
+
+ movea.l meb_ChipMRHeader+mh_Lower(a6),a0
+ move.l meb_ChipMRHeader+mh_Upper(a6),d0
+ sub.l a0,d0 ; D0 := Länge
+ jsr meb_ClearMem(a6) ; ** DEBUG ** Cracker-Schutz: Speicher mit Muster füllen
+ jsr meb_InitChipMem(a6)
+
+ movea.l meb_FastMRHeader+mh_Lower(a6),a0
+ move.l meb_FastMRHeader+mh_Upper(a6),d0
+ sub.l a0,d0 ; D0 := Länge
+ beq.s 2$ ; Kein FAST-RAM --->
+ jsr meb_ClearMem(a6) ; ** DEBUG ** Cracker-Schutz: Speicher mit Muster füllen
+ jsr meb_InitFastMem(a6)
+2$:
+ *** Jenes Zeugs initialisieren
+
+ IFND SYSTEM
+ move.w #$7fff,intena(a5) ; Alle Interrupts off
+ move.w #$7fff,intreq(a5) ; Interrupt-Requests löschen
+ move #$2000,sr ; Interrupt Level 0
+ move.w #INTF_SETCLR|INTF_INTEN|INTF_VERTB|INTF_COPER,intena(a5)
+ move.w #$7fff,dmacon(a5) ; Alle DMAs off
+ move.w #DMAF_SETCLR|DMAF_MASTER,dmacon(a5)
+ ENDC
+ jsr meb_InitKey(a6) ; Tastatur on
+ jsr meb_InitDisk(a6) ; Diskroutine on
+ bsr InitRAMLib ; RAMLib initialisieren
+
+ *** 1. File einladen & starten
+
+ move.l meb_MainPrgName(a6),d0 ; 1. Modul
+ jsr meb_LoadSeg(a6) ; meinprg laden
+ movea.l d0,a0 ; Muss A0 sein, User weiss es!
+ jmp (a0) ; A6 muss MyExecBase sein!
+
+**************************************************************************
+
+ *** System resetten (wir sind im Supervisor)
+
+ColdRebootFunc:
+ IFD SYSTEM
+ bsr ExitCDFunc
+ bsr ExitKeyFunc
+
+ move.l a6,-(SP)
+ movea.l 4,a6
+
+ moveq #INTB_VERTB,d0
+ lea MyVertInt(PC),a1
+ JSRLIB RemIntServer
+
+ moveq #INTB_COPER,d0
+ lea MyCopInt(PC),a1
+ JSRLIB RemIntServer
+
+ movea.l (SP)+,a6
+
+ColdRebootJmp: jmp (1$).L ; Zum Patchen
+1$:
+ ENDC
+
+ IFD DISKVERSION
+ btst #AFB_68020,meb_AttnFlags+1(a6) ; MMU ?
+ beq.s 2$ ; nein --->
+ clr.l -(SP) ; Code für MMU off
+ move.l SP,a0
+ dc.w $f010,$4000 ; pmove (a0),tc
+2$: nop
+ nop
+ lea 2,a0
+ RESET
+ jmp (a0)
+ ENDC
+
+ IFD RAMVERSION
+ jmp $1FFFFA ; ABORT
+ ENDC
+
+
+**************************************************************************
+* Level 3 Interrupt Server
+
+ IFD SYSTEM
+
+VBLServer: EQU 0
+
+MyVertInt: dc.l 0,0
+ dc.b 0,60
+ dc.l _idstring
+ dc.l __MyExecBase
+ dc.l 1$
+
+ * D1/A0-A1/A5-A6 = Scratch
+
+1$: lea _custom,a5
+ movea.l a1,a6 ; _MyExecBase
+ tst.l meb_VBLIntVector(a6)
+ beq.s 2$
+ jsr meb_VBLIntJump(a6)
+2$: movea.l a5,a0 ; Custom für Gfx-IntServer
+ moveq.l #0,d0 ; Set Z bit
+ rts
+
+MyCopInt: dc.l 0,0
+ dc.b 0,60
+ dc.l _idstring
+ dc.l __MyExecBase
+ dc.l 1$
+
+1$: lea _custom,a5
+ movea.l a1,a6 ; _MyExecBase
+ tst.l meb_CopperIntVector(a6)
+ beq.s 2$
+ jsr meb_CopperIntJump(a6)
+2$: moveq.l #0,d0 ; Set Z bit
+ rts
+
+ ELSEIF
+
+VBLServer: movem.l a5/a6,-(SP)
+ lea _custom,a5 ; User weiss das!
+ lea __MyExecBase(PC),a6 ; User weiss das!
+ btst.b #INTB_VERTB,intreqr+1(a5)
+ beq.s 2$
+ tst.l meb_VBLIntVector(a6)
+ beq.s 1$
+ jsr meb_VBLIntJump(a6)
+1$: move.w #INTF_VERTB,intreq(a5)
+2$:
+ btst.b #INTB_COPER,intreqr+1(a5)
+ beq.s 4$
+ tst.l meb_CopperIntVector(a6)
+ beq.s 3$
+ jsr meb_CopperIntJump(a6)
+3$: move.w #INTF_COPER,intreq(a5)
+4$:
+ movem.l (SP)+,a5/a6
+ rte
+ ENDC
+
+**************************************************************************
+* CIA Interrupt Server
+
+ IFD SYSTEM
+
+CiaAServer: EQU 0
+CiaBServer: EQU 0
+
+ ELSEIF
+
+CiaAServer: movem.l d0/d2/a0/a2/a5/a6,-(SP) ; ACHTUNG: unten gleich!
+ lea _custom,a5 ; User weiss das!
+ lea __MyExecBase(PC),a6 ; User weiss das!
+ move.w #$0008,intreq(a5) ; Interruptrequest löschen
+ move.b $bfed01,d2 ; ICAA ICR auslesen
+ lea meb_CiaATimerAVector(a6),a2 ; Vektor-Basis
+ bra.s CiaCommon
+
+CiaBServer: movem.l d0/d2/a0/a2/a5/a6,-(SP) ; ACHTUNG: oben gleich!
+ lea _custom,a5 ; User weiss das!
+ lea __MyExecBase(PC),a6 ; User weiss das!
+ move.w #$2000,intreq(a5) ; Interruptrequest löschen
+ move.b $bfdd00,d2 ; ICAB ICR auslesen
+ lea meb_CiaBTimerAVector(a6),a2 ; Vektor-Basis
+ ;; bra.s CiaCommon
+
+CiaCommon: lsr.b #1,d2 ; Timer A Interrupt ?
+ bcc.s 1$ ; Nein --->
+ move.l (a2),d0 ; Vektor gültig ?
+ beq.s 1$ ; nein --->
+ movea.l d0,a0
+ jsr (a0)
+1$:
+ lsr.b #1,d2 ; Timer B Interrupt ?
+ bcc.s 2$ ; Nein --->
+ move.l 4(a2),d0 ; Vektor gültig ?
+ beq.s 2$ ; nein --->
+ movea.l d0,a0
+ jsr (a0)
+2$:
+ lsr.b #1,d2 ; Alarm Interrupt ?
+ bcc.s 3$ ; Nein --->
+ move.l 8(a2),d0 ; Vektor gültig ?
+ beq.s 3$ ; nein --->
+ movea.l d0,a0
+ jsr (a0)
+3$:
+ lsr.b #1,d2 ; Serial Interrupt ?
+ bcc.s 4$ ; Nein --->
+ move.l 12(a2),d0 ; Vektor gültig ?
+ beq.s 4$ ; nein --->
+ movea.l d0,a0
+ jsr (a0)
+4$:
+ lsr.b #1,d2 ; Flag Interrupt ?
+ bcc.s 5$ ; Nein --->
+ move.l 16(a2),d0 ; Vektor gültig ?
+ beq.s 5$ ; nein --->
+ movea.l d0,a0
+ jsr (a0)
+5$:
+ movem.l (SP)+,d0/d2/a0/a2/a5/a6
+ rte
+
+ ENDC
+
+**************************************************************************
+** E X C E P T I O N - H A N D L E R
+**************************************************************************
+
+ *** Die Einsprünge von den ZeroPage-Vektoren:
+
+GuruHandler: bsr.s CalcGuru
+;;Guru1Handler: bsr.s CalcGuru
+Guru2Handler: bsr.s CalcGuru
+Guru3Handler: bsr.s CalcGuru
+Guru4Handler: bsr.s CalcGuru
+Guru5Handler: bsr.s CalcGuru
+Guru6Handler: bsr.s CalcGuru
+Guru7Handler: bsr.s CalcGuru
+Guru8Handler: bsr.s CalcGuru
+Guru9Handler: bsr.s CalcGuru
+GuruAHandler: bsr.s CalcGuru
+GuruBHandler: bsr.s CalcGuru
+GuruCHandler: bsr.s CalcGuru
+GuruDHandler: bsr.s CalcGuru
+GuruEHandler: bsr.s CalcGuru
+GuruFHandler: bsr.s CalcGuru
+ nop ; Damit letzter Offset != 0
+
+CalcGuru: subi.l #GuruHandler,(SP) ; Vektornummer erzeugen
+ lsr.w 2(SP)
+ cmpi.w #$4ef9,ROMCRACKSPEC ; Ist's unsere Kickstart?
+ bne.s 1$ ; Nein --->
+ jmp ROMCRACKEXCEPT
+1$: move.l #ExceptText,meb_ROMCrackDebugText+__MyExecBase
+ move.w 2(SP),d0
+ lsr.w #4,d0
+ add.b #'0',d0
+ move.b d0,exno
+ move.w 2(SP),d0
+ and.w #15,d0
+ add.b #'0',d0
+ move.b d0,exno+1
+ bra ColdRebootFunc
+
+
+**************************************************************************
+* Handler für JMP 0
+
+JumpZero: move.l #JumpZeroText,meb_ROMCrackDebugText+__MyExecBase
+ bra.s DebugFunc
+
+ *** ROMCrack aufrufen
+
+UndefdFunc: move.l #UndefdText,$110
+
+DebugFunc: cmpi.w #$4ef9,ROMCRACKSPEC ; Ist's unsere Kickstart?
+ bne.s 1$ ; Nein --->
+ jmp ROMCRACKSPEC
+1$: bra ColdRebootFunc
+
+
+**************************************************************************
+** E X E C - R O U T I N E N
+**************************************************************************
+
+**************************************************************************
+* Cache D0 setzen
+
+SetCacheFunc:
+ IFD SYSTEM
+ XREF @SetCACR
+ bra @SetCACR
+ ELSEIF
+ btst.b #AFB_68020,meb_AttnFlags+1(a6) ; Cache vorhanden ?
+ beq.s 1$ ; nein --->
+ dc.w $4E7B,$0002 ; movec d0,cacr
+1$: rts
+ ENDC
+
+**************************************************************************
+* Blitter reservieren
+
+OwnBlitterFunc:
+ IFD SYSTEM
+ XREF _GfxBase
+ move.l a6,-(SP)
+ movea.l _GfxBase,a6
+ JSRLIB OwnBlitter
+ JSRLIB WaitBlit
+ movea.l (SP)+,a6
+ ELSEIF
+PlayCDTrackFunc:
+WaitCDTrackFunc:
+ ENDC
+ rts
+
+**************************************************************************
+* Blitter freigeben
+
+DisownBlitterFunc:
+ IFD SYSTEM
+ move.l a6,-(SP)
+ movea.l _GfxBase,a6
+ JSRLIB WaitBlit
+ JSRLIB DisownBlitter
+ movea.l (SP)+,a6
+ ENDC
+ rts
+
+**************************************************************************
+* Neue Liste initialisieren, A0: Liste
+
+NewListFunc: move.l a0,lh_Head(a0)
+ addq.l #lh_Tail,(a0) ; Head zeigt auf Tail
+ clr.l lh_Tail(a0) ; Tail ist immer 0
+ move.l a0,lh_TailPred(a0) ; TailPred zeigt auf Head
+ rts
+
+**************************************************************************
+* Node in Liste einfügen (nach Priorität), A0: Liste, A1: Node
+
+EnqueueFunc: movem.l d0-d1/a0,-(SP)
+ bsr.s DisableFunc
+ move.b ln_Pri(a1),d1
+ move.l lh_Head(a0),d0
+1$: movea.l d0,a0
+ move.l ln_Succ(a0),d0
+ beq.s 2$ ; Ende der Liste --->
+ cmp.b ln_Pri(a0),d1 ; Priorität kleiner oder gleich ?
+ ble.s 1$ ; ja ---> weitersuchen
+2$: move.l ln_Pred(a0),d0
+ move.l a1,ln_Pred(a0)
+ move.l a0,ln_Succ(a1)
+ move.l d0,ln_Pred(a1)
+ movea.l d0,a0
+ move.l a1,ln_Succ(a0)
+ bsr.s EnableFunc
+ movem.l (SP)+,d0-d1/a0
+ rts
+
+**************************************************************************
+* Node aus Liste entfernen, A1: Node
+
+RemoveFunc: movem.l a0/a1,-(SP)
+ bsr.s DisableFunc
+ movea.l ln_Succ(a1),a0
+ movea.l ln_Pred(a1),a1
+ move.l a0,ln_Succ(a1)
+ move.l a1,ln_Pred(a0)
+ bsr.s EnableFunc
+ movem.l (SP)+,a0/a1
+ rts
+
+**************************************************************************
+* Node an den Anfang der Liste anhängen, A0: Liste, A1: Node
+
+AddHeadFunc: movem.l d0/a0/a1,-(SP)
+ bsr.s DisableFunc
+ move.l lh_Head(a0),d0
+ move.l a1,lh_Head(a0)
+ movem.l d0/a0,ln_Succ(a1)
+ movea.l d0,a0
+ move.l a1,ln_Pred(a0)
+ bsr.s EnableFunc
+ movem.l (SP)+,d0/a0/a1
+ rts
+
+**************************************************************************
+* Interrupts sperren mit IDNestCnt und so
+
+DisableFunc:
+ IFD SYSTEM
+ move.l a6,-(SP)
+ movea.l 4,a6
+ JSRLIB Disable
+ movea.l (SP)+,a6
+ ELSEIF
+ move.w #$4000,$dff09a ; Master interrupt off
+ addq.b #1,meb_IDNestCnt(a6) ; INC counter
+ ENDC
+ rts
+
+**************************************************************************
+* Interrupts zulassen mit IDNestCnt und so
+
+EnableFunc:
+ IFD SYSTEM
+ move.l a6,-(SP)
+ movea.l 4,a6
+ JSRLIB Enable
+ movea.l (SP)+,a6
+ ELSEIF
+ subq.b #1,meb_IDNestCnt(a6)
+ bge.s 1$
+ move.w #$c000,$dff09a
+1$:
+ ENDC
+ rts
+
+**************************************************************************
+* Node ans Ende der Liste anhängen, A0: Liste, A1: Node
+
+AddTailFunc: movem.l d0/a0/a1,-(SP)
+ bsr.s DisableFunc
+ lea lh_Tail(a0),a0
+ move.l ln_Pred(a0),d0
+ move.l a1,ln_Pred(a0)
+ move.l a0,ln_Succ(a1)
+ move.l d0,ln_Pred(a1)
+ move.l d0,a0
+ move.l a1,ln_Succ(a0)
+ bsr.s EnableFunc
+ movem.l (SP)+,d0/a0/a1
+ rts
+
+**************************************************************************
+* Ersten Node aus Liste entfernen, A0: Liste gibt D0: Node, CCR
+
+RemHeadFunc: movem.l a0/a1,-(SP)
+ bsr.s DisableFunc
+ move.l lh_Head(a0),a1
+ move.l ln_Succ(a1),d0
+ beq.s 1$
+ move.l d0,lh_Head(a0)
+ exg d0,a1
+ move.l a0,ln_Pred(a1)
+1$: bsr.s EnableFunc
+ movem.l (SP)+,a0/a1
+ tst.l d0
+ rts
+
+**************************************************************************
+
+ END