home *** CD-ROM | disk | FTP | other *** search
/ 100 af Verdens Bedste Spil / 100Spil.iso / dos / wolf3d / source / wolfsrc.1 / ID_SD_A.ASM < prev    next >
Assembly Source File  |  1993-02-04  |  10KB  |  527 lines

  1. ;
  2. ;    ID_SD_A.ASM
  3. ;    Id Sound Manager assembly stuff
  4.  
  5.     .286C
  6.     IDEAL
  7.     MODEL    MEDIUM,C
  8.     JUMPS
  9.  
  10.     INCLUDE 'ID_SD.EQU'
  11.  
  12. DEBUG    =    0
  13.  
  14.     EXTRN    SDL_DigitizedDone:FAR
  15.     EXTRN    alOut:FAR
  16.  
  17. ;============================================================================
  18.  
  19. DATASEG
  20.  
  21.     EXTRN    sqActive:WORD
  22.     EXTRN    ssSample:DWORD
  23.     EXTRN    ssLengthLeft:WORD
  24.     EXTRN    ssControl:WORD
  25.     EXTRN    ssStatus:WORD
  26.     EXTRN    ssData:WORD
  27.     EXTRN    ssOn:BYTE
  28.     EXTRN    ssOff:BYTE
  29.  
  30.     EXTRN    pcSound:DWORD
  31.     EXTRN    pcLengthLeft:WORD
  32.     EXTRN    pcLastSample:BYTE
  33.     EXTRN    pcSoundLookup:WORD
  34.  
  35.     EXTRN    alSound:DWORD
  36.     EXTRN    alBlock:WORD
  37.     EXTRN    alLengthLeft:WORD
  38.     EXTRN    alTimeCount:DWORD
  39.  
  40.     EXTRN    sqHack:DWORD
  41.     EXTRN    sqHackPtr:DWORD
  42.     EXTRN    sqHackLen:WORD
  43.     EXTRN    sqHackSeqLen:WORD
  44.     EXTRN    sqHackTime:DWORD
  45.  
  46.     EXTRN    HackCount:WORD
  47.     EXTRN    TimeCount:WORD
  48.     EXTRN    LocalTime:WORD
  49.  
  50.     EXTRN    TimerCount:WORD
  51.     EXTRN    TimerDivisor:WORD
  52.     EXTRN    t0OldService:DWORD
  53.  
  54.     EXTRN    SoundMode:WORD
  55.     EXTRN    DigiMode:WORD
  56.  
  57.     EXTRN    SoundNumber:WORD
  58.     EXTRN    SoundPriority:WORD
  59.  
  60. count_time    dw    ?
  61. count_fx    dw    ?
  62.  
  63. pcdtab    db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  64.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  65.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  66.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  67.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  68.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  69.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  70.         db    00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
  71.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  72.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  73.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  74.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  75.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  76.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  77.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  78.         db    10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
  79.  
  80.  
  81. ;============================================================================
  82.  
  83. CODESEG
  84.  
  85. MyDS    dw    ?
  86.  
  87. pcindicate    dw    ?
  88. extreme        dw    ?
  89.  
  90.     PROC    SDL_SetDS
  91.     PUBLIC    SDL_SetDS
  92.  
  93.     mov    ax,ds
  94.     mov    [cs:MyDS],ds
  95.     ret
  96.  
  97.     ENDP
  98.  
  99. ;
  100. ;    COMMONSTART
  101. ;    Macro used for common prefix code
  102. ;
  103.     MACRO    COMMONSTART
  104.     IF DEBUG
  105.     push dx
  106.     push ax
  107.     mov    dx,STATUS_REGISTER_1
  108.     in    al,dx
  109.     mov    dx,ATR_INDEX
  110.     mov    al,ATR_OVERSCAN
  111.     out    dx,al
  112.     mov    al,4    ; red
  113.     out    dx,al
  114.     ENDIF
  115.  
  116.     push ds
  117.     push ax
  118.  
  119.     mov    ds,[cs:MyDS]
  120.     inc    [HackCount]
  121.     ENDM
  122.  
  123. ;
  124. ;    DOFX
  125. ;    Macro used to do the sound effects code
  126. ;
  127.     MACRO    DOFX
  128.     les    di,[pcSound]                ; PC sound effects
  129.     mov    ax,es
  130.     or    ax,di
  131.     jz    @@nopc                        ; nil pointer - no PC sound effect going
  132.  
  133.     mov    bl,[es:di]                    ; Get the byte
  134.     inc    [WORD PTR pcSound]            ; Increment pointer
  135.     cmp    [pcLastSample],bl            ; Is this sample the same as last?
  136.     jz    @@pcsame                    ; Yep - don't do anything
  137.     mov    [pcLastSample],bl            ; No, save it for next time
  138.  
  139.     or    bl,bl
  140.     jz    @@pcoff                        ; If 0, turn sounds off
  141.     xor    bh,bh
  142.     shl    bx,1
  143.     mov    bx,[pcSoundLookup+bx]        ; Use byte as index into frequency table
  144.  
  145.     mov    al,0b6h                        ; Write to channel 2 (speaker) timer
  146.     out    pcTAccess,al
  147.     mov    al,bl
  148.     out    pcTimer,al                    ; Low byte
  149.     mov    al,bh
  150.     out    pcTimer,al                    ; High byte
  151.  
  152.     in    al,pcSpeaker                ; Turn the speaker & gate on
  153.     or    al,3
  154.     out    pcSpeaker,al
  155.  
  156.     jmp @@pcsame
  157.  
  158. @@pcoff:
  159.     in    al,pcSpeaker                  ; Turn the speaker & gate off
  160.     and    al,0fch                        ; ~3
  161.     out    pcSpeaker,al
  162.  
  163. @@pcsame:
  164.     dec    [pcLengthLeft]                ; Decrement length
  165.     jnz    @@nopc                        ; If not 0, we're not done with the sound
  166.  
  167.     mov    ax,0
  168.     mov    [WORD PTR pcSound],ax        ; Zero the pointer
  169.     mov    [WORD PTR pcSound + 2],ax
  170.     mov    [SoundNumber],ax            ; Indicate no sound
  171.     mov    [SoundPriority],ax            ;  with no priority
  172.  
  173.     in    al,pcSpeaker                  ; Turn the speaker off
  174.     and    al,0fdh                        ; ~2
  175.     out    pcSpeaker,al
  176. @@nopc:
  177.  
  178.     les    di,[alSound]                ; AdLib sound effects
  179.     mov    ax,es
  180.     or    ax,di
  181.     jz    @@noal                        ; nil pointer - no AdLib effect going
  182.  
  183.     xor    ah,ah
  184.     mov    al,[es:di]
  185.     or    al,al
  186.     jz    @@aldone
  187.  
  188.     CALL alOut C,alFreqL,ax
  189.     mov    ax,[alBlock]
  190.  
  191. @@aldone:
  192.     CALL alOut C,alFreqH,ax
  193.     inc    [WORD PTR alSound]
  194.     dec    [alLengthLeft]
  195.     jnz    @@noal
  196.  
  197.     mov    ax,0
  198.     mov    [WORD PTR alSound],ax        ; Zero the pointer
  199.     mov    [WORD PTR alSound + 2],ax
  200.     mov    [SoundNumber],ax            ; Indicate no sound
  201.     mov    [SoundPriority],ax            ;  with no priority
  202.     CALL alOut C,alFreqH,ax            ; Turn off the sound
  203. @@noal:
  204.  
  205.     ENDM
  206.  
  207. ;
  208. ;
  209. ;
  210.     MACRO    TIME
  211.     cmp    [count_time],2
  212.     jb    @@notime
  213.     add    [LocalTime],1
  214.     adc    [LocalTime+2],0
  215.     add    [TimeCount],1
  216.     adc    [TimeCount+2],0
  217.     mov    [count_time],0
  218. @@notime:
  219.     ENDM
  220.  
  221. ;
  222. ;    COMMONEND
  223. ;    Macro used for common suffix code
  224. ;
  225.     MACRO    COMMONEND
  226. @@fullexit:
  227.     pop    es
  228.     popa
  229.  
  230. @@nosave:
  231.     mov    ax,[TimerDivisor]
  232.     add    [TimerCount],ax
  233.     jnc    @@myack
  234.  
  235.     pushf
  236.     call [t0OldService]
  237.     jmp    @@out
  238.  
  239. @@myack:
  240.     mov    al,20h
  241.     out    20h,al
  242.  
  243. @@out:
  244.     pop    ax
  245.     pop    ds
  246.  
  247.     IF DEBUG
  248.     mov    dx,STATUS_REGISTER_1
  249.     in    al,dx
  250.     mov    dx,ATR_INDEX
  251.     mov    al,ATR_OVERSCAN
  252.     out    dx,al
  253.     mov    al,3    ; blue
  254.     out    dx,al
  255.     mov    al,20h    ; normal
  256.     out    dx,al
  257.     pop    ax
  258.     pop    dx
  259.     ENDIF
  260.  
  261.     iret
  262.     ENDM
  263.  
  264. ;
  265. ;    SDL_IndicatePC
  266. ;
  267.     PROC    SDL_IndicatePC on:WORD
  268.     PUBLIC    SDL_IndicatePC
  269.  
  270.     mov    ax,[on]
  271.     mov    [cs:pcindicate],ax
  272.     ret
  273.  
  274.     ENDP
  275.  
  276. ;
  277. ;    SDL_t0ExtremeAsmService
  278. ;    Timer 0 ISR 7000Hz interrupts
  279. ;
  280.     PROC    SDL_t0ExtremeAsmService
  281.     PUBLIC    SDL_t0ExtremeAsmService
  282.  
  283.     push ax
  284.     mov    al,[BYTE PTR cs:pcindicate]
  285.     or    al,al
  286.     jz    @@done
  287.  
  288.     push ds
  289.     push es
  290.     pusha
  291.  
  292.     mov    ds,[cs:MyDS]
  293.  
  294.     les    di,[pcSound]
  295.     mov    ax,es
  296.     or    ax,di
  297.     jz    @@donereg                    ; nil pointer
  298.  
  299.     mov    bl,[es:di]                    ; Get the byte
  300.     inc    [WORD PTR pcSound]            ; Increment pointer
  301.  
  302.     and    bl,11100000b                ; Nuke some of the precision (DEBUG - do this in the table)
  303.  
  304.     xor    bh,bh
  305.     mov    ah,[pcdtab+bx]                ; Translate the byte
  306.  
  307.     in    al,pcSpeaker
  308.     and    al,11111100b
  309.     or    al,ah
  310.     out    pcSpeaker,al
  311.  
  312.     dec    [pcLengthLeft]
  313.     jnz    @@donereg
  314.  
  315.     mov    [WORD PTR pcSound],0        ; We're done with this sample
  316.     mov    [WORD PTR pcSound+2],0
  317.  
  318.     in    al,pcSpeaker
  319.     and    al,11111100b
  320.     out    pcSpeaker,al
  321.  
  322.     call SDL_DigitizedDone
  323.  
  324. @@donereg:
  325.     popa
  326.     pop    es
  327.     pop    ds
  328.  
  329. @@done:
  330.     inc    [cs:extreme]
  331.     cmp    [cs:extreme],10
  332.     jae    @@tofast
  333.  
  334.     mov    al,20h
  335.     out    20h,al
  336.     pop    ax
  337.     iret
  338.  
  339. @@tofast:
  340.     mov    [cs:extreme],0
  341.     pop    ax
  342.  
  343. ;    jmp    SDL_t0FastAsmService            ; Drops through to SDL_t0FastAsmService
  344.  
  345.     ENDP
  346.  
  347. ;
  348. ;    SDL_t0FastAsmService
  349. ;    Timer 0 ISR for 700Hz interrupts
  350. ;
  351.     PROC    SDL_t0FastAsmService
  352.     PUBLIC    SDL_t0FastAsmService
  353.  
  354.     COMMONSTART
  355.  
  356.     inc    [count_fx]                        ; Time to do PC/AdLib effects & time?
  357.     cmp    [count_fx],5
  358.     jae    @@dofull
  359.  
  360.     mov    ax,[sqActive]                    ; Is the sequencer active?
  361.     or    ax,ax
  362.     jnz    @@dofull
  363.  
  364.     mov    ax,[WORD PTR ssSample]            ; Is there a sample for the Sound Src?
  365.     or    ax,[WORD PTR ssSample+2]
  366.     jz    @@nosave
  367.  
  368. @@dofull:
  369.     pusha
  370.     push es
  371.  
  372.     cmp    [count_fx],5
  373.     jb    @@nofx
  374.     mov    [count_fx],0
  375.     DOFX
  376.  
  377.     inc    [count_time]
  378.     TIME
  379. @@nofx:
  380.  
  381.     mov    ax,[sqActive]
  382.     or    ax,ax
  383.     jz    @@nosq
  384.  
  385.     mov    ax,[sqHackLen]
  386.     or    ax,ax
  387.     jz    @@sqdone
  388.  
  389.     les    di,[sqHackPtr]
  390. @@sqloop:
  391.     mov    ax,[WORD PTR sqHackTime+2]
  392.     cmp    ax,[WORD PTR alTimeCount+2]
  393.     ja    @@sqdone
  394.     mov    ax,[WORD PTR sqHackTime]
  395.     cmp    ax,[WORD PTR alTimeCount]
  396.     ja    @@sqdone
  397.  
  398.     mov    ax,[es:di+2]                    ; Get time to next event
  399.     add    ax,[WORD PTR alTimeCount]
  400.     mov    [WORD PTR sqHackTime],ax
  401.     mov    ax,[WORD PTR alTimeCount+2]
  402.     adc    ax,0
  403.     mov    [WORD PTR sqHackTime+2],ax
  404.  
  405.     mov    ax,[es:di]                        ; Get register/value pair
  406.     xor    bh,bh
  407.     mov    bl,ah
  408.     xor    ah,ah
  409.     CALL alOut C,ax,bx
  410.  
  411.     add    di,4
  412.     mov    [WORD PTR sqHackPtr],di
  413.  
  414.     sub    [sqHackLen],4
  415.     jnz    @@sqloop
  416.  
  417. @@sqdone:
  418.     add    [WORD PTR alTimeCount],1
  419.     adc    [WORD PTR alTimeCount+2],0
  420.     mov    ax,[sqHackLen]
  421.     or    ax,ax
  422.     jnz    @@nosq
  423.  
  424.     mov    ax,[WORD PTR sqHack]        ; Copy pointer
  425.     mov    [WORD PTR sqHackPtr],ax
  426.     mov    ax,[WORD PTR sqHack+2]
  427.     mov    [WORD PTR sqHackPtr+2],ax
  428.  
  429.     mov    ax,[sqHackSeqLen]            ; Copy length
  430.     mov    [sqHackLen],ax
  431.  
  432.     mov    ax,0
  433.     mov    [WORD PTR alTimeCount],ax    ; Reset time counts
  434.     mov    [WORD PTR alTimeCount+2],ax
  435.     mov    [WORD PTR sqHackTime],ax
  436.     mov    [WORD PTR sqHackTime+2],ax
  437. @@nosq:
  438.  
  439.     les    di,[ssSample]            ; Get pointer to Sound Source sample
  440.     mov    ax,es
  441.     or    ax,di
  442.     jz    @@ssdone                ; If nil, skip this
  443.  
  444. @@ssloop:
  445.     mov    dx,[ssStatus]            ; Check to see if FIFO has any empty slots
  446.     in    al,dx
  447.     test al,40h
  448.     jnz    @@ssdone                ; Nope - don't push any more data out
  449.  
  450.     mov    dx,[ssData]
  451.     mov    al,[es:di]                ; al = *ssSample
  452.     out    dx,al                    ; Pump the value out
  453.  
  454.     mov    dx,[ssControl]            ; Pulse printer select
  455.     mov    al,[ssOff]
  456.     out    dx,al
  457.     push ax
  458.     pop    ax
  459.     mov    al,[ssOn]
  460.     out    dx,al
  461.  
  462.     push ax                        ; Delay a short while
  463.     pop    ax
  464.  
  465.     inc    di
  466.     mov    [WORD PTR ssSample],di    ; ssSample++
  467.  
  468.     dec    [ssLengthLeft]
  469.     jnz @@ssloop
  470.  
  471.     mov    [WORD PTR ssSample],0    ; We're done with this sample
  472.     mov    [WORD PTR ssSample+2],0
  473.  
  474.     call SDL_DigitizedDone
  475. @@ssdone:
  476.  
  477.     COMMONEND
  478.  
  479.     ENDP
  480.  
  481. ;
  482. ;    SDL_t0SlowAsmService
  483. ;    Timer 0 ISR for 140Hz interrupts
  484. ;
  485.     PROC    SDL_t0SlowAsmService
  486.     PUBLIC    SDL_t0SlowAsmService
  487.  
  488.     IF DEBUG
  489.     push dx
  490.     push ax
  491.     mov    dx,STATUS_REGISTER_1
  492.     in    al,dx
  493.     mov    dx,ATR_INDEX
  494.     mov    al,ATR_OVERSCAN
  495.     out    dx,al
  496.     mov    al,4    ; red
  497.     out    dx,al
  498.     ENDIF
  499.  
  500.     push ds
  501.     push ax
  502.  
  503.     mov    ds,[cs:MyDS]
  504.  
  505.     inc    [count_time]
  506.     TIME
  507.  
  508.     mov    ax,[WORD PTR pcSound]        ; Is there a PC sound effect going?
  509.     or    ax,[WORD PTR pcSound+2]
  510.     jnz    @@dofull
  511.  
  512.     mov    ax,[WORD PTR alSound]        ; Is there an AdLib sound effect going?
  513.     or    ax,[WORD PTR alSound+2]
  514.     jz    @@nosave
  515.  
  516. @@dofull:
  517.     pusha
  518.     push es
  519.  
  520.     DOFX
  521.  
  522.     COMMONEND
  523.  
  524.     ENDP
  525.  
  526.     END
  527.