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