home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games 1995 January / amigagames-1995-01.iso / archive / spiele / publicdomain / sk003.dms / sk003.adf / src / soundloader.s < prev    next >
Text File  |  2001-01-01  |  8KB  |  335 lines

  1.  
  2. ;
  3. ; FORMAT
  4. ;    'SAND' , # of Sample.w, # Size of header.w,
  5. ;    [ HEADER.l ] * # Size of header
  6. ;    [ SAMPLES ]  (whatever memory they take)
  7. ;
  8.  
  9.  
  10. MAXALL equ 64   ; allow 64 samples
  11.  
  12.     ;
  13.     ; load a directory full of objects into a merged filehunk
  14.     ; record size information and stuff like that.
  15.     ; list of files to load is specified in musiclist.txt
  16.     ; by Andy Hook
  17.  
  18.     move.l    #$40000,d0
  19.     lea    memsiz(pc),a0
  20.     move.l    d0,(a0)
  21.     bsr    allocatememory
  22.     beq    failure0
  23.     lea    memory(pc),a0
  24.     move.l    d0,(a0)
  25.     lea    posinfo(pc),a0
  26.     move.l    d0,(a0)
  27.     add.l    #8,(a0)            ; (leave room for ID stuff)
  28.     lea    memptr(pc),a0
  29.     add.l    #MAXALL*4,d0        ; room for x sound offset ptrs
  30.     move.l    d0,(a0)
  31.     lea    parsestart(pc),a0
  32.     move.l    d0,(a0)
  33.     move.l    memsiz(pc),d1        ; d1 = max size to load
  34.                     ; d0 = load-at address
  35.     lea    listname(pc),a0        ; a0 = name to load
  36.     bsr    loadthis
  37.     beq    failure
  38.     lea    memsiz(pc),a0
  39.     sub.l    d0,(a0)            ; loaded to much?
  40.     beq    failure
  41.     bmi    failure
  42.     lea    memptr(pc),a0
  43.     add.l    d0,(a0)
  44.     lea    audiostart(pc),a0
  45.     move.l    memptr(pc),(a0)
  46.     lea    parseend(pc),a0        ; store stuff after the musiclist.txt
  47.     move.l    memptr(pc),(a0)
  48.  
  49. 1$    btst    #6,$bfe001
  50.     beq    failure
  51.     bsr    parsenext        ; a0 = name to load next
  52.     bmi    failure
  53.     beq    donethat
  54.     move.l    a0,-(a7)
  55.     bsr    printname
  56.     move.l    (a7)+,a0
  57.     btst    #6,$bfe001
  58.     beq    failure
  59.     move.l    memsiz,d1        ; d1 = max size to load
  60.     move.l    memptr,d0        ; d0 = load-at address
  61.     bsr    loadthis
  62.     beq    failure
  63.  
  64.     btst    #0,d0            ; this shouldn't happen but...
  65.     beq.s    3$
  66.     addq.l    #1,d0
  67. 3$
  68.     lea    memsiz(pc),a0
  69.     sub.l    d0,(a0)
  70.     beq    failure
  71.     bmi    failure
  72.     lea    memptr(pc),a0
  73.  
  74.     lea posinfo(pc),a2
  75.     move.l (a2),a1
  76.     move.l    (a0),d1
  77.     sub.l audiostart(pc),d1        ; (remember start)
  78.     move.l d1,(a1)+
  79.     move.l    (a0),d1
  80.     add.l    d0,d1
  81.     sub.l    audiostart(pc),d1    ; (and end too...for the last one)
  82.     move.l    d1,(a1)
  83.     move.l a1,(a2)
  84.     lea poscount(pc),a2
  85.     add.w #1,(a2)
  86.     cmp.w #MAXALL-4,(a2)        ; (room for header)
  87.     bcc  failure
  88.  
  89.     add.l    d0,(a0)
  90.     bra.s    1$
  91.  
  92. donethat
  93.     move.l    #MAXALL*4,d1        ; D1 = size to save
  94.     move.l    memory(pc),a0        ; D0 = save start
  95.     move.l    a0,d0
  96.     move.l    #'SAND',(a0)+        ; ID HEADER
  97.     move.w    poscount(pc),(a0)+    ; x = # of samples
  98.     move.w    #$0040,(a0)+        ; x = Header Size (1/4th)
  99.     lea    savename(pc),a0        ; A0 = name to save under
  100.     bsr    saveopen        ; + Write HEADER INFO
  101.     beq    failure
  102.  
  103.     move.l    parseend(pc),d2        ; d2 = start, WRITE BODY INFO
  104.     move.l    memptr(pc),d3        ; d3 = size
  105.     sub.l    d2,d3
  106.     bsr    savewrite
  107.     bsr    saveclose
  108.  
  109.     bsr    freememory
  110.     lea    error2(pc),a0
  111.     bra    dumpmess
  112.  
  113. failure0
  114.     lea    error0(pc),a0
  115.     bra    dumpmess
  116. failure    bsr    freememory
  117.     lea    error1(pc),a0
  118.     bra    dumpmess
  119.  
  120.  
  121.  
  122.  
  123.  
  124. parsenext
  125.     clr.w    d0
  126.     move.l    parsestart(pc),a1
  127.     move.l    parseend(pc),a2
  128.     lea    fastparse(pc),a3
  129.                         ; skip white space
  130. parse10    cmp.l    a1,a2                ; done?
  131.     beq.s    parse90
  132.     move.b    (a1)+,d0
  133.     tst.b    (a3,d0.w)
  134.     beq.s    parse10
  135.  
  136.     lea    -1(a1),a0            ; A0 = start of valid
  137.                         ; skip to white space
  138. parse20    cmp.l    a1,a2
  139.     beq.s    parse90
  140.     move.b    (a1)+,d0
  141.     tst.b    (a3,d0.w)
  142.     bne.s    parse20
  143.     clr.b    -1(a1)                ; tack on terminator
  144.  
  145.     lea    parsestart(pc),a2        ; remember where I am
  146.     move.l    a1,(a2)
  147.     move.b    #1,d0
  148.     rts                    ; A0 = ptr to next name
  149. parse90    clr.b    d0
  150.     rts
  151.  
  152. ;
  153. ; this fast parse table is mostly in retaliation for a beserk discussion
  154. ; in the end of BYTE magazine about revamping ASCII "because its too hard
  155. ; to deal with adequately"....perhaps for Intel loser users who can't
  156. ; think in CISC type operations, like their excuses for a computer.
  157. ;
  158. ; The discussion pointed out aspects of ASCII, but didn't define them in
  159. ; terms or good or bad.
  160. ;
  161. ; 3 conditions can be quickly tested this way, -1, 0 or 1... EOF/JUNK/VALID...
  162. ;
  163.  
  164. fastparse    dc.b    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  165.         dc.b    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  166.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  167.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  168.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  169.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  170.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  171.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
  172.  
  173.  
  174. ;----------------------------------------------------------------------------
  175. AllocMem    equ    -30-168
  176. FreeMem        equ    -30-180
  177. allocatememory
  178.                         ; D0 = memory size
  179.     clr.l    d1                ; D1 = Memory Type, ie 2=Chip
  180.     move.l    4,a6
  181.     jsr    AllocMem(a6)
  182.     tst.l    d0                ; D0 = 0 = Failed
  183.     rts
  184. freememory
  185.     move.l    #$40000,d0
  186.     move.l    memory(pc),a1
  187.     move.l    4,a6
  188.     jmp    FreeMem(a6)
  189. ;----------------------------------------------------------------------------
  190.  
  191. printname
  192.     movem.l    a0/a1,-(a7)
  193.     lea    loading(pc),a0
  194.     bsr    dumpmess
  195.     movem.l    (a7)+,a0/a1
  196.     move.l    a1,d3
  197.     move.l    a0,d1
  198.     sub.l    d1,d3
  199.     move.l    a0,d2
  200.     bsr.s    dumpmess2
  201.     lea    carriage(pc),a0
  202. dumpmess
  203.     moveq    #0,d3
  204.     move.b    (a0)+,d3            ; D3 = Length
  205.     move.l    a0,d2                ; D2 = What
  206. dumpmess2
  207.     move.l    4,a6                ; Get EXEC
  208.     lea    DosLibrary(pc),a1        ; Open 'DOS.LIBRARY'
  209.     moveq    #0,d0                ;
  210.     jsr    LVOOpenLibrary(a6)        ;
  211.     move.l    d0,a6                ; A6 = DosBase
  212.     jsr    LVOOutput(a6)            ; Get LVOOutput Handle
  213.     move.l    d0,d1                ; D1 = Output Handle
  214.     jmp    LVOWrite(a6)            ; LVOWrite
  215.  
  216. ;----------------------------------------------------------------------------
  217.  
  218. LVODelay    equ -30-168
  219. LVODeviceProc    equ -30-144
  220. LVOSeek        equ -30-36
  221. LVOOutput    equ -30-30
  222. LVOInput    equ -30-24
  223. LVOWrite    equ -30-18
  224. LVORead        equ -30-12
  225. LVOClose    equ -30-6
  226. LVOOpen        equ -30
  227. LVOOpenLibrary    equ -30-522
  228.  
  229. Disable        equ -120        ; (some other fun stuff)
  230. Enable        equ -126
  231. ;AllocMem    equ -198
  232. ;FreeMem    equ -210
  233.  
  234. FindTask    equ -294        ; name,a1
  235. SetSignal    equ -306        ; newSignal,signalSet,d0,d1
  236. Wait        equ -318        ; signalSet,d0
  237. AllocSignal    equ -330        ; Signalnum,d0
  238. FreeSignal    equ -336        ; signalNum,d0
  239.  
  240. PutMsg        equ -366        ; PutMsg(port=a0,mess=a1);
  241. WaitPort    equ -384        ; WaitPort(port=a0);
  242. GetMsg        equ -372        ; GetMsg(port=a0);
  243.  
  244. OpenDevice    equ -444        ; devName,unit,ioReq,flags(a0,d0/a1,d1
  245. CloseDevice    equ -450        ; ioRequest,a1
  246. RawDoFmt    equ -522
  247.  
  248. loadthis                ; D1 = Size, D0 = Start, A0 = Name
  249.     lea    lsiz(pc),a1
  250.     move.l    d1,(a1)+
  251.     move.l    d0,(a1)+
  252.     move.l    a0,(a1)
  253.     move.l    4,a6            ; Open DOS.LIBRARY
  254.     lea    DosLibrary(pc),a1
  255.     moveq    #0,d0
  256.     jsr    LVOOpenLibrary(a6)
  257.     move.l    d0,a6            ; A6 = DOS.LIBRARY
  258.     move.l    lnam(pc),d1        ; D1 = Get FileName
  259.     move.l    #1005,d2        ; D2 = MODE_OLDFILE  LOAD
  260.     jsr    LVOOpen(a6)        ; Open the file
  261.     move.l    d0,d4            ; d4 is reserved as file ptr
  262.     beq.s    saveerror        ; (can use load error routine)
  263.     move.l    lstart(pc),d2        ; D2 = Start
  264.     move.l    lsiz(pc),d3        ; D3 = Size
  265.     move.l    d4,d1            ; D1 = File Pointer
  266.     jsr    LVORead(a6)
  267.     move.l    d0,-(a7)
  268.     move.l    d4,d1            ; FP
  269.     jsr    LVOClose(a6)        ; Close File
  270.     move.l    (a7)+,d0        ; D0 = Amount Loaded
  271.     move.b    #1,d1            ; (flag success)
  272.     rts
  273. saveerror:
  274.     moveq    #0,d0
  275.     rts
  276.  
  277. saveopen                ; D1 = Size, D0 = Start, A0 = Name
  278.     lea    lsiz(pc),a1
  279.     move.l    d1,(a1)+
  280.     move.l    d0,(a1)+
  281.     move.l    a0,(a1)
  282.     move.l    4,a6            ; Open DOS.LIBRARY
  283.     lea    DosLibrary(pc),a1
  284.     moveq    #0,d0
  285.     jsr    LVOOpenLibrary(a6)
  286.     move.l    d0,a6            ; A6 = DOS.LIBRARY
  287.     move.l    lnam(pc),d1
  288.     move.l    #1006,d2
  289.     jsr    LVOOpen(a6)
  290.     move.l    d0,d4            ; d4 is reserved as file ptr
  291.     beq.s    saveerror        ; (can use load error routine)
  292.     move.l    lstart(pc),d2        ; D2 = Start
  293.     move.l    lsiz(pc),d3        ; D3 = Size
  294. savewrite
  295.     move.l    d4,d1            ; D1 = File Pointer
  296.     jmp    LVOWrite(a6)
  297.  
  298. saveclose
  299.     move.l    d4,d1            ; FP
  300.     jmp    LVOClose(a6)        ; Close File
  301.  
  302. lsiz        dc.l 0
  303. lstart        dc.l 0
  304. lnam        dc.l 0
  305.  
  306.  
  307. DosLibrary    dc.b    'dos.library',0
  308.  
  309. poscount    dc.l 0
  310. posinfo        dc.l 0
  311.  
  312. audiostart    dc.l 0
  313. parsestart    dc.l 0
  314. parseend    dc.l 0
  315. memory        dc.l 0
  316. memsiz        dc.l 0
  317. memptr        dc.l 0
  318. listname    dc.b 'musiclist.txt',0
  319.         even
  320. savename    dc.b 'music.hunk',0,0
  321.         even
  322. error2        dc.b 73-29+1,'Successfully loaded all musiclist.txt files!',10,0
  323.         even
  324. error1        dc.b 66-29+1,'File is missing, corrupt or too large',10,0
  325.         even
  326. error0        dc.b 73-29+1,'Could not allocate the $40000 Bytes I wanted',10,0
  327.         even
  328. loading        dc.b 10,'loading...',0,0
  329.         even
  330. carriage    dc.b 1,10,0
  331.  
  332.     end
  333.  
  334. ; end of soundloader.s
  335.