mirror of
https://github.com/dschmenk/PLASMA.git
synced 2024-10-31 16:04:48 +00:00
Add embedded PLASMA sample
This commit is contained in:
parent
488f039494
commit
2118af149b
395
src/samplesrc/a2pwm/a2pwm.s
Executable file
395
src/samplesrc/a2pwm/a2pwm.s
Executable file
@ -0,0 +1,395 @@
|
|||||||
|
;****************************************************************
|
||||||
|
;*
|
||||||
|
;* PWM SOUND ROUTINES
|
||||||
|
;*
|
||||||
|
;****************************************************************
|
||||||
|
;*
|
||||||
|
;* PWM ZERO PAGE LOCATIONS
|
||||||
|
;*
|
||||||
|
SPEAKER = $C030
|
||||||
|
HFO = $08
|
||||||
|
LFO = $09
|
||||||
|
LFOINDEX= $0A ; IF LFOUSRH == 0
|
||||||
|
LFOUSRL = $0A
|
||||||
|
LFOUSRH = $0B
|
||||||
|
ATK = $0C
|
||||||
|
DCY = $0D
|
||||||
|
SUS = $0E
|
||||||
|
RLS = $0F
|
||||||
|
ATKINCL = $10
|
||||||
|
ATKINCH = $11
|
||||||
|
DCYINCL = $12
|
||||||
|
DCYINCH = $13
|
||||||
|
RLSINCL = $14
|
||||||
|
RLSINCH = $15
|
||||||
|
ADSRL = $16
|
||||||
|
ADSRH = $17
|
||||||
|
ADSRINCL= $18
|
||||||
|
ADSRINCH= $19
|
||||||
|
TONELEN = $1B
|
||||||
|
LPCNT = $1C
|
||||||
|
HFOCNT = $1D
|
||||||
|
LFOPOSL = $1E
|
||||||
|
LFOPOSH = $1F
|
||||||
|
LFOPTR = $00
|
||||||
|
LFOPTRL = LFOPTR
|
||||||
|
LFOPTRH = LFOPTRL+1
|
||||||
|
;*
|
||||||
|
;* PWM ENTRY POINT
|
||||||
|
;*
|
||||||
|
HILOPWM LDA LFOUSRL
|
||||||
|
LDX LFOUSRH
|
||||||
|
BNE + ; USER SUPPLIED WAVEFORM
|
||||||
|
LDX #>LFOTBL
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
+ STA LFOPTRL
|
||||||
|
STX LFOPTRH
|
||||||
|
PHP
|
||||||
|
SEI
|
||||||
|
LDY #$00
|
||||||
|
STY LFOPOSL
|
||||||
|
; STY LFOPOSH
|
||||||
|
STY LPCNT
|
||||||
|
STY ADSRL
|
||||||
|
; STY ADSRH
|
||||||
|
LDA #$02
|
||||||
|
STA HFOCNT
|
||||||
|
ATTACK LDX #$0F
|
||||||
|
LDA ATK
|
||||||
|
BEQ DECAY
|
||||||
|
LDX #$00
|
||||||
|
STA TONELEN
|
||||||
|
LDA ATKINCL
|
||||||
|
STA ADSRINCL
|
||||||
|
LDA ATKINCH
|
||||||
|
STA ADSRINCH
|
||||||
|
JSR HILOSND
|
||||||
|
DECAY LDA DCY
|
||||||
|
BEQ SUSTAIN
|
||||||
|
STA TONELEN
|
||||||
|
LDA #$00 ; REVERSE ATTACK RATE
|
||||||
|
SEC
|
||||||
|
SBC DCYINCL
|
||||||
|
STA ADSRINCL
|
||||||
|
LDA #$00
|
||||||
|
SBC DCYINCH
|
||||||
|
STA ADSRINCH
|
||||||
|
JSR HILOSND
|
||||||
|
SUSTAIN LDA SUS
|
||||||
|
BEQ RELEASE
|
||||||
|
STA TONELEN
|
||||||
|
LDA #$00 ; SUSTAIN DOESN'T ALTER VOLUME
|
||||||
|
STA ADSRINCL
|
||||||
|
STA ADSRINCH
|
||||||
|
JSR HILOSND
|
||||||
|
RELEASE LDA RLS
|
||||||
|
BEQ PWMEXIT
|
||||||
|
STA TONELEN
|
||||||
|
LDA #$00 ; REVERSE RELEASE RATE
|
||||||
|
SEC
|
||||||
|
SBC RLSINCL
|
||||||
|
STA ADSRINCL
|
||||||
|
LDA #$00
|
||||||
|
SBC RLSINCH
|
||||||
|
STA ADSRINCH
|
||||||
|
JSR HILOSND
|
||||||
|
PWMEXIT PLP
|
||||||
|
RTS
|
||||||
|
PWMSND CLC ; 1, 2
|
||||||
|
LDA ADSRL ; 2, 3
|
||||||
|
ADC ADSRINCL ; 2, 3
|
||||||
|
STA TMP ; 2, 3
|
||||||
|
TXA ; 1, 2
|
||||||
|
ADC ADSRINCH ; 2, 3
|
||||||
|
DEC LPCNT ; 2, 5
|
||||||
|
;------
|
||||||
|
;12,21
|
||||||
|
|
||||||
|
BNE HILOSND ; 2, 2
|
||||||
|
AND #$0F ; 2, 2
|
||||||
|
TAX ; 1, 2
|
||||||
|
LDA TMP ; 2, 3
|
||||||
|
STA ADSRL ; 2, 3
|
||||||
|
DEC TONELEN ; 2, 5
|
||||||
|
BEQ PWMRET ; 2, 2
|
||||||
|
DEC HFOCNT ; 2, 5
|
||||||
|
BEQ SPKRON ; 2, 2
|
||||||
|
CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
NOP ; 1, 2
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;55,79
|
||||||
|
|
||||||
|
; BNE HILOSND ; , 3
|
||||||
|
HILOSND DEC HFOCNT ; 2, 5
|
||||||
|
BNE + ; 2, 2
|
||||||
|
SPKRON BIT SPEAKER ; 3, 4
|
||||||
|
SPKRPWM JMP PWM1 ; 3, 3+62
|
||||||
|
;------
|
||||||
|
;10,79
|
||||||
|
|
||||||
|
; BNE HILOSND ; , 3
|
||||||
|
; DEC HFOCNT ; , 5
|
||||||
|
; BNE + ; , 3
|
||||||
|
+ BNE ++ ; 2, 3
|
||||||
|
++ NOP ; 1, 2
|
||||||
|
NOP ; 1, 2
|
||||||
|
NOP ; 1, 2
|
||||||
|
NOP ; 1, 2
|
||||||
|
NOP ; 1, 2
|
||||||
|
NOP ; 1, 2
|
||||||
|
NOP ; 1, 2
|
||||||
|
CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;44,79
|
||||||
|
PWMRET RTS
|
||||||
|
;*
|
||||||
|
;* 4 BIT x 4 BIT TO 3.5 BIT MULTIPLY TABLE
|
||||||
|
;*
|
||||||
|
!ALIGN 255,0
|
||||||
|
MUL4X4 !BYTE $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
!BYTE $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
!BYTE $00, $00, $00, $00, $00, $00, $00, $00, $20, $20, $20, $20, $20, $20, $20, $20
|
||||||
|
!BYTE $00, $00, $00, $00, $00, $00, $20, $20, $20, $20, $20, $20, $20, $20, $20, $20
|
||||||
|
!BYTE $00, $00, $00, $00, $20, $20, $20, $20, $20, $20, $20, $20, $40, $40, $40, $40
|
||||||
|
!BYTE $00, $00, $00, $00, $20, $20, $20, $20, $20, $20, $40, $40, $40, $40, $40, $40
|
||||||
|
!BYTE $00, $00, $00, $20, $20, $20, $20, $20, $40, $40, $40, $40, $40, $40, $60, $60
|
||||||
|
!BYTE $00, $00, $00, $20, $20, $20, $20, $40, $40, $40, $40, $40, $60, $60, $60, $60
|
||||||
|
!BYTE $00, $00, $20, $20, $20, $20, $40, $40, $40, $40, $60, $60, $60, $60, $80, $80
|
||||||
|
!BYTE $00, $00, $20, $20, $20, $20, $40, $40, $40, $60, $60, $60, $60, $80, $80, $80
|
||||||
|
!BYTE $00, $00, $20, $20, $20, $40, $40, $40, $60, $60, $60, $60, $80, $80, $80, $A0
|
||||||
|
!BYTE $00, $00, $20, $20, $20, $40, $40, $40, $60, $60, $60, $80, $80, $80, $A0, $A0
|
||||||
|
!BYTE $00, $00, $20, $20, $40, $40, $40, $60, $60, $60, $80, $80, $A0, $A0, $A0, $C0
|
||||||
|
!BYTE $00, $00, $20, $20, $40, $40, $40, $60, $60, $80, $80, $80, $A0, $A0, $C0, $C0
|
||||||
|
!BYTE $00, $00, $20, $20, $40, $40, $60, $60, $80, $80, $80, $A0, $A0, $C0, $C0, $E0
|
||||||
|
!BYTE $00, $00, $20, $20, $40, $40, $60, $60, $80, $80, $A0, $A0, $C0, $C0, $E0, $E0
|
||||||
|
LFOTBL !SOURCE "lfotbl.s"
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM1 BIT SPEAKER ; 3, 4
|
||||||
|
CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM2 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,62
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM3 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM4 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM5 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM6 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM7 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
||||||
|
!ALIGN 63,0
|
||||||
|
PWM8 CLC ; 1, 2
|
||||||
|
LDA LFOPOSL ; 2, 3
|
||||||
|
ADC LFO ; 2, 3
|
||||||
|
STA LFOPOSL ; 2, 3
|
||||||
|
TYA ; 1, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
AND #$1F ; 2, 2
|
||||||
|
TAY ; 1, 2
|
||||||
|
TXA ; 1, 2
|
||||||
|
ORA (LFOPTR),Y ; 2, 5
|
||||||
|
STA *+4 ; 3, 4
|
||||||
|
LDA MUL4X4 ; 3, 4
|
||||||
|
ASL ; 1, 2
|
||||||
|
STA SPKRPWM+1 ; 3, 4
|
||||||
|
LDA #>PWM1 ; 2, 2
|
||||||
|
ADC #$00 ; 2, 2
|
||||||
|
STA SPKRPWM+2 ; 3, 4
|
||||||
|
LDA HFO ; 2, 3
|
||||||
|
STA HFOCNT ; 2, 3
|
||||||
|
BIT SPEAKER ; 3, 4
|
||||||
|
JMP PWMSND ; 3, 3
|
||||||
|
;------
|
||||||
|
;43,61
|
267
src/samplesrc/a2pwm/hilopwm.pla
Executable file
267
src/samplesrc/a2pwm/hilopwm.pla
Executable file
@ -0,0 +1,267 @@
|
|||||||
|
const inbuff = $200
|
||||||
|
const freemem = $0002
|
||||||
|
const FALSE = 0
|
||||||
|
const TRUE = !FALSE
|
||||||
|
//
|
||||||
|
// System variables.
|
||||||
|
//
|
||||||
|
word heap
|
||||||
|
//
|
||||||
|
// Periods of scale in second octave
|
||||||
|
//
|
||||||
|
byte scale[] = 166, 156, 148, 139, 132, 124, 117, 111, 104, 99, 93, 88, 83, 78
|
||||||
|
//
|
||||||
|
// Key mapping to note
|
||||||
|
//
|
||||||
|
byte keytone[] = 'A','S','E','D','R','F','G','Y','H','U','J','I','K','L'
|
||||||
|
//
|
||||||
|
// Which octave are we in
|
||||||
|
//
|
||||||
|
byte octave = 1
|
||||||
|
//
|
||||||
|
// FLO period and waveform
|
||||||
|
//
|
||||||
|
byte LFO, LFOmap
|
||||||
|
//
|
||||||
|
// Note duration
|
||||||
|
//
|
||||||
|
byte duration = 22
|
||||||
|
//
|
||||||
|
// Envelope parameters
|
||||||
|
//
|
||||||
|
byte atkLen = 2
|
||||||
|
byte dcyLen = 0
|
||||||
|
byte susLen = 4
|
||||||
|
byte relLen = 16
|
||||||
|
word atkRate = $07FF
|
||||||
|
word dcyRate = $0000
|
||||||
|
word relRate = $00FF
|
||||||
|
//
|
||||||
|
// Import utility routines
|
||||||
|
//
|
||||||
|
include "util.pla"
|
||||||
|
//
|
||||||
|
// Clear viewport to white
|
||||||
|
//
|
||||||
|
def clearWin
|
||||||
|
byte i, j
|
||||||
|
inverse
|
||||||
|
home
|
||||||
|
for j = 0 to 3
|
||||||
|
for i = 0 to 39; putc(' '); next
|
||||||
|
next
|
||||||
|
return gotoxy(0,0)
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Display LFO bar
|
||||||
|
//
|
||||||
|
def showLFO
|
||||||
|
byte LFObar
|
||||||
|
|
||||||
|
LFObar = (LFO+7)/8
|
||||||
|
grcolor(WHITE)
|
||||||
|
rect(34, 39, 6, 39, FALSE)
|
||||||
|
if LFObar < 32
|
||||||
|
grcolor(ORANGE)
|
||||||
|
rect(35, 38, 7, 38-LFObar, TRUE)
|
||||||
|
fin
|
||||||
|
if LFObar
|
||||||
|
grcolor(DRKBLU)
|
||||||
|
rect(35, 38, 39-LFObar, 38, TRUE)
|
||||||
|
fin
|
||||||
|
putsxy(36, 0, " ")
|
||||||
|
gotoxy(36, 0)
|
||||||
|
puti(LFO)
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Display LFO waveform
|
||||||
|
//
|
||||||
|
def showWaveform
|
||||||
|
byte i, mapBar
|
||||||
|
word mapPtr
|
||||||
|
//
|
||||||
|
// Get pointer to LFO waveform by calling PWM with zero note
|
||||||
|
//
|
||||||
|
envelope(0, 0, 0, 0, atkRate, dcyRate, relRate)
|
||||||
|
hilopwm(0, LFO, LFOmap)
|
||||||
|
mapPtr = *0 // Pointer at address 0
|
||||||
|
grcolor(WHITE)
|
||||||
|
rect(0, 33, 6, 39, FALSE)
|
||||||
|
for i = 0 to 31
|
||||||
|
mapBar = ^(mapPtr + i) >> 3
|
||||||
|
grcolor(BLACK)
|
||||||
|
vlin(7, 38-mapBar, i + 1)
|
||||||
|
grcolor(MAGENTA)
|
||||||
|
vlin(38 - mapBar, 38, i + 1)
|
||||||
|
grcolor(PURPLE)
|
||||||
|
vlin(37-mapBar, 38-mapBar, i + 1)
|
||||||
|
next
|
||||||
|
//
|
||||||
|
// Restore envelope
|
||||||
|
//
|
||||||
|
envelope(atkLen, dcyLen, susLen, relLen, atkRate, dcyRate, relRate)
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Display duration
|
||||||
|
//
|
||||||
|
def showDuration
|
||||||
|
byte left, right
|
||||||
|
|
||||||
|
if duration == 40
|
||||||
|
left = 0
|
||||||
|
right = 39
|
||||||
|
else
|
||||||
|
left = 19-duration/2
|
||||||
|
right = left + duration
|
||||||
|
fin
|
||||||
|
grcolor(BLACK)
|
||||||
|
if left > 0
|
||||||
|
rect(0, left-1, 0, 5, TRUE)
|
||||||
|
fin
|
||||||
|
if right < 39
|
||||||
|
rect(right+1, 39, 0, 5, TRUE)
|
||||||
|
fin
|
||||||
|
grcolor(AQUA)
|
||||||
|
rect(left, right, 0, 5, TRUE)
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Display octave
|
||||||
|
//
|
||||||
|
def showOctave
|
||||||
|
inverse
|
||||||
|
putsxy(0, 1, "----------------------------------------")
|
||||||
|
normal
|
||||||
|
putsxy(octave*10, 1, "----------")
|
||||||
|
inverse
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Recalc envelope parameters
|
||||||
|
//
|
||||||
|
def recalcEnv
|
||||||
|
atkLen = duration/8
|
||||||
|
relLen = duration/2
|
||||||
|
susLen = duration - atkLen - relLen
|
||||||
|
atkRate = $0FFF/atkLen
|
||||||
|
relRate = $0FFF/relLen
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Main loop
|
||||||
|
//
|
||||||
|
def main
|
||||||
|
byte quit, key, i
|
||||||
|
|
||||||
|
|
||||||
|
envelope(atkLen, dcyLen, susLen, relLen, atkRate, dcyRate, relRate)
|
||||||
|
quit = FALSE
|
||||||
|
repeat
|
||||||
|
if keypressed
|
||||||
|
key = toupper(getc)
|
||||||
|
when key
|
||||||
|
is $1B // ESC
|
||||||
|
quit = TRUE
|
||||||
|
break
|
||||||
|
is $15 // ->
|
||||||
|
if octave < 3
|
||||||
|
octave++
|
||||||
|
showOctave
|
||||||
|
fin
|
||||||
|
break
|
||||||
|
is $08 // <-
|
||||||
|
if octave > 0
|
||||||
|
octave--
|
||||||
|
showOctave
|
||||||
|
fin
|
||||||
|
break
|
||||||
|
is '1'
|
||||||
|
is '2'
|
||||||
|
is '3'
|
||||||
|
is '4'
|
||||||
|
is '5'
|
||||||
|
is '6'
|
||||||
|
is '7'
|
||||||
|
is '8'
|
||||||
|
LFOmap = key - '1'
|
||||||
|
showWaveform
|
||||||
|
break
|
||||||
|
is '<'
|
||||||
|
is ','
|
||||||
|
LFO--
|
||||||
|
showLFO
|
||||||
|
break
|
||||||
|
is '>'
|
||||||
|
is '.'
|
||||||
|
LFO++
|
||||||
|
showLFO
|
||||||
|
break
|
||||||
|
is '+'
|
||||||
|
is $0B // UP
|
||||||
|
if duration < 40
|
||||||
|
duration++
|
||||||
|
recalcEnv
|
||||||
|
envelope(atkLen, dcyLen, susLen, relLen, atkRate, dcyRate, relRate)
|
||||||
|
showDuration
|
||||||
|
fin
|
||||||
|
break
|
||||||
|
is '-'
|
||||||
|
is $0A // DOWN
|
||||||
|
if duration > 2
|
||||||
|
duration--
|
||||||
|
recalcEnv
|
||||||
|
envelope(atkLen, dcyLen, susLen, relLen, atkRate, dcyRate, relRate)
|
||||||
|
showDuration
|
||||||
|
fin
|
||||||
|
break
|
||||||
|
otherwise
|
||||||
|
for i = 0 to 13
|
||||||
|
if keytone[i] == key
|
||||||
|
if LFO == 0
|
||||||
|
hilopwm(scale[i]>>octave, LFO, 0)
|
||||||
|
else
|
||||||
|
hilopwm(scale[i]>>octave, LFO, LFOmap)
|
||||||
|
fin
|
||||||
|
break
|
||||||
|
fin
|
||||||
|
next
|
||||||
|
wend
|
||||||
|
fin
|
||||||
|
//LFO = pdl(0)
|
||||||
|
until quit
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Get heap start.
|
||||||
|
//
|
||||||
|
heap = *freemem
|
||||||
|
call($FDED, $8D, 0, 0, 0)
|
||||||
|
call($FDED, $91, 0, 0, 0)// CTRL-Q = turn off 80 column
|
||||||
|
call($FDED, $8D, 0, 0, 0)
|
||||||
|
^$C000 = 0 // Turn off 80STORE
|
||||||
|
grmode
|
||||||
|
clearview
|
||||||
|
showDuration
|
||||||
|
showWaveform
|
||||||
|
showLFO
|
||||||
|
putsxy(8, 0, "OSCILLATION OVERTHRUSTER")
|
||||||
|
normal
|
||||||
|
putsxy(2, 0, "1..8")
|
||||||
|
gotoxy(34, 0); putc('<')
|
||||||
|
gotoxy(39, 0); putc('>')
|
||||||
|
gotoxy(6, 3); putc('-')
|
||||||
|
gotoxy(32, 3); putc('+')
|
||||||
|
inverse
|
||||||
|
showOctave
|
||||||
|
normal
|
||||||
|
putsxy(0, 2, "<-")
|
||||||
|
putsxy(38, 2, "->")
|
||||||
|
inverse
|
||||||
|
putsxy(11, 3, "A S D F G H J K L")
|
||||||
|
normal
|
||||||
|
gotoxy(14, 2); putc('E')
|
||||||
|
gotoxy(16, 2); putc('R')
|
||||||
|
gotoxy(20, 2); putc('Y')
|
||||||
|
gotoxy(22, 2); putc('U')
|
||||||
|
gotoxy(24, 2); putc('I')
|
||||||
|
inverse
|
||||||
|
main
|
||||||
|
normal
|
||||||
|
textmode
|
||||||
|
done
|
BIN
src/samplesrc/a2pwm/lfo.po
Executable file
BIN
src/samplesrc/a2pwm/lfo.po
Executable file
Binary file not shown.
32
src/samplesrc/a2pwm/lfotbl.s
Executable file
32
src/samplesrc/a2pwm/lfotbl.s
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
LFODWN !BYTE $F0 , $F0 , $E0 , $E0 , $D0 , $D0 , $C0 , $C0
|
||||||
|
!BYTE $B0 , $B0 , $A0 , $A0 , $90 , $90 , $80 , $80
|
||||||
|
!BYTE $70 , $70 , $60 , $60 , $50 , $50 , $40 , $40
|
||||||
|
!BYTE $30 , $30 , $20 , $20 , $10 , $10 , $00 , $00
|
||||||
|
LFOUP !BYTE $00 , $00 , $10 , $10 , $20 , $20 , $30 , $30
|
||||||
|
!BYTE $40 , $40 , $50 , $50 , $60 , $60 , $70 , $70
|
||||||
|
!BYTE $80 , $80 , $90 , $90 , $A0 , $A0 , $B0 , $B0
|
||||||
|
!BYTE $C0 , $C0 , $D0 , $D0 , $E0 , $E0 , $F0 , $F0
|
||||||
|
LFOREXP !BYTE $F0 , $D0 , $C0 , $B0 , $A0 , $90 , $90 , $80
|
||||||
|
!BYTE $70 , $60 , $60 , $50 , $50 , $40 , $40 , $40
|
||||||
|
!BYTE $30 , $30 , $30 , $20 , $20 , $20 , $20 , $10
|
||||||
|
!BYTE $10 , $10 , $10 , $10 , $10 , $00 , $00 , $00
|
||||||
|
LFOEXP !BYTE $00 , $00 , $00 , $10 , $10 , $10 , $10 , $10
|
||||||
|
!BYTE $10 , $20 , $20 , $20 , $20 , $30 , $30 , $30
|
||||||
|
!BYTE $40 , $40 , $40 , $50 , $50 , $60 , $60 , $70
|
||||||
|
!BYTE $80 , $90 , $90 , $A0 , $B0 , $C0 , $D0 , $F0
|
||||||
|
LFSAW !BYTE $00 , $10 , $20 , $30 , $40 , $50 , $60 , $70
|
||||||
|
!BYTE $80 , $90 , $A0 , $B0 , $C0 , $D0 , $E0 , $F0
|
||||||
|
!BYTE $F0 , $E0 , $D0 , $C0 , $B0 , $A0 , $90 , $80
|
||||||
|
!BYTE $70 , $60 , $50 , $40 , $30 , $20 , $10 , $00
|
||||||
|
LFOCOS !BYTE $00 , $10 , $10 , $20 , $30 , $40 , $50 , $60
|
||||||
|
!BYTE $80 , $90 , $B0 , $C0 , $D0 , $E0 , $F0 , $F0
|
||||||
|
!BYTE $F0 , $F0 , $F0 , $E0 , $D0 , $C0 , $B0 , $90
|
||||||
|
!BYTE $80 , $60 , $50 , $40 , $30 , $20 , $10 , $10
|
||||||
|
LFOSIN !BYTE $00 , $20 , $30 , $50 , $60 , $80 , $90 , $A0
|
||||||
|
!BYTE $B0 , $C0 , $D0 , $E0 , $E0 , $F0 , $F0 , $F0
|
||||||
|
!BYTE $F0 , $F0 , $F0 , $F0 , $E0 , $E0 , $D0 , $C0
|
||||||
|
!BYTE $B0 , $A0 , $90 , $80 , $60 , $50 , $30 , $20
|
||||||
|
LFOOCOS !BYTE $F0 , $F0 , $F0 , $E0 , $E0 , $E0 , $D0 , $C0
|
||||||
|
!BYTE $C0 , $B0 , $A0 , $90 , $90 , $90 , $80 , $80
|
||||||
|
!BYTE $80 , $80 , $80 , $90 , $90 , $90 , $A0 , $B0
|
||||||
|
!BYTE $C0 , $C0 , $D0 , $E0 , $E0 , $E0 , $F0 , $F0
|
28
src/samplesrc/a2pwm/makefile
Executable file
28
src/samplesrc/a2pwm/makefile
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
.SUFFIXES =
|
||||||
|
AFLAGS = -o $@
|
||||||
|
HILOPWM = hilopwm.bin
|
||||||
|
PLASM = ../../plasm
|
||||||
|
#
|
||||||
|
# Image filetypes for Virtual ][
|
||||||
|
#
|
||||||
|
PLATYPE = .\$$ED
|
||||||
|
BINTYPE = .BIN
|
||||||
|
SYSTYPE = .SYS
|
||||||
|
TXTTYPE = .TXT
|
||||||
|
#
|
||||||
|
# Image filetypes for CiderPress
|
||||||
|
#
|
||||||
|
#RELTYPE = \#FE1000
|
||||||
|
#INTERPTYPE = \#050000
|
||||||
|
#BINTYPE = \#060000
|
||||||
|
#SYSTYPE = \#FF2000
|
||||||
|
#TXTTYPE = \#040000
|
||||||
|
|
||||||
|
all: $(HILOPWM)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm *.o *~ *.a *.bin
|
||||||
|
|
||||||
|
$(HILOPWM): a2pwm.s util.pla hilopwm.pla pwmvm.s $(PLASM)
|
||||||
|
./$(PLASM) -A < hilopwm.pla > hilopwm.a
|
||||||
|
acme -o $(HILOPWM) pwmvm.s
|
1007
src/samplesrc/a2pwm/pwmvm.s
Executable file
1007
src/samplesrc/a2pwm/pwmvm.s
Executable file
File diff suppressed because it is too large
Load Diff
404
src/samplesrc/a2pwm/util.pla
Normal file
404
src/samplesrc/a2pwm/util.pla
Normal file
@ -0,0 +1,404 @@
|
|||||||
|
//
|
||||||
|
// Colors
|
||||||
|
//
|
||||||
|
const BLACK = 0
|
||||||
|
const MAGENTA = 1
|
||||||
|
const DRKBLU = 2
|
||||||
|
const PURPLE = 3
|
||||||
|
const DRKGRN = 4
|
||||||
|
const GREY = 5
|
||||||
|
const MEDBLU = 6
|
||||||
|
const LGTBLU = 7
|
||||||
|
const BROWN = 8
|
||||||
|
const ORANGE = 9
|
||||||
|
const GRAY = 10
|
||||||
|
const PINK = 11
|
||||||
|
const LGTGRN = 12
|
||||||
|
const YELLOW = 13
|
||||||
|
const AQUA = 14
|
||||||
|
const WHITE = 15
|
||||||
|
|
||||||
|
word txt1scrn[] = $0400,$0480,$0500,$0580,$0600,$0680,$0700,$0780
|
||||||
|
word = $0428,$04A8,$0528,$05A8,$0628,$06A8,$0728,$07A8
|
||||||
|
word = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0
|
||||||
|
//
|
||||||
|
// CALL 6502 ROUTINE
|
||||||
|
// CALL(ADDR, AREG, XREG, YREG, STATUS)
|
||||||
|
//
|
||||||
|
asm call
|
||||||
|
PHP
|
||||||
|
LDA ESTKL+4,X
|
||||||
|
STA CALL6502+1
|
||||||
|
LDA ESTKH+4,X
|
||||||
|
STA CALL6502+2
|
||||||
|
LDA ESTKL,X
|
||||||
|
PHA
|
||||||
|
LDA ESTKL+1,X
|
||||||
|
TAY
|
||||||
|
LDA ESTKL+3,X
|
||||||
|
PHA
|
||||||
|
LDA ESTKL+2,X
|
||||||
|
INX
|
||||||
|
INX
|
||||||
|
INX
|
||||||
|
INX
|
||||||
|
STX ESP
|
||||||
|
TAX
|
||||||
|
PLA
|
||||||
|
PLP
|
||||||
|
CALL6502 JSR $FFFF
|
||||||
|
PHP
|
||||||
|
STA REGVALS+0
|
||||||
|
STX REGVALS+1
|
||||||
|
STY REGVALS+2
|
||||||
|
PLA
|
||||||
|
STA REGVALS+3
|
||||||
|
LDX ESP
|
||||||
|
LDA #<REGVALS
|
||||||
|
LDY #>REGVALS
|
||||||
|
STA ESTKL,X
|
||||||
|
STY ESTKH,X
|
||||||
|
PLP
|
||||||
|
RTS
|
||||||
|
REGVALS !FILL 4
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// SET MEMORY TO VALUE
|
||||||
|
// MEMSET(ADDR, VALUE, SIZE)
|
||||||
|
// With optimizations from Peter Ferrie
|
||||||
|
//
|
||||||
|
asm memset
|
||||||
|
LDA ESTKL+2,X
|
||||||
|
STA DSTL
|
||||||
|
LDA ESTKH+2,X
|
||||||
|
STA DSTH
|
||||||
|
LDY ESTKL,X
|
||||||
|
BEQ +
|
||||||
|
INC ESTKH,X
|
||||||
|
LDY #$00
|
||||||
|
+ LDA ESTKH,X
|
||||||
|
BEQ SETMEX
|
||||||
|
SETMLPL CLC
|
||||||
|
LDA ESTKL+1,X
|
||||||
|
SETMLPH STA (DST),Y
|
||||||
|
DEC ESTKL,X
|
||||||
|
BEQ ++
|
||||||
|
- INY
|
||||||
|
BEQ +
|
||||||
|
-- BCS SETMLPL
|
||||||
|
SEC
|
||||||
|
LDA ESTKH+1,X
|
||||||
|
BCS SETMLPH
|
||||||
|
+ INC DSTH
|
||||||
|
BNE --
|
||||||
|
++ DEC ESTKH,X
|
||||||
|
BNE -
|
||||||
|
SETMEX INX
|
||||||
|
INX
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// COPY MEMORY
|
||||||
|
// MEMCPY(DSTADDR, SRCADDR, SIZE)
|
||||||
|
//
|
||||||
|
asm memcpy
|
||||||
|
INX
|
||||||
|
INX
|
||||||
|
LDA ESTKL-2,X
|
||||||
|
ORA ESTKH-2,X
|
||||||
|
BEQ CPYMEX
|
||||||
|
LDA ESTKL-1,X
|
||||||
|
CMP ESTKL,X
|
||||||
|
LDA ESTKH-1,X
|
||||||
|
SBC ESTKH,X
|
||||||
|
BCC REVCPY
|
||||||
|
;
|
||||||
|
; FORWARD COPY
|
||||||
|
;
|
||||||
|
LDA ESTKL,X
|
||||||
|
STA DSTL
|
||||||
|
LDA ESTKH,X
|
||||||
|
STA DSTH
|
||||||
|
LDA ESTKL-1,X
|
||||||
|
STA SRCL
|
||||||
|
LDA ESTKH-1,X
|
||||||
|
STA SRCH
|
||||||
|
LDY ESTKL-2,X
|
||||||
|
BEQ FORCPYLP
|
||||||
|
INC ESTKH-2,X
|
||||||
|
LDY #$00
|
||||||
|
FORCPYLP LDA (SRC),Y
|
||||||
|
STA (DST),Y
|
||||||
|
INY
|
||||||
|
BNE +
|
||||||
|
INC DSTH
|
||||||
|
INC SRCH
|
||||||
|
+ DEC ESTKL-2,X
|
||||||
|
BNE FORCPYLP
|
||||||
|
DEC ESTKH-2,X
|
||||||
|
BNE FORCPYLP
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
; REVERSE COPY
|
||||||
|
;
|
||||||
|
REVCPY ;CLC
|
||||||
|
LDA ESTKL-2,X
|
||||||
|
ADC ESTKL,X
|
||||||
|
STA DSTL
|
||||||
|
LDA ESTKH-2,X
|
||||||
|
ADC ESTKH,X
|
||||||
|
STA DSTH
|
||||||
|
CLC
|
||||||
|
LDA ESTKL-2,X
|
||||||
|
ADC ESTKL-1,X
|
||||||
|
STA SRCL
|
||||||
|
LDA ESTKH-2,X
|
||||||
|
ADC ESTKH-1,X
|
||||||
|
STA SRCH
|
||||||
|
DEC DSTH
|
||||||
|
DEC SRCH
|
||||||
|
LDY #$FF
|
||||||
|
LDA ESTKL-2,X
|
||||||
|
BEQ REVCPYLP
|
||||||
|
INC ESTKH-2,X
|
||||||
|
REVCPYLP LDA (SRC),Y
|
||||||
|
STA (DST),Y
|
||||||
|
DEY
|
||||||
|
CPY #$FF
|
||||||
|
BNE +
|
||||||
|
DEC DSTH
|
||||||
|
DEC SRCH
|
||||||
|
+ DEC ESTKL-2,X
|
||||||
|
BNE REVCPYLP
|
||||||
|
DEC ESTKH-2,X
|
||||||
|
BNE REVCPYLP
|
||||||
|
CPYMEX RTS
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Unsigned word comparisons.
|
||||||
|
//
|
||||||
|
asm uword_isge
|
||||||
|
LDA ESTKL+1,X
|
||||||
|
CMP ESTKL,X
|
||||||
|
LDA ESTKH+1,X
|
||||||
|
SBC ESTKH,X
|
||||||
|
LDA #$FF
|
||||||
|
ADC #$00
|
||||||
|
EOR #$FF
|
||||||
|
STA ESTKL+1,X
|
||||||
|
STA ESTKH+1,X
|
||||||
|
INX
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
asm uword_isle
|
||||||
|
LDA ESTKL,X
|
||||||
|
CMP ESTKL+1,X
|
||||||
|
LDA ESTKH,X
|
||||||
|
SBC ESTKH+1,X
|
||||||
|
LDA #$FF
|
||||||
|
ADC #$00
|
||||||
|
EOR #$FF
|
||||||
|
STA ESTKL+1,X
|
||||||
|
STA ESTKH+1,X
|
||||||
|
INX
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
asm uword_isgt
|
||||||
|
LDA ESTKL,X
|
||||||
|
CMP ESTKL+1,X
|
||||||
|
LDA ESTKH,X
|
||||||
|
SBC ESTKH+1,X
|
||||||
|
LDA #$FF
|
||||||
|
ADC #$00
|
||||||
|
STA ESTKL+1,X
|
||||||
|
STA ESTKH+1,X
|
||||||
|
INX
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
asm uword_islt
|
||||||
|
LDA ESTKL+1,X
|
||||||
|
CMP ESTKL,X
|
||||||
|
LDA ESTKH+1,X
|
||||||
|
SBC ESTKH,X
|
||||||
|
LDA #$FF
|
||||||
|
ADC #$00
|
||||||
|
STA ESTKL+1,X
|
||||||
|
STA ESTKH+1,X
|
||||||
|
INX
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Addresses of internal routines.
|
||||||
|
//
|
||||||
|
asm _hilopwm
|
||||||
|
TXA
|
||||||
|
PHA
|
||||||
|
JSR HILOPWM
|
||||||
|
PLA
|
||||||
|
TAX
|
||||||
|
DEX
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
asm toupper
|
||||||
|
LDA ESTKL,X
|
||||||
|
TOUPR AND #$7F
|
||||||
|
CMP #'a'
|
||||||
|
BCC +
|
||||||
|
CMP #'z'+1
|
||||||
|
BCS +
|
||||||
|
SBC #$1F
|
||||||
|
+ STA ESTKL,X
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// CONSOLE I/O
|
||||||
|
//
|
||||||
|
asm putc
|
||||||
|
LDA ESTKL,X
|
||||||
|
; JSR TOUPR
|
||||||
|
ORA #$80
|
||||||
|
JMP $FDF0
|
||||||
|
end
|
||||||
|
asm getc
|
||||||
|
DEX
|
||||||
|
- LDA $C000
|
||||||
|
BPL -
|
||||||
|
BIT $C010
|
||||||
|
AND #$7F
|
||||||
|
STA ESTKL,X
|
||||||
|
LDA #$00
|
||||||
|
STA ESTKH,X
|
||||||
|
RTS
|
||||||
|
end
|
||||||
|
def keypressed
|
||||||
|
return ^$C000 >= 128
|
||||||
|
end
|
||||||
|
def pdl(num)
|
||||||
|
return call($FB1E, 0, num, 0, 0)->2
|
||||||
|
end
|
||||||
|
def bttn(num)
|
||||||
|
return (^$C061+num) >= 128
|
||||||
|
end
|
||||||
|
def putln
|
||||||
|
return putc($0D)
|
||||||
|
end
|
||||||
|
def puts(str)
|
||||||
|
byte i
|
||||||
|
|
||||||
|
for i = 1 to ^str
|
||||||
|
putc(^(str+i))
|
||||||
|
next
|
||||||
|
end
|
||||||
|
def puti(i)
|
||||||
|
byte numstr[7]
|
||||||
|
byte place, sign
|
||||||
|
|
||||||
|
place = 6
|
||||||
|
if i < 0
|
||||||
|
sign = 1
|
||||||
|
i = -i
|
||||||
|
else
|
||||||
|
sign = 0
|
||||||
|
fin
|
||||||
|
while i >= 10
|
||||||
|
numstr[place] = i % 10 + '0'
|
||||||
|
i = i / 10
|
||||||
|
place--
|
||||||
|
loop
|
||||||
|
numstr[place] = i + '0'
|
||||||
|
place--
|
||||||
|
if sign
|
||||||
|
numstr[place] = '-'
|
||||||
|
place--
|
||||||
|
fin
|
||||||
|
numstr[place] = 6 - place
|
||||||
|
return puts(@numstr[place])
|
||||||
|
end
|
||||||
|
def normal
|
||||||
|
^$32 = $FF
|
||||||
|
end
|
||||||
|
def inverse
|
||||||
|
^$32 = $3F
|
||||||
|
end
|
||||||
|
def gotoxy(x, y)
|
||||||
|
^$24 = x + ^$20
|
||||||
|
return call($FB5B, y + ^$22, 0, 0, 0)
|
||||||
|
end
|
||||||
|
def home
|
||||||
|
return call($FC58, 0, 0, 0, 0)
|
||||||
|
end
|
||||||
|
def putsxy(x, y, str)
|
||||||
|
gotoxy(x, y)
|
||||||
|
return puts(str)
|
||||||
|
end
|
||||||
|
def textmode
|
||||||
|
call($FB39, 0, 0, 0, 0) // textmode()
|
||||||
|
return home
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// Clear viewport to white
|
||||||
|
//
|
||||||
|
def clearview
|
||||||
|
byte i
|
||||||
|
word c
|
||||||
|
inverse
|
||||||
|
c = ' ' | $80 & ^$32
|
||||||
|
c = c | (c << 8)
|
||||||
|
for i = ^$22 to ^$23
|
||||||
|
memset(txt1scrn[i] + ^$20, c, ^$21)
|
||||||
|
next
|
||||||
|
return gotoxy(0,0)
|
||||||
|
end
|
||||||
|
def grmode
|
||||||
|
call($FB2F, 0, 0, 0, 0) // initmode()
|
||||||
|
call($FB40, 0, 0, 0, 0) // grmode()
|
||||||
|
return home
|
||||||
|
end
|
||||||
|
def grcolor(color)
|
||||||
|
return call($F864, color, 0, 0, 0)
|
||||||
|
end
|
||||||
|
def plot(x, y)
|
||||||
|
return call($F800, y, 0, x, 0)
|
||||||
|
end
|
||||||
|
def hlin(left, right, y)
|
||||||
|
^$2C = right;
|
||||||
|
return call($F819, y, 0, left, 0)
|
||||||
|
end
|
||||||
|
def vlin(top, bottom, x)
|
||||||
|
^$2D = bottom;
|
||||||
|
return call($F828, top, 0, x, 0)
|
||||||
|
end
|
||||||
|
def rect(left, right, top, bottom, fill)
|
||||||
|
byte y
|
||||||
|
|
||||||
|
hlin(left, right, top)
|
||||||
|
hlin(left, right, bottom)
|
||||||
|
top++
|
||||||
|
bottom--
|
||||||
|
if fill
|
||||||
|
for y = top to bottom
|
||||||
|
hlin(left, right, y)
|
||||||
|
next
|
||||||
|
else
|
||||||
|
vlin(top, bottom, left)
|
||||||
|
vlin(top, bottom, right)
|
||||||
|
fin
|
||||||
|
end
|
||||||
|
//
|
||||||
|
// HFO/LFO PWM sound routines
|
||||||
|
//
|
||||||
|
def envelope(attack, decay, sustain, release, ainc, dinc, rinc)
|
||||||
|
^$0C = attack
|
||||||
|
^$0D = decay
|
||||||
|
^$0E = sustain
|
||||||
|
^$0F = release
|
||||||
|
*$10 = ainc
|
||||||
|
*$12 = dinc
|
||||||
|
*$14 = rinc
|
||||||
|
end
|
||||||
|
def hilopwm(HFO, LFO, LFOusr)
|
||||||
|
^$08 = HFO
|
||||||
|
^$09 = LFO
|
||||||
|
*$0A = LFOusr
|
||||||
|
return _hilopwm
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user