* Convert SoundTracker by E.Hambuch
* konvertiert SoundTrackerfiles in ladbares Format
* für IntroMaker  Version 1.1
* für A68k-Assembler
CALLEXEC: macro
  move.l 4,a6
  jsr _LVO\1(a6)
  endm
CALLDOS: macro
  move.l _DOSBase,a6
  jsr _LVO\1(a6)
  endm
_LVOOldOpenLibrary: equ -408
_LVOCloseLibrary:   equ -414
MODE_OLDFILE: equ 1005
MODE_NEWFILE: equ 1006
_LVOOpen:  equ -30
_LVOClose:  equ -36
_LVORead:  equ -42
_LVOWrite: equ -48
_LVOInput: equ -54
_LVOOutput: equ -60
_LVOLock: equ -84
_LVOUnLock: equ -90
_LVOExamine: equ -102
pr_CLI     equ $ac
pr_MsgPort equ $5c
  movem.l d0/a0,-(sp)
  clr.l _WBenchMsg
  sub.l a1,a1
  move.l 4,a6   ; ExecBase
  jsr -294(a6)  ; FindTask
  move.l d0,a4
  tst.l pr_CLI(a4)
  beq.s fromWorkbench
  movem.l (sp)+,d0/a0
  bra run
fromWorkbench
  lea pr_MsgPort(a4),a0
  jsr -384(a6)  ; WaitPort
  lea pr_MsgPort(a4),a0
  jsr -372(a6)  ; GetMsg
  move.l d0,_WBenchMsg
  movem.l (sp)+,d0/a0
run
  bsr.s _main
  move.l d0,-(sp)
  tst.l _WBenchMsg
  beq.s _exit
  move.l 4,a6   ; ExecBase
  jsr -132(a6)  ; Forbid
  move.l _WBenchMsg(pc),a1
  jsr -378(a6)  ; ReplyMsg
_exit
  move.l (sp)+,d0
  rts
_WBenchMsg
  ds.l 1
  even
_main:
  lea dosname,a1
  CALLEXEC OldOpenLibrary
  move.l d0,_DOSBase
  beq ende
  tst.l _WBenchMsg
  beq clistart
  move.l #fenster,d1
  move.l #MODE_NEWFILE,d2
  CALLDOS Open
  move.l d0,Out
  move.l d0,Inp
  beq closedos
  bra start
clistart:
  CALLDOS Output
  move.l d0,Out
  beq closedos
  jsr _LVOInput(a6)
  move.l d0,Inp
  beq closedos
start:
  lea text1,a0
  bsr print
forever:
  lea text2,a0
  bsr print
  move.l Inp,d1
  move.l #Buffer1,d2
  moveq #79,d3
  jsr _LVORead(a6)
  cmp.b #1,d0
  ble closedos
  lea Buffer1,a0
  clr.b -1(a0,d0.w)
  lea text3,a0
  bsr print
  move.l Inp,d1
  move.l #Buffer2,d2
  moveq #79,d3
  jsr _LVORead(a6)
  lea Buffer2,a0
  clr.b -1(a0,d0.w)
  move.l #Buffer1,d1
  bsr filelen
  move.l d0,Len
  bne.s w0
  lea text4,a0
  bsr print
  bra forever
w0:
  move.l #Buffer1,d1
  move.l #MODE_OLDFILE,d2
  jsr _LVOOpen(a6)
  move.l d0,File1
  bne.s w1
  lea text4,a0
  bsr print
  bra forever
w1:
  move.l #Buffer2,d1
  move.l #MODE_NEWFILE,d2
  jsr _LVOOpen(a6)
  move.l d0,File2
  bne.s w2
  move.l File1,d1
  jsr _LVOClose(a6)
  lea text5,a0
  bsr print
  bra forever
w2:
  move.l File2,d1
  move.l #Len,d2
  moveq #4,d3
  jsr _LVOWrite(a6)
  move.l File2,d1
  move.l #Period,d2
  moveq #2,d3
  jsr _LVOWrite(a6)
writesamp:
  move.l File1,d1
  move.l #FIBlock,d2
  move.l #260,d3
  jsr _LVORead(a6)
  move.l d0,d3
  ble closefiles
  move.l File2,d1
  move.l #FIBlock,d2
  jsr _LVOWrite(a6)
  tst.l d0
  bpl writesamp
closefiles:
  move.l File1,d1
  jsr _LVOClose(a6)
  move.l File2,d1
  jsr _LVOClose(a6)
  bra forever
closeall:
  tst.l _WBenchMsg
  beq.s closedos
  move.l Out,d1
  CALLDOS Close
closedos:
  move.l _DOSBase,a1
  CALLEXEC CloseLibrary
ende: rts
print:
  move.l a0,a1
s00: tst.b (a1)+
  bne.s s00
  suba.l a0,a1
  move.l Out,d1
  move.l a0,d2
  move.l a1,d3
  subq.l #1,d3
  jmp _LVOWrite(A6)  
filelen:
  moveq #-2,d2
  CALLDOS Lock
  move.l d0,d7
  beq endfilelen
  move.l d0,d1
  move.l #FIBlock,d2
  jsr _LVOExamine(a6)
  move.l d0,-(sp)
  move.l d7,d1
  jsr _LVOUnLock(a6)
  move.l (sp)+,d0
  beq.s endfilelen
  move.l FIBlock+124,d0
endfilelen: rts
  DATA
dosname: dc.b 'dos.library',0
text1: dc.b 'ConvertSoundTracker 1.1 by E.Hambuch',10
       dc.b '------------------------------------',10,10,0
text2: dc.b 'In>',0
text3: dc.b 'Out>',0
text4: dc.b 'Cant open input file !',10,7,0
text5: dc.b 'Cant open output file !',10,7,0
fenster: dc.b 'CON:0/0/640/200/ConvertST V1.1',0
  even
Period: dc.w 15625  ;Frequenz in Herz
  BSS
_DOSBase:   ds.l 1
Out:        ds.l 1
Inp:        ds.l 1
Len:        ds.l 1
File1:       ds.l 1
File2:       ds.l 1
 cnop 0,4 ;muß auf Langwort liegen
FIBlock:    ds.b 264
Buffer1:    ds.b 80
Buffer2:    ds.b 80
  END
