?login_element?

Subversion Repositories NedoOS

Rev

Rev 1739 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "gsports.asm"
  3.         include "gscodedefs.asm"
  4.         include "vs10xx.asm"
  5.  
  6. XTALI_FREQ = 14000000 ;14mhz on NGS
  7. CLOCKF_VS1011 = 0x8000|((XTALI_FREQ+1000)/2000) ;28mhz
  8. CLOCKF_VS1033 = ((XTALI_FREQ-8000000+2000)/4000)|SC_MULT_03_35X|SC_ADD_03_00X ;49mhz
  9. CLOCKF_VS1053 = ((XTALI_FREQ-8000000+2000)/4000)|SC_MULT_53_40X|SC_ADD_53_00X ;56mhz
  10.  
  11.         MACRO WDC
  12.         in a,(SSTAT)
  13.         and M_MCRDY
  14.         jr z,$-4
  15.         ENDM
  16.  
  17.         MACRO WDD
  18.         in a,(SSTAT)
  19.         rrca
  20.         jr nc,$-3
  21.         ENDM
  22.  
  23.         MACRO ATOZX
  24.         out (ZXDATWR),a
  25.         in a,(ZXSTAT)
  26.         rlca
  27.         jr c,$-3
  28.         ENDM
  29.  
  30.         MACRO CALCFREEBUFFERSPACE
  31.         ld a,h
  32.         sub d
  33.         and 0x7f
  34.         ENDM
  35.  
  36.         MACRO LOAD256 IENABLED
  37. .loadloop
  38.         in a,(ZXSTAT)                         ;check if data or command is pending
  39.         and M_CBIT|M_DBIT
  40.         jr z,.loadloop
  41.         rlca
  42.         jr c,.loaddata
  43. ;got command
  44.         IF IENABLED
  45.         di
  46.         ENDIF
  47.         call processcommand
  48.         IF IENABLED
  49.         ei
  50.         ENDIF
  51.         jr .loadloop
  52. .loaddata
  53.         in a,(ZXDATRD)
  54.         ld (de),a
  55.         inc e
  56.         jr nz,.loadloop
  57.         inc d
  58.         ENDM
  59.  
  60.         org GSPROGSTART
  61. begin   di
  62.         ld sp,GSSTACKADDR
  63.         call checkifngs
  64. ;uploading is done via interrupt handler
  65.         ld hl,interrupthandler
  66.         ld (GSINTERRUPTTABLEENTRYADDR),hl
  67.         ld a,GSINTERRUPTTABLEENTRYADDR>>8
  68.         ld i,a
  69.         im 2
  70.         call mutemod
  71.         ld a,%10011100
  72.         out (SCTRL),a
  73. ;set ngs to 10mhz
  74.         ld d,C_10MHZ
  75.         call ngssetfreq
  76. ;hw decoder reset
  77.         ld a,M_MPXRS
  78.         out (SCTRL),a
  79.         WDC
  80. ;clear reset signal
  81.         ld a,M_MPXRS|M_SETNCLR
  82.         out (SCTRL),a
  83. ;go to 12mhz
  84.         ld d,C_12MHZ
  85.         call ngssetfreq
  86. ;write to a register after reset
  87.         ld l,SCI_VOL
  88.         ld de,SV_SILENCE
  89.         call vswriteregister
  90. ;read chip id
  91.         ld l,SCI_STATUS
  92.         call vsreadregister
  93.         ld a,e
  94.         and SS_VER_MASK
  95.         ld (vsversion),a
  96. ;set an arbitrary writable page for the ring buffer in 0x8000...0xffff
  97.         ld a,2
  98.         out (MPAG),a
  99. startnewstream
  100.         call vssoftreset                      ;reset decoder setting SDI to compatibility mode
  101. ;start preloading
  102.         ld h,0x70
  103.         ld de,0x8000                          ;de is ring buffer write pointer
  104. preloadloop
  105.         LOAD256 0
  106.         ld a,d
  107.         cp 0xdf
  108.         jr c,preloadloop
  109. ;start uploading
  110.         ld hl,0x8000                          ;hl is ring buffer read pointer
  111.         ei
  112. mainloop
  113.         in a,(ZXSTAT)                         ;check if a command is pending
  114.         rrca
  115.         jr nc,checkifcandownload
  116. ;handle command
  117.         di
  118.         call processcommand
  119.         ei
  120.         jr mainloop
  121. checkifcandownload
  122.         CALCFREEBUFFERSPACE
  123.         cp 3
  124.         jr c,mainloop                         ;keep read and write addresses of the ring buffer at least 256 bytes apart
  125.         LOAD256 1
  126.         set 7,d
  127.         jr mainloop
  128.  
  129. interrupthandler
  130.         push af
  131.         push bc
  132.         ld a,d
  133.         sub h
  134.         and 0x7f
  135.         cp 3
  136.         jr c,skipupload                       ;keep read and write addresses of the ring buffer at least 256 bytes apart
  137.         in a,(SSTAT)
  138.         rrca
  139.         jr nc,skipupload                      ;check if data requested
  140.         ld b,32                               ;upload 32 bytes
  141. uploadloop
  142.         ld a,(hl)
  143.         out (MD_SEND),a
  144.         inc hl
  145.         djnz uploadloop
  146.         set 7,h                               ;make sure the address didn't wrap under 0x8000
  147. ;blink LED
  148. ;        ld a,h
  149. ;        rlca
  150. ;        rlca
  151. ;        out (LEDCTR),a
  152. skipupload
  153.         pop bc
  154.         pop af
  155.         ei
  156.         ret
  157.  
  158. vssoftreset
  159.         ld l,SCI_VOL
  160.         ld de,SV_SILENCE
  161.         call vswriteregister                  ;set volume to minimum
  162.         ld l,SCI_MODE
  163.         call vsreadregister
  164.         ld a,e
  165.         xor SM_RESET
  166.         ld e,a
  167.         ld a,d
  168.         and ~(SM_SDINEW>>8)                   ;NGS implements compatibility mode only
  169.         ld d,a
  170.         call vswriteregister                  ;reset
  171.         ld a,e
  172.         xor SM_RESET
  173.         ld e,a
  174.         call vswriteregister                  ;clear reset
  175. volumevalue=$+1
  176.         ld de,0
  177.         ld l,SCI_VOL
  178.         call vswriteregister                  ;restore volume
  179.         call vsclockvalue
  180.         ld l,SCI_CLOCKF
  181.         call vswriteregister                  ;set internal clock
  182. vsversion=$+1
  183.         ld a,255
  184.         cp SS_VER_VS1001
  185.         ret nz
  186.         ld l,0x02                             ;Force the clock-doubler on by writing 0x8008 to SCI_INT_FCTLH.
  187.         ld de,0x8008                          ;The datasheet states that you should never write to this register.
  188.         jr vswriteregister                    ;This is, however, an exception.
  189.  
  190. ;l = register
  191. ;de = value
  192. vswriteregister
  193.         WDD
  194.         WDC
  195.         ld a,M_MCNCS
  196.         out (SCTRL),a                         ;SCI start
  197.         WDC
  198.         ld bc,MC_SEND
  199.         ld a,2
  200.         out (c),a                             ;write op
  201.         WDC
  202.         out (c),l                             ;which register
  203.         WDC
  204.         out (c),d                             ;high byte
  205.         WDC
  206.         out (c),e                             ;low byte
  207.         WDC
  208.         ld a,M_MCNCS|M_SETNCLR
  209.         out (SCTRL),a                         ;SCI end
  210.         WDC
  211.         ret
  212.  
  213. ;l = register
  214. ;out: de = value
  215. vsreadregister
  216.         WDD
  217.         WDC
  218.         ld a,M_MCNCS
  219.         out (SCTRL),a                         ;SCI start
  220.         WDC
  221.         ld bc,MC_SEND
  222.         ld a,3
  223.         out (c),a                             ;read op
  224.         WDC
  225.         out (c),l                             ;which register
  226.         WDC
  227.         ld a,0xff
  228.         out (c),a
  229.         WDC
  230.         ld bc,MC_READ
  231.         in d,(c)                              ;high byte
  232.         WDC
  233.         ld a,0xff
  234.         out (MC_SEND),a
  235.         WDC
  236.         in e,(c)                              ;low byte
  237.         WDC
  238.         ld a,M_MCNCS|M_SETNCLR
  239.         out (SCTRL),a                         ;SCI end
  240.         WDC
  241.         ret
  242.  
  243. vsclockvalue
  244. ;out: de = CLOCKF value
  245.         ld a,(vsversion)
  246.         ld de,CLOCKF_VS1011
  247.         cp SS_VER_VS1001
  248.         ret z
  249.         cp SS_VER_VS1002
  250.         ret z
  251.         cp SS_VER_VS1011
  252.         ret z
  253.         ld de,CLOCKF_VS1033
  254.         cp SS_VER_VS1003
  255.         ret z
  256.         cp SS_VER_VS1033
  257.         ret z
  258.         ld de,CLOCKF_VS1053
  259.         ret
  260.  
  261. ngssetfreq
  262. ;d = frequency constant
  263.         in a,(GSCFG0)
  264.         and %11001111
  265.         or d
  266.         out (GSCFG0),a
  267.         ret
  268.  
  269. checkifngs
  270.         in a,(GSCFG0)
  271.         and %11001111
  272.         out (GSCFG0),a
  273.         ld d,a
  274.         WDC
  275.         in a,(GSCFG0)
  276.         cp d
  277.         ret z
  278. notngsloop
  279.         in a,(ZXSTAT)
  280.         rrca
  281.         call c,processcommand
  282.         jr notngsloop
  283.  
  284. mutemod
  285.         xor a
  286.         out (VOL1),a
  287.         out (VOL2),a
  288.         out (VOL3),a
  289.         out (VOL4),a
  290.         out (VOL5),a
  291.         out (VOL6),a
  292.         out (VOL7),a
  293.         out (VOL8),a
  294.         ret
  295.  
  296. processcommand
  297.         in a,(ZXCMD)
  298.         rlca
  299.         ld (commandtable+1),a
  300.         out (CLRCBIT),a
  301. commandtable
  302.         jr $
  303.         jr cmdrestart : ASSERT CMDRESTART==0
  304.         jr cmdgetfreebufferspace : ASSERT CMDGETFREEBUFFERSPACE==1
  305.         jr cmdgetchipid : ASSERT CMDGETCHIPID==2
  306.         jr cmdrestartstream : ASSERT CMDRESTARTSTREAM==3
  307.         jr cmdvolumeup : ASSERT CMDVOLUMEUP==4
  308.         jr cmdvolumedown : ASSERT CMDVOLUMEDOWN==5
  309.  
  310. cmdrestart
  311.         call vssoftreset
  312.         ld d,C_20MHZ
  313.         call ngssetfreq
  314.         jp 0
  315.  
  316. cmdgetfreebufferspace
  317.         CALCFREEBUFFERSPACE
  318.         ATOZX
  319.         ret
  320.  
  321. cmdgetchipid
  322.         ld a,(vsversion)
  323.         ATOZX
  324.         ret
  325.  
  326. cmdrestartstream
  327.         ld sp,GSSTACKADDR
  328.         jp startnewstream
  329.  
  330. cmdvolumeup
  331.         ld a,(volumevalue)
  332.         or a
  333.         ret z
  334.         dec a
  335. setvolume
  336.         push hl
  337.         push de
  338.         push bc
  339.         ld e,a
  340.         ld d,a
  341.         ld (volumevalue),de
  342.         ld l,SCI_VOL
  343.         call vswriteregister
  344.         pop bc
  345.         pop de
  346.         pop hl
  347.         ret
  348.  
  349. cmdvolumedown
  350.         ld a,(volumevalue)
  351.         cp SV_SILENCE>>8
  352.         ret nc
  353.         inc a
  354.         jr setvolume
  355.  
  356. end
  357.         savebin "gscode.bin",begin,end-begin
  358.