home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / ssp / ssp_on.asm < prev    next >
Assembly Source File  |  1980-01-02  |  8KB  |  361 lines

  1. ;************************************************************************
  2. ;*                                                                      *
  3. ;*     Super Sound Player  for FM TOWNS                                 *
  4. ;*                                                                      *
  5. ;*             Switch ON program                                        *
  6. ;*                                                                      *
  7. ;*            by HONESEN    since 1990/10/20                            *
  8. ;*                                1990/10/21  ver0.0                    *
  9. ;*                                1990/10/27  ver1.0                    *
  10. ;*                                1990/10/28  ver1.1    for Oh!FM       *
  11. ;*                                1990/11/11  ver1.2                    *
  12. ;*                                1990/11/12  ver1.2a                   *
  13. ;*                                                                      *
  14. ;*                                1990/11/23  ver2.0    T-OS L30        *
  15. ;*                                1990/12/10  ver2.1                    *
  16. ;*                                                                      *
  17. ;************************************************************************
  18.  
  19.         .386p
  20.         assume    cs:_code,ds:_code
  21.  
  22. ;========================================
  23. ; constant definition
  24. ;========================================
  25.  
  26. SND_BIOS_ent_o    equ    80H
  27. SND_BIOS_ent_x    equ    14000H
  28. tone_work    equ    14008H
  29. xprog_ent    equ    14100H
  30. tone_data    equ    14080H
  31.  
  32. _code        segment    para public use32 'code'
  33.  
  34. ;========================================
  35. ; main routine
  36. ;========================================
  37.  
  38. main        proc    near
  39. ; ----- Set T-BIOS selecter
  40.         mov    ax,0118H
  41.         mov    es,ax                ; set selecter
  42. ; ----- Transfer extended program
  43.         mov    ebx,offset xprog        ; sorce address
  44.         mov    edx,xprog_ent            ; destination address
  45.         mov    ecx,offset xprog_e-offset xprog ; size
  46. main0:        mov    al,[ebx]
  47.         mov    es:[edx],al
  48.         inc    ebx
  49.         inc    edx
  50.         loop    main0
  51. ; ----- Check SSP OFF
  52.         mov    eax,es:[SND_BIOS_ent_o]
  53.         cmp    eax,xprog_ent
  54.         jz    main1
  55. ; ----- Patch up SND_BIOS jump table
  56.         mov    es:[SND_BIOS_ent_x],eax
  57.         mov    eax,xprog_ent
  58.         mov    es:[SND_BIOS_ent_o],eax
  59.         mov    ax,0110H
  60.         mov    es:[SND_BIOS_ent_x+4],ax
  61. ; ----- Exit back to DOS.
  62. main1:        mov    ax,04C00H
  63.         int     21H
  64. main        endp
  65.  
  66. ;========================================
  67. ; T-BIOS extended program
  68. ;========================================
  69.  
  70. xprog        proc    far
  71.         call    pword ptr cs:[SND_BIOS_ent_x]
  72.         pushfd
  73.         cmp    ah,1            ; KEY ON ?
  74.         jnz    xprog0
  75.         push    09DD9H            ; Push FM color
  76.         push    02EE2H            ; Push PCM color
  77.         call    interval        ; Write interval indicator
  78.         lea    esp,[esp+8]
  79.         jmp    xprog_ret
  80. xprog0:        cmp    ah,2            ; KEY OFF ?
  81.         jnz    xprog1
  82.         mov    dl,127            ; Set volume 0
  83.         push    0            ; indicator color is black
  84.         push    0
  85.         call    interval        ; Erase interval indicator
  86.         lea    esp,[esp+8]        ; ^^^^^ Write black 
  87.         jmp    xprog_ret
  88. xprog1:        cmp    ah,4            ; TONE CHANGE ?
  89.         jnz    xprog2
  90.         call    tone            ; Write tone name
  91.         jmp    xprog_ret
  92. xprog2:        cmp    ah,3            ; PAN CHANGE ?
  93.         jnz    xprog_ret
  94.         call    pan            ; write pan indicator
  95. xprog_ret:    popfd
  96.         ret
  97.  
  98. ;---------------------------------------
  99. ; interval indicator
  100. ;---------------------------------------
  101.  
  102. interval    proc    near
  103.         pushad
  104.         push    es
  105.         push    fs
  106.         mov    ax,118H            ; Set selecter
  107.         mov    es,ax
  108.         mov    ax,1CH
  109.         mov    fs,ax
  110. ; ----- If color=black (KEY OFF) then dh=interval when key on
  111. ;                                else save interval
  112.         movzx    ebx,bl
  113.         cmp    dword ptr ss:[esp+44],0
  114.         jz    interval2
  115.         mov    es:[ebx+tone_work],dh
  116.         jmp    interval3
  117. interval2:    mov    dh,es:[ebx+tone_work]
  118. ; ----- indicator position  --> edx
  119. interval3:    call    getadr            ; Get VRAM address
  120.         jc    interval_r
  121.         push    ecx
  122.         movzx    ecx,ch
  123.         lea    edx,[edx+(60-4)*512+60][ecx*2]
  124.         pop    ecx
  125. ; ----- indicator length --> ecx  (length=volume/16+5)
  126.         movzx    ecx,cl
  127.         and    ecx,ecx
  128.         jz    interval_r
  129.         shr    ecx,4
  130.         add    ecx,5
  131. ; ----- indicator color --> ax
  132.         mov    ax,ss:[esp+48]
  133.         cmp    bl,6
  134.         jb    interval1
  135.         mov    ax,ss:[esp+44]
  136. ; ----- Write indicator
  137. interval1:    sub    edx,512
  138.         mov    fs:[edx],ax
  139.         loop    interval1
  140. ; ----- End
  141. interval_r:    pop    fs
  142.         pop    es
  143.         popad
  144.         ret
  145. interval    endp
  146.  
  147. ;---------------------------------------
  148. ; tone name
  149. ;---------------------------------------
  150.  
  151. tone        proc    near
  152.         pushad
  153.         push    ds
  154.         push    es
  155.         push    fs
  156.         mov    ax,118H            ; Set selecter
  157.         mov    es,ax
  158.         mov    ax,1CH
  159.         mov    fs,ax
  160. ; ----- get tone neme --> tone_data (Use SND_BIOS)
  161.         mov    ah,6
  162.         mov    cx,118H
  163.         mov    ds,cx
  164.         mov    esi,tone_data
  165.         call    pword ptr cs:[SND_BIOS_ent_x]
  166.         and    al,al
  167.         jnz    tone_r
  168. ; ----- tone name position --> edx
  169.         call    getadr
  170.         jc    tone_r
  171.         lea    edx,[edx+(40+2)*512+8]
  172. ; ----- tone name color --> bh
  173.         mov    bh,0DH
  174.         cmp    bl,6
  175.         jb    tone1
  176.         mov    bh,0EH
  177. ; ----- Print tone name
  178. tone1:        mov    ecx,8
  179. tone2:        mov    bl,ds:[esi]
  180.         cmp    bl,20H
  181.         jae    tone3
  182.         mov    bl,20H
  183. tone3:        call    putchr            ; Print one character
  184.         add    edx,4-512*16
  185.         inc    esi
  186.         loop    tone2
  187. ; ----- End
  188. tone_r:        pop    fs
  189.         pop    es
  190.         pop    ds
  191.         popad
  192.         ret
  193. tone        endp
  194.  
  195. ;---------------------------------------
  196. ; pan indicator
  197. ;---------------------------------------
  198.  
  199. pan        proc    near
  200.         pushad
  201.         push    es
  202.         push    fs
  203.         mov    ax,118H            ; Set selecter
  204.         mov    es,ax
  205.         mov    ax,1CH
  206.         mov    fs,ax
  207. ; ----- indicator position --> edx
  208.         push    edx
  209.         call    getadr
  210.         pop    ecx            ; cl = pan
  211.         jc    pan3
  212.         lea    edx,[edx+(40+2)*512+44]
  213.         sub    cl,64
  214.         js    pan2
  215.         jz    pan1
  216. ; ----- right indicator ON
  217.         call    era_pan
  218.         call    era_pan
  219.         mov    ebx,offset r_pan-offset xprog+xprog_ent
  220.         call    ind_pan
  221.         jmp    pan3
  222. ; ----- Center indicator ON
  223. pan1:        call    era_pan
  224.         mov    ebx,offset c_pan-offset xprog+xprog_ent
  225.         call    ind_pan
  226.         call    era_pan
  227.         jmp    pan3
  228. ; ----- Left indicator ON
  229. pan2:        mov    ebx,offset l_pan-offset xprog+xprog_ent
  230.         call    ind_pan
  231.         call    era_pan
  232.         call    era_pan
  233. ; ----- End
  234. pan3:        pop    fs
  235.         pop    es
  236.         popad
  237.         ret
  238. pan        endp
  239.  
  240. ; ----- indicator pattern table
  241.  
  242. r_pan        dd    00000003H,00000033H,00000333H,00003333H
  243.         dd    00033BB3H,0033BBB3H,033BBBB3H,33BBBBB3H
  244.         dd    033BBBB3H,0033BBB3H,00033BB3H,00003333H
  245.         dd    00000333H,00000033H,00000003H,00000000H
  246.  
  247. c_pan        dd    00000000H,00000000H,00333300H,03333330H
  248.         dd    333BB333H,33BBBB33H,33BBBB33H,33BBBB33H
  249.         dd    33BBBB33H,33BBBB33H,333BB333H,03333330H
  250.         dd    00333300H,00000000H,00000000H,00000000H
  251.  
  252. l_pan        dd    30000000H,33000000H,33300000H,33330000H
  253.         dd    3BB33000H,3BBB3300H,3BBBB330H,3BBBBB33H
  254.         dd    3BBBB330H,3BBB3300H,3BB33000H,33330000H
  255.         dd    33300000H,33000000H,30000000H,00000000H
  256.  
  257. ;---------------------------------------
  258. ; put one character in bl (use 8x8 FONT)
  259. ;---------------------------------------
  260.  
  261. putchr        proc    near
  262.         push    ds
  263.         push    esi
  264.         push    ecx
  265.         push    ebx
  266.         push    edx
  267.         mov    ax,0
  268.         mov    dx,0808H
  269.         call    pword ptr cs:[0A0H]    ;get FONT address (FONT_BIOS)
  270.         pop     edx
  271.         pop    ebx
  272.         mov    ecx,8
  273. putchr0:    mov    bl,ds:[esi]
  274.         push    ecx
  275.         mov    eax,0
  276.         mov    ecx,8
  277. putchr1:    shl    eax,4
  278.         shr    bl,1
  279.         jnc    putchr2
  280.         or    al,bh
  281. putchr2:    loop    putchr1
  282.         mov    fs:[edx],eax
  283.         mov    fs:[edx+512],eax
  284.         add    edx,1024
  285.         pop    ecx
  286.         inc    esi
  287.         loop    putchr0
  288.         pop    ecx
  289.         pop    esi
  290.         pop    ds
  291.         ret
  292. putchr        endp
  293.  
  294. ;---------------------------------------
  295. ; indicate pan
  296. ;---------------------------------------
  297.  
  298. ind_pan        proc    near
  299.         mov    ecx,16
  300. ind_pan1:    mov    eax,es:[ebx]
  301.         mov    fs:[edx],eax
  302.         add    ebx,4
  303.         add    edx,512
  304.         loop    ind_pan1
  305.         sub    edx,512*16-4
  306.         ret
  307. ind_pan        endp
  308.  
  309. ;---------------------------------------
  310. ; erase pan
  311. ;---------------------------------------
  312.  
  313. era_pan        proc    near
  314.         mov    ecx,16
  315.         mov    eax,0
  316. era_pan1:    mov    fs:[edx],eax
  317.         add    edx,512
  318.         loop    era_pan1
  319.         sub    edx,512*16-4
  320.         ret
  321. era_pan        endp
  322.  
  323. ;---------------------------------------
  324. ; get VRAM address
  325. ;---------------------------------------
  326.  
  327. getadr        proc    near
  328.         cmp    bl,64            ;bl <- ch no.
  329.         jb    getadr0
  330.         sub    bl,64-6
  331. getadr0:    cmp    bl,14
  332.         jae    getadr_er
  333.         and    dh,7FH
  334.         mov    cx,dx
  335.         movzx    ebx,bl
  336.         mov    ax,512*20
  337.         mov    bh,0
  338.         mul    bx
  339.         shl    edx,16
  340.         mov    dx,ax
  341.         and    al,al
  342.         ret
  343. getadr_er:    stc
  344.         ret
  345. getadr        endp
  346.  
  347. xprog_e:    nop
  348.  
  349. ; <<<<< Version >>>>>
  350.         db    'SSP_ON ver2.1 1990/12/10 HONESEN'
  351.  
  352. xprog        endp
  353.  
  354. _code        ends
  355.  
  356. _stack        segment byte stack use32 'stack'
  357.         db    8192 dup (?)
  358. _stack        ends
  359.  
  360.         end main
  361.