<< Home | About Forth | About TurboForth | Download | Language Reference | Resources | Tutorials | YouTube >>

;          _____                       _  __          __           _     
;         / ____|                     | | \ \        / /          | |    
;        | (___   ___  _   _ _ __   __| |  \ \  /\  / /__  _ __ __| |___ 
;         \___ \ / _ \| | | | '_ \ / _` |   \ \/  \/ / _ \| '__/ _` / __|
;         ____) | (_) | |_| | | | | (_| |    \  /\  / (_) | | | (_| \__ \
;        |_____/ \___/ \__,_|_| |_|\__,_|     \/  \/ \___/|_|  \__,_|___/
                                                                        

; SN76489 register writes
; -----------------------
; When a byte is written to the SN76489, it processes it as follows:
;  %1cctdddd
;    d=data bits
;    t=type bits
;    c=channel bits 
;If bit 7 is 1 then the byte is a LATCH/DATA byte.
;
; Bits 6 and 5 (cc) give the channel to be latched, ALWAYS. 
; This selects the row in the above table.
; %00 is channel 0, %01 is channel 1, %10 is channel 2, %11 is channel 3.
; Bit 4 (t) determines whether to latch volume (1) or tone/noise (0) data. 
; The remaining 4 bits (dddd) are placed into the low 4 bits of the relevant 
; register. 
; For the three-bit noise register, the highest bit is discarded.
; The latched register is NEVER cleared by a data byte.
; If bit 7 is 0 then the byte is a DATA byte.
;
;  %0-DDDDDD
;    |``````-- Data
;    `-------- Unused
;
; If the currently latched register is a tone register then the low 6 bits of 
; the byte (DDDDDD) are placed into the high 6 bits of the latched register. 
; If the latched register is less than 6 bits wide (ie. not one of the tone 
; registers), instead the low bits are placed into the corresponding bits of the
; register, and any extra high bits are discarded.
; The data have the following meanings (described more fully later):
;
; Tone registers
;    DDDDDDdddd = cccccccccc
;    DDDDDDdddd gives the 10-bit half-wave counter reset value. 
;
; Volume registers
;    (DDDDDD)dddd = (--vvvv)vvvv
;
;    dddd gives the 4-bit volume value.
;    If a data byte is written, the low 4 bits of DDDDDD update the 4-bit volume
;    value. However, this is unnecessary. 
;
; Noise register
;    (DDDDDD)dddd = (---trr)-trr
;
;    The low 2 bits of dddd select the shift rate and the next highest bit 
;    (bit 2) selects the mode (white (1) or "periodic" (0)).
;    If a data byte is written, its low 3 bits update the shift rate and mode 
;    in the same way. 

; called from bank0 - see 0-20-Sound.a99
sound1  mov @bank1_,@retbnk
        limi 2
        limi 0 
        li r7,>8400                 ; address of sound chip
    ; set the channel...
        mov *stack+,r1              ; pop channel
        mov r1,r8                   ; save it
        li r0,>9000                 ; set msb and volume latch bit
        src r1,3                    ; move channel into correct bit position
        soc r0,r1                   ; combine
    ; set the volume...
        mov *stack+,r0              ; pop volume
        swpb r0                     ; move to high byte
        soc r0,r1                   ; combine
        movb r1,*r7                 ; move to sound chip
    ; get pitch...
        andi r1,>e000               ; reset t bit (to latch pitch)
        mov *stack+,r0              ; pop pitch
        mov r0,r2                   ; copy it
        andi r0,>000f               ; get the low 4 bits
        swpb r0                     ; move to high byte
        soc r0,r1                   ; combine
        movb r1,*r7                 ; move to sound chip
    ; process noise channel if ch#=3...
        ci r8,3                     ; noise channel?
        jeq sndxit                  ; if so then just exit
        sla r2,4                    ; get upper 6 bits in upper byte
        movb r2,*r7                 ; send to sound chip
sndxit  b @retB0