?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;play *.tfm
  2.  
  3. ;newtfm=1 ;0=revision A, 1=revision C
  4. pseudo60hz=1
  5.  
  6. ;эти настройки не меняйте:
  7. A6XXXX=1
  8. PACK28=1
  9.        
  10.         ;LD HL,0xc000;tfmData
  11.         ;LD (addrTFM),HL
  12.         ;LD (loopPos),HL
  13.         ;LD A,0
  14.         ;LD (tfdplay_pg),A
  15.         ;LD (looptfmpg),A
  16.         ;LD A,1
  17.         ;LD (skipTFM),A
  18.        if 0
  19. LOOP
  20.       IF pseudo60hz
  21.      ;делаем псевдо 60Hz
  22. cnt=$+1
  23.        LD A,6
  24.        DEC A
  25.        jr NZ,$+4
  26.        LD A,6
  27.        LD (cnt),A
  28.        jr Z,nehalt
  29.       ENDIF
  30.         HALT
  31. nehalt
  32.         ;LD A,2
  33.         ;OUT (-2),A
  34.         CALL tfm
  35.         ;LD A,0
  36.         ;OUT (-2),A
  37.         ;LD A,#7F
  38.         ;IN A,(-2)
  39.         ;RRA
  40.         ;JP   LOOP
  41.         CALL tfmini
  42.         LD B,D
  43.         WaitStatus
  44.         LD A,#FF ;выкл. FM
  45.         OUT (C),A
  46.         RET
  47.        endif
  48.  
  49.        if 0
  50. WRITEREG
  51. ;A=REG
  52. ;A'=VALUE
  53.         LD B,D
  54.         WaitStatus
  55.         OUT (C),A ;reg
  56.         EXA
  57.         WaitStatus
  58.         LD B,E
  59.         OUT (C),A ;value
  60.         EXA
  61.         RET
  62.        endif
  63.  
  64. selChip0ix
  65.         LD B,D
  66.         LD A,statuschip0
  67.         OUT (C),A
  68.        LD IX,lows0
  69.         RET
  70.  
  71. selChip1ix
  72.         LD B,D
  73.         LD A,statuschip1
  74.         OUT (C),A
  75.        LD IX,lows1
  76.         RET
  77.  
  78. tfm_play
  79. ;a = port bd77 value
  80.         di
  81.         push af
  82.         and 0xf7;0xa0;%10101000 ;320x200 mode noturbo
  83.         ld bc,0xbd77    ;shadow ports and palette remain on
  84.         out (c),a
  85.  
  86.         call tfm_playPP
  87.  
  88.         pop af
  89.         ;LD A,0xa8;%10101000 ;320x200 mode
  90.         ld bc,0xbd77    ;shadow ports and palette remain on
  91.         out (c),a
  92.         ei
  93.         ret
  94.  
  95. tfm_playPP
  96.         ld a,(tfdplay_pg)
  97.         ld c,a
  98.         ld b,tpgs/256
  99.         ld a,(bc)
  100.         SETPGC000
  101.  
  102. skipTFM=$+1
  103.         LD A,1
  104.         DEC A
  105.         JP NZ,skiperTFM
  106. addrTFM=$+1
  107.         LD HL,0xc000;tfmData
  108.         ;LD E,#BF
  109.         ld de,0xffbf
  110.         LD C,#FD
  111.         CALL selChip0ix
  112. tfm_parse0
  113.         LD A,(HL)
  114.         INCHL
  115.        CP #C0
  116.        JP NC,parseMARKER
  117.         CP #14
  118.         jr Z,parseBEG
  119.        CP #A6
  120.        JP Z,parseA6
  121.        CP #A5
  122.        JP Z,parseA5
  123.        CP #A4
  124.        JP Z,parseA4
  125.        CP #A2
  126.        JP Z,parseA2
  127.        CP #A1
  128.        JP Z,parseA1
  129.        CP #A0
  130.        JP Z,parseA0
  131.      IF PACK28
  132.       SUB #2A
  133.       CP 6
  134.       JP C,parseKEY
  135.       SUB #0E-#2A
  136.      ELSE
  137.       SUB #0E
  138.      ENDIF
  139.       CP 6
  140.       JP C,parseH1SSG
  141.       SUB #08-#0E
  142.       CP 3
  143.       JP C,parseVOSSG
  144.       SUB #00-#08
  145.       CP 6
  146.       JP C,parseFRSSG
  147.         EXA
  148.         LD A,(HL)
  149.         INCHL
  150.         EXA
  151.         CALL WRITEREG
  152.         JR tfm_parse0
  153. parseBEG
  154.         LD (loopPos),HL
  155.         LD A,(tfdplay_pg)
  156.         LD (looptfmpg),A
  157.         JR tfm_parse0
  158.  
  159. parseA6
  160.         LD A,(HL)
  161.        LD (IX+2+3),A
  162.         INCHL
  163.        IF A6XXXX
  164.         LD A,#A2
  165.        ELSE
  166.         JP tfm_parse0
  167.        ENDIF
  168. parseA2
  169.        PUSH AF
  170.        ADD A,4
  171.      EXA
  172.        LD A,(IX+2+3)
  173.      EXA
  174.      CALL WRITEREG
  175.        POP AF
  176.      EXA
  177.         LD A,(HL)
  178.         LD (IX+2),A
  179.      EXA
  180.      CALL WRITEREG
  181.         INCHL
  182.         JP tfm_parse0
  183. parseA5
  184.         LD A,(HL)
  185.        LD (IX+1+3),A
  186.         INCHL
  187.        IF A6XXXX
  188.         LD A,#A1
  189.        ELSE
  190.         JP tfm_parse0
  191.        ENDIF
  192. parseA1
  193.        PUSH AF
  194.        ADD A,4
  195.      EXA
  196.        LD A,(IX+1+3)
  197.      EXA
  198.      CALL WRITEREG
  199.        POP AF
  200.      EXA
  201.         LD A,(HL)
  202.         LD (IX+1),A
  203.      EXA
  204.      CALL WRITEREG
  205.         INCHL
  206.         JP tfm_parse0
  207. parseA4
  208.         LD A,(HL)
  209.        LD (IX+0+3),A
  210.         INCHL
  211.        IF A6XXXX
  212.         LD A,#A0
  213.        ELSE
  214.         JP tfm_parse0
  215.        ENDIF
  216. parseA0
  217.        PUSH AF
  218.        ADD A,4
  219.      EXA
  220.        LD A,(IX+0+3)
  221.      EXA
  222.      CALL WRITEREG
  223.        POP AF
  224.      EXA
  225.         LD A,(HL)
  226.         LD (IX+0),A
  227.      EXA
  228.      CALL WRITEREG
  229.         INCHL
  230.         JP tfm_parse0
  231.  
  232. tfmQ
  233.         LD (addrTFM),HL ;tfdplay_pg уже сохранена
  234.         RET
  235. parseHALTS
  236.         LD A,(HL)
  237.         INCHL
  238.         ADD A,3
  239. HLskiperTFM
  240.         LD (addrTFM),HL
  241. skiperTFM
  242.         LD (skipTFM),A
  243.         RET
  244. parseCHIP1
  245.         CALL selChip1ix
  246.         JP tfm_parse0
  247. parseEND
  248. loopPos=$+1
  249.         LD HL,0xc000;tfmData
  250. looptfmpg=$+1
  251.         LD A,0
  252.         LD (tfdplay_pg),A
  253.        PUSH BC
  254.         ld c,a
  255.         ld b,tpgs/256
  256.         ld a,(bc)
  257.         SETPGC000
  258.        POP BC
  259.         JP tfm_parse0
  260.  
  261. parseMARKER
  262.         CP #FF
  263.         jr Z,tfmQ
  264.         CP #FE
  265.         jr Z,parseHALTS
  266.         CP #FD
  267.         jr Z,parseCHIP1
  268.         CP #FC
  269.         jr Z,parseEND
  270.       CP #F0
  271.       jr NC,parseViSSG
  272.       CP #D8
  273.       jr NC,parseSLSSG
  274.       ;CP #C0
  275.       ;jr NC,parseSLIDE
  276. parseSLIDE
  277. ;Cx,Cx+8,Dx - сдвиг мл.байта частоты на +x-4
  278.        PUSH AF
  279.         SUB #C0
  280.         RRA
  281.         RRA
  282.         RRA
  283.         AND 3
  284.         LD (_IXshift1),A
  285.         LD (_IXshift2),A
  286.       ADD A,3
  287.       LD (_IXshift3),A
  288.         ADD A,#A0 -3+4
  289.       PUSH AF
  290.      EXA
  291. _IXshift3=$+2
  292.       LD A,(IX+3) ;ст.б.
  293.      EXA
  294.      CALL WRITEREG
  295.       POP AF
  296.       SUB 4
  297.      EXA
  298.        POP AF
  299.         AND #7
  300.         SUB 4
  301. _IXshift1=$+2
  302.         ADD A,(IX) ;старый мл.байт частоты
  303. _IXshift2=$+2
  304.         LD (IX),A ;новый мл.байт частоты
  305.      EXA
  306.      CALL WRITEREG
  307.         JP tfm_parse0
  308.  
  309. parseViSSG
  310. ;A=0..3 - vol -2..+2 SSG A
  311.   ;4..7 - B
  312.   ;8..b - C
  313.         PUSH AF
  314.         AND 3
  315.         SUB 2
  316.         SBC A,-1
  317.         LD (ViSSGa),A
  318.         POP AF
  319.         RRA
  320.         RRA
  321.         AND 3
  322.       ADD A,12
  323.       LD (_IXshViSSG),A
  324.       LD (_IXshViSSG2),A
  325.         ADD A,8-12
  326.      EXA
  327. _IXshViSSG=$+2
  328.         LD A,(IX)
  329. ViSSGa=$+1
  330.         ADD A,0
  331. _IXshViSSG2=$+2
  332.         LD (IX),A
  333.        SUB 4
  334.        jr NC,$+3
  335.        XOR A
  336.      EXA
  337.      CALL WRITEREG
  338.         JP tfm_parse0
  339.  
  340. parseSLSSG
  341. ;A=Dx+8 - lfrqSSGA += x-4
  342.   ;Ex   - B
  343.   ;Ex+8 - C
  344.         SUB #D8
  345.         PUSH AF
  346.         AND 7
  347.         SUB 4
  348.        ;SBC A,-1
  349.         LD (SLSSGa),A
  350.         POP AF
  351.         RRA
  352.         RRA
  353.         AND 6
  354.       ADD A,6
  355.       LD (_IXshSLSSG),A
  356.       LD (_IXshSLSSG2),A
  357.         ADD A,0-6
  358.      EXA
  359. _IXshSLSSG=$+2
  360.         LD A,(IX)
  361. SLSSGa=$+1
  362.         ADD A,0
  363. _IXshSLSSG2=$+2
  364.         LD (IX),A
  365.      EXA
  366.      CALL WRITEREG
  367.         JP tfm_parse0
  368.  
  369. parseVOSSG
  370.         ADD A,8
  371.       ADD A,12-8
  372.       LD (_IXshVOSSG),A
  373.      SUB 12-8
  374.      EXA
  375.         LD A,(HL)
  376. _IXshVOSSG=$+2
  377.         LD (IX),A
  378.        SUB 4
  379.        jr NC,$+3
  380.        XOR A
  381.      EXA
  382.      CALL WRITEREG
  383.         INCHL
  384.         JP tfm_parse0
  385.  
  386. parseFRSSG
  387.       ADD A,6
  388.       LD (_IXshFRSSG),A
  389.      SUB 6
  390.      EXA
  391.         LD A,(HL)
  392. _IXshFRSSG=$+2
  393.         LD (IX),A
  394.      EXA
  395.      CALL WRITEREG
  396.         INCHL
  397.         JP tfm_parse0
  398.  
  399. parseH1SSG
  400. ;A=0/1 - dec/inc HfrqSSGA
  401.   ;2/3 - B
  402.   ;4/5 - C
  403.         PUSH AF
  404.         AND 1
  405.         SUB 1
  406.         SBC A,-1
  407.         LD (H1SSGa),A
  408.         POP AF
  409.         OR 1
  410.       ADD A,6
  411.       LD (_IXshH1SSG),A
  412.       LD (_IXshH1SSG2),A
  413.         ADD A,0-6
  414.      EXA
  415. _IXshH1SSG=$+2
  416.         LD A,(IX)
  417. H1SSGa=$+1
  418.         ADD A,0
  419. _IXshH1SSG2=$+2
  420.         LD (IX),A
  421.      EXA
  422.      CALL WRITEREG
  423.         JP tfm_parse0
  424.        IF PACK28
  425. parseKEY
  426. ;A=0/1 - key OFF/OFFON chn A
  427.   ;2/3 - B
  428.   ;4/5 - C
  429.         PUSH AF
  430.         RRA
  431.         AND 3
  432.      EXA
  433.      LD A,#28
  434.      CALL WRITEREG ;key off
  435.         POP AF
  436.         RRA
  437.         JP NC,tfm_parse0
  438.         AND 3
  439.         OR #F0
  440.      EXA
  441.      LD A,#28
  442.      CALL WRITEREG ;key on
  443.         JP tfm_parse0
  444.        ENDIF
  445.  
  446.  
  447. lows0   DS 3+3+6+3 ;l,h,SSGfrq,SSGv
  448. lows1   DS 3+3+6+3
  449.  
  450. ;msg     DB "Sonic 3D Blast song #13"
  451. ;lmsg=$-msg
  452.  
  453. ;tfmData=#C000
  454. ;name0   DB "sonic3d t"
  455. ;name1   DB "sonic3d 0"
  456. ;name3   DB "sonic3d 1"
  457. ;name4   DB "sonic3d 2"
  458. ;end
  459. ;        ORG #5CDD
  460. ;        DB "sonic3D B"
  461. ;        INCLUDE "B:m2hr*",#C0
  462.        ;ORG GO
  463.