;       >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;       <<             LED - Tuner (Yeah!)              <<
;       >>      (c) 1989 by Silicon Generation          >>
;       <<             Von: Andreas Uhl                 <<
;       >>                  Kemptener Str. 36           >>
;       <<                  8944 Grönenbach             <<
;       >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_Exec=4
_Forbid=-132
_Permid=-138
_OpenLibrary=-552
_CloseLibrary=-414
_OutPut=-60
_Write=-48
_Read=-42
_Input=-54
_Open=-30
_Close=-36
_Findtask=-294
_Waitport=-384
_GetMsg=-372
_ReplyMsg=-378

Start:                                 ;WB oder CLI ?
       move.l  _exec,a6
       move.l  sp,Stackpointer
       clr.l   MP
       sub.l   a1,a1
       jsr     _Findtask(a6)
       move.l  d0,a4
       tst.l   $ac(a4)
       bne     Main
       lea     $5c(a4),a0
       jsr     _WaitPort(a6)
       jsr     _GetMsg(a6)
       move.l  d0,MP

Main:
       lea     dosname(pc),a1          ;DOS-Lib öffnen
       moveq   #0,d0
       move.l  _exec,a6
       jsr     _OpenLibrary(a6)
       tst.l   d0
       beq     Fini
       move.l  d0,dosbase

       move.l  #conname,d1             ;CON: öffnen       move.l  #1005,d2
       move.l  dosbase,a6
       jsr     _Open(a6)
       move.l  d0,d6
       tst.l   d0
       beq     Error1

       move.l  #Message,d2             ;Text in Window
       move.l  d6,d1
       move.l  #ScndMess-Message,d3
       move.l  dosbase,a6
       jsr     _Write(a6)
       bsr     Eingabe

       move.l  $6c,OldLevel_3          ;Alten Int-Vektor sichern
       move.l  _exec,a6                ;Neuen VertB-Interrupt setzen
       jsr     _Forbid(a6)
       move.w  #$4000,$dff09a
       move.l  #NewLevel_3,$6c
       move.w  #$c000,$dff09a
       move.l  _exec,a6       jsr     _Permid(a6)

Loop:                                  ;Neue Werte abfragen
       bsr     Eingabe
       cmp.b   #"0",Buffer
       beq     Error2
       bra     Loop

Error2:
       move.l  OldLevel_3,$6c          ;alten Interrupt setzen
       move.l  d6,d1                   ;CON: schließen
       move.l  dosbase,a6
       jsr     _Close(a6)
Error1:                                ;DOS-Lib schließen
       move.l  dosbase,a1
       move.l  _exec,a6
       jsr     _CloseLibrary(a6)
Fini:
       tst.l   MP
       beq     NoMP
       move.l  _exec,a6
       jsr     _Forbid(a6)
       move.l  MP,a1
       jsr     _ReplyMsg(a6)
NoMP:
       move.l  Stackpointer,sp
       clr.l   d0
       rts

Eingabe:                               ;Tastatureingabe
       move.l  dosbase,a6
       move.l  d6,d1
       move.l  #ScndMess,d2
       move.l  #MEnde-ScndMess,d3
       jsr     _Write(a6)
       move.l  dosbase,a6
       move.l  d6,d1
       move.l  #Buffer,d2
       moveq   #2,d3
       jsr     _Read(a6)
       cmp.b   #"0",Buffer
       bmi     UserError
       cmp.b   #"9",Buffer
       bhi     UserError
       clr.w   VBCtr
       rts
UserError:
       move.l  d6,d1
       move.l  #UE_TextEnde-UE_Text,d3
       move.l  #UE_Text,d2
       move.l  dosbase,a6
       jsr     _Write(a6)
       bra     Eingabe

NewLevel_3:                            ;Interrupt-Routiene
       move.l  d0,-(sp)
       btst    #5,$dff01f              ;VertB?
       beq     BacktoExec
       add.b   #1,VBCtr
       move.b  buffer,d0
       sub.b   #"0",d0
       cmp.b   VBCtr,d0
       bne     BacktoExec
       clr.w   VBCtr
       bchg    #1,$bfe001              ;LED umschalten
BacktoExec:
       move.l  (sp)+,d0                ;Alten Level3 anspringen
       dc.w    $4ef9                   ;Opcode JMP (Sorry Olli, ich mach
OldLevel_3:                            ;das halt immer so ...)
       dc.l    0

VBCtr:
       dc.w    0
 align.w
Message:
       dc.b    27,1,"     Hi Hoschi!",27,00,10
 align.w
ScndMess:
       dc.b    "Gimme da magic number.",10,"(0=End-9=Slow):",0
MEnde:
 align.w
UE_Text:
       dc.b    10,"Ey man: Only 0-9 !!!",10,"LED it be ...",10,0
UE_TextEnde:
 align.w
dosbase:
       dc.l    0
dosname:
       dc.b    "dos.library",0
 align.w
conname:
       dc.b    "CON:200/50/240/100/LED-Tuner",0
 align.w
Buffer:
       dc.l    0
MP:    dc.l    0
Stackpointer:
       dc.l    0
 end
