1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.133
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Borland Turbo Assembler and Tools 5.0
     
  4. gudleifr

    gudleifr

    Регистрация:
    16 сен 2006
    Сообщения:
    2.592
    Повторю. COM-ов без "ORG 100", пардон, "ORG 100h", не бывает.
     
    Последнее редактирование: 23 авг 2013
  5. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Они там в MAK-файле в EXE компиляют, а потом вызывают EXE2BIN.

    В общем, можно попробовать так:
    Код:
    MODEL TINY
    CODESEG
    START:
    ;#############################################################################
    ;##                                                                         ##
    ;##  SBAWE32.ASM                                                            ##
    ;##                                                                         ##
    ;##  Miles Sound System                                                     ##
    ;##                                                                         ##
    ;##  MIDI sound driver for Creative's Sound Blaster AWE32 with Sound Font   ##
    ;##  support.                                                               ##
    ;##                                                                         ##
    ;##  Version 1.00 of 12-Nov-94: Initial version for MSS 3.0                 ##
    ;##                                                                         ##
    ;##  Author: John Miles                                                     ##
    ;##                                                                         ##
    ;##  Modified for AWE32 by: Scott E. Sindorf                                ##
    ;##                         Creative Labs, Inc.                             ##
    ;##                                                                         ##
    ;##  2-Mar-95: Using AWE32 library Version 2.11                             ##
    ;##                                                                         ##
    ;##  Internal functions added                                               ##
    ;##  ------------------------                                               ##
    ;##    SB16_get_mid_vol --- get MIDI volume                                 ##
    ;##    SB16_set_mid_vol --- set MIDI volume                                 ##
    ;##    AWE32_send_sysex --- process SysEx message                           ##
    ;##    AWE32_get_ram ------ get total amount of AWE32 RAM                   ##
    ;##    AWE32_map_mem ------ define partitions in AWE32's RAM                ##
    ;##    AWE32_get_info ----- get sample and preset info from Sound Font      ##
    ;##    AWE32_stream_smpl -- stream sample information to AWE32 RAM          ##
    ;##    AWE32_load_presets - load Sound Font articulation info               ##
    ;##    AWE32_free_part ---- free one or all memory partitions               ##
    ;##                                                                         ##
    ;##                                                                         ##
    ;##  8086 ASM source compatible with MASM or TASM                           ##
    ;##                                                                         ##
    ;#############################################################################
    ;##                                                                         ##
    ;##  Copyright (C) 1991-1996 RAD Game Tools, Inc.                           ##
    ;##                                                                         ##
    ;##  Contact RAD Game Tools at 801-322-4300 for technical support.          ##
    ;##                                                                         ##
    ;#############################################################################
    
    DEVICE_NAME     equ <'Creative Sound Blaster AWE32'>
    LEFTMIDIVOL     equ 34h
    RIGHTMIDIVOL    equ 35h
    
    NOTEOFF         equ 80h
    NOTEON          equ 90h
    NOTEPRESSURE    equ 0a0h
    CONTROL         equ 0b0h
    PROGRAM         equ 0c0h
    CHLPRESSURE     equ 0d0h
    PITCHBEND       equ 0e0h
    SYSEXMSG        equ 0f0h
    
                    ;
                    ;Prologue and common driver functions
                    ;
    
                    INCLUDE mss_mdi.inc
                    INCLUDE ctaweapi.inc
                    INCLUDE sbawe32.inc
    
                    ;
                    ;Driver description table (DDT)
                    ;
    
    DDT             LABEL WORD
    
    library_env     dw 0
                    dw 0
    
    GTL_suffix      dw ?
                    dw ?
    
    num_voices      dw ?
    
    max_melodic_ch  dw 16
    min_melodic_ch  dw 1
    percussion_ch   dw 10
    
                    ;
                    ;Driver state table (DST)
                    ;
    
    DST             LABEL WORD
    
    library_dir     db 128 dup (?)
    GTL_filename    db 128 dup (?)
    
    MIDI_data       db 512 dup (?)
    
                    ;
                    ;Constant configuration data
                    ;
    
    env_config      db 'BLASTER',0
    suffix          db 'SBK',0
    
    dev_configs     IO_PARMS <620h,-1,-1,-1, -1,-1,-1,-1>
                    IO_PARMS <640h,-1,-1,-1, -1,-1,-1,-1>
                    IO_PARMS <660h,-1,-1,-1, -1,-1,-1,-1>
                    IO_PARMS <680h,-1,-1,-1, -1,-1,-1,-1>
    
    N_CONFIGS       equ 4
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Device-specific data and procedures                                    ##
    ;##                                                                         ##
    ;#############################################################################
    
    MIX_ADDR        dw ?                    ;IO_ADDR+04h
    init_volume     dw ?                    ;Initial voice volume
    current_volume  dw ?                    ;Current voice volume
    
    
    IFDEF SFONT                             ; structure for handling Sound Fonts
      SFInfo        SOUND_PACKET <0,MAXBANKS,0,0,0,0,0,0,0,0,0,0>
      banksizes     dd MAXBANKS dup(0)
    ENDIF
    
    
    ;----------------ї
    ;іAWE32 variablesі
    ;L----------------
    PUBLIC C awe32NumG
    PUBLIC C awe32BaseAddx
    PUBLIC C awe32DramSize
    
    awe32NumG       DW      30
    awe32BaseAddx   DW      0620h, 0a20h, 0e20h
    awe32DramSize   DD      040000h
    
    PUBLIC C awe32Scratch
    PUBLIC C awe32SFont
    PUBLIC C awe32GChannel
    PUBLIC C awe32MIDIChannel
    PUBLIC C awe32SoundPad
    
    awe32Scratch        SCRATCH         <>
    awe32SFont          SOUNDFONT       4 DUP({})
    awe32GChannel       GCHANNEL        32 DUP({})
    awe32MIDIChannel    MIDICHANNEL     16 DUP({})
    awe32SoundPad       SOUNDPAD        <>
    
    EXTRN C awe32SPad1Obj:BYTE
    EXTRN C awe32SPad2Obj:BYTE
    EXTRN C awe32SPad3Obj:BYTE
    EXTRN C awe32SPad4Obj:BYTE
    EXTRN C awe32SPad5Obj:BYTE
    EXTRN C awe32SPad6Obj:BYTE
    EXTRN C awe32SPad7Obj:BYTE
    
    ;-----------------------ї
    ;іMIDI support functionsі
    ;L-----------------------
    EXTRN PASCAL awe32InitMIDI       :NEAR
    EXTRN PASCAL awe32NoteOn         :NEAR
    EXTRN PASCAL awe32NoteOff        :NEAR
    EXTRN PASCAL awe32ProgramChange  :NEAR
    EXTRN PASCAL awe32Controller     :NEAR
    EXTRN PASCAL awe32PolyKeyPressure:NEAR
    EXTRN PASCAL awe32ChannelPressure:NEAR
    EXTRN PASCAL awe32PitchBend      :NEAR
    EXTRN PASCAL awe32Sysex          :NEAR
    
    ;---------------------------ї
    ;іHardware support functionsі
    ;L---------------------------
    EXTRN PASCAL awe32Detect      :NEAR
    EXTRN PASCAL awe32InitHardware:NEAR
    EXTRN PASCAL awe32Terminate   :NEAR
    
    ;--------------------------------------------------------------ї
    ;і  Soundfont support functions                                і
    ;L--------------------------------------------------------------
    IFDEF SFONT
    EXTRN PASCAL awe32TotalPatchRam   :NEAR
    EXTRN PASCAL awe32DefineBankSizes :NEAR
    EXTRN PASCAL awe32SFontLoadRequest:NEAR
    EXTRN PASCAL awe32StreamSample    :NEAR
    EXTRN PASCAL awe32SetPresets      :NEAR
    EXTRN PASCAL awe32ReleaseBank     :NEAR
    EXTRN PASCAL awe32ReleaseAllBanks :NEAR
    ENDIF
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  SB16_get_mid_vol                                                       ##
    ;##                                                                         ##
    ;##  Description: Get volume register value = AX (0-127)                    ##
    ;##                                                                         ##
    ;##  Input: none                                                            ##
    ;##                                                                         ##
    ;##  Output: AL = left voice volume                                         ##
    ;##          AH = right voice volume                                        ##
    ;##                                                                         ##
    ;##  Destroys AX, CX, DX                                                    ##
    ;##                                                                         ##
    ;#############################################################################
    
    SB16_get_mid_vol  PROC
    
                    mov dx,MIX_ADDR             
                    mov al,LEFTMIDIVOL
                    out dx,al
                    inc dx
                    in al,dx
                    mov cl,al
    
                    dec dx
                    mov al,RIGHTMIDIVOL
                    out dx,al
                    inc dx
                    in al,dx
                    mov ch,al
    
                    and cl,11111000b
                    and ch,11111000b
    
                    mov ax,cx
                    ret
    
    SB16_get_mid_vol  ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  SB16_set_mid_vol                                                       ##
    ;##                                                                         ##
    ;##  Description: Set volume register value = AX (0-127)                    ##
    ;##                                                                         ##
    ;##  Input: AL = left voice volume                                          ##
    ;##         AH = right voice volume                                         ##
    ;##                                                                         ##
    ;##  Output: none                                                           ##
    ;##                                                                         ##
    ;##  Destroys AX, CX, DX                                                    ##
    ;##                                                                         ##
    ;#############################################################################
    
    SB16_set_mid_vol  PROC
    
                    and al,11111000b
                    mov cl,al
                    and ah,11111000b
                    mov ch,ah
    
                    mov dx,MIX_ADDR             
                    mov al,LEFTMIDIVOL
                    out dx,al
                    inc dx
                    in al,dx
                    and al,00000111b
                    or al,cl
                    out dx,al
    
                    dec dx
                    mov al,RIGHTMIDIVOL
                    out dx,al
                    inc dx
                    in al,dx
                    and al,00000111b
                    or al,ch
                    out dx,al
    
                    ret
    
    SB16_set_mid_vol  ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_send_sysex                                                       ##
    ;##                                                                         ##
    ;##  Description: Send a System Exclusive message to the AWE32              ##
    ;##                                                                         ##
    ;##  Input: DS:SI = pointer to second byte in sysex msg                     ##
    ;##                                                                         ##
    ;##  Output: none                                                           ##
    ;##                                                                         ##
    ;##  Destroys AX                                                            ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_send_sysex  PROC
    
                    push cx                 ;store message count
                    xor cx,cx               ;setup for determining msg size
    
                    dec si                  ;backup to beginning of msg
                    push si
    __sysex_fetch:
                    lodsb                   ;determine message size
                    inc cx
                    cmp al, 0f7h
                    jne __sysex_fetch
    
                    pop ax                  ;get msg starting location
    
                    push si                 ;save current pointer location
    
                    push cx                 ;make all SysEx msgs from channel 1
                    push ax                 ;sysex message pointer
                    push ds
                    push cx                 ;msg size
                    call awe32Sysex
    
                    pop si                  ;retrieve current pointer location
                    pop cx                  ;retrieve message count
    
                    ret
    
    AWE32_send_sysex  ENDP
    
    IFDEF SFONT
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_get_ram                                                          ##
    ;##                                                                         ##
    ;##  Description: Get the total amount of RAM on the AWE32                  ##
    ;##                                                                         ##
    ;##  Input: none                                                            ##
    ;##                                                                         ##
    ;##  Output: DX:SI = total RAM on the AWE32                                 ##
    ;##          AX = ok (0) or error                                           ##
    ;##                                                                         ##
    ;##  Destroys AX                                                            ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_get_ram   PROC
    
                    mov ax,ds                       ;parameter SFInfo
                    push ax
                    mov ax,OFFSET SFInfo
                    push ax
    
                    call awe32TotalPatchRam         ;AWE32 library call
                    mov dx,WORD PTR [SFInfo._total_patch_ram+2]
                    mov si,WORD PTR [SFInfo._total_patch_ram]
                    ret
    AWE32_get_ram   ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_map_mem                                                          ##
    ;##                                                                         ##
    ;##  Description: Defines partitions in the AWE32 RAM space for multiple    ##
    ;##               Sound Font uploads.                                       ##
    ;##                                                                         ##
    ;##  Input: DX:SI = Pointer to structure containing the memory map array    ##
    ;##                 and the partition count (number of entries in array).   ##
    ;##                                                                         ##
    ;##  Output: AX = ok (0) or error                                           ##
    ;##                                                                         ##
    ;##  Destroys AX, CX, SI, DI, ES                                            ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_map_mem   PROC
                    push ds                         ;store DS
                    push ds                         ;ES = DS
                    pop es
    
                    mov ds,dx
                    mov cx,[si]    ;get partition count
                    mov es:[SFInfo._total_banks],cx
    
                    mov ds,[si+2];get pointer to partition sizes array
                    xor si,si
    
                    mov di,OFFSET banksizes         ;get pointer to banksizes array
                    shl cx,1                        ;transfer 2 words for each entry
    __getBankSize:
                    movsw                           ;copy data to banksizes array
                    loop __getBankSize
    
                    pop ds
    
                    mov ax,ds                       ;parameter SFInfo
                    push ax
                    mov ax,OFFSET SFInfo
                    push ax
    
                    call awe32DefineBankSizes       ;AWE32 library call
                    ret
    AWE32_map_mem   ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_get_info                                                         ##
    ;##                                                                         ##
    ;##  Description: Defines partitions in the AWE32 RAM space for multiple    ##
    ;##               Sound Font uploads.                                       ##
    ;##                                                                         ##
    ;##  Input: DX:SI = Pointer to structure containing the memory map array    ##
    ;##                 and the partition count (number of entries in array).   ##
    ;##                                                                         ##
    ;##  Output: AX = ok (0) or error                                           ##
    ;##                                                                         ##
    ;##  Destroys AX, DX, SI, ES                                                ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_get_info  PROC
                    mov es,dx
    
                    mov ax,es:[si] ;get bank number
                    mov [SFInfo._bank_no],ax
    
                    mov ax,es:[si+2];get pointer to header data
                    mov WORD PTR [SFInfo._data+2],ax
                    mov WORD PTR [SFInfo._data],0
    
                    mov ax,ds                       ;parameter SFInfo
                    push ax
                    mov ax,OFFSET SFInfo
                    push ax
    
                    call awe32SFontLoadRequest      ;AWE32 library call
                    mov dx,ds
                    mov si,OFFSET [SFInfo._no_sample_packets]
                    ret
    AWE32_get_info  ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_stream_smpl                                                      ##
    ;##                                                                         ##
    ;##  Description: Loads the 16 bit PCM data into the AWE32 RAM.             ##
    ;##                                                                         ##
    ;##  Input: DX:SI = Pointer to structure containing the sample data and its ##
    ;##                 associated bank number.                                 ##
    ;##                                                                         ##
    ;##  Output: AX = ok (0) or error                                           ##
    ;##                                                                         ##
    ;##  Destroys AX, ES                                                        ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_stream_smpl  PROC
    
                    mov es,dx
    
                    mov ax,es:[si] ;get bank number
                    mov [SFInfo._bank_no],ax
    
                    mov ax,es:[si+2];get pointer to sample data
                    mov WORD PTR [SFInfo._data+2],ax
                    mov WORD PTR [SFInfo._data],0
    
                    mov ax,ds                       ;parameter SFInfo
                    push ax
                    mov ax,OFFSET SFInfo
                    push ax
    
                    call awe32StreamSample          ;return in ax
                    ret
    AWE32_stream_smpl  ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_load_presets                                                     ##
    ;##                                                                         ##
    ;##  Description: Loads articulation information into the driver.           ##
    ;##                                                                         ##
    ;##  Input: DX:SI = Pointer to structure containing the preset data and its ##
    ;##                 associated bank number.                                 ##
    ;##                                                                         ##
    ;##  Output: AX = ok (0) or error                                           ##
    ;##                                                                         ##
    ;##  Destroys AX, ES                                                        ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_load_presets  PROC
    
                    mov es,dx
    
                    mov ax,es:[si] ;get bank number
                    mov [SFInfo._bank_no],ax
    
                    mov ax,es:[si+2];get pointer to preset data
                    mov WORD PTR [SFInfo._presets+2],ax
                    mov WORD PTR [SFInfo._presets],0
    
                    mov ax,ds                       ;parameter SFInfo
                    push ax
                    mov ax,OFFSET SFInfo
                    push ax
    
                    call awe32SetPresets            ;return in ax
                    ret
    AWE32_load_presets  ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  AWE32_free_part                                                        ##
    ;##                                                                         ##
    ;##  Description: Frees one or all of the memory partitions defined in the  ##
    ;##               call to AWE32_map_mem().                                  ##
    ;##                                                                         ##
    ;##  Input: AX = Partition (bank) to free or ALL (-1).                      ##
    ;##                                                                         ##
    ;##  Output: AX = ok (0) or error                                           ##
    ;##                                                                         ##
    ;##  Destroys AX                                                            ##
    ;##                                                                         ##
    ;#############################################################################
    
    AWE32_free_part  PROC
                    mov [SFInfo._bank_no],ax
    
                    mov ax,ds                       ;parameter SFInfo
                    push ax
                    mov ax,OFFSET SFInfo
                    push ax
    
                    cmp [SFInfo._bank_no], ALL
                    je __free_all
    
                    call awe32ReleaseBank           ;AWE32 library call
                    ret
    __free_all:
                    call awe32ReleaseAllBanks       ;AWE32 library call
                    ret
    AWE32_free_part  ENDP
    
    
    
    ENDIF           ;(IFDEF SFONT)
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 300H (Initialize Driver)                                      ##
    ;##                                                                         ##
    ;##  Must call MDI_init in MSS_MDI.INC to initialize common driver          ##
    ;##  data, then set up variables which are specific to this driver          ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_300H         PROC
    
                    call MDI_init
    
                    ;
                    ;Initialize SBAWE32 driver data
                    ;
    
                    mov ax,OFFSET dev_configs
                    mov common_configs,ax
    
                    mov num_configs,N_CONFIGS
    
                    mov ax,OFFSET env_config    ;ptr to environment variable name
                    mov env_name,ax
    
                    mov ax,OFFSET suffix        ;ptr to SBK suffix
                    mov GTL_suffix,ax
    
                    mov service_rate,-1
    
                    mov ax,awe32NumG            ;get number of voices
                    mov num_voices,ax
    
                    ;
                    ;Return success
                    ;
    
                    mov caller_AX,1
                    ret
    
    FN_300H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 301H (Get Driver Information)                                 ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_301H         PROC
    
                    mov caller_DX,cs
                    mov caller_AX,OFFSET DDT
    
                    mov caller_CX,cs
                    mov caller_BX,OFFSET DST
    
                    ret
    
    FN_301H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 302H (Periodic Interrupt Service)                             ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_302H         PROC
    
                    mov caller_AX,-1
                    ret
    
    FN_302H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 303H (Parse Environment String... if found)                   ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_303H         PROC
                    
                    ;
                    ;Initialize VHDR.IO members to -1
                    ;
    
                    cld
                    mov cx,SIZE IO_PARMS
                    mov di,OFFSET IO_ADDR
                    mov al,-1
                    rep stosb
    
                    ;
                    ;Shift scratch string right one character and left-pad
                    ;with blank, to ensure leading space before first field
                    ;
    
                    mov bx,OFFSET scratch+126
    __shift:        mov al,[bx]
                    mov [bx+1],al
                    dec bx
                    cmp bx,OFFSET scratch-1
                    jne __shift
    
                    mov scratch[0],' '
                    
                    ;
                    ;Expected BLASTER format: _A220
                    ;(_ = space)
                    ;
    
                    mov bx,0
    
    __scan_string:  cmp bx,128
                    jae __parse_done
    
                    cmp BYTE PTR scratch[bx],0
                    je __parse_done
    
                    cmp WORD PTR scratch[bx],'A '
                    je __parse_A
    
                    cmp WORD PTR scratch[bx],'a '
                    je __parse_A
    
                    cmp WORD PTR scratch[bx],'E '
                    je __parse_E
    
                    cmp WORD PTR scratch[bx],'e '
                    je __parse_E
    
                    inc bx
                    jmp __scan_string
    
    __parse_A:      add bx,2                        ;get mixer address
                    mov ax,16
                    call ASC_val
                    add ax,4
                    mov MIX_ADDR,ax
                    jmp __scan_string
    
    __parse_E:      add bx,2                        ;get EMU8000 address
                    mov ax,16
                    call ASC_val
                    add ax,4
                    mov awe32BaseAddx ,ax
                    jmp __scan_string
    
    __parse_done:   mov ax,awe32BaseAddx
                    mov caller_AX,ax                ;(-1 = 0ffffh)
                    ret
    
    FN_303H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 304H (Verify Device I/O Parameters)                           ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_304H         PROC
    
                    ;
                    ;Set I/O addresses
                    ;
    
                    mov ax,IO_ADDR
                    push ax
                    call awe32Detect
                    or   ax,ax
                    je   __found
    
                    mov caller_AX,0                 ;error!
                    jmp  __exit
    __found:
                    mov caller_AX,1                 ;detected
    
    __exit:         ret
    
    FN_304H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 305H (Initialize Device)                                      ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_305H         PROC
    
                    call awe32InitHardware
    
    IFDEF SFONT
                    mov ax,ds                       ;assign banksizes array to SFInfo structure
                    mov WORD PTR [SFInfo._banksizes+2],ax
                    mov ax,OFFSET banksizes
                    mov WORD PTR [SFInfo._banksizes],ax
    ENDIF
    
                    lea  bx,[awe32SoundPad]         ;initialize the pads
                    mov  ax,ds
                    mov  [bx+2],ax                  ;SPad1
                    mov  [bx+6],ax                  ;SPad2
                    mov  [bx+10],ax                 ;SPad3
                    mov  [bx+14],ax                 ;SPad4
                    mov  [bx+18],ax                 ;SPad5
                    mov  [bx+22],ax                 ;SPad6
                    mov  [bx+26],ax                 ;SPad7
                    lea  ax,awe32SPad1Obj
                    mov  [bx],ax
                    lea  ax,awe32SPad2Obj
                    mov  [bx+4],ax
                    lea  ax,awe32SPad3Obj
                    mov  [bx+8],ax
                    lea  ax,awe32SPad4Obj
                    mov  [bx+12],ax
                    lea  ax,awe32SPad5Obj
                    mov  [bx+16],ax
                    lea  ax,awe32SPad6Obj
                    mov  [bx+20],ax
                    lea  ax,awe32SPad7Obj
                    mov  [bx+24],ax
    
                    call awe32InitMIDI              ;initialize the driver
    
                    ;
                    ;Read and preserve current volume settings
                    ;Set right volume equal to left volume
                    ;
                    
                    call SB16_get_mid_vol
                    mov init_volume,ax
    
                    mov ah,al
                    mov current_volume,ax
    
                    call SB16_set_mid_vol
    
                    mov caller_AX,1
    __exit:
                    ret
    
    FN_305H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 306H (Shut Down Device)                                       ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_306H         PROC
    
                    call awe32Terminate
    
                    ;
                    ;Restore volume to initial value
                    ;
    
                    mov ax,init_volume
                    call SB16_set_mid_vol
                    
                    mov caller_AX,1
                    ret
    
    FN_306H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 500H (Get/Set MIDI Hardware Volume)                           ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_500H         PROC
    
                    mov ax,caller_DX
                    cmp ax,-1
                    je __read_volume
    
                    shl ax,1
    
                    mov ah,al
                    mov current_volume,ax
    
                    call SB16_set_mid_vol
    
    __read_volume:
                    call SB16_get_mid_vol
                    mov ax,current_volume
                    mov ah,0
    
                    shr ax,1
    
                    mov caller_AX,ax
                    ret
    
    FN_500H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 501H (Initialize Instrument Manager)                          ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_501H         PROC
                    
                    mov caller_AX,-1
                    ret
    
    FN_501H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 502H (Transmit MIDI Data)                                     ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_502H         PROC
    
                    LOCAL __saveSI:WORD
                    LOCAL __saveCX:WORD
                    
                    cld
    
                    mov cx,caller_CX        ;get # of MIDI messages to send
                    jcxz __exit             ;exit if none
    
                    mov si,OFFSET MIDI_data ;SI -> MIDI message list to send
    
    __for_message:  lodsb                   ;get status/channel byte
                    mov bl,al
                    cmp bl,SYSEXMSG
                    jne __notsysex
                    call AWE32_send_sysex
                    jmp __next_message
    __notsysex:
                    and bx,11110000b        ;separate command
                    and ax,00001111b        ;separate channel
                    push ax                 ;MIDI channel
                    lodsb
                    push ax                 ;note number/ctrlr #/pitchbend LSB
                    lodsb                   ;velocity/data/pitchbend MSB
                    push ax
    
                    mov __saveSI, si        ;save so C library calls won't trash
                    mov __saveCX, cx        ;
    
                    cmp bl,NOTEOFF
                    jne __noteon
                    call awe32NoteOff
                    jmp __next_message
    __noteon:
                    cmp bl,NOTEON
                    jne __polykey
                    call awe32NoteOn
                    jmp __next_message
    __polykey:
                    cmp bl,NOTEPRESSURE
                    jne __controller
                    call awe32PolyKeyPressure
                    jmp __next_message
    __controller:
                    cmp bl,CONTROL
                    jne __program
                    call awe32Controller
                    jmp __next_message
    __program:
                    cmp bl,PROGRAM
                    jne __channel
                    dec __saveSI            ;put 2nd data back
                    pop ax
                    call awe32ProgramChange
                    jmp __next_message
    __channel:
                    cmp bl,CHLPRESSURE
                    jne __pitchbend
                    dec __saveSI            ;put 2nd data back
                    pop ax
                    call awe32ChannelPressure
                    jmp __next_message
    __pitchbend:
                    cmp bl, PITCHBEND
                    jne __next_message
                    call awe32PitchBend
                    jmp __next_message
    __next_message:
                    mov si, __saveSI        ;restore them
                    mov cx, __saveCX
                    loop __for_message      ;do for all messages in list
    __exit:
                    mov caller_AX,1         ;exit w/success code when done
                    ret
    
    FN_502H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 503H (Install Timbre Set)                                     ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_503H         PROC
    
                    mov caller_AX,-1
                    ret
    
    FN_503H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 504H (Get Timbre Status)                                      ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_504H         PROC
                    
                    mov caller_AX,-1
                    ret
    
    FN_504H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 505H (Protect/Unprotect Timbre)                               ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_505H         PROC
                    
                    mov caller_AX,-1
                    ret
    
    FN_505H         ENDP
    
    ;#############################################################################
    ;##                                                                         ##
    ;##  Function 506H (Vendor-Specific Extensions)  SBAWE32                    ##
    ;##                                                                         ##
    ;#############################################################################
    
    FN_506H         PROC
    
                    mov ax,-1                       ;VSE function not supported
    IFDEF SFONT
                    mov cx,caller_CX                ;get function number
                    cmp cx,GETTOTALRAM
                    jne __defbanksizes
    
                    call AWE32_get_ram
                    mov caller_DX,dx                ;total patch ram in DX:SI
                    mov caller_SI,si
                    jmp __exit
    __defbanksizes:
                    cmp cx,DEFBANKSIZES
                    jne __getinfo
    
                    mov dx,caller_DX                ;get pointer to SF_DATA structure
                    mov si,caller_SI                ; memory mapping info inside
                    call AWE32_map_mem
                    jmp __exit
    __getinfo:
                    cmp cx,SF_GETINFO
                    jne __streamsmpl
    
                    mov dx,caller_DX                ;get pointer to SF_DATA structure
                    mov si,caller_SI                ; header data inside
                    call AWE32_get_info
                    mov caller_DX,dx                ;AWE32 Info in DX:SI
                    mov caller_SI,si
                    jmp __exit
    __streamsmpl:
                    cmp cx,SF_STREAMSMPL
                    jne __setpresets
    
                    mov dx,caller_DX                ;get pointer to SF_DATA structure
                    mov si,caller_SI                ; sample data inside
    
                    call AWE32_stream_smpl          ;return in ax
                    jmp __exit
    __setpresets:
                    cmp cx,SF_SETPRESETS
                    jne __freebnk
    
                    mov dx,caller_DX                ;get pointer to SF_DATA structure
                    mov si,caller_SI                ; preset data inside
    
                    call AWE32_load_presets
                    jmp __exit
    __freebnk:
                    cmp cx,FREEBANK
                    jne __exit
    
                    mov ax,caller_DX                ;get bank number
                    call AWE32_free_part
    
    ENDIF
    __exit:
                    mov caller_AX,ax                ;set return value
                    ret
    
    FN_506H         ENDP
    
                    END START
    Линкер ругнётся на стэк, но у нас ведь exe2bin потом результат обработает, так что должно работать.

    Другими слова, вот это в самое начало:
    Код:
    MODEL TINY
    CODESEG
    START:
    а в конце END заменить на END START.

    Ну и вот:
    tasm /m /w+ /ml /dSBAWE32 /dSFONT /dTASM sbawe32.asm
    tlink /x sbawe32,,,rawe32s
    exe2bin sbawe32.exe sbawe32.mdi
     

    Вложения:

    • drv.zip
      Размер файла:
      25,2 КБ
      Просмотров:
      37
    SAS, Чёрный Думер, ThisSuXX и 3 другим нравится это.
  6. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Ок, таким образом откомпилировалось. Проверить пока полностью не могу, но похоже, что драйвер получился рабочим. Спасибо!

    UPD: драйвер отлично работает!
     
    Последнее редактирование: 13 сен 2013
    A.P.$lasH нравится это.
  7. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    :facepalm:

    Хочу сделать TSR для защищенного режима. Судя по документации DPMI 1.0, необходимо вызвать сперва функцию 0C00h для подготовки, а затем 0C01h для непосредственно terminate-and-stay-resident. Соответственно, сляпал код:

    Код:
    typedef struct
    {
        long long lDesc16Data;
        long long lDesc16Code;
        short lOff16Proc;
        short res;
        long long lDesc32Data;
        long long lDesc32Code;
        long lOff32Proc; 
    } rs_buf;
    
    Код:
    int InstallResidentServiceProviderCallback(long long data_descriptor)
    {
       union REGS r;
       struct SREGS sr;
    
       rs_buf rs_buffer[1];
    
       rs_buffer->lDesc16Data = 0;
       rs_buffer->lDesc16Code = 0;
       rs_buffer->lOff16Proc = 0;
       rs_buffer->res = 0;
       rs_buffer->lDesc32Data = data_descriptor;
       rs_buffer->lDesc32Code = 0;
       rs_buffer->lOff32Proc = 0;
    
       r.x.eax = 0x0C00;
       sr.es = FP_SEG(rs_buffer);
       r.x.edi = FP_OFF(rs_buffer);
    
       int386x (0x31, &r, &r, &sr);
    
       if (r.x.cflag)                                // Call failed?
       {
         return(r.w.ax);
       }
       else
       {
         return 0;
       }
    }
    
    Так как я не собираюсь оставлять в памяти никакого кода, а только буфер с данными для последующего использования железом, то инициализирую только дескриптор данных 32-битного режима.

    Однако вызов завершается с ошибкой (установлен carry flag). При этом:

    А у меня возвращается 0C00h, то есть в регистре AX так и остается номер функции прерывания 31h.

    Что я делаю не так?
     
    Последнее редактирование: 13 сен 2013
  8. ThisSuXX

    ThisSuXX

    Регистрация:
    2 дек 2005
    Сообщения:
    934
    Geryon, скорей всего надо просто прописать данные для сегментных регистров DS, FS, GS тоже. Могу быть не прав. :)
     
  9. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Это как? Функция 0C00h принимает в ES селектор 40-байтной структуры с инфой по локациям кода и данных, которые предполагается оставить в памяти после вызова 0C01h. Что предлагаешь прописать в DS, FS и GS?
     
  10. ThisSuXX

    ThisSuXX

    Регистрация:
    2 дек 2005
    Сообщения:
    934
    Geryon, они нужны не для прерывания 31h, а для того чтобы функция int386x () работала правильно.

    PS: Я уже лет десять ничего не программировал. :)
     
    Geryon нравится это.
  11. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Это не помогает. Проблема, видимо, в совместимости со стандартом DPMI 1.0. Я использовал экстендер PMODE/W, совместимый лишь с DPMI 0.9 - отсюда и симптомы, т.к. согласно спецификациям DPMI 0.9, функция при сбое лишь устанавливает carry flag, а регистр AX оставляет без изменений. Код ошибки начал записываться в AX только начиная с DPMI 1.0.

    Я сменил экстендер на Causeway - и функция заработала. DOS/4GW и DOS/32A вообще жестоко крашатся.

    На всякий случай я добавил код, инициализирующий DS, FS и GS, но поведение всех четырех доступных экстендеров после этого не изменилось.
     
    ThisSuXX нравится это.
  12. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Ок, из известных мне дос-экстендеров TSR-функции, видимо, поддерживает только DOS/4G (DOS/4GW и DOS/4GW Pro не поддерживают).

    Ни у кого случаем не завалялся? Сам экстендер (dos4g.exe) можно взять из дистрибутива Eradicator, но хочется полный пакет.
     
  13. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, он идёт в составе Watcom C.
     
  14. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Википедия говорит следующее:

    По крайней мере, в моем дистрибутиве WATCOM C++ есть только DOS/4GW, в котором нужного мне функционала нет :(
     
  15. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
  16. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.133
    daemolisher, SAS, Steel Rat и 3 другим нравится это.
  17. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    не игру в 64к, а игру, которая в заархивированном виде будет весить 64К... То есть основное требование не к коду игры, а к сжимаемости её указанными в описании конкурса архиваторами и предоставленным линкером. Из-за чего конкурс выглядит несколько убого и странно. Отсутствие призов вообще всё сводит на уровень п-мерства. А обсуждаемые участниками технологии и инструменты способны доставить тонну лулзов.
    Интересно, что обсуждается исключительно написание игр использующих DX10...
     
    Чёрный Думер и Steel Rat нравится это.
  18. Чёрный Думер и все виды материала

    Чёрный Думер

    Регистрация:
    17 мар 2010
    Сообщения:
    2.434
    Алгоритм циклического нуля?
     
    Bato-San нравится это.
  19. daemolisher

    daemolisher

    Регистрация:
    2 дек 2009
    Сообщения:
    1.704
    поучаствуйте и выиграйте,

    легко сказать, что правила конкурса не нравятся



    P.S.
    для того, кто хоть немного знаком с программированием и современной демосценой требования выглядят более чем разумно

     
  20. INHELLER

    INHELLER

    Регистрация:
    19 май 2009
    Сообщения:
    7.228
    daemolisher > Я бы запретил пользоваться каким-либо архиватором. :spiteful:
    А то так недостаточно круто.
     
    Steel Rat нравится это.
  21. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    У кого-нибудь есть идеи как бороться с этим говном?
    .
    Код:
    steelrat@inspiron:~$ android
    Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display
    	at com.android.sdkmanager.Main.showSdkManagerWindow(Main.java:346)
    	at com.android.sdkmanager.Main.doAction(Main.java:334)
    	at com.android.sdkmanager.Main.run(Main.java:120)
    	at com.android.sdkmanager.Main.main(Main.java:103)
    Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Display
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    
    OS - Ubuntu 13.04, библиотека SWT установлена и сторонняя и имеется собственная из Android SDK - разница лишь в количестве ненайденных классов. Решение из Гуглу - разрешить выполнение в папке /tmp - мне не помогает, у меня там и так всё разрешено.
    Забавно, Android Studio работает, а Eclipse вываливает примерно с теми же ошибками.
     
    Последнее редактирование: 6 окт 2013
  22. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Другой вопрос. Есть либа из двух с половиной файлов - minizip ( http://www.winimage.com/zLibDll/unzip11.zip ) . make говорит, что no rule for target. Это почему? Или так - каких сведений в моём вопросе недостаточно?
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление