sb.asm

来自「Application sources:A084.ZIP」· 汇编 代码 · 共 1,006 行 · 第 1/2 页

ASM
1,006
字号
;
;    SOUND BLASTER
;
;    Compile with FASM for Menuet
;
   
use32
   
                org     0x0
   
                db      'MENUET01'              ; 8 byte id
                dd      0x01
                dd      START                   ; program start
                dd      I_END                   ; program image size
                dd      0x80000                 ; required amount of memory
                dd      0xfff0                  ; stack position
                dd      0,0
   
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
vol_data             dd 0x40000
playposition         dd 0x20000
next_tic             dd 0x0
onoff                dd 0x0
pause_between_songs  dd 100
delay                dd 100
repeat_song          db 0
mono_stereo          dd 1
   
   
; 0x10000 data from hd
; 0x20000 play position for sb
; 0x40000 volume indicator data
   
   
START:                          ; start of execution
   
    call draw_window            ; at first, draw the window
   
    mov  eax,26
    mov  ebx,9
    int  0x40
    mov  [next_tic],eax
   
still:
   
    mov  [delay],145
    cmp  [mono_stereo],2
    jne  no_stereo
    mov  [delay],73
  no_stereo:
   
    mov  eax,55
    mov  ebx,2
    mov  ecx,0
    mov  edx,[mono_stereo]
    int  0x40
   
    mov  eax,23                 ; wait here for event
    mov  ebx,1
    int  0x40
   
    cmp  eax,0
    jne  do_task
   
still2:
   
    cmp  [onoff],0
    je   still
   
    mov  eax,26
    mov  ebx,9
    int  0x40
    mov  ebx,[next_tic]
    cmp  eax,ebx
    jge  play_wave_block
   
    mov  edi,[next_tic]
    sub  edi,eax
    mov  eax,[delay]
    sub  eax,edi
    mov  edi,eax
    call draw_volume
   
    jmp  still
   
  do_task:
   
    cmp  eax,1                  ; redraw request ?
    je   red
    cmp  eax,2                  ; key in buffer ?
    je   key
    cmp  eax,3                  ; button in buffer ?
    je   button
   
    cmp  eax,16+4
    jne  no_irman
    mov  eax,42
    mov  ebx,4
    int  0x40
    dec  [ir_count]
    cmp  bl,140
    jne  no_first
    mov  [ir_count],3
  no_first:
    cmp  [ir_count],0
    jne  no_irman
    call give_wav
    cmp  bl,215
    je   play
    mov  ah,4
;;    cmp  bl,55
;;    je   rev
    mov  ah,3
;;;    cmp  bl,183
;;;    je   rev
    cmp  bl,127
    jne  no_block_dec
    add  [block],65536/512*10
  no_block_dec:
    cmp  bl,191
    jne  no_block_inc
    sub  [block],65536/512*10
  no_block_inc:
    jmp  still
   no_irman:
   
    jmp  still
   
  play_wave_block:
   
    mov  eax,55    ; load wave
    mov  ebx,0
    mov  ecx,[playposition]
    int  0x40
   
    mov  eax,55    ; play wave
    mov  ebx,1
    int  0x40
   
    mov  eax,26
    mov  ebx,9
    int  0x40
    add  eax,[delay]
    mov  [next_tic],eax
   
    call draw_wave
    call read_wav
   
    jmp  still
   
  red:                          ; redraw
    call draw_window
    jmp  still
   
  key:                          ; key
    mov  eax,2                  ; just read it and ignore
    int  0x40
    jmp  still2
   
  button:                       ; button
    mov  eax,17                 ; get id
    int  0x40
   
    cmp  ah,6
    jne  no_ir
    call enable_ir
    jmp  still
  no_ir:
   
    cmp  ah,7
    jne  no_file_name
    call read_string
    jmp  still
  no_file_name:
   
    cmp  ah,2                   ; button id=2
    jne  noplay
  play:
    mov  eax,[onoff]
    not  eax
    and  eax,1
    mov  [onoff],eax
    mov  [playposition],0x20000
    mov  [block],2
    call read_header
    call read_wav
;    mov  [next_tic],0
    jmp  still
   
  noplay:
   
    cmp  ah,3
    jb   no_rev
    cmp  ah,4
    jg   no_rev
    sub  ah,3
    shr  eax,8
    imul eax,4000
    sub  eax,2000
    add  [block],eax
    cmp  [block],0x0f000000
    jb   block_ok
    mov  [block],2
  block_ok:
    call display_progress
    jmp  still2
  no_rev:
   
    cmp  ah,5                   ; repeat song ?
    jne  no_repeat
    mov  al,[repeat_song]
    inc  al
    and  eax,1
    mov  [repeat_song],al
    shl  eax,2
    mov  eax,[repeat_text+eax]
    mov  [text+40*5+31],eax
    call draw_window
    jmp  still
    repeat_text: db 'OFF ON  '
  no_repeat:
   
   
    cmp  ah,1
    jne  noclose
    cmp  [infrared_enabled],1
    jne  no_dis
    mov  eax,45
    mov  ebx,1
    mov  ecx,4
    int  0x40
    mov  eax,46
    mov  ebx,1
    mov  ecx,0x3f0
    mov  edx,0x3ff
    int  0x40
  no_dis:
    mov  eax,-1                 ; close this program
    int  0x40
  noclose:
   
    jmp  still2
   
   
give_wav:
   
    pusha
   
    mov  eax,55
    mov  ebx,0
    mov  ecx,0x20000
    int  0x40
   
    popa
    ret
   
