?login_element?

Subversion Repositories NedoOS

Rev

Rev 1886 | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. STACK=0x4000
  5. scrbase=0x8000
  6.  
  7.         macro NEXTCOLUMN
  8.         bit 6,h
  9.         set 6,h
  10.         jr z,1f;shapes_linehorR_incxok
  11.         ld a,h
  12.         xor 0x60
  13.         ld h,a
  14.         and 0x20
  15.         jr nz,1f;shapes_linehorR_incxok
  16.         inc hl
  17. 1;shapes_linehorR_incxok
  18.         endm
  19.  
  20.         org PROGSTART
  21. begin
  22.         ld sp,STACK
  23.         OS_HIDEFROMPARENT
  24.  
  25.         ld e,0+0x80
  26.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  27.        
  28.         ld e,0 ;color byte 0bRLrrrlll
  29.         OS_CLS
  30.        
  31. ;01          89          01    ;low+0x0000
  32. ;   23          ab          23 ;high+0x0000
  33. ;      45          cd          ;low+0x2000
  34. ;         67          ef       ;high+0x2000
  35.  
  36.         ;ld hl,0x8000
  37.         ;ld b,10
  38.         ;ld c,0xff        
  39. ;hl=scraddr
  40. ;c=color byte 0bRLrrrlll
  41. ;b=wid/2
  42.         ;call drawhorline
  43.         ;jr $
  44.        
  45.         ld de,pal
  46.         OS_SETPAL
  47.        
  48.         ;ld hl,0;0x8000
  49.         ;ld de,0x8001
  50.         ;ld bc,0x7fff
  51.         ;ldir
  52.  
  53. ;смещаем таблицу частот на серединки между нотами, чтобы легче сравнивать
  54.         ld hl,tb_st
  55.         ld de,0x0fff ;previous freq
  56.         ld lx,96
  57. retb0
  58.         ld c,(hl)
  59.         inc l
  60.         ld b,(hl)
  61.         dec l
  62.         push bc ;previous freq
  63.         ex de,hl
  64.         add hl,bc
  65.         ;inc hl
  66.         srl h
  67.         rr l
  68.         ex de,hl
  69.         ld (hl),e
  70.         inc l
  71.         ld (hl),d
  72.         inc hl
  73.         pop de ;previous freq
  74.         dec lx
  75.         jr nz,retb0
  76.        
  77. loop
  78. pause_on=$
  79.         or a
  80.         jr c,pauseq
  81.         ld a,(user_scr0_low) ;ok
  82.         SETPG8000
  83.         ld a,(user_scr0_high) ;ok
  84.         SETPGC000 ;╨┐╤А╨╕ ╨┐╨╛╤В╨╡╤А╨╡ ╤Д╨╛╨║╤Г╤Б╨░ ╨╛╨▒╨╡ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Л ╤Б╨░╨╝╨╕ ╨▓╨╛╤Б╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М╤Б╤П ╨╜╨╡ ╨╝╨╛╨│╤Г╤В
  85.         call drawnotes
  86.         call scrollleft
  87. pauseq
  88.         YIELD
  89.         GET_KEY ;GETKEY_ ;OS_GETKEYNOLANG
  90.         ld a,c ;keynolang
  91.         cp ' '
  92.         call z,pause
  93.         cp '1'
  94.         call z,shut_a
  95.         cp '2'
  96.         call z,shut_b
  97.         cp '3'
  98.         call z,shut_c
  99.         ;cp NOKEY
  100.         ;jr z,loop
  101.         cp key_esc
  102.         jr nz,loop
  103.        
  104.         QUIT
  105.        
  106. pause
  107.         ld hl,pause_on
  108. switch
  109.         ex af,af' ;'
  110.         ld a,(hl)
  111.         xor 128
  112.         ld (hl),a
  113.         ex af,af' ;'
  114.         ret
  115.        
  116. shut_a
  117.         ld hl,a_on
  118.         jr switch
  119. shut_b
  120.         ld hl,b_on
  121.         jr switch
  122. shut_c
  123.         ld hl,c_on
  124.         jr switch
  125.        
  126. drawnotes
  127.         ld a,0xfe
  128.         ld bc,0xfffd
  129.         out (c),a
  130.         call drawnotes_chip
  131.         ld bc,0xfffd
  132.         out (c),b
  133. drawnotes_chip
  134.         ld a,7
  135.         call getreg
  136.         ld c,a ;..cbaCBA (cba шум, CBA тон, инвертированные)
  137.         set 7,c ;no env
  138.         set 6,c ;wrong noise
  139.        
  140.         ld a,6
  141.         call getreg
  142.         or a
  143.         jr nz,$+4
  144.         res 6,c ;noise is analyzable
  145.        
  146. a_on=$
  147.         or a
  148.         ld a,0
  149.         call nc,drawnotes_channel
  150. b_on=$
  151.         or a
  152.         ld a,1
  153.         call nc,drawnotes_channel
  154. c_on=$
  155.         or a
  156.         ld a,2
  157.         call nc,drawnotes_channel
  158.         bit 7,c
  159.         ret nz
  160. ;env
  161.         ld a,11
  162.         call getfreq
  163.         ld a,13
  164.         call getreg
  165.         and 15
  166.         cp 8
  167.         ret c
  168.         bit 0,a
  169.         ret nz ;нечётный тип огибающей - не рисовать
  170.         bit 1,a ;a/e?
  171.         jr z,noslowenv
  172.         sla e
  173.         rl d
  174. noslowenv
  175.         sla e
  176.         rl d
  177.         sla e
  178.         rl d
  179.         sla e
  180.         rl d
  181.         sla e
  182.         rl d
  183.         call drawfreq
  184.         ret
  185.  
  186. drawnotes_channel
  187.         ld (drawnotes_channel_a),a
  188.         add a,8
  189.         call getreg_setenvflag
  190.         jr z,drawnotes_noA
  191.          cp 7;8
  192.          jr c,drawnotes_noA
  193.         bit 0,c
  194.         jr nz,drawnotes_noA
  195.         bit 3,c
  196.         jr nz,drawnotes_nonoiseA ;no noise
  197.         bit 6,c
  198.         jr nz,drawnotes_noA ;wrong noise
  199. drawnotes_nonoiseA
  200. drawnotes_channel_a=$+1
  201.         ld a,0
  202.         add a,a
  203.         call getfreq
  204.         push bc
  205.         call drawfreq
  206.         pop bc
  207. drawnotes_noA
  208.         ld a,c
  209.         rra
  210.         xor c
  211.         and 0x3f
  212.         xor c
  213.         ld c,a
  214.         ret
  215.  
  216. getfreq
  217.         ld d,a
  218.         call getreg
  219.         ld e,a
  220.         ld a,d
  221.         inc a
  222.         call getreg
  223.         ld d,a
  224.         ret
  225.        
  226. drawfreq
  227.         ld hl,tb_st
  228. ;сейчас в таблице частоты на четверть тона ниже
  229.         ld lx,96
  230. findfreq0
  231.         ld c,(hl)
  232.         inc l
  233.         ld a,(hl)
  234.         cp d
  235.         jr c,findfreq_overflow ;наш период de больше, чем табличный
  236.         jr nz,findfreq_next
  237.         ld a,c
  238.         cp e
  239.         jr c,findfreq_overflow ;наш период de больше, чем табличный
  240. findfreq_next
  241.         inc hl
  242.         dec lx
  243.         jr nz,findfreq0
  244. findfreq_overflow ;наш период de больше, чем табличный
  245. ;первый F# (ми) = 59
  246.  
  247. ;если lx=96, то наша нота ниже, чем самая нижняя возможная
  248. ;правильные ноты 95..0
  249.         ld a,95
  250.         sub lx ;=-1..95
  251.         adc a,0
  252.        
  253.         cp 12
  254.         ret c
  255.         cp 96-12
  256.         ret nc
  257.        
  258.         ld l,a ;нота 0..95 ;первый F# (ми) = 6
  259.         ld h,tcolor/256
  260.         ld c,(hl) ;4..15 ;первый F# (ми) цвет 9
  261.         ld a,c
  262.         and 8
  263.         ld b,a
  264.         rla
  265.         or b
  266.         rlca
  267.         rlca
  268.         rlca ;0xc0
  269.         ld b,a
  270.         ld a,c
  271.         and 7
  272.         ld c,a
  273.         rlca
  274.         rlca
  275.         rlca
  276.         or c
  277.         or b
  278.          ld c,a
  279.  
  280.         ld h,ty/256
  281.         ld a,95*2
  282.         sub l
  283.         sub l
  284.         ld l,a ;y
  285.         ld a,(hl)
  286.         inc h
  287.         ld h,(hl)
  288.         ld l,a
  289.          ld a,c
  290.         ld bc,39+0x8000+0x6000
  291.         add hl,bc
  292.         ld (hl),a;0xff
  293.         ret
  294.        
  295. getreg_setenvflag
  296.         call getreg
  297.         bit 4,a
  298.         jr z,$+4
  299.         res 7,c ;env
  300.         or a
  301.         ret
  302.  
  303. getreg
  304.         push bc
  305.         ld bc,0xfffd
  306.         out (c),a
  307.         in a,(c)
  308.         pop bc
  309.         ret
  310.  
  311. scrollleft
  312. ;01          89          01    ;low+0x0000
  313. ;   23          ab          23 ;high+0x0000
  314. ;      45          cd          ;low+0x2000
  315. ;         67          ef       ;high+0x2000
  316.  
  317.         ld hl,0x8000+(12*40*2)
  318.         ld hx,96-12-12
  319. scroll0
  320.        push hl ;+0x0000
  321.         push hl ;+0x0000
  322.         ld d,h
  323.         ld e,l
  324.         set 6,h
  325.         dup 39
  326.         ldi
  327.         edup
  328.         ld a,(hl)
  329.         ld (de),a
  330.         pop hl ;+0x0000
  331.         ld d,h
  332.         ld e,l
  333.         set 5,h
  334.         set 6,d
  335.         push hl ;+0x2000
  336.         dup 39
  337.         ldi
  338.         edup
  339.         ld a,(hl)
  340.         ld (de),a
  341.         pop hl ;+0x2000
  342.         push hl ;+0x2000
  343.         ld d,h
  344.         ld e,l
  345.         set 6,h
  346.         dup 39
  347.         ldi
  348.         edup
  349.         ld a,(hl)
  350.         ld (de),a
  351.         pop hl ;+0x2000
  352.         ld d,h
  353.         ld e,l
  354.         res 5,h
  355.         inc l;hl
  356.         set 6,d
  357.         dup 39
  358.         ldi
  359.         edup
  360.         xor a
  361.         ld (de),a
  362.        pop hl ;+0x0000
  363.         ld bc,40*2
  364.         add hl,bc
  365.         dec hx
  366.         jp nz,scroll0
  367.         ret
  368.  
  369. xytoscraddr
  370. ;l=x/2
  371. ;e=y (не портится)
  372. ;screen pages are mapped in 2 CPU windows
  373. ;addr = tY(y) + tX(x)
  374.         ld h,tx/256
  375.         ld d,ty/256
  376.         ld a,(de) ;(y*40)
  377.         add a,(hl) ;x div 4
  378.         ld (xytoscraddr_l),a
  379.         inc d
  380.         inc h
  381.         ld a,(de) ;'(y*40)
  382.         adc a,(hl) ;f(x mod 4)
  383.         ld h,a
  384. xytoscraddr_l=$+1
  385.         ld l,0
  386.         ret
  387.  
  388.         if 1==0
  389. prpixel
  390. ;bc=x (не портится)
  391. ;e=y (не портится)
  392. ;screen pages are mapped in 2 CPU windows
  393. ;addr = tY(y) + tX(x)
  394.         push bc
  395.         ld a,b
  396.         rra
  397.         ld a,c
  398.         rra
  399.         ld l,a
  400.         ;ld d,ty/256
  401.         ;ld h,tx/256
  402.         ld a,(de) ;(y*40)
  403.         jr c,prpixel_r
  404.         add a,(hl) ;x div 4
  405.         ld c,a
  406.         inc d
  407.         inc h
  408.         ld a,(de) ;'(y*40)
  409.         adc a,(hl) ;f(x mod 4)
  410.         ld b,a
  411.         ld a,(bc)
  412.         and 0xb8 ;keep right pixel ;иначе надо cls перед redraw
  413. prpixel_color_l=$+1
  414.         or 0;lx
  415.         ld (bc),a
  416.         dec h
  417.         dec d
  418.         pop bc
  419.         ret
  420. prpixel_r
  421.         add a,(hl) ;x div 4
  422.         ld c,a
  423.         inc d
  424.         inc h
  425.         ld a,(de) ;'(y*40)
  426.         adc a,(hl) ;f(x mod 4)
  427.         ld b,a
  428.         ld a,(bc)
  429.         and 0x47 ;keep left pixel ;иначе надо cls перед redraw
  430. prpixel_color_r=$+1
  431.         or 0;lx
  432.         ld (bc),a
  433.         dec h
  434.         dec d
  435.         pop bc
  436.         ret
  437.         endif
  438.  
  439.  
  440.         align 256
  441. tx
  442.         dup 256
  443.         db ($&0xff)/4
  444.         edup
  445.         dup 64
  446.         db 0x80
  447.         db 0xc0
  448.         db 0xa0
  449.         db 0xe0
  450.         edup
  451. ty
  452.         dup 200
  453.         db 0xff&(($&0xff)*40)
  454.         edup
  455.         ds 56,0xff&8000
  456.         dup 200
  457.         db (($&0xff)*40)/256
  458.         edup
  459.         ds 56,8000/256
  460.  
  461.         align 256
  462. tb_st
  463.         incbin "tb_st.bin"
  464.  
  465.         align 256
  466. tcolor
  467.         dup 8
  468.         db 4,5,6,7,8,9,10,11,12,13,14,15
  469.         edup
  470.  
  471. pal
  472.         ;dw 0x3c3c ;9 (ля, малиновое)
  473.         ;dw 0x1c1c ;4 (ми, пурпурное)
  474.         ;dw 0x5c5c ;11 (си, фиолетовое)
  475.         ;dw 0x1e1e ;6 (фа-диез, синее) - blue note
  476.         ;dw 0x8e8e ;1 (до-диез, сине-голубое)
  477.         ;dw 0x0e0e ;8 (соль-диез, голубое)
  478.         ;dw 0x2e2e ;3 (ре-диез, сине-зелёное)
  479.         ;dw 0x0f0f ;10 (ля-диез, зелёное)
  480.         ;dw 0x4d4d ;5 (фа, жёлто-зелёное)
  481.         ;dw 0x0d0d ;0 (до, жёлтое)
  482.         ;dw 0x8d8d ;7 (соль, оранжевое)
  483.         ;dw 0x1d1d ;2 (ре, красное)
  484.         ;dw 0x0c0c ;W
  485.         ;dw 0xecec ;w
  486.         ;dw 0x1f1f ;grey
  487.         ;dw 0xffff ;black
  488. ;в Sound Tracker строй си-бемоль ("до" называется D и т.д.)
  489.         dw 0xffff ;black
  490.         dw 0x1f1f ;grey
  491.         dw 0xecec ;w
  492.         dw 0x0c0c ;W
  493.         dw 0x0f0f ;10 (ля-диез = си-бемоль, зелёное) -- C
  494.         dw 0x5c5c ;11 (си, фиолетовое)               -- C#
  495.         dw 0x0d0d ;0 (до, жёлтое)                    -- D
  496.         dw 0x8e8e ;1 (до-диез, сине-голубое)         -- D#
  497.         dw 0x1d1d ;2 (ре, красное)                   -- E
  498.         dw 0x2e2e ;3 (ре-диез, сине-зелёное)         -- F   +
  499.         dw 0x1c1c ;4 (ми, пурпурное)                 -- F#
  500.         dw 0x4d4d ;5 (фа, жёлто-зелёное)             -- G
  501.         dw 0x1e1e ;6 (фа-диез, синее) - blue note    -- G#  +
  502.         dw 0x8d8d ;7 (соль, оранжевое)               -- A   +
  503.         dw 0x0e0e ;8 (соль-диез, голубое)            -- A#
  504.         dw 0x3c3c ;9 (ля, малиновое)                 -- B
  505.        
  506. end
  507.  
  508.         savebin "showay.com",begin,end-begin
  509.         LABELSLIST "../../../us/user.l",1
  510.