Facebook
From Muffie, 3 Years ago, written in x86 Assembler.
Embed
Download Paste or View Raw
Hits: 181
  1. ;
  2. ;       (C) By Muffie 2008.
  3. ;    v5 preliminary (incorrect) noise support. (most of comments are in Brazilian Portuguese)
  4. ;
  5.  
  6. LATCH:                  DB 00           ; tenho que gravar a porra do ultimo latch...
  7. FREQLOW:                DB 00           ; PARTE BAIXA DO SOM
  8. FLAGNOISE:              DB 00
  9. VOLUMEC:                DB 00
  10.  
  11. ;;Muffie's note to self
  12. ;; AY-CHIP
  13. ;;      Channel A, tone period: xxxxyyyyzzzz = xxxx in R1 and yyyyzzzz in R0
  14. ;;
  15.  
  16.  
  17. ; SN REGISTERS DUMP
  18. ;LATCH:                 DB %00000000
  19. VOL0:                   DB %00000000                    ; xxxx0000
  20. VOL1:                   DB %00000000                    ; xxxx0000
  21. VOL2:                   DB %00000000                    ; xxxx0000
  22. ;VOLN:                  DB %00000000                    ; xxxx0000
  23. TON0L:                  DB %00000000                    ; 00000000      ;R0
  24. TON0U:                  DB %00000000                    ; xxxxxx00      ;R1
  25. TON1L:                  DB %00000000                    ; 00000000      ;R2
  26. TON1U:                  DB %00000000                    ; xxxxxx00      ;R3
  27. TON2L:                  DB %00000000                    ; 00000000      ;R4
  28. TON2U:                  DB %00000000                    ; xxxxxx00      ;R5
  29. TONN:                   DB %00000000                    ; xxxxx000     
  30.  
  31. REG7:           DB $00
  32.  
  33. INIT_SOUND:
  34.         PUSH AF
  35.         LD      A,7
  36.         OUT     ($A0),A
  37.         LD A,%10111000  ; sem ruido
  38.         OUT ($A1),A
  39.         LD (REG7),A
  40.  
  41.         LD A,8
  42.         OUT     ($A0),A ; Selecionei registrador 8, volume do canal A , carregado no a  do PSG
  43.         LD A,%00000000 ;  Modo Fixo, volume ZERO
  44.         OUT ($A1),A     ; gravei
  45.  
  46.         LD A,9
  47.         OUT     ($A0),A ; Selecionei registrador 9, volume do canal B , carregado no a  do PSG
  48.         LD A,%00000000 ;  Modo Fixo, volume ZERO
  49.         OUT ($A1),A     ; gravei
  50.  
  51.         LD A,10
  52.         OUT     ($A0),A ; Selecionei registrador 10, volume do canal c , carregado no a  do PSG
  53.         LD A,%00000000 ;  Modo Fixo, volume ZERO
  54.         OUT ($A1),A     ; gravei
  55.        
  56.         ; agora vamos apagar os tons
  57.         LD A,0
  58.         OUT     ($A0),A ; Selecionei registrador 0, tom do canal A
  59.         LD A,%00000000 ;
  60.         OUT ($A1),A     ; gravei
  61.         LD A,1
  62.         OUT     ($A0),A ; Selecionei registrador 1, tom do canal A
  63.         LD A,%00000000 ;
  64.         LD A,2
  65.         OUT     ($A0),A ; Selecionei registrador 2, tom do canal A
  66.         LD A,%00000000 ;
  67.         OUT ($A1),A     ; gravei
  68.         LD A,3
  69.         OUT     ($A0),A ; Selecionei registrador 3, tom do canal A
  70.         LD A,%00000000 ;
  71.         LD A,4
  72.         OUT     ($A0),A ; Selecionei registrador 4, tom do canal A
  73.         LD A,%00000000 ;
  74.         OUT ($A1),A     ; gravei
  75.         LD A,5
  76.         OUT     ($A0),A ; Selecionei registrador 5, tom do canal A
  77.         LD A,%00000000 ;
  78.  
  79.         POP AF
  80.         RET
  81. ; ---------QDEMU - By Muffie 201477--------------------------------------------------------------
  82. TOCA_SOM_COLECO:
  83.         PUSH AF
  84.         PUSH BC
  85.         PUSH HL
  86.         PUSH DE
  87.        
  88.        
  89.         LD B,A                  ;
  90.         BIT 7,A
  91.         JP Z,TS_DADOS
  92.  
  93. TS_REGISTRO:                                    ;;LATCH/DATA BYTE      
  94.         LD (LATCH),A
  95.         AND %00010000                           ; SE DER ZERO É FREQUENCIA
  96.         JR Z,TS_FREQUENCIA
  97. TS_VOLUME:                                              ; SENÃO É VOLUME...
  98.         LD A,B
  99.         AND %01100000
  100.         RRCA
  101.         RRCA
  102.         RRCA
  103.         RRCA
  104.         RRCA                                            ; NÚMEROS BONITINHOS: 0 = CANAL 0, 1 = CANAL 1, 2 = CANAL 2 E 3=CANAL RUIDO!
  105.         LD C,A                                          ; C TEM O CANAL
  106. TS_VOLUME_JUMP_FROM_DATA:
  107.         LD A,B                                          ;; VOLTEI PRA PEGAR O VOLUME
  108.         AND %00001111
  109.         CPL
  110.         AND %00001111                           ; VOLUME NO COLECO EH INVERTIDO
  111.         LD B,A                                          ; B AGORA TEM O VOLUME CERTINHO
  112.         LD A,C
  113.         CP  %00000011                           ; SERÁ QUE ELE QUER O VOLUME DO RUIDO?
  114.         JR Z,TS_VOLUME_RUIDO   
  115.         LD A,8
  116.         ADD A,C                                         ; PARA PEGAR O REGISTRADOR CERTO PARA O VOLUME DE CADA CANAL
  117.         OUT ($A0),A
  118.         LD A,
  119.         OUT ($A1),A                                     ; PRONTO, VOLUME "SETADO"
  120.         LD HL,VOL0                                      ;; AGORA VOU SALVAR O VOLUME NA MEMORIA VOL0,VOL1,VOL2
  121.         LD B,0
  122.         ADD HL,BC                                       ;
  123.         LD (HL),A                                       ; SALVEI O VOLUME TAMBEM
  124.  
  125.         JP TS_FIM
  126. TS_VOLUME_RUIDO:
  127.         LD A,B                                          ; B já tinha o volume em formato xxxx0000
  128.         ;LD (VOLN),A                                    ; SALVEI O VOLUME DO RUIDO
  129.         OR A                                            ; SÓ FICA MUTE SE O VOLUME FOR ZERO. QQ COUSA DIFERENTE, LIGARÁ
  130.         JR Z,OFFRUIDO
  131. ONRUIDO:
  132.         CALL LIGA_NOISE
  133.         JR TS_FIM                                       ;
  134. OFFRUIDO:
  135.         CALL DESLIGA_NOISE
  136.         JR TS_FIM
  137.  
  138. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FIM VOLUME (PARTE DO LATCH/DATA BYTE DO SN)
  139.        
  140. TS_FREQUENCIA:
  141.         LD A,B                                          ; O B AQUI AINDA TEM O LATCH FULL
  142.         CALL GET_CHANNEL_FROM_A
  143.         LD C,A                                          ; C AGORA TEM O CANAL CERTINHO
  144.         CP %00000011                            ; O CARA QUER O CANAL DE RUIDO?
  145.         JR Z,TS_FREQ_RUIDO2            
  146.         LD A,B
  147.         LD B,$0
  148.         RLC C                                           ; MULTIPLICADO POR DOIS, MAS SEMPRE A PARTE BAIXA DOS CANAIS
  149.         LD HL,TON0L                                     ; INICIO DOS REGISTROS
  150.         ADD HL,BC                                       ; PARTE BAIXA DO CANAL CORRETO
  151.         AND %00001111                           ; AGORA A TEM A FREQUENCIA
  152.         LD (HL),A                                       ; GRAVEI A PARTE BAIXA NO TOM DO CANAL CORRETO
  153.         JP OUTPUT_CHANNEL
  154.        
  155. TS_FREQ_RUIDO2:                                 ; PULA DIRETO DOS DADOS TB
  156.         LD HL,TONN
  157.         LD A,B
  158.         AND %00000111                           ; O RUIDO DO COLECO SOH TEM 3 BITS
  159.         LD (HL),A
  160.         JP OUTPUT_CHANNEL
  161.        
  162. TS_FIM:
  163.         POP DE
  164.         POP HL
  165.         POP BC
  166.         POP AF
  167.         RET
  168.  
  169. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FIM DO (LATCH/DATA BYTE DO SN)
  170.        
  171. TS_DADOS:
  172.         LD A,(LATCH)                            ; PEGUEI O ULTIMO QUE VEIO ANTES
  173.         BIT 4,A                                         ; 0 É TOM OU NOISE, 1 É VOLUME
  174.         JR NZ,TS_DADOS_VOLUME                   ;
  175.         CALL GET_CHANNEL_FROM_A
  176.         CP %00000011                            ; O CARA QUER O CANAL DE RUIDO?
  177.         JR Z,TS_FREQ_RUIDO2            
  178. TS_DADOS_TOMS:
  179.         LD C,A                                          ; C AGORA TEM O CANAL CERTINHO
  180.         LD D,B                                          ; SALVEI O BYTE DE DADOS EM D
  181.         LD B,$0
  182.         LD HL,TON0L
  183.         RLC C                                           ; CADA CANAL OCUPA 2 BYTES, TEM QUE MULT2 PARA ACHAR A PARTE BAIXA CORRETA
  184.         ADD HL,BC
  185.         LD A,D
  186.         AND %00001111
  187.         RLCA
  188.         RLCA
  189.         RLCA
  190.         RLCA
  191.         LD E,A
  192.         LD A,(HL)
  193.         ADD A,E
  194.         LD (HL),A                                       ; GRAVEI OS 4 DA DIREITA DOS DADOS
  195.         INC HL                                          ; AGORA VOU PARA A PARTE ALTA DO REGISTRO DE TOM
  196.         LD A,D
  197.         AND %00110000                           ; A PARTE DE BAIXO JÁ SALVEI
  198.         RRCA
  199.         RRCA
  200.         RRCA
  201.         RRCA
  202.         LD (HL),A                                       ; PRONTO, DEVO TER O TOM CORRETO
  203.         JP      OUTPUT_CHANNEL                  ; EH FREQUENCIA
  204.        
  205. TS_DADOS_VOLUME:
  206.         CALL GET_CHANNEL_FROM_A
  207.         LD C,A                                          ; TENHO QUE PREPARAR O C PARA O JUMP
  208.         JP TS_VOLUME_JUMP_FROM_DATA     ; EM B AINDA TENHO O ORIGINAL DE DADOS, VOLUME. NEM DEVE EXISTIR ESTE
  209.        
  210.  
  211. GET_CHANNEL_FROM_A:
  212.         AND %01100000
  213.         RLCA
  214.         RLCA
  215.         RLCA
  216.         RET
  217.        
  218. LIGA_NOISE:
  219.         LD IX,VOL0 ;; VAMOS ESCOLHER O CANAL COM MAIOR VOLUME
  220. LN_LOOP:
  221.         LD A,(IX)
  222.         LD D,(IX+1)
  223.         LD E,(IX+2)
  224.         CP D
  225.         JR C,STEP1              ; D É MAIOR QUE A
  226.         CP E
  227.         JR C,STEP1              ; E É MAIOR QUE A
  228.         LD B,%10110000  ; NOISE VAI PARA O CANAL 0 (A)
  229.         LD C,%00000001
  230.         LD D,8                  ; VOLUME DO CANAL A
  231.         JR LN_FIM
  232. STEP1:                          ; A FOI DESCARTADO
  233.         LD A,D
  234.         CP E
  235.         JR C,STEP3              ; E É MAIOR QUE D
  236.         LD B,%10011000  ; NOISE VAI PARA O CANAL 2 (C)
  237.         LD A,E
  238.         LD C,%00000100
  239.         LD D,9                  ; VOLUME DO CANAL B
  240.         JR LN_FIM
  241. STEP3:
  242.         LD B,%10101000  ; NOISE VAI PARA O CANAL 1 (B)
  243.         LD A,D
  244.         LD C,%00000010
  245.         LD D,10                 ; VOLUME DO CANAL C
  246. LN_FIM:
  247.                                         ; AQUI, A TEM VOLUME DO CANAL COM MAIOR VOLUME. TB TENHO B, COM A INFORMAÇÃO DE ONDE GUARDAR O NOISE E C, COM O CANAL TOM A DESLIGAR SE O VOLUME TOM FOR ZERO.
  248.         CP $0                   ;
  249.         JR Z,TOM_VOLUME_ZERO    ; SE O MAIOR TEM VOLUME ZERO, EU PRECISO AUMENTAR O VOLUME E DESLIGAR O TOM
  250.  
  251. LN_FIM2:
  252.         LD      A,7
  253.         OUT     ($A0),A
  254.         LD A,B
  255.         OUT ($A1),A
  256.         LD (REG7),A
  257.         RET
  258.  
  259. TOM_VOLUME_ZERO:
  260.         LD A,B
  261.         ;OR C
  262.         LD B,A          ; ARRUMEI B
  263.         LD A,D          ; VAMOS ENFIAR BALA NO VOLUME DO TOM (QUE AGORA VAI SER SÓ NOISE)
  264.         OUT ($A0),A
  265.         LD A,%00000110  ; $6 de volume no noise
  266.         OUT ($A1),A
  267.         JR LN_FIM2
  268.  
  269. DESLIGA_NOISE:
  270.         LD      A,7
  271.         OUT     ($A0),A
  272.         LD A,%10111000  ; DESABILITA NOISE EM TODOS OS CANAIS
  273.         OUT ($A1),A
  274.         LD (REG7),A
  275.         RET
  276.  
  277. OUTPUT_CHANNEL:
  278.         LD A,(LATCH)
  279.         CALL GET_CHANNEL_FROM_A
  280.         CP %00000011            ; EH O DE RUIDO?
  281.         JR Z,OUTPUT_RUIDO
  282.         RLCA
  283.         LD C,A                          ; C TEM O CANAL*2
  284.         LD B,$0
  285.         LD HL,TON0L
  286.         ADD HL,BC                       ; HL TEM O CANAL CORRETO A GRAVAR
  287.         LD A,C
  288.         OUT ($A0),A                     ; SELECIONOU REGISTRADOR 0, 2 OU 4 DO PSG
  289.         LD A,(HL)
  290.         OUT ($A1),A                     ; GRAVEI
  291.         INC C
  292.         INC HL
  293.         LD A,C
  294.         OUT ($A0),A                     ; SELECIONOU REGISTRADOR 1, 3 OU 5 DO PSG
  295.         LD A,(HL)
  296.         OUT ($A1),A                     ; GRAVEI
  297.         JP TS_FIM
  298.                
  299. OUTPUT_RUIDO:
  300.         LD HL,TONN
  301.         LD A,6
  302.         OUT ($A0),A
  303.         LD A,(HL)
  304.         OUT ($A1),A
  305.         JP TS_FIM      
  306.        
  307.        
  308. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  309. ;;;;;;;;;;;;;;;;;;;;;; Rotinas de desvio da BIOS do coleco, para usar a emulacao de som tb...
  310. SOM_BIOS_0172_018D:
  311.         CALL TOCA_SOM_COLECO
  312.         RET
  313.  
  314. SOM_BIOS_017A:
  315.         OR D
  316.         CALL TOCA_SOM_COLECO
  317.         RET
  318.  
  319. SOM_BIOS_023D:
  320.         CALL TOCA_SOM_COLECO
  321.         LD A,$BF
  322.         CALL TOCA_SOM_COLECO
  323.         LD A,$DF
  324.         CALL TOCA_SOM_COLECO
  325.         LD A,$FF
  326.         CALL TOCA_SOM_COLECO
  327.         RET
  328.  
  329. SOM_BIOS_0335_0354:
  330.         CALL TOCA_SOM_COLECO
  331.         RET
  332.