ir_count db 0x0
   
   
drop_rate dd 100
   
draw_volume:
   
; edi = tic to show
   
    ret
   
    pusha
   
    add  edi,[vol_data]
   
    mov  eax,[drop_rate]
    cmp  eax,2
    jb   no_drop
    sub  eax,2
  no_drop:
    mov  [drop_rate],eax
   
    movzx eax,byte [edi]
    cmp  eax,[drop_rate]
    jge  drop_ok
    mov  eax,[drop_rate]
    mov  [edi],al
    jmp  fixed_drop
  drop_ok:
    mov  [drop_rate],eax
  fixed_drop:
   
    mov  eax,13
    mov  ebx,320*65536+20
    mov  ecx,50*65536+1
    movzx edx,byte [edi]
    shr   edx,1
    mov  esi,128
    sub  esi,edx
    add  ecx,esi
    mov  edx,0x00ff00
    int  0x40
   
    mov  eax,13
    mov  ebx,320*65536+20
    movzx edx,byte [edi]
    shr  edx,1
    mov  ecx,edx
    add  ecx,(50+128)*65536+1
    shl  edx,16
    sub  ecx,edx
    mov  edx,0xff0000
    int  0x40
   
    popa
   
    ret
   
   
read_header:
   
    pusha
   
    mov  dword [file_info+4],0               ; block to read
    mov  dword [file_info+8],1               ; blocks to read
    mov  dword [file_info+12],0x10000+1024   ; return data pointer
    mov  dword [file_info+16],0x60000        ; work area for os
   
    mov  eax,58
    mov  ebx,file_info
    int  0x40
   
    movzx eax,byte [0x10000+1024+12+10]
    mov   [channels],eax
    movzx eax,byte [0x10000+1024+12+20]
    mov   [bytes_per_sample],eax
   
    cmp   [0x10000+1024],dword 'RIFF'
    jne   unknownformat
    cmp   [0x10000+1024+8],dword 'WAVE'
    jne   unknownformat
   
    mov [addb],128
    cmp [channels],1
    je  addb_ok
    mov [addb],256
  addb_ok:
    cmp [bytes_per_sample],1
    je  addb_ok2
    mov [addb],256
  addb_ok2:
   
    mov [bmul],256
    cmp [addb],256
    je  bmok
    mov [bmul],512
  bmok:
   
    cmp [bytes_per_sample],4
    jne no16s
    mov [addb],512   ;mono_stereo
    mov ecx,[mono_stereo]
    shr ecx,1
    shr [addb],cl
    mov [bmul],128   ;mono_stereo
    shl [bmul],cl
  no16s:
   
    popa
   
    ret
   
unknownformat:
   
    mov  [onoff],0
   
    call display_progress
   
    mov  eax,13
    mov  ebx,190*65536+10
    mov  ecx,104*65536+10
    mov  edx,0xff0000
    int  0x40
    pusha
   
    mov  eax,5
    mov  ebx,[pause_between_songs]
    int  0x40
   
    popa
    mov  eax,13
    mov  edx,0x000000
    int  0x40
   
    popa
   
    ret
   
   
   
channels           dd 0x0  ; 1=mono, 2 stereo
bytes_per_sample   dd 0x0  ; 1=8 2=2*8/16 4=16
   
buffer dd 0x20000
   
block  dd 0x2
addb   dd 256    ;  128 = mono 8 bit , 256 = stereo 8 bit/16 bit mono
bmul   dd 0x0    ;  512 = mono 8 bit , 256 = stereo 8 bit/16 bit mono
   
file_size dd 100
   
current_play dd wavfile+40*0
   
   
read_wav:
   
    pusha
   
  new_file:
   
    mov  edx,[block]
   
  newread:
   
    mov  dword [file_info+4],edx             ; block to read
    mov  dword [file_info+8],1               ; blocks to read
    mov  dword [file_info+12],0x10000+1024   ; return data pointer
    mov  dword [file_info+16],0x60000        ; work area for os
   
    mov  eax,58
    mov  ebx,file_info
    int  0x40
   
   
    pusha
    mov  eax,11
    int  0x40
    cmp  eax,1
    jne  no_wd
    call draw_window
  no_wd:
    popa
   
    pusha
    mov  eax,38
    mov  ebx,1*65536+128
    mov  ecx,71*65536+71
    add  ebx,25*65536+25
    mov  edx,0x555555
;    int  0x40
    mov  eax,38
    mov  ebx,[esp+32-12]
    and  ebx,65536/512 -1
    or   ebx,1*65536
    add  ebx,25*65536+25
    mov  ecx,71*65536+71
    mov  edx,0x999999
;    int  0x40
    popa
   
    cmp  eax,0
    je   conp
   
    movzx eax,byte [repeat_song]
    inc   eax
    and   eax,1
    imul  eax,40
    mov  [current_play],wavfile
  play_ok:
   
    mov  [onoff],1
    mov  [playposition],0x20000
    mov  [block],20
   
    mov  eax,5
    mov  ebx,[pause_between_songs]
    add  ebx,[delay]
    int  0x40
   
    call read_header
   
    cmp  [onoff],0
    je   noplay2
    cmp  [repeat_song],0
    je   noplay2
   
    call display_progress
   
    jmp  new_file
   
  noplay2:
   
    mov  [onoff],0
    mov  [block],2
    call display_progress
   
    popa
    ret
  conp:
   
    mov  [file_size],ebx
   
    mov  esi,0x10000+1024   ; 8 bit stereo & 16 bit mono
    mov  edi,edx
    sub  edi,[block]

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?