*** Screen saven 1/1987 (bleibt staendig aktiv!) ***

call  macro
   jsr   _LVO\1(a6)
   endm

xlib  macro
   xref  _LVO\1
   endm

   xref  _AbsExecBase
   xref  _custom
   xref  _ciaa
   xlib  OpenLibrary
   xlib  Wait
   xlib  AllocSignal
   xlib  SetSignal
   xlib  Signal
   xlib  AddIntServer
   xlib  FindTask
   xlib  Forbid
   xlib  Permit
   xref  SaveVPort
   xdef  DosBase

LIB_SIZE       equ   $22
NT_INTERRUPT   equ   $2
INTB_VERTB     equ   $5
vp_Modes       equ   $20
potinp         equ   $16

Start:
   lea      Buffer,a1
   moveq    #51,d1
BufLoop:
   move.b   (a0)+,d0
   move.b   d0,(a1)+
   cmp.b    #' ',d0
   dblt     d1,BufLoop
   subq.l   #1,a1
   move.b   #'0',(a1)+
   move.l   a1,Count
   move.b   #'0',(a1)+
   move.b   #'.',(a1)+
   move.b   #'p',(a1)+
   move.b   #'i',(a1)+
   move.b   #'c',(a1)+
   clr.b    (a1)

   move.l   _AbsExecBase,a6
   lea      DosName,a1
   clr.l    d0
   call     OpenLibrary
   move.l   d0,DosBase
   beq.s    Error
   lea      GfxName,a1
   clr.l    d0
   call     OpenLibrary
   move.l   d0,GfxBase
   beq.s    Error
   moveq    #-1,d0
   call     AllocSignal
   tst.l    d0
   bpl.s    OkSig
Error:
   moveq    #20,d0
   rts
OkSig:
   moveq    #1,d1
   lsl.l    d0,d1
   move.l   d1,Signal

   sub.l    a1,a1
   call     FindTask
   move.l   d0,ThisTask

   moveq    #INTB_VERTB,d0
   lea      IntNode,a1
   call     AddIntServer

   call     Forbid      ;wir sind verboten!

WaitSig:
   move.l   _AbsExecBase,a6
   clr.l    d0          ;Damit wir nicht zweimal saven
   move.l   Signal,d1
   call     SetSignal

   move.l   Signal,d0
   call     Wait
   move.l   GfxBase,a0
   move.l   LIB_SIZE(a0),a0
   move.l   (a0),a0
   move.l   a0,d0
   beq.s    WaitSig
ViewPortLoop:
   move.l   (a0),d0
   beq.s    SaveIt
   move.w   vp_Modes(a0),d0
   bpl.s    SaveIt
   move.l   d0,a0
   bra.s    ViewPortLoop
SaveIt:
   move.l   Count,a2
   addq.b   #1,(a2)
   cmp.b    #'9',(a2)
   ble.s    OkSave
   move.b   #'0',(a2)
   addq.b   #1,-1(a2)
OkSave:
   lea      Buffer,a1
   jsr      SaveVPort
   bra      WaitSig

IntCode:
   btst.b   #6,_ciaa
   bne.s    NoSave
   move.w   _custom+potinp,d0
   btst     #10,d0
   bne.s    NoSave
   movem.l  d2-d7/a2-a4,-(sp)
   move.l   ThisTask,a1
   move.l   Signal,d0
   move.l   _AbsExecBase,a6
   call     Signal
   movem.l  (sp)+,d2-d7/a2-a4
NoSave:
   moveq    #0,d0
   rts
   
   section  data,DATA

DosName: dc.b  'dos.library',0
GfxName: dc.b  'graphics.library',0
IntName: dc.b  'SaveInt',0

   cnop  0,4
IntNode:
   dc.l  0,0
   dc.b  NT_INTERRUPT,-60
   dc.l  IntName,0,IntCode

   section  Space,BSS

Signal:     ds.l  1
ThisTask:   ds.l  1
DosBase:    ds.l  1
GfxBase:    ds.l  1
Count:      ds.l  1
Buffer:     ds.b  60

   end


