← ST-Computer 09 / 1992

Kugelsicher: Resetfeste Programme auf dem ST - Der Nachtrag

Grundlagen

Tja, durch die Aussicht auf den baldigen Urlaub hat es uns in der letzten Ausgabe ein wenig an Konzentration gemangelt. Die Listings zu unserem Artikel "Kugelsicher - resetfeste Programme" waren falsch bzw. nicht vorhanden. Aus diesem Grund streuen wir uns hiermit Asche aufs Haupt, ziehen den Sackleinen an und reichen die Listings selbstverständlich nach. Nostra culpa, nostra maxima culpa!

; ############################################### ; ## *** KUCKUCK! *** ## ; ## RESETFESTES DEMONSTRATIONSPROGRAMM ## ; ## by ROLAND NITZ (c) 1992 MAXON Computer ## ; ############################################### .TEXT START: bra MAIN ; » WEGEN RESIDENT-BLEIBEN... « ; ** WIRD PER RESETVEKTOR ANGESPRUNGEN...***+ ; KOPIERT "RESET-ROUTINE" AN EINGETRAGENE ADRESSE ; (SIEHE OBEN), SETZT PHYSTOP HERAB UND KLINKT ; SICH DANN AUS EINER EVT. XBRA-KETTE WIEDER AUS. .DC.b "XBRA" ; XBRA-PROTOKOLL .DC.b "KUCK" ; PROGRAMMKENNUNG OLDRV: .DC.l 0 ; ; ALTE ADRESSE RESVEC: movem.l d0-d2/a0-a2/a7,SAVREGS lea.l MAIN+1052, sp ; STACK INIT. movea.l $42e,a2 ; PHYSTOP HOLEN suba.w #((ERT-SRT+$1ff)&$200),a2 ; ; VERSCHIEBUNG lea.l SRT,a0 ; STARTADRESSE movea.l a2,a1 ; COPY-ADRESSE move.l a1,$42e ; NEUES PHYSTOP move.w #(ERT-SRT)/4,d0 .COPY: move.l (a0)+,(a1)+ ; KOPIERE DATEN dbra d0,.COPY ; NÄCHSTEN... ; » ADRESSE IM HANDLER EINTRÄGEN lea.l $680,a0 ; SPRUNGLISTE moveq.l #32-1,d0 ; MAX. 32 POS. .TSTPOS: tst.l (a0)+ ; IST 0? beq .OKPOS ; JA: OK! dbra d0,.TSTPOS ; WEITERSUCHEN tst.w d0 ; D0 NEGATIV? bmi .FAILIT ; JA: AUS. .OKPOS: move.l a2,-4(a0) ; ROUT. EINHÄNGEN bsr CHCKSM ; PRÜFSUMME KORR. .FAILIT: lea.l $42a,a1 ; BASISADRESSE .TST: cmpi.l #RESVEC,(a1) ; BIN DAS ICH? beq .CPY ; JA: KOPIERE... movea.l (a1),a2 ; ADR. HOLEN cmpi.l #"XBRA”,-12(a2) ; XBRA? bne .REMOVE ; NEIN: DANN CLR!! lea.l -4(a2),a1 ; FÜR NÄCHSTEN LAUF tst.l (a1) ; ADRESSE 0? bne -TST ; NEIN: WEITER bra .EXIT ; JA: RAUS (??!) .CPY: move.l OLDRV,(a1) ; SONST SETZEN tst.l $42a ; RES_VECTOR=0? bne .EXIT ; NEIN: WEITER .REMOVE: clr.l $426 ; RESVALID=INVALID .EXIT: tst.l OLDRV ; NOCH EINE ROUTINE? beq .CONT ; NEIN: WEITER movem.l SAVREGS,d0-d2/a0-a2 move.l OLDRV,-(sp) ; ALTE ROUTINE rts ; UND ZURÜCK .CONT: cmpi.w #$9bcd,(a6) ; FEHLERHAFTES TOS? bne .GOON ; NEIN: NORMAL WEITER lea.l $24(a6),a6 ; SONST $24 ADDIEREN .GOON: movem.l SAVREGS,d0-d2/a0-a2/a7 ; ; REGISTER RETTEN jmp (a6) ; UND WEITERMACHEN ;*** HANDLER *** SHANDLER: .DC.l $12123456 ; MAGIC NUMBER .DC.l $600 ; ZEIGER movem.l d0-d7/a0-a6,-(sp) movea.w #$680,a0 ; STARTADRESSE move.w #16-1,d0 ; MAXIMAL 16 ROUTINEN .EXEC: tst.l (a0)+ ; IST ADRESSE=0? beq .CONT ; JA: WEITER movea.l -4(a0),a1 ; SONST ADRESSE HOLEN movem.l d0/a0,-(sp) ; SAVE REGISTER jsr (a1) ; UND AUSFÜHREN movem.l (sp)+,d0/a0 ; RESTORE REG. .CONT: dbra d0,.EXEC ; NÄCHSTE ADR movem.l (sp)+,d0-d7/a0-a6 rts ; ZURÜCK EHANDLER: ; *** EIGENTLICHE ROUTINE, UM DIE ES GEHT... *** SRT: bra.s .JMP ; ÜBERSPRINGEN .DC.l "KUCK" ; KENNUNG... .JMP: pea RESTXT(pc) ; TEXT move.w #9,-(sp) ; F#9 : CCONWS trap #1 ; GEMDOS addq.l #6,sp ; STACKKORREKTUR W_KEY: move.w #7,-(sp) ; FUNKTION #7 trap #1 ; GEMDOS: CRAWCIN addq.l #2,sp ; STACKKORREKTUR rts ; ZURÜCK RESTXT: .DC.b 27,"p KUCKUCK! " .DC.b 27,"q [TASTE]",13,10,0 .EVEN ERT: ; ENDE DER ROUTINE ; *** ROUTINE KORRIGIERT PRÜFSUMME *** CHCKSM: moveq.l #0,d0 ; D0 LÖSCHEN movea.w #$600,a0 ; SEITE LADEN move.w #256-2,d1 ; 255 WÖRTER TESTEN .ADD: add.w (a0)+,d0 ; UND ADDIEREN dbra d1,.ADD ; NÄCHSTES WORT move.w #$5678,d2 ; PRÜFSUMME sub.w d0,d2 ; AKT. PRÜFSUMME - move.w d2,(a0)+ ; NEUE EINTRÄGEN rts ; UND TSCHÜSS.. !*** DIESER TEIL BLEIBT NICHT RESIDENT! *** SAVREGS: MAIN: clr.l -(sp) ; MODUS: SV move.w #32,-(sp) ; F# 32 trap #1 ; GEMDOS: SUPER addq.l #6,sp ; STACKKORREKTUR move.l d0, OLDSP ; ALTEN SSP MERKEN lea.l $600,a0 ; BASISADRESSE cmpi.l #$12123456,(a0) ; SCHON INST.? bne .INST ; NEIN: INSTALLIEREN cmpa.l 4(a0),a0 ; STIMMT DAS AUCH? bne .INST ; NEIN: INSTALLIEREN moveq.l #0,d1 ; LÖSCHEN (PRÜFSUMME) move.w #$100-1,do ; 256 WÖRTER ADDIEREN .TSTCHS: add.w (a0)+,d1 ; ADDIEREN dbra d0,.TSTCHS ; NÄCHSTE cmpi.w #$5678,d1 ; PRÜFSUMME KORREKT? beq .JUMP ; JA: WEITER .INST: bsr H_INST ; < EIGENER HANDLER > bsr CHCKSM ; CHECKSUM-KORR. bra .NOTFND ; KANN NOCH NICHT ; ; INSTALLIERT SEIN .JUMP: ; TESTET, OB PPG SCHON RESIDENT lea.l $680,a0 ; BASISADRESSE moveq.l #32-1,d0 ; 32 SLOTS TESTEN .TST: tst.l (a0)+ ; WERT=0? beq .CONT1 ; ÜBERGEHEN movea.l -4(a0),a1 ; SONST ADR HOLEN cmpi.l #"KUCK",2(a1) ; STIMMT KENNUNG? beq .FOUND ; JA: GEFUNDEN .CONT1: dbra d0,.TST ; SONST: WEITERSUCHEN cmpi.l #$31415926,$426 ; RESVALID? bne .NOTFND ; NICHT GEFUNDEN! movea.l $42a,a0 ; SONST ADR HOLEN .TST2: cmpi.l #"XBRA",-12(a0) ; XBRA? bne .NOTFND ; NEIN: >RAUS cmpi.l #"KUCK",-8(a0) ; KENNUNG ? beq .FOUND ; STIMMT: GEFUNDEN tst.l -4(a0) ; IST ADR =0? beq .NOTFND ; => LETZTE ROUTINE movea.l -4(a0),a0 ; SONST ADR HOLEN bra .TST2 ; UND WEITERSUCHEN .NOTFND: cmpi.l #$31415926,$426 ; RESVALID? bne .NORM ; NEIN: NORMAL WEITER move.l $42a,OLDRV ; SONST: ADR. MERKEN .NORM: move.l #RESVEC,$42a ; NEUE ROUT. INST, move.l #$31415926,$426 ; RESVALID! .K_RES: pea R_OK ; TXT:"PRG INST." move.w #9,-(sp) ; F#=9 trap #1 ; GEMDOS: CCONWS addq.l #6,sp ; STACKKORREKTUR bsr W_KEY ; WARTE AUF TASTE bsr SUPOFF ; SV-MODUS AUS clr.w -(sp) ; STATUS: 0=OK move.l #MAIN-START+1308,-(sp) ; SOVIELE BYTES RESIDENT HALTEN... move.w #49,-(sp) ; F# 49 trap #1 ; GEMDOS .FOUND: pea R_NI ; TXT:"SCHON INST." move.w #9,-(sp) ; F#=9 trap #1 ; GEMDOS: CCONWS addq.l #6,sp ; STACKKORREKTUR bsr W_KEY ; WARTE AUF TASTE bsr SUPOFF ; SV-MODUS AUS clr.w -(sp) ; F#0 trap #1 ; GEMDOS: PTERM ; *** SUPERVISOR-MODUS AUS *** SUPOFF: movea.l (sp)+,a3 ; RÜCKSPRUNGADR. move.l OLDSP,-(sp) ; ALTER STACK, move.w #32,-(sp) ; F# 32 trap #1 ; GEMDOS: SUPER addq.l #6,sp ; STACKKORREKTUR jmp (a3) ; UND ZURÜCK... ; *** INSTALLIERT HANDLER *** H_INST: move.w #(EHANDLER-SHANDLER)/4,d0 ; ; LÄNGE IN LONGS movea.w #$600,a1 ; KOPIERZIEL lea.l SHAMDLER,a0 ; STARTADR. QUELLE .COPY1: move.l (a0)+,(a1)+ ; KOPIERE... dbra d0,.COPY1 ; SOVIELE LANGWORTE .CLR: cmpa.l #$800,a1 ; SCHON BEI $800? beq .EXIT ; JA: EXIT clr.l (a1)+ ; SONST LÖSCHEN bra .CLR ; UND NOCH EINMAL .EXIT: rts ; CIAO... .DATA R_OK: .DC.b "E KUCKUCK! ist jetzt" .DC.b " resident.",13,10,0 R_NI: .DC.b "E KUCKUCK! war bereits" .DC.b " installiert.",13,10,0 .EVEN .BSS OLDSP: .DS.L 1 ; ############################################### ; ## *** R_KUCK! *** ## ; ## ENTFERNT KUCKUCK AUS DEM SPEICHER ## ; ## by ROLAND NITZ (c) 1992 MAXON Computer ## ; ############################################### .ABS KUCKLEN equ $200 .TEXT START: clr.l -(sp) ; MODUS: SV move.w #32,-(sp) ; F# 32 trap #1 ; GEMDOS: SUPER addq.l #6,sp ; STACKKORREKTÜR move.l d0,OLDSP ; ALTEN SSP MERKEN lea.l $600,a0 ; BASISADRESSE cmpi.l #$12123456,(a0) ; SCHON INST.? bne .N_INST ; NEIN: INSTALLIEREN cmpa.l 4(a0),a0 ; STIMMT DAS AUCH? bne .N_INST ; NEIN: INSTALLIEREN moveq.l #0,d1 ; LÖSCHEN (PRÜFSUMME) move.w #$100-1,d0 ; 256 WÖRTER ADDIEREN .TSTCHS: add.w (a0)+,d1 ; ADDIEREN dbra d0,.TSTCHS ; NÄCHSTE cmpi.w #$5678,d1 ; PRÜFSUMME KORREKT? bne .N_INST ; JA: WEITER lea.l $680,a0 ; BASISADRESSE moveq.l #32-1,d0 ; 32 SLOTS TESTEN .TST: tst.l (a0)+ ; WERT=0? beq .CONT1 ; ÜBERGEHEN movea.l -4(a0),a1 ; SONST ADR HOLEN cmpi.l #"KUCK",2(a1) ; STIMMT KENNUNG? beq .FOUND ; JA: GEFUNDEN .CONT1: dbra d0,.TST ; SONST: WEITERSUCHEN cmpi.l #$31415926,$426 ; RESVALID? bne .N_INST ; NICHT GEFUNDEN! lea.l $42a,a1 ; SONST BASIS HOLEN .TST2: movea.l (a1),a0 ; ADR HOLEN cmpi.l #"XBRA",-12(a0) ; XBRA? bne .N_INST ; NEIN: >RAUS cmpi.l #"KUCK",-8(a0) ; KENNUNG ? beq .RVFOUND ; STIMMT: GEFUNDEN tst.l -4(a0) ; IST ADR =0? beq .N_INST ; => LETZTE ROUTINE lea.l -4(a0),a1 ; SONST ADR HOLEN bra .TST2 ; UND WEITERSUCHEN .N_INST: pea NTEXT ; TXT: "WAR N. INST." bra .PRGEX ; ->RAUS .RVFOUND: move.l -4(a0),(a1) ; IM RESVEC GEFUNDEN tst.l $42a ; RES_VEC=0? bne .REM ; NEIN: WEITER clr.l $426 ; SONST RESVALID DEL. bra .REM ; LÖSCHEN UND WEITER .FOUND: lea.l -4(a0),a1 ; ZEIGER AUF ADRESSE lea.l $680,a0 ; BASIS HOLEN movea.l (a1),a2 ; ADRESSE HOLEN movea.l $42e,a3 ; PHYSTOP HOLEN movea.w #-1,a4 ; ADR. moveq.l #32-1,d0 ; 32 SLOTS TESTEN .GMIN: tst.l (a0)+ ; IST 0? beq .CONT ; JA: WEITERSUCHEN cmpa.l -4(a0),a4 ; KLEINER ALS ADR? bls .JMP ; JA: WEITER movea.l -4(a0),a4 ; SONST HOLEN .JMP: cmpa.l -4(a0),a2 ; KLEINER ALS bls .CONT ; A2? JA: WEITER addi.l #KUCKLEN,-4(a0) ; ADR. KORR. .CONT: dbra d0,.GMIN ; WEITERSUCHEN clr.l (a1) ; EINTRAG LÖSCHEN cmpa.l a4, a3 ; KLEINSTE ADR bne .REMERR ; MUß=PHYSTOP SEIN move.l a2,d0 ; ADRESSDIFFERENZ sub.l a4,d0 ; ERRECHNEN, beq .CNT2 ; IST =0? ->RAUS subq.l #1,d0 ; WG. DBRA .SHIFT: move.b -(a2),KUCKLEN(a2) ; SCHIEBE... dbra d0,.SHIFT ; UND WEITER... .CNT2: moveq.l #0,d0 ; DO LÖSCHEN movea.w #$600,a0 ; SEITE LADEN move.w #256-2,d1 ; 255 WÖRTER TESTEN .ADD: add.W (a0)+,d0 ; UND ADDIEREN dbra d1,.ADD ; NÄCHSTES WORT move.w #$5678,d2 ; PRÜFSUMME sub.w d0,d2 ; AKT. PRÜFSUMME - move.w d2,(a0)+ ; NEUE EINTRAGEN addi.l #KUCKLEN,$42e ; PHYSTOP KORR. bra .REM ; EXIT ERFOLGSMELDUNG .REMERR: pea FEHLER ; "FEHLER!!" bra .PRGEX ; ->RAUS .REM: pea REMOVED ; TXT:"PRG. ENTFERNT" .PRGEX: move.w #9,-(sp) ; F#:9 CCONWS trap #1 ; GEMDOS-CALL addq.l #6,sp ; STACKKORREKTUR move.w #7,-(sp) ; #7: CRAWCIN trap #1 ; (GEMDOS) addq.l #2,sp ; STACKKORREKTUR bsr SUPOFF ; SV-MODUS AUS clr.w -(sp) ; F#0: PTERM trap #1 ; (GEMDOS) ; *** SUPERVISOR-MODUS AUS *** SUPOFF: movea.l (sp)+,a3 ; RÜCKSPRUNGADR. move.l OLDSP,-(sp) ; ALTER STACK move.w #32,-(sp) ; F# 32 trap #1 ; GEMDOS: SUPER addq.l #6,sp ; STACKKORREKTUR jmp (a3) ; UND ZURÜCK... .DATA NTEXT: .DC.b "E KUCKUCK! konnte nicht" .DC.b " gefunden werden.",13,10,0 FEHLER: .DC.b "E KUCKUCK! nur desaktiviert." .DC.b " FEHLER: Speicher ungenutzt!! ",0 REMOVED: .DC.b "E KUCKUCK! wurde aus" .DC.b " dem Speicher entfernt.",13,10,0 .EVEN .BSS OLDSP: .DS.l 1
Roland Nitz