
MODULE 'intuition/screens','intuition/intuitionbase','intuition/intuition'

CONST PRA=$BFD000,PRB=$BFE101,DDRA=$BFD200,DDRB=$BFE301

DEF x,win:PTR TO window,c,delay,tip,byte,screen:PTR TO screen,quick,noscreen,
    oldy,line,ref,re,oldsec,synch,ms,force

DEF wx,wy,nx,ny

PROC ppinit()
  oldy:=20
  oldsec:=0
  ref:=0
  ms:=1

  IF quick THEN quick:=2 ELSE quick:=1
  MOVE.B #%00000000,DDRB
  MOVE.B DDRA,D0
  ANDI.B #%11111010,D0
  ORI.B #%00000100,D0
  MOVE.B D0,DDRA
ENDPROC

PROC adjust()
  nx:=win.leftedge
  re:=0
  ny:=win.topedge
  wx:=win.width
  wy:=win.height
ENDPROC

PROC openwin(x,y,x2,y2)
  DEF w
  IF noscreen
    w:=OpenW(x,y,x2,y2,IDCMP_MOUSEBUTTONS+IDCMP_RAWKEY+IDCMP_NEWSIZE+IDCMP_CLOSEWINDOW,$f,'Digital Sampler Display',0,$1,NIL,NIL)
  ELSE
    w:=OpenW(x,y,x2,y2,IDCMP_MOUSEBUTTONS+IDCMP_RAWKEY+IDCMP_NEWSIZE+IDCMP_CLOSEWINDOW,$f,'Digital Sampler Display',screen,$f,NIL,NIL)
  ENDIF
ENDPROC w
PROC main()
  DEF ib:PTR TO intuitionbase,g,l
  ib:=intuitionbase
  parse()
  delay:=1
  ppinit()
nomma:
  IF testsampler()
    IF (l:=EasyRequestArgs(0,[20,0,0,'Sampler not found!\n\nIs your 8-bit sampler correctly\nconnected to your parallel port?','Retry|Override|Quit'],0,NIL))=1 THEN JUMP nomma
    IF l=0 THEN JUMP pfui
  ENDIF

  IF screen:=IF noscreen THEN 4 ELSE OpenS(640,480,1,0,'Calculating refresh rate...',[SA_LIKEWORKBENCH,TRUE,SA_DEPTH,1,0,NIL])
    IF noscreen=0
      SetRGB4(screen.viewport,0,0,0,0)
      SetRGB4(screen.viewport,1,15,15,0)
    ENDIF

    IF win:=openwin(0,20,250,236)
      WindowLimits(win,50,40,0,0)
      ActivateWindow(win)
      adjust()
      x:=5

      WHILE (c:=getclass())<>IDCMP_CLOSEWINDOW

        IF oldsec<>ib.seconds
          StringF(g:=String(100),'Actual display refresh rate [\dx\d]: \d rf/s',wx,wy,re)
          IF re<>0 THEN SetWindowTitles(win,'Digital Sampler Display',g)
          re:=ref
          ref:=0
          oldsec:=ib.seconds
        ENDIF

        x:=x+quick

        IF x>(wx-20)
          ms:=1
          INC ref
          Delay(1)
          x:=5
          IF (tip>1) AND (tip<5000) THEN Delay(tip)
          
        ENDIF

        isbyte()
        CLR byte
        MOVE.B PRB,D0
        MOVE.L D0,byte

        byte:=(byte*wy)/256

        IF byte<20 THEN byte:=20
        IF byte>(wy-5) THEN byte:=wy-5

        IF ((byte>124) AND (byte<132)) OR (ms=0) OR (synch=0)
          IF ms<>0 THEN Box(4,20,(wx-20),(wy-5),0)
          ms:=0
          IF line
            Line(x,byte,x-quick,oldy,1)
          ELSE
            Plot(x,byte,1)
          ENDIF
        ELSE
          DEC x
        ENDIF
       
        oldy:=byte

        IF c=IDCMP_NEWSIZE        
          adjust()
        ELSEIF c=IDCMP_RAWKEY
          adjust()
          CloseW(win)
          IF (win:=openwin(nx,ny,wx,wy))=0 THEN JUMP uah
          adjust()
          ActivateWindow(win)
        ELSEIF c=IDCMP_MOUSEBUTTONS
          EasyRequestArgs(0,[20,0,0,'Sleeping...','Wake up!'],0,NIL)
        ENDIF

        IF CtrlC() THEN JUMP aus
        IF delay=0 THEN Delay(1)
      ENDWHILE
aus:
      CloseW(win)
    ENDIF
uah:
    IF noscreen=0 THEN CloseS(screen)
  ENDIF
pfui:
ENDPROC

PROC testsampler()
  DEF n
  IF force THEN RETURN 0
  n:=0  
  MOVE.B PRB,D0
  MOVE.L D0,byte
  IF byte=255
    Delay(20)  
    MOVE.B PRB,D0
    MOVE.L D0,byte
    IF byte=255 THEN n:=1
  ENDIF
ENDPROC n

PROC isbyte()
  ORI.B #%00000100,PRA
  ANDI.B #%11111011,PRA
busy:  ANDI.B #%00000001,PRA
  BEQ.S busy
ENDPROC

PROC getclass()
  DEF msg:PTR TO intuimessage,m
  m:=0

  IF msg:=GetMsg(win.userport)
    m:=msg.class
    ReplyMsg(msg)
  ENDIF
ENDPROC m
 
  
PROC parse()
  DEF rdarg,myargs:PTR TO LONG
  myargs:=[0,0,0,0,0,0,0,0,0,0,0]

  IF rdarg:=ReadArgs('DELAY/N/K,QUICK/S,NOLINES/S,SYNCH/S,NOSCREEN/S,FORCE/S',myargs,NIL)
    IF myargs[0] THEN tip:=Long(myargs[0]) ELSE tip:=0  
    quick:=myargs[1]
    line:=IF myargs[2] THEN 0 ELSE 1
    synch:=myargs[3]
    noscreen:=myargs[4]
    force:=myargs[5]
    FreeArgs(rdarg)
  ELSE
    WriteF('TSound: Falsche Argumente! (bad args)\n')
    CleanUp(5)
  ENDIF
ENDPROC
