Kugelsicher: Resetfeste Programme auf dem ST - Der Nachtrag

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
Links

Copyright-Bestimmungen: siehe Über diese Seite