Subversion Repositories ngs

Rev

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

  1.  
  2. ; LAST UPDATE: 29.11.2024 savelij
  3.  
  4.                 include macros.a80
  5.                 include ports_ngs.a80
  6.                 include local_macros.a80
  7.                 include local_define.a80
  8.                 include macros_sp.a80
  9.                 include dss.a80
  10.                 include bios_sp.a80
  11.                 include define_sp.a80
  12.                 include ports_sp.a80
  13.                 include sdcomand.a80
  14.  
  15. GSCOD           EQU 0x8000                      ; адрес куда закидывать код на нгс
  16.  
  17.                 ORG ADR_START
  18. START           DI
  19.         IFDEF _SPRINTER
  20.                 CALL CLS
  21.         DE_ADR_SCR ((32-(EMESS24-MESS24))/2),15
  22.                 LD HL,MESS24
  23.                 CALL PRINT
  24.         DE_ADR_SCR 4,9
  25.                 LD HL,MESS28
  26.                 CALL PRINT
  27.                 XOR A
  28.                 CALL DETECT_ISA
  29.                 CALL CHECK_ISA
  30.                 JR NC,.L1
  31.                 CALL CLOSE_ISA
  32.                 LD A,1
  33.                 CALL DETECT_ISA
  34.                 JR NC,.L1
  35.         DE_ADR_SCR 8,8
  36.                 LD HL,NOT_FOUND_ISA
  37.                 CALL PRINT
  38.                 JP NO_ISA
  39.         ELSE
  40.                 LD HL,0x0110
  41.                 LD (0x5C09),HL                  ; установка переменной клавиатуры
  42.                 RES 3,(IY+48)
  43.                 RES 5,(IY+1)
  44.         ENDIF
  45. .L1             LD (OLD_STACK),SP               ; сохранение стека
  46.                 LD SP,0
  47. OLD_STACK       EQU $-2
  48.         IFDEF _SPRINTER
  49. ; TODO добавить получение ключей из командной строки доса
  50.         ELSE
  51.                 LD A,0x7F
  52.                 IN A,(0xFE)
  53.                 RRA
  54.                 RRA
  55.                 JR NC,LOOP21
  56.         ENDIF
  57.  
  58. ; тест наличия GS/NeoGS
  59.                 LD B,0x30                       ; для определения наличия нгс используется
  60.                                                 ; команда 0x1D с параметром =0
  61.         OUT_GSDAT 0                             ; ждем ответа 0x30 прерываний
  62.         OUT_GSCOM 0x1D
  63. LOOP22          EI
  64.                 HALT
  65.                 DI
  66.                 DEC B
  67.                 JR Z,LOOP21                     ; счетчик обнулился, а может нгс висит?
  68.         IN_GSCOM                                ; ждем сброса команд бита
  69.                 RRA
  70.                 JR C,LOOP22
  71.         IN_GSDAT                                ; команд бит сбросился, читаем ответ из дата порта
  72.                                                 ; попытка получить флаговый байт с нгс
  73.         OUT_GSDAT 0                             ; при первом запуске команда 0xFF еще не пропатчена
  74.                 LD B,0x30                       ; ждем ответа 0x30 прерываний
  75.         OUT_GSCOM 0xFF
  76. LOOP001         EI
  77.                 HALT
  78.                 DI
  79.                 DEC B
  80.                 JR Z,LOOP21                     ; счетчик обнулился, пробуем перезапустить нгс
  81.         IN_GSCOM
  82.                 RRA
  83.                 JR C,LOOP001
  84.                 JR LOOP13                       ; нгс ответил на команду, подключаемся к внутреннему плееру
  85.  
  86. ; принудительный перезапуск NeoGS
  87. LOOP21
  88.         OUT_GSCTR M_DBIT                        ; полный сброс нгс
  89.                 EI
  90.                 HALT
  91.                 HALT
  92.                 DI
  93.         OUT_GSCOM 0xF3                          ; холодный перезапуск нгс прошивки
  94.                 LD B,0x30                       ; ждем 0x30 прерываний
  95. LOOP25          EI
  96.                 HALT
  97.                 HALT
  98.                 DI
  99.                 DEC B
  100.                 JP Z,NO__GS                     ; нет ответа, нет нгс
  101.         IN_GSCOM
  102.                 RRA
  103.                 JR C,LOOP25                     ; команд бит изменился, продолжаем
  104. ; загрузка и запуск кода на NeoGS
  105. RST_NGS_CODE                                    ; запрос количества страниц памяти
  106.         OUT_GSCOM 0x23                          ; для определения в какую страницу плеер закидывать
  107.                 CALL WC
  108.         IN_GSDAT
  109.                 OR 0x3F
  110.                 LD D,A
  111.                 LD E,MPAG                       ; включаем стандартной командой прошивки
  112.                 CALL OUTPORT                    ; страницу на нгс для загрузки внутреннего плеера
  113.                                                 ; стандартными средствами грузим код на нгс
  114.                 LD DE,FAT_END - GO_YES
  115.                 LD A,E
  116.         OUT_GSDAT_A
  117.         OUT_GSCOM 0x14
  118.                 CALL WC
  119.                 LD A,D
  120.         OUT_GSDAT_A
  121.                 CALL WD
  122.         OUT_GSDAT LOW (GSCOD)
  123.                 CALL WD
  124.         OUT_GSDAT HIGH(GSCOD)
  125.                 CALL WD
  126.                 LD HL,GO_YES
  127. .LODCOD         LD A,(HL)
  128.                 INC HL
  129.         OUT_GSDAT_A
  130.                 CALL WD
  131.                 DEC DE
  132.                 LD A,D
  133.                 OR E
  134.                 JR NZ,.LODCOD
  135. ; код загрузили, запускаем
  136.         OUT_GSDAT LOW (GSCOD)
  137.         OUT_GSCOM 0x13
  138.                 CALL WC
  139.         OUT_GSDAT HIGH (GSCOD)
  140.                 EI
  141.                 HALT
  142.                 HALT
  143.                 DI                              ; подождали 2 прерывания запуска кода
  144. LOOP13          LD A,7
  145.                 CALL CLS                        ; очистили экран
  146.         DE_ADR_SCR 0,8
  147.                 LD HL,MESS20                    ; печать текста о поиске на SD карточке
  148.                 CALL PRINT
  149.                                                 ; подаем команду проверки что на нгс крутится
  150.         OUT_GSDAT 0x1D
  151.         OUT_GSCOM 0x1F
  152.                 LD B,0
  153.                 CALL WAITGS                     ; ожидаем ответа покручивавая палочку
  154.         IN_GSDAT                                ; читаем ответ
  155.                 CP 0x8B
  156.                 JP Z,RST_NGS_CODE               ; если 0x8B то ответила стандартная прошивка
  157.                 CP PLAYER_OK
  158.                 JP Z,Warm                       ; если ответ 0x77, то ответил внутренний плеер
  159.                 CP SD_NOT_FOUND
  160.                 JP NZ,LOOP17                    ; SD карта найдена?
  161.                 LD A,7
  162.                 CALL CLS
  163.                 LD HL,MESS13
  164.         DE_ADR_SCR 0,16
  165. LOOP20          CALL PRINT
  166.                 LD HL,MESS15
  167.         DE_ADR_SCR 0,18
  168.                 CALL PRINT
  169.                 LD HL,MESS16
  170.         DE_ADR_SCR 0,20
  171.                 CALL PRINT
  172.                 JR LOOP16
  173.  
  174. LOOP17          CP FAT_NOT_FOUND
  175.                 JR NZ,LOOP26                    ; на SD карте FAT не обнаружен
  176.                 LD A,7
  177.                 CALL CLS
  178.                 LD HL,MESS14
  179.         DE_ADR_SCR 0,16
  180.                 JR LOOP20
  181.  
  182. LOOP26          CP FILES_NOT_FOUND
  183.                 JR NZ,LOOP27
  184.                 LD A,7
  185.                 CALL CLS
  186.                 LD HL,MESS23
  187.         DE_ADR_SCR 0,16
  188.                 JR LOOP20
  189.  
  190. LOOP27          CP NEOGS_ERROR
  191.                 JP NZ,RST_NGS_CODE              ; плата GS стараго типав
  192.                 JP NO_NGS
  193.  
  194. LOOP16
  195.         IFDEF _SPRINTER
  196.                 EI
  197.         SPDSS DSSF.SCANKEY
  198.                 JR Z,LOOP16
  199.         ELSE
  200.                 EI
  201.                 HALT
  202.                 DI
  203.                 BIT 5,(IY+1)
  204.                 JR Z,LOOP16
  205.                 LD A,(IY-0x32)
  206.                 RES 5,(IY+1)
  207.         ENDIF
  208.                 CP 0x0D
  209.                 JP Z,START
  210.                 CP 0x20
  211.                 JP Z,RESCOMP
  212.                 JR LOOP16
  213.  
  214. Warm            LD A,7
  215.                 CALL CLS                        ; очистка экрана
  216.                 LD HL,START_TEST
  217.         DE_ADR_SCR 1,0
  218.                 CALL PRINT
  219.  
  220. ; зацикливание теста передачи портов на 256 заходов между компом и NGS
  221. CYCLEZX         LD A,(.NEXT)
  222.                 PUSH AF
  223.                 LD HL,STEP_TEST
  224.         DE_ADR_SCR 1,2
  225.                 CALL PRINT
  226.                 POP AF
  227.                 CALL PRIHEX
  228.                 LD C,0
  229. .NEXT           EQU $-1
  230.         OUT_GSDAT 0x1F
  231.         OUT_GSCOM 0x1F
  232.                 EI
  233.                 HALT
  234.                 DI
  235.         IN_GSDAT
  236.                 CP C
  237.                 JR NZ,.ERROR
  238.                 INC C
  239.                 JR Z,.START_TEST_SD
  240.                 LD A,C
  241.                 LD (.NEXT),A
  242.                 DEC A
  243.                 EI
  244.                 HALT
  245.                 HALT
  246.                 DI
  247.                 JR CYCLEZX
  248.  
  249. .ERROR          LD HL,TEST_ERROR
  250.         DE_ADR_SCR 2,8
  251.                 CALL PRINT
  252.                 JP NO_ISA
  253.  
  254. ; тестирование чтения секторов с SD карты, чтение с передачей на комп
  255. .START_TEST_SD
  256.         DE_ADR_SCR 1,4
  257.                 LD HL,TEST_SD
  258.                 CALL PRINT
  259.  
  260. ; инит SD карты
  261.         OUT_GSDAT 0
  262.         OUT_GSCOM 0x1F
  263.                 CALL WN
  264. .L6
  265.         IN_GSDAT
  266.                 CP PLAYER_OK
  267.                 JR NZ,.L6
  268.  
  269.                 LD BC,0
  270.                 LD DE,0x0100
  271. .               LD IXL,0
  272. .L2             PUSH BC
  273.                 PUSH DE
  274.                 LD HL,STEP_TEST
  275.         DE_ADR_SCR 1,6
  276.                 CALL PRINT
  277.                 LD A,IXL
  278.                 CALL PRIHEX
  279.                 POP DE
  280.                 POP BC
  281.                 EI
  282.                 HALT
  283.                 DI
  284. ; чтения сектора в цикле
  285. .L1             LD A,1                  ; количество секторов для чтения
  286.                 EX AF,AF'
  287.                 LD A,0x20               ; команда драйверу
  288.                 CALL COMM2SD
  289.                 PUSH BC
  290.                 PUSH DE
  291.         OUT_GSCOM_A
  292.                 CALL WC
  293.                 LD DE,512
  294.                 LD HL,FAT_END
  295. .L4             CALL WN
  296.         IN_GSDAT
  297.                 LD (HL),A
  298.                 INC HL
  299.                 DEC DE
  300.                 LD A,D
  301.                 OR E
  302.                 JR NZ,.L4
  303.                 CALL WN
  304. .L5
  305.         IN_GSDAT
  306.                 CP PLAYER_OK
  307.                 JR NZ,.L5
  308.                 EX AF,AF'
  309.                 POP DE
  310.                 POP BC
  311.                 INC IXL
  312.                 LD E,IXL
  313.                 JR NZ,.L2
  314.                 LD HL,END_TEST
  315.         DE_ADR_SCR 1,8
  316.                 CALL PRINT
  317.                 CALL ANYKEY
  318.                 JP RESCOMP
  319.  
  320. ; передатчик команд/параметров в драйвер на NeoGS
  321. COMM2SD
  322.         OUT_GSDAT_A                     ; ушла команда драйверу
  323.         OUT_GSCOM 0x1F                  ; ушла команда прошивке
  324.                 CALL WC
  325.                 LD A,B
  326.         OUT_GSDAT_A                     ; ушли биты 31-24 параметров
  327.                 CALL WD
  328.                 LD A,C
  329.         OUT_GSDAT_A                     ; ушли биты 23-16 параметров
  330.                 CALL WD
  331.                 LD A,D
  332.         OUT_GSDAT_A                     ; ушли биты 15-8 параметров
  333.                 CALL WD
  334.                 LD A,E
  335.         OUT_GSDAT_A                     ; ушли биты 7-0 параметров
  336.                 CALL WD
  337.                 EX AF,AF'
  338.         OUT_GSDAT_A                     ; ушло кол-во секторов
  339.                 EX AF,AF'
  340.                 DUPL 9
  341.                 RET
  342.  
  343. ; при отсутствии NeoGS выход в 128 басик
  344. NO_NGS          LD A,7
  345.                 CALL CLS
  346.         DE_ADR_SCR 9,8
  347.                 LD HL,MESS17
  348.                 CALL PRINT
  349. NO_ISA
  350.         DE_ADR_SCR 6,10
  351.                 LD HL,MESS19
  352.                 CALL PRINT
  353.                 CALL ANYKEY
  354.                 JP RESCOMP
  355.  
  356. ; ждем нажатия кнопки
  357. ANYKEY
  358.         IFDEF _SPRINTER
  359.                 EI
  360.         SPDSS DSSF.SCANKEY
  361.                 JR Z,ANYKEY
  362.                 RET
  363.         ELSE
  364. .L1             XOR A
  365.                 IN A,(0xFE)
  366.                 CPL
  367.                 AND 0x1F
  368.                 JR Z,.L1
  369.                 RET
  370.         ENDIF
  371.  
  372. ; ждем отпускания кнопки
  373. NANYKEY
  374.         IFDEF _SPRINTER
  375.                 EI
  376.         SPDSS DSSF.SCANKEY
  377.                 JR NZ,NANYKEY
  378.                 RET
  379.         ELSE
  380. .L1             XOR A
  381.                 IN A,(0xFE)
  382.                 CPL
  383.                 AND 0x1F
  384.                 JR NZ,.L1
  385.                 RET
  386.         ENDIF
  387.  
  388. ; при отсутствии GS выход в 128 басик
  389. NO__GS          LD A,7
  390.                 CALL CLS
  391.         DE_ADR_SCR 10,8
  392.                 LD HL,MESS18
  393.                 CALL PRINT
  394.         DE_ADR_SCR 6,10
  395.                 LD HL,MESS19
  396.                 CALL PRINT
  397.                 CALL ANYKEY
  398.                 JP RESCOMP
  399.  
  400. ; печать текста до байта 0 или пока B не обнулица
  401. PRINT_B         LD A,(HL)
  402.                 AND A
  403.                 RET Z
  404.                 INC HL
  405.                 CALL PRISYM
  406.                 DJNZ PRINT_B
  407.                 RET
  408.  
  409. ; печать текста до байта 0
  410. PRINT           LD A,(HL)
  411.                 INC HL
  412.                 AND A
  413.                 RET Z
  414.                 CALL PRISYM
  415.                 JR PRINT
  416.  
  417.  
  418. ; ожидание отпускания кнопки и сброс
  419. RESCOMP         CALL NANYKEY
  420.         IFDEF _SPRINTER
  421.                 CALL CLS
  422.                 CALL CLOSE_ISA
  423.         SPDSS DSSF.EXIT
  424.         ELSE
  425.                 XOR A
  426.                 LD BC,0x7FFD
  427.                 OUT (C),A
  428.                 JP 0
  429.         ENDIF
  430.  
  431. WAITGS          LD E,B
  432.                 LD D,0
  433.                 LD HL,VENTIL
  434.                 ADD HL,DE
  435.                 LD A,(HL)
  436.         DE_ADR_SCR 27,8
  437.                 CALL PRISYM
  438.                 LD C,5
  439. .L1             EI
  440.                 HALT
  441.                 DI
  442.                 DEC C
  443.                 JR NZ,.L1
  444.         IN_GSCOM
  445.                 RRA
  446.                 RET NC
  447.                 INC B
  448.                 RES 2,B
  449.                 JR WAITGS
  450.  
  451. MOD00           DZ "Length:        "
  452. MOD02           DZ "Position:      "
  453. MOD03           DZ "Note:          "
  454.  
  455. VENTIL          DB 0xC4,0x5C,0x7C,0x2F
  456.  
  457. MESS16          DZ "\"Space\" Exit"
  458. MESS13          DZ "SD-Card Not Found"
  459. MESS14          DZ "FAT not Found"
  460. MESS15          DZ "Press \"ENTER\" 4 Restart Init SD"
  461. MESS17          DB "Neo"
  462. MESS18          DZ "GS not found"
  463. MESS19          DB "Press any key for "
  464.         IFDEF _SPRINTER
  465.                 DZ "exit"
  466.         ELSE
  467.                 DZ "reset"
  468.         ENDIF
  469. MESS20          DZ "Please wait, search files"
  470. MESS23          DZ "File(s) not found"
  471. MESS24          DB "Neo Player Light v";,VERS_PLAYER,0
  472. EMESS24         EQU $-1
  473. MESS28          DZ "Please wait, detect NeoGS"
  474.  
  475.         IFDEF _SPRINTER
  476. NOT_FOUND_ISA   DZ "ISA Slot not found. Emulator?"
  477.         ENDIF
  478.  
  479. START_TEST      DZ "Test ports ZX <-> NGS"
  480. STEP_TEST       DZ "Position: "
  481. TEST_ERROR      DZ "Error test"
  482. TEST_SD         DZ "Test SD card read"
  483. END_TEST        DZ "Test OK, press any key 4 reset"
  484.  
  485. CLS
  486.         IFDEF _SPRINTER
  487.                 LD HL,32 << 8 + 80
  488.                 LD DE,0
  489.         SPBIOS BIOSF.LP_CLS_WIN, LGRAY
  490.         ELSE
  491.                 LD HL,0x4000
  492.                 LD E,L
  493.                 LD D,H
  494.                 LD (HL),L
  495.                 INC E
  496.                 LD BC,0x1800
  497.                 LDIR
  498.                 LD (0x5C8D),A
  499.                 LD (0x5C48),A
  500.                 LD HL,0x5800
  501.                 LD D,H
  502.                 LD E,L
  503.                 LD (HL),A
  504.                 LD BC,0x02FF
  505.                 INC E
  506.                 LDIR
  507.                 RRCA
  508.                 RRCA
  509.                 RRCA
  510.                 AND 7
  511.                 OUT (0xFE),A
  512.         ENDIF
  513.                 RET
  514.  
  515. ; чтение из порта NeoGS
  516. ; вход: E-адрес порта
  517. ; выход: A-прочитанное значение
  518. INPORT          LD A,E
  519.         OUT_GSDAT_A
  520.         OUT_GSCOM 0x11
  521.                 CALL WC
  522.         IN_GSDAT
  523.                 RET
  524.  
  525. ; запись в порт NEOGS
  526. ; вход: E-адрес порта, D-значение
  527. OUTPORT         LD A,E
  528.         OUT_GSDAT_A
  529.         OUT_GSCOM 0x10
  530.                 CALL WC
  531.                 LD A,D
  532.         OUT_GSDAT_A
  533.                 JR WD
  534.  
  535. RES_PORTNGS     XOR A
  536.         OUT_GSDAT_A
  537.         OUT_GSCOM_A
  538.         IN_GSCOM
  539.                 RET
  540.  
  541. ; ожидание установки DATA бита
  542. WN
  543.         IN_GSCOM
  544.                 RLA
  545.                 JR NC,WN
  546.                 RET
  547.  
  548. ; ожидание сброса COMMAND бита
  549. WC
  550.         IN_GSCOM
  551.                 RRA
  552.                 JR C,WC
  553.                 RET
  554.  
  555. ; ожидание сброса DATA бита
  556. WD
  557.         IN_GSCOM
  558.                 RLA
  559.                 JR C,WD
  560.                 RET
  561.  
  562. ; прием E байт из NeoGS
  563. INI_E
  564. INI_E1          LD D,0
  565. INI_E2          DEC D
  566.                 JR Z,INI_E3
  567.                 CALL WN
  568.         IN_GSDAT
  569.                 LD (HL),A
  570.                 INC HL
  571.                 DEC E
  572.                 JR NZ,INI_E1
  573.                 RET
  574.  
  575. INI_E3
  576.                 LD SP,(OLD_STACK)
  577.                 JP LOOP21
  578.  
  579. PRIHEX          PUSH AF
  580.                 RRA
  581.                 RRA
  582.                 RRA
  583.                 RRA
  584.                 CALL .PHC
  585.                 POP AF
  586. .PHC            AND 0x0F
  587.                 CP 0x0A
  588.                 JR C,.L1
  589.                 ADD A,7
  590. .L1             ADD A,'0'
  591. PRISYM          PUSH HL
  592.                 PUSH DE
  593.         IFDEF _SPRINTER
  594.                 PUSH BC
  595.                 LD B,1
  596.         SPBIOS BIOSF.LP_PRINT_SYM
  597.                 POP BC
  598.                 POP DE
  599.                 POP HL
  600.                 RET
  601.         ELSE
  602.                 PUSH DE
  603.                 LD L,A
  604.                 LD H,0
  605.                 LD DE,CHARS
  606.                 ADD HL,HL
  607.                 ADD HL,HL
  608.                 ADD HL,HL
  609.                 ADD HL,DE
  610.                 POP DE
  611.         REPT 8
  612.                 LD A,(HL)
  613.                 LD (DE),A
  614.                 INC HL
  615.                 INC D
  616.         ENDM
  617.                 POP DE
  618.                 POP HL
  619.                 INC E
  620.                 RET
  621.         ENDIF
  622.  
  623.         IFDEF _SPRINTER
  624. ; установка позиции печати
  625. SET_DE_ADR_SCR  PUSH AF
  626.                 PUSH HL
  627.                 PUSH DE
  628.                 PUSH BC
  629.         SPBIOS BIOSF.LP_SET_PLACE
  630.                 POP BC
  631.                 POP DE
  632.                 POP HL
  633.                 POP AF
  634.                 RET
  635.  
  636. DETECT_ISA      LD (OPEN_ISA.SLOT),A
  637. ; A - номер слота 0 или 1
  638. OPEN_ISA        LD A,0
  639. .SLOT           EQU $-1
  640.                 ex af,af'
  641.                 in a,(PAGE_CPU3);(mmu3)
  642.                 ld (CLOSE_ISA.pg),a
  643.                 ld bc,0x1FFD;sc_port
  644.                 ld a,0x11
  645.                 out (c),a
  646.                 ex af,af'
  647.                 rlca
  648.                 or %11010100;ISA.SLOT0_PORT
  649.                 out (PAGE_CPU3),a;(mmu3),a
  650.                 ld bc,ISA_PORT;ISA.DIR
  651.                 xor a
  652.                 out (c),a
  653.                 ret
  654.  
  655. CLOSE_ISA       ld bc,0x1FFD;sc_port
  656.                 ld a,1
  657.                 out (c),a
  658.                 ld a,0
  659. .pg             EQU $-1
  660.                 out (PAGE_CPU3),a;(mmu3),a
  661.                 ret
  662.  
  663. CHECK_ISA       ld a,(0xC000)
  664.                 cp 0xff
  665.                 ret z                           ; норм, шина ISA есть
  666.                 scf                             ; нет, шины нет (эмулятор?)
  667.                 ret
  668.         ENDIF
  669.  
  670.         IFNDEF _SPRINTER
  671. CHARS           binclude make/altstd.bin
  672.         ENDIF
  673.  
  674. ; код для выполнения на нгс
  675. GO_YES          ;binclude tmp/play_on_ngs.rom
  676.  
  677. ; патч прошивки для плеерения MOD
  678. ; плеерение, проверка и прочее
  679. COMINT          EQU 0x026B
  680. COMINT_         EQU 0x026E
  681. COMINT0         EQU 0x0273
  682. COMINT1         EQU 0x0295
  683. WTDTL           EQU 0x02BC
  684. EMPTY1          EQU 0x0942
  685. ADDA80          EQU 0x0EF8
  686. EMPTY2          EQU 0x3D5F
  687. NUMPG           EQU 0x4080                              ; всего страниц
  688. CPAGE           EQU 0x4081
  689. CNTMOD          EQU 0x4090
  690. CURMOD          EQU 0x4096
  691. CONVERT         EQU 0x40B7
  692. MTSTAT          EQU 0x4151
  693. MTSNGPS         EQU 0x415B
  694. MTSNGSZ         EQU 0x415C
  695. PlMode          EQU 0x41A0
  696. MODLLEN         EQU 0x41A1
  697. ISTACK          EQU 0x4400
  698. LDMOD           EQU 0xC3F8
  699. PLAYMOD         EQU 0xC426
  700. FXB01           EQU 0xD2B2
  701.  
  702.  INIT_VAR 0x4168
  703.  SETVAR FLAGS,                  BYTE
  704.  SETVAR STATUS,                 BYTE                    ; статус плеера
  705.  SETVAR GETVTSL,                BYTE                    ; громкость MP3 чипа
  706.  SETVAR GETVTSH,                BYTE                    ; биты режимов
  707.  SETVAR VSTBL,                  WORD                    ; текущие настройки тембров
  708.  SETVAR COUNT_MP3,              WORD                    ; количество MP3
  709.  SETVAR NUMFILE,                WORD                    ; номер текущего файла
  710.  SETVAR TYPE_RESET,             BYTE                    ; тип сброса
  711.  SETVAR TYPE_FAT,               BYTE                    ; калибр FAT
  712.  SETVAR BUF_TEXT,               8                       ; буфер для текста
  713.  SETVAR SIZE_PATTERN_MOD,       BYTE                    ; кол-во патернов в загруженном MOD
  714.  SETVAR SIZE_PAGES_MOD,         BYTE                    ; кол-во страниц MOD
  715.  SETVAR TIMEOUT,                WORD                    ; TIMEOUT на работу с новым файлом
  716.  SETVAR KUDAXOR,                WORD                    ; адрес перехода на XOR BIT 7
  717.  SETVAR PAGE_PLAYER,            BYTE                    ; номер страницы расположения плеера
  718.  SETVAR INT_MODE,               BYTE                    ; флаг разрешенности прерываний
  719.  SETVAR CHIP_TYPE,              BYTE                    ; тип чина на плате
  720.  SETVAR FILE_TYPE,              BYTE                    ; тип файла
  721.  SETVAR BCDE,                   DWORD                   ; параметры от спека
  722.  SETVAR SIZE,                   BYTE                    ;
  723.  SETVAR PARAM1,                 BYTE
  724.  SETVAR SIZE_VARS,              0                       ; количество переменных
  725.  
  726.         PHASE 0x8000
  727.                 DI
  728.                 LD SP,ISTACK
  729.                 CALL PATCH
  730.                 OUT (ZXDATWR),A
  731.                 OUT (CLRCBIT),A                         ; сообщили спеку о результатах инита
  732.                 JP COMINT
  733.  
  734. PATCH           LD A,(NUMPG)
  735.                 OR %00111111
  736.                 LD (PAGE_PLAYER),A                      ; страница расположения плеера
  737.                 IN A,(GSCFG0)
  738.                 RES B_RAMRO,A
  739.                 SET B_EXPAG,A
  740.                 OUT (GSCFG0),A
  741.                 LD A,0x80
  742.                 OUT (MPAGEX),A
  743.  
  744.                 LD HL,0x11D6
  745.                 LD (HL),0xCD
  746.                 INC HL
  747.                 LD (HL),LOW (NXTMODR)
  748.                 INC HL
  749.                 LD (HL),HIGH (NXTMODR)
  750.                 INC HL
  751.                 EX DE,HL
  752.                 LD HL,0x11E3
  753.                 XOR A
  754.                 SBC HL,DE
  755.                 LD B,H
  756.                 LD C,L
  757.                 LD H,D
  758.                 LD L,E
  759.                 LD (HL),A
  760.                 INC DE
  761.                 LDIR                                    ; зачистка хвостов в ПЗУ
  762.  
  763.                 LD HL,P_START
  764.                 LD DE,EMPTY1
  765.                 LD BC,P__END - P_00
  766.                 LDIR                                    ; перенос управления MP3 плеером в ПЗУ
  767.                 LD HL,(NUMPG)
  768.                 LD H,0x40
  769.                 DEC L
  770.                 LD (HL),1
  771.                 INC L
  772.                 LD (HL),0                               ; отрубание последней страницы ОЗУ
  773.                                                         ; от основного списка страниц
  774.                 LD HL,NUMPG
  775.                 DEC (HL)
  776.                 LD HL,P_00
  777.                 LD (0x0300 + (0x1F * 2)),HL             ; патч команды 1F
  778.                 LD HL,COMMFF
  779.                 LD (0x0300 + (0x2F * 2)),HL             ; патч команды FF
  780.                 IN A,(GSCFG0)
  781. ;               SET B_RAMRO,A                           ; запрет звписи в прошивку
  782.                 RES B_EXPAG,A
  783.                 OUT (GSCFG0),A
  784.                 LD A,(PAGE_PLAYER)
  785.                 OUT (MPAG),A
  786.  
  787.                 LD A,PLAYER_OK                          ; код ошибки =все замечательно
  788.                 LD (STATUS),A
  789.                 RET
  790.  
  791. NXTMODR         LD A,(PAGE_PLAYER)
  792.                 OUT (MPAG),A
  793.                 JP OPROS
  794.  
  795. COMMFF          IN A,(ZXDATRD)
  796.                 OUT (CLRCBIT),A
  797.                 ADD A,LOW (FLAGS)
  798.                 LD IYL,A
  799.                 LD A,HIGH (FLAGS)
  800.                 ADC A,0
  801.                 LD IYH,A
  802.                 LD A,(IY+0)
  803.                 OUT (ZXDATWR),A
  804.                 JP COMINT_
  805. ;       DEPHASE
  806.  
  807. P_START
  808.         PHASE EMPTY1
  809.  
  810. ; основной цикл общения со спеком
  811. P_00            JP OPROS.L3
  812.  
  813. ; продолжить играть MOD
  814. CONROM          LD A,(CPAGE)
  815.                 OUT (MPAG),A
  816.                 JP COMINT
  817.  
  818. OPROS           IN A,(ZXSTAT)
  819.                 RRA
  820.                 JR C,.L1
  821.                 JR OPROS
  822.  
  823. .L1             IN A,(ZXCMD)
  824.                 CP 0x1F
  825.                 JR NZ,CONROM
  826. .L3             IN A,(ZXDATRD)
  827.                 OUT (CLRCBIT),A
  828.                 LD (PARAM1),A
  829.                 CP 0x20
  830.                 JR NZ,.L4
  831.                 EX AF,AF'
  832.                 CALL WDY
  833.                 IN A,(ZXDATRD)                  ; прием битов 31-24 параметра
  834.                 LD H,A
  835.                 CALL WDY
  836.                 IN A,(ZXDATRD)                  ; прием битов 23-16 параметра
  837.                 LD L,A
  838.                 LD (BCDE),HL
  839.                 CALL WDY
  840.                 IN A,(ZXDATRD)                  ; прием битов 15-8 параметра
  841.                 LD H,A
  842.                 CALL WDY
  843.                 IN A,(ZXDATRD)                  ; прием битов 7-0 параметра
  844.                 LD L,A
  845.                 LD (BCDE+2),HL
  846.                 CALL WDY
  847.                 IN A,(ZXDATRD)                  ; прием кол-во секторов
  848.                 LD (SIZE),A
  849. .L2             EX AF,AF'
  850. .L4             LD HL,CONROM
  851.                 PUSH HL
  852.                 ADD A,A
  853.                 ADD A,LOW (TABFUNC)
  854.                 LD L,A
  855.                 LD A,HIGH (TABFUNC)
  856.                 ADC A,0
  857.                 LD H,A
  858.                 LD A,(PAGE_PLAYER)
  859.                 OUT (MPAG),A
  860.                 LD A,(HL)
  861.                 INC HL
  862.                 LD H,(HL)
  863.                 LD L,A
  864.                 JP (HL)
  865.  
  866. ;----FUNC1D----
  867. ; ответ на запрос какой код работает
  868. TEST_MODE       IN A,(ZXDATRD)
  869.                 OUT (CLRCBIT),A
  870.                 LD A,(STATUS)
  871.                 OUT (ZXDATWR),A
  872.                 RET            
  873.  
  874. ;----FUNC1F-----
  875. ; тест порта с возвратом кода
  876. CYCLE           IN A,(ZXDATRD)
  877.                 OUT (CLRCBIT),A
  878.                 LD C,0
  879. .NEXT           EQU $-1
  880.                 LD B,0
  881.                 DJNZ $
  882.                 LD A,C
  883.                 OUT (ZXDATWR),A
  884.                 INC A
  885.                 LD (.NEXT),A
  886. NONFUNC         RET
  887.  
  888. ;----FUNC20-----
  889. ; читать сектора карты по номеру
  890. READ_SD_SECTOR  LD A,(SIZE)
  891.                 EX AF,AF'
  892.                 LD A,2
  893.                 LD HL,BUFREAD
  894.                 LD DE,(BCDE)
  895.                 LD BC,(BCDE+2)
  896.                 PUSH HL
  897.                 CALL COM2SD
  898.                 POP HL
  899.                 LD DE,512
  900. ; передача одного сектора на спек
  901. RDSECTG         IN A,(ZXSTAT)
  902.                 RRA
  903.                 JR NC,RDSECTG
  904.                 OUT (CLRCBIT),A
  905. .L1             LD A,(HL)
  906.                 INC HL
  907.                 OUT (ZXDATWR),A
  908.                 CALL WDN
  909.                 DEC DE
  910.                 LD A,D
  911.                 OR E
  912.                 JR NZ,.L1
  913.  
  914. OK_WORK         LD A,PLAYER_OK
  915. OUTSTAT         OUT (ZXDATWR),A
  916. ; ждем пока спек заберет байт из порта
  917. WDN             IN A,(ZXSTAT)
  918.                 RLA
  919.                 JR C,WDN
  920.                 RET
  921.  
  922. ; ждем пока спек даст байт в порт
  923. WDY             IN A,(ZXSTAT)
  924.                 RLA
  925.                 JR NC,WDY
  926.                 RET
  927.  
  928. INIT_SD         XOR A
  929.                 CALL COM2SD
  930.                 AND A
  931.                 LD A,PLAYER_OK                          ; код ошибки =все замечательно
  932.                 JR Z,.L1
  933.                 LD A,SD_NOT_FOUND
  934. .L1             LD (STATUS),A
  935.                 OUT (ZXDATWR),A
  936.                 RET
  937.  
  938. COM2SD          include sd_on_ngs.a80  
  939.  
  940. TABFUNC         DW INIT_SD                                      ; 00 перезапуск SD
  941.                 DW NONFUNC;PREV_TRACK                           ; 01 предыдущий трек
  942.                 DW NONFUNC;PLAY                                 ; 02 плей
  943.                 DW NONFUNC;PAUSE                                ; 03 пауза
  944.                 DW NONFUNC;STOP                                 ; 04 стоп
  945.                 DW NONFUNC;NEXT_TRACK                           ; 05 следующий трек
  946.                 DW NONFUNC;XORBASS                              ; 06 XOR TREBLE/BASS
  947.                 DW NONFUNC;XORSURR                              ; 07 XOR SURROUND
  948.                 DW NONFUNC;VOL_UP                               ; 08 громкость +
  949.                 DW NONFUNC;VOL_DOWN                             ; 09 громкость -
  950.                 DW NONFUNC;MUTE                                 ; 0A вкл/выкл громкости
  951.                 DW NONFUNC;GET_TIME                             ; 0B отдать время
  952.                 DW NONFUNC;GET_VTS                              ; 0C отдать парам 6-10
  953.                 DW NONFUNC;GET_CURRENT                          ; 0D отдать тек номер
  954.                 DW NONFUNC;SET_NUM                              ; 0E установка текущего номера
  955.                 DW NONFUNC;RESET_MP3                            ; 0F сброс MP3 декодера
  956.                 DW NONFUNC;FAT_TYPE                             ; 10 тип FAT
  957.                 DW NONFUNC;GET_LNG                              ; 11 отдать имя файла
  958.                 DW NONFUNC;GET_FILE_DESCR                       ; 12 отдать описатель
  959.                 DW NONFUNC;GET_COUNT_FILES                      ; 13 отдать колво *.EXT
  960.                 DW NONFUNC;SEND_MP3                             ; 14 прд на MP3
  961.                 DW NONFUNC;TXT_COUNT_FILES                      ; 15 DEC число файлов
  962.                 DW NONFUNC;TXT_CURRENT_FILE                     ; 16 DEC число текущ+1
  963.                 DW NONFUNC;XOR_RESET                            ; 17 переключения типа сброса
  964.                 DW NONFUNC;PREV_DIR                             ; 18 следующий DIR
  965.                 DW NONFUNC;NEXT_DIR                             ; 19 предыдущий DIR
  966.                 DW NONFUNC;SET_TEMBR                            ; 1A уст. тембров
  967.                 DW NONFUNC;TXT_TEMBR_STATUS                     ; 1B чтение тембров
  968.                 DW NONFUNC;BITRATE                              ; 1C RD битрейт и проч
  969.                 DW TEST_MODE                                    ; 1D тест режима
  970.                 DW NONFUNC;GET_CHIP_TYPE                        ; 1E номер чипа MP3
  971.                 DW CYCLE                                        ; 1F тест обмена
  972.                 DW READ_SD_SECTOR                               ; 20 читать сектора карты по номеру
  973. END_TAB
  974.  
  975. P__END
  976.         DEPHASE
  977. BUFREAD
  978.         DEPHASE
  979. FAT_END
  980.