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
Aus: ST-Computer 09 / 1992, Seite 138

Links

Copyright-Bestimmungen: siehe Über diese Seite