From 3bbb96b77341337efd5000b4fd623b428faea3de Mon Sep 17 00:00:00 2001 From: Daniel Gimpelevich Date: Sun, 15 Feb 2026 11:22:31 -0800 Subject: [PATCH] Added option to use NMI for IRQ --- Code/hardware.asm | 18 +- Code/keyboard.asm | 5 + Code/make-nmi.cmd | 4 + Code/tools/dasm | Bin 0 -> 115607 bytes Code/tools/dasm-new | Bin 0 -> 154596 bytes Code/tools/dasm-new.exe | Bin 0 -> 248083 bytes Code/vicmidi-nmi.list | 3586 +++++++++++++++++++++++++++++++++++++++ Code/vicmidi-nmi.prg | Bin 0 -> 4845 bytes Code/vicmidi.list | 112 +- Docs/DASM/DASM-new.TXT | 769 +++++++++ 10 files changed, 4445 insertions(+), 49 deletions(-) create mode 100644 Code/make-nmi.cmd create mode 100755 Code/tools/dasm create mode 100755 Code/tools/dasm-new create mode 100755 Code/tools/dasm-new.exe create mode 100644 Code/vicmidi-nmi.list create mode 100644 Code/vicmidi-nmi.prg create mode 100644 Docs/DASM/DASM-new.TXT diff --git a/Code/hardware.asm b/Code/hardware.asm index 11c62cb..a909430 100644 --- a/Code/hardware.asm +++ b/Code/hardware.asm @@ -67,11 +67,18 @@ resetuart: setupirq: sei + ifnconst USE_NMI ; Point to my interrupt vector lda #theirq sta $0315 + else + lda #thenmi + sta $0319 + eif ; Disable timer interrupts @@ -86,6 +93,15 @@ setupirq: ; ---------------------------------------------------------------------------- ; The IRQ. +thenmi: + ifconst USE_NMI + pha + txa + pha + tya + pha + eif + theirq: ; Fetch the received byte lda UART_RXTX ;get data @@ -114,4 +130,4 @@ nouart: byte 127,127, " uart NOT FOUND! ", 127,127 byte 0 -; EOF! \ No newline at end of file +; EOF! diff --git a/Code/keyboard.asm b/Code/keyboard.asm index 961c765..10e0b23 100644 --- a/Code/keyboard.asm +++ b/Code/keyboard.asm @@ -122,6 +122,8 @@ ReadKey: lda #$00 sta midinoteout + dec screen_colors + key_x: rts @@ -136,9 +138,12 @@ keypressed: ; A contains key code beq key_x ; Yes, do nothing ; New note - send it + sta midinoteout jsr sendnoteon + inc screen_colors + rts diff --git a/Code/make-nmi.cmd b/Code/make-nmi.cmd new file mode 100644 index 0000000..022b6c5 --- /dev/null +++ b/Code/make-nmi.cmd @@ -0,0 +1,4 @@ +@cls +@del *.prg +@tools\dasm vicmidi.asm -ovicmidi-nmi.prg -lvicmidi-nmi.list -DUSE_NMI +@copy vicmidi-nmi.prg e:\ diff --git a/Code/tools/dasm b/Code/tools/dasm new file mode 100755 index 0000000000000000000000000000000000000000..07d40680069533d64ad70f5bb6520d95a1851593 GIT binary patch literal 115607 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 literal 0 HcmV?d00001 diff --git a/Code/tools/dasm-new b/Code/tools/dasm-new new file mode 100755 index 0000000000000000000000000000000000000000..1fe7e9e852a84bdadefbbf6feb69f6439c8cfe0b GIT binary patch literal 154596 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 Lp6~g=_xFDQpjfi% literal 0 HcmV?d00001 diff --git a/Code/tools/dasm-new.exe b/Code/tools/dasm-new.exe new file mode 100755 index 0000000000000000000000000000000000000000..cde8dabcd6210e20943fb5da495182e91d372306 GIT binary patch literal 248083 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

$(K0*@G&X|iQ% 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%0AS$m&5ONI&>En;lZk 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 literal 0 HcmV?d00001 diff --git a/Code/vicmidi-nmi.list b/Code/vicmidi-nmi.list new file mode 100644 index 0000000..54e1e2e --- /dev/null +++ b/Code/vicmidi-nmi.list @@ -0,0 +1,3586 @@ +------- FILE vicmidi.asm LEVEL 1 PASS 2 + 1 b2eb ???? ; VIC-20 MIDI Interface + 2 b2eb ???? ; By David Viens and Leif Bloomquist, portions by + 3 b2eb ???? ; Michael Kircher and Viznut + 4 b2eb ???? + 5 b2eb ???? ; ---------------------------------------------------------------------------- + 6 b2eb ???? + 7 b2eb ???? processor 6502 ; VIC-20 + 8 b2eb ???? + 9 b2eb ???? ; Assume no memory expansion. Compile as Cartridge ROM in Block 5. + 10 a000 org $A000 ; Block 5 + 11 a000 + 12 a000 ; Macro and equate includes (must be at start) +------- FILE macros.asm LEVEL 2 PASS 2 + 0 a000 include "macros.asm" + 1 a000 + 2 a000 ; ============================================================== + 3 a000 ; Macro wrapping the fast hex poke + 4 a000 ; ============================================================== + 5 a000 + 6 a000 MAC hexpoke + 7 a000 lda #<{1} ; Low byte + 8 a000 sta $22 + 9 a000 lda #>{1} ; High byte + 10 a000 sta $23 + 11 a000 + 12 a000 lda {2} ; Note - address + 13 a000 jsr hexstr + 14 a000 ENDM + 15 a000 + 16 a000 ; ============================================================== + 17 a000 ; Macro to position the cursor + 18 a000 ; ============================================================== + 19 a000 + 20 a000 MAC plot + 21 a000 ldy #{1} + 22 a000 ldx #{2} + 23 a000 clc + 24 a000 jsr $E50A ; PLOT - same on 64 and VIC + 25 a000 ENDM + 26 a000 + 27 a000 ; ============================================================== + 28 a000 ; Macro to print a string + 29 a000 ; ============================================================== + 30 a000 + 31 a000 MAC printstring + 32 a000 ldy #>{0} + 33 a000 lda #<{0} + 34 a000 jsr STROUT + 35 a000 ENDM + 36 a000 + 37 a000 ; ============================================================== + 38 a000 ; Macro to print a byte (Hex) + 39 a000 ; ============================================================== + 40 a000 + 41 a000 MAC printbyte + 42 a000 ldx #$00 + 43 a000 ldy #$0F + 44 a000 lda {0} + 45 a000 jsr printnum + 46 a000 ENDM +------- FILE vicmidi.asm +------- FILE equates.asm LEVEL 2 PASS 2 + 0 a000 include "equates.asm" + 1 a000 ; -------------------------------------------------------------------------------------------------- + 2 a000 ;;free zero page (to use as vars) + 3 a000 ;INDEX1: $0022-$0023, First utility pointer used by HEXPOKE + 4 a000 ;INDEX2: $0024-$0025, Second utility pointer bytesexpected, midicounter + 5 a000 ;FORNAM: $0049-$004A, Pointer to FOR/NEXT index variable etc channel + 6 a000 ;TEMPF3: $004E-$0052, Temporary FLPT storage Used by keyboard routines + 7 a000 ;TEMPF1: $0057-$005B, Temporary FLPT storage Used by setwave + 8 a000 ;TEMPF2: $005C-$0060: Temporary FLPT storage FIFO pointers + 9 a000 ;FAC: $0061-$0066, Floating-point Accumulator (FAC) Flags for Poly mode + 10 a000 ;AFAC: $0069-$006E, Alternative/Auxilary FAC 69=last note + 11 a000 + 12 a000 ; ---- Zero Page Addresses ------------------------------------------------- + 13 a000 + 14 a000 00 24 midicounter = $24 + 15 a000 00 25 bytesexpected = $25 + 16 a000 + 17 a000 00 49 channel = $49 + 18 a000 00 4a bank = $4A ; 0=NTSC Normal, 1=PAL Normal, 2=NTSC Alt., 3=PAL Alt. + 19 a000 + 20 a000 ; Previous keyboard column bits. + 21 a000 00 4e c0 = $4E ; 2,4,6,8,(...) + 22 a000 00 4f c1 = $4F ; q,e,t,u,(...) + 23 a000 00 50 c2 = $50 ; w,r,y,i,p,(...) + 24 a000 00 51 c3 = $51 ; 1,3,5,7,(...) + 25 a000 + 26 a000 ; Used by setwave + 27 a000 00 57 TMP = $57 + 28 a000 00 58 TMP2 = $58 + 29 a000 + 30 a000 00 5c write_pointer = $5C ; FIFO current write pointer - incremented on byte received + 31 a000 00 5d read_pointer = $5D ; FIFO current read pointer - incremented on byte removed + 32 a000 + 33 a000 00 5e currentvalue = $5E ; Current value for voice settings + 34 a000 + 35 a000 00 61 poly_flags = $61 ; Flags for polymode + 36 a000 ; Also 62,63,64 + 37 a000 + 38 a000 00 68 lastnote = $68 ; Remembers last note, so Note Off applies to that note only + 39 a000 ; Also 69,6A,6B + 40 a000 + 41 a000 00 6c temp1 = $6C ; Used for screen colors + 42 a000 00 6d tempx = $6D ; Used by program change + 43 a000 + 44 a000 ;*00FB-00FE 251-254 Operating system free zero page space + 45 a000 00 fb statusbyte = $FB + 46 a000 00 fc mididata0 = $FC + 47 a000 00 fd mididata1 = $FD + 48 a000 00 fe mididata2 = $FE ; If needed + 49 a000 + 50 a000 ; ---- Non Zero Page Addresses ----------------------------------------------- + 51 a000 + 52 a000 ; Store viznut waveform being used per voice (located near start of BASIC space) + 53 a000 10 10 waveform1 = $1010 + 54 a000 10 11 waveform2 = $1011 + 55 a000 10 12 waveform3 = $1012 + 56 a000 10 13 waveform4 = $1013 + 57 a000 + 58 a000 10 14 tempstatusbyte = $1014 + 59 a000 10 15 command = $1015 + 60 a000 + 61 a000 ; Scratch space for setwave parameters + 62 a000 10 20 setwavechannel = $1020 ; y = channel ($0a..$0c) + 63 a000 10 21 setwavefrequency = $1021 ; x = initial frequency + 64 a000 10 22 setwaveshiftreg = $1022 ; a = shift register contents + 65 a000 + 66 a000 ; Used by MIDI Out + 67 a000 10 23 midinoteout = $1023 + 68 a000 + 69 a000 ; Setwave Target + 70 a000 11 00 setwave = $1100 ; Setwave code has to all be on one page. + 71 a000 + 72 a000 ; Input Buffer + 73 a000 12 00 buffer = $1200 + 74 a000 + 75 a000 ; Font (copied here from ROM) + 76 a000 18 00 font = $1800 ; 6144 decimal + 77 a000 + 78 a000 ;Screen locations + 79 a000 1e 00 screen_start = $1E00 + 80 a000 1e 4d midi_display = $1E4D + 81 a000 1e 77 voice_display = $1E77 + 82 a000 1f f9 spin_display = $1FF9 ; Lower-right corner + 83 a000 97 f9 spin_color = spin_display + $7800 + 84 a000 + 85 a000 ;Sound and Video Registers + 86 a000 90 0a sound_voice1 = $900A ; Frequency for oscillator 1 (low) (on: 128-255) + 87 a000 90 0b sound_voice2 = $900B ; Frequency for oscillator 2 (medium) (on: 128-255) + 88 a000 90 0c sound_voice3 = $900C ; Frequency for oscillator 3 (high) (on: 128-255) + 89 a000 90 0d sound_noise = $900D ; Frequency of noise source (on: 128-255) + 90 a000 90 0e sound_volume = $900E ; Bits 0-3 sets volume of all sound. Bits 4-7 are auxiliary color information (not used) + 91 a000 90 0f screen_colors = $900F + 92 a000 + 93 a000 ; ST16C450 Registers (IO3) + 94 a000 9c 00 UART_RXTX = $9C00 + 95 a000 9c 01 UART_IER = $9C01 + 96 a000 9c 02 UART_ISR = $9C02 + 97 a000 9c 03 UART_LCR = $9C03 + 98 a000 9c 04 UART_MCR = $9C04 + 99 a000 9c 05 UART_LSR = $9C05 + 100 a000 9c 07 UART_SCRATCHPAD = $9C07 + 101 a000 9c 00 UART_DIVISOR_LSB = $9C00 ; Yes, same as UART_RXTX + 102 a000 9c 01 UART_DIVISOR_MSB = $9C01 + 103 a000 + 104 a000 + 105 a000 ; Kernal/BASIC Routines + 106 a000 e5 5f CLRSCREEN = $E55F + 107 a000 e5 81 HOME = $E581 + 108 a000 eb 1e ISCNKY = $EB1E + 109 a000 f2 7a CHROUT = $F27A + 110 a000 ff e4 GETIN = $FFE4 + 111 a000 cb 1e STROUT = $CB1E ; Print string pointed to by (A/Y) until zero byte. + 112 a000 + 113 a000 00 08 CG_DCS = 8 ;disable shift+C= + 114 a000 00 09 CG_ECS = 9 ;enable shift+C= + 115 a000 + 116 a000 00 0e CG_LCS = 14 ;switch to lowercase + 117 a000 00 8e CG_UCS = 142 ;switch to uppercase + 118 a000 + 119 a000 ;cursor movement + 120 a000 00 13 CS_HOM = 19 + 121 a000 00 91 CS_U = 145 + 122 a000 00 11 CS_D = 17 + 123 a000 00 9d CS_L = 157 + 124 a000 00 1d CS_R = 29 + 125 a000 + 126 a000 00 0d CRLF = 13 + 127 a000 + 128 a000 ; EOF! +------- FILE vicmidi.asm + 15 a000 + 16 a000 ; ---- Startup Code --------------------------------------------------------- + 17 a000 09 a0 dc.w START ; Entry point for power up + 18 a002 c9 a5 dc.w RESTORE ; Entry point for warm start (RESTORE) + 19 a004 + 20 a004 41 30 c3 c2* dc.b "A0",$C3,$C2,$CD ; 'A0CBM' boot string + 21 a009 + 22 a009 START + 23 a009 ; Kernel Init + 24 a009 20 8d fd jsr $fd8d ; RAMTAS - Initialise System Constants + 25 a00c 20 52 fd jsr $fd52 ; Init Vectors + 26 a00f 20 f9 fd jsr $fdf9 ; Init I/O + 27 a012 20 18 e5 jsr $e518 ; Init I/O + 28 a015 + 29 a015 ; BASIC Init (Partial) + 30 a015 20 5b e4 jsr $e45b ; Init Vectors + 31 a018 20 a4 e3 jsr $e3a4 ; BASIC RAM + 32 a01b 20 04 e4 jsr $e404 ; INIT Message (needed (?) so keycheck routines work) + 33 a01e + 34 a01e entry + 35 a01e 20 c4 a3 jsr setupfont + 36 a021 20 89 a3 jsr mainscreen + 37 a024 20 2e a6 jsr setup_pal + 38 a027 20 b8 a3 jsr setwavecopy + 39 a02a 20 57 a5 jsr checkuart + 40 a02d 20 9f a5 jsr setupirq + 41 a030 20 80 a5 jsr resetuart + 42 a033 + 43 a033 ; Default to maximum volume + 44 a033 a9 0f lda #$0F + 45 a035 20 69 a2 jsr setvolume + 46 a038 + 47 a038 ; Initial Values + 48 a038 a9 00 lda #$00 + 49 a03a 85 24 sta midicounter ; midicounter=0 + 50 a03c 85 fb sta statusbyte ; statusbyte=0 + 51 a03e 85 fc sta mididata0 ; mididata0=0 + 52 a040 85 fd sta mididata1 ; mididata1=0 + 53 a042 85 fe sta mididata2 ; mididata2=0 + 54 a044 85 4e sta c0 ; no keys are pressed in 7F + 55 a046 85 4f sta c1 ; no keys are pressed in BF + 56 a048 85 50 sta c2 ; no keys are pressed in FD + 57 a04a 85 51 sta c3 ; no keys are pressed in FE + 58 a04c 85 68 sta lastnote+0 ; Clear + 59 a04e 85 69 sta lastnote+1 ; last + 60 a050 85 6a sta lastnote+2 ; note + 61 a052 85 6b sta lastnote+3 ; (including noise) + 62 a054 85 61 sta poly_flags+0 ; Clear + 63 a056 85 62 sta poly_flags+1 ; poly + 64 a058 85 63 sta poly_flags+2 ; flags + 65 a05a 8d f9 97 sta spin_color + 66 a05d 85 5c sta write_pointer + 67 a05f 85 5d sta read_pointer + 68 a061 8d 10 10 sta waveform1 + 69 a064 8d 11 10 sta waveform2 + 70 a067 8d 12 10 sta waveform3 + 71 a06a 8d 13 10 sta waveform4 + 72 a06d 8d 23 10 sta midinoteout + 73 a070 + 74 a070 ;;; ========================================================================== + 75 a070 ;;; main LOOP! + 76 a070 loop + 77 a070 ee f9 97 inc spin_color ; Prove we aren't 'frozen' + 78 a073 20 e8 a6 jsr ReadKey ; create events from keyboard if needed + 79 a076 + 80 a076 a5 5d lda read_pointer + 81 a078 c5 5c cmp write_pointer + 82 a07a f0 f4 beq loop ; Pointers match, no data + 83 a07c ;;; ========================================================================== + 84 a07c + 85 a07c ; We have data! + 86 a07c ; Advance pointer for next read + 87 a07c e6 5d inc read_pointer + 88 a07e + 89 a07e ; Read current byte + 90 a07e aa tax ; Since A still contains the unincremented pointer + 91 a07f bd 00 12 lda buffer,x + 92 a082 + 93 a082 ; If Bit 7 is set, it means it's a status byte and we need to prepare for a new message + 94 a082 10 33 bpl data ; Not a status byte + 95 a084 + 96 a084 ; ---------------------------------------------------------------------------- + 97 a084 ; Process a status byte (Currently in A) + 98 a084 + 99 a084 ; Store the status byte temporarily + 100 a084 8d 14 10 sta tempstatusbyte + 101 a087 + 102 a087 ; Handle System Common / System Realtime messages + 103 a087 29 f0 and #$F0 + 104 a089 c9 f0 cmp #$F0 + 105 a08b d0 03 bne normalmessage + 106 a08d ; inc screen_colors + 107 a08d 4c 1e a1 jmp system_realtime_proc ; Which goes back to loop + 108 a090 + 109 a090 normalmessage + 110 a090 ; Everything else, split into Command and Channel + 111 a090 ad 14 10 lda tempstatusbyte + 112 a093 85 fb sta statusbyte + 113 a095 29 f0 and #$F0 ; Get the upper nybble + 114 a097 8d 15 10 sta command + 115 a09a + 116 a09a a5 fb lda statusbyte + 117 a09c 29 0f and #$0F ; Get the lower nybble + 118 a09e 85 49 sta channel + 119 a0a0 + 120 a0a0 ; Also, check how many data bytes should follow. + 121 a0a0 ad 15 10 lda command + 122 a0a3 + 123 a0a3 ; 1 for Program Change + 124 a0a3 c9 c0 cmp #$C0 ; Program change + 125 a0a5 f0 05 beq bytes1 + 126 a0a7 + 127 a0a7 ; Assume 2 for all the rest + 128 a0a7 bytes2 + 129 a0a7 a0 02 ldy #$02 + 130 a0a9 4c ae a0 jmp setbytes + 131 a0ac + 132 a0ac bytes1 + 133 a0ac a0 01 ldy #$01 + 134 a0ae ; Drop through + 135 a0ae + 136 a0ae setbytes + 137 a0ae 84 25 sty bytesexpected + 138 a0b0 + 139 a0b0 ; Reset the midi counter to 0 + 140 a0b0 a2 00 ldx #$00 + 141 a0b2 86 24 stx midicounter + 142 a0b4 + 143 a0b4 4c 70 a0 jmp loop ; Wait for next byte + 144 a0b7 + 145 a0b7 + 146 a0b7 ; ---------------------------------------------------------------------------- + 147 a0b7 ; Store data byte - in A. + 148 a0b7 + 149 a0b7 data + 150 a0b7 a6 24 ldx midicounter ; What byte are we at? + 151 a0b9 95 fc sta mididata0,x ; Store received midi data pointed by x + 152 a0bb + 153 a0bb e8 inx ; x++ + 154 a0bc 86 24 stx midicounter ; and store x + 155 a0be + 156 a0be e4 25 cpx bytesexpected ; Number of data bytes expected in this MIDI message (i.e. 2) + 157 a0c0 f0 03 beq messageproc ; Complete MIDI message received. + 158 a0c2 + 159 a0c2 ; Not complete, wait for more bytes. + 160 a0c2 4c 70 a0 jmp loop + 161 a0c5 + 162 a0c5 + 163 a0c5 ; ---------------------------------------------------------------------------- + 164 a0c5 ; Process a complete MIDI message (All but System) + 165 a0c5 + 166 a0c5 messageproc + 167 a0c5 + 168 a0c5 ; Display received message bytes + 0 a0c5 HEXPOKE (midi_display+0),statusbyte + 1 a0c5 a9 4d lda #<(midi_display+0) + 2 a0c7 85 22 sta $22 + 3 a0c9 a9 1e lda #>(midi_display+0) + 4 a0cb 85 23 sta $23 + 5 a0cd + 6 a0cd a5 fb lda statusbyte + 7 a0cf 20 e2 a5 jsr hexstr + 0 a0d2 HEXPOKE (midi_display+3),mididata0 + 1 a0d2 a9 50 lda #<(midi_display+3) + 2 a0d4 85 22 sta $22 + 3 a0d6 a9 1e lda #>(midi_display+3) + 4 a0d8 85 23 sta $23 + 5 a0da + 6 a0da a5 fc lda mididata0 + 7 a0dc 20 e2 a5 jsr hexstr + 0 a0df HEXPOKE (midi_display+6),mididata1 + 1 a0df a9 53 lda #<(midi_display+6) + 2 a0e1 85 22 sta $22 + 3 a0e3 a9 1e lda #>(midi_display+6) + 4 a0e5 85 23 sta $23 + 5 a0e7 + 6 a0e7 a5 fd lda mididata1 + 7 a0e9 20 e2 a5 jsr hexstr + 172 a0ec + 173 a0ec ; Reset the midi counter to 0 again, in case of running status + 174 a0ec a2 00 ldx #$00 + 175 a0ee 86 24 stx midicounter + 176 a0f0 + 177 a0f0 ; Determine Command + 178 a0f0 ad 15 10 lda command + 179 a0f3 + 180 a0f3 c9 80 cmp #$80 ; Note Off + 181 a0f5 f0 0f beq donoteoff + 182 a0f7 + 183 a0f7 c9 90 cmp #$90 ; Note On + 184 a0f9 f0 11 beq donoteon + 185 a0fb + 186 a0fb c9 b0 cmp #$B0 ; Control Change + 187 a0fd f0 13 beq docontrolchange + 188 a0ff + 189 a0ff c9 c0 cmp #$C0 ; Program Change + 190 a101 f0 15 beq doprogramchange + 191 a103 + 192 a103 ; All others (Aftertouch, etc.) ignored. + 193 a103 4c 70 a0 jmp loop + 194 a106 + 195 a106 donoteoff + 196 a106 20 e1 a1 jsr noteoff + 197 a109 4c 70 a0 jmp loop + 198 a10c + 199 a10c donoteon + 200 a10c 20 3d a1 jsr noteon + 201 a10f 4c 70 a0 jmp loop + 202 a112 + 203 a112 docontrolchange + 204 a112 20 fa a1 jsr controlchange + 205 a115 4c 70 a0 jmp loop + 206 a118 + 207 a118 doprogramchange + 208 a118 20 94 a2 jsr programchange + 209 a11b 4c 70 a0 jmp loop + 210 a11e + 211 a11e + 212 a11e ; ---------------------------------------------------------------------------- + 213 a11e ; Process a MIDI System Realtime (for future) + 214 a11e + 215 a11e system_realtime_proc + 216 a11e + 217 a11e ; Display received message bytes + 0 a11e HEXPOKE (midi_display+0),tempstatusbyte + 1 a11e a9 4d lda #<(midi_display+0) + 2 a120 85 22 sta $22 + 3 a122 a9 1e lda #>(midi_display+0) + 4 a124 85 23 sta $23 + 5 a126 + 6 a126 ad 14 10 lda tempstatusbyte + 7 a129 20 e2 a5 jsr hexstr + 219 a12c + 220 a12c ; Blank the unused MIDI bytes + 221 a12c a9 2d lda #45 ; - + 222 a12e 8d 50 1e sta midi_display+3 + 223 a131 8d 51 1e sta midi_display+4 + 224 a134 8d 53 1e sta midi_display+6 + 225 a137 8d 54 1e sta midi_display+7 + 226 a13a + 227 a13a ; inc screen_colors + 228 a13a + 229 a13a ; Determine Command + 230 a13a ;lda tempstatusbyte + 231 a13a + 232 a13a ;cmp #$... + 233 a13a ;beq ... + 234 a13a + 235 a13a ; All ignored. + 236 a13a 4c 70 a0 jmp loop + 237 a13d + 238 a13d + 239 a13d + 240 a13d + 241 a13d ;***************************************************************************** + 242 a13d ;************************* MIDI Processing ********************************* + 243 a13d ;***************************************************************************** + 244 a13d + 245 a13d ; ---- Note On --------------------------------------------------- + 246 a13d ; 9c nn vv + 247 a13d + 248 a13d noteon + 249 a13d ; Special Case: Treat Velocity=0 as Note Off. Velocity ignored otherwise. + 250 a13d a5 fd lda mididata1 + 251 a13f d0 03 bne noteon_contd + 252 a141 4c e1 a1 jmp noteoff + 253 a144 + 254 a144 noteon_contd + 255 a144 a4 49 ldy channel ; Y now contains Channel # (0-offset) + 256 a146 a6 fc ldx mididata0 ; X now contains MIDI Note # + 257 a148 + 258 a148 ; Special Case: Channel 5 used for Poly mode + 259 a148 c0 04 cpy #$04 + 260 a14a d0 03 bne savenote + 261 a14c 20 43 a6 jsr get_poly_voice + 262 a14f + 263 a14f savenote + 264 a14f ; Save the note# so that later Note Offs only apply to this note. + 265 a14f 8a txa + 266 a150 99 68 00 sta lastnote,y + 267 a153 + 268 a153 ; Perform a table lookup of MIDI Note# to VIC Register + 269 a153 ; Table to use depends on bank/voice/channel + 270 a153 + 271 a153 ; Check the bank + 272 a153 a5 4a lda bank + 273 a155 + 274 a155 c9 00 cmp #$00 + 275 a157 f0 0d beq lookups_ntsc + 276 a159 + 277 a159 c9 01 cmp #$01 + 278 a15b f0 32 beq lookups_pal + 279 a15d + 280 a15d c9 02 cmp #$02 + 281 a15f f0 57 beq lookups_alt + 282 a161 + 283 a161 c9 03 cmp #$03 + 284 a163 f0 53 beq lookups_alt + 285 a165 + 286 a165 ; Ignore all other banks + 287 a165 60 rts + 288 a166 + 289 a166 + 290 a166 ; ------ NTSC ------- + 291 a166 + 292 a166 lookups_ntsc + 293 a166 c0 00 cpy #$00 + 294 a168 f0 0d beq vlook1_ntsc + 295 a16a + 296 a16a c0 01 cpy #$01 + 297 a16c f0 0f beq vlook2_ntsc + 298 a16e + 299 a16e c0 02 cpy #$02 + 300 a170 f0 11 beq vlook3_ntsc + 301 a172 + 302 a172 c0 03 cpy #$03 + 303 a174 f0 13 beq vlook4_ntsc + 304 a176 + 305 a176 ; Ignore all other channels + 306 a176 60 rts + 307 a177 + 308 a177 vlook1_ntsc + 309 a177 bd eb a8 lda voice1lookup_ntsc,x + 310 a17a 4c 1a a3 jmp setvoice + 311 a17d + 312 a17d vlook2_ntsc + 313 a17d bd 6b a9 lda voice2lookup_ntsc,x + 314 a180 4c 1a a3 jmp setvoice + 315 a183 + 316 a183 vlook3_ntsc + 317 a183 bd eb a9 lda voice3lookup_ntsc,x + 318 a186 4c 1a a3 jmp setvoice + 319 a189 + 320 a189 vlook4_ntsc + 321 a189 bd 6b aa lda voice4lookup_ntsc,x + 322 a18c 4c 1a a3 jmp setvoice + 323 a18f + 324 a18f ; ------ PAL ------- + 325 a18f + 326 a18f lookups_pal + 327 a18f c0 00 cpy #$00 + 328 a191 f0 0d beq vlook1_pal + 329 a193 + 330 a193 c0 01 cpy #$01 + 331 a195 f0 0f beq vlook2_pal + 332 a197 + 333 a197 c0 02 cpy #$02 + 334 a199 f0 11 beq vlook3_pal + 335 a19b + 336 a19b c0 03 cpy #$03 + 337 a19d f0 13 beq vlook4_pal + 338 a19f + 339 a19f ; Ignore all other channels + 340 a19f 60 rts + 341 a1a0 + 342 a1a0 vlook1_pal + 343 a1a0 bd eb aa lda voice1lookup_pal,x + 344 a1a3 4c 1a a3 jmp setvoice + 345 a1a6 + 346 a1a6 vlook2_pal + 347 a1a6 bd 6b ab lda voice2lookup_pal,x + 348 a1a9 4c 1a a3 jmp setvoice + 349 a1ac + 350 a1ac vlook3_pal + 351 a1ac bd eb ab lda voice3lookup_pal,x + 352 a1af 4c 1a a3 jmp setvoice + 353 a1b2 + 354 a1b2 vlook4_pal + 355 a1b2 bd 6b ac lda voice4lookup_pal,x + 356 a1b5 4c 1a a3 jmp setvoice + 357 a1b8 + 358 a1b8 ; ------ Alternate ------- + 359 a1b8 + 360 a1b8 lookups_alt + 361 a1b8 c0 00 cpy #$00 + 362 a1ba f0 0d beq vlook1_alt + 363 a1bc + 364 a1bc c0 01 cpy #$01 + 365 a1be f0 0f beq vlook2_alt + 366 a1c0 + 367 a1c0 c0 02 cpy #$02 + 368 a1c2 f0 11 beq vlook3_alt + 369 a1c4 + 370 a1c4 c0 03 cpy #$03 + 371 a1c6 f0 13 beq vlook4_alt + 372 a1c8 + 373 a1c8 ; Ignore all other channels + 374 a1c8 60 rts + 375 a1c9 + 376 a1c9 vlook1_alt + 377 a1c9 bd eb ac lda voice1lookup_alt,x + 378 a1cc 4c 1a a3 jmp setvoice + 379 a1cf + 380 a1cf vlook2_alt + 381 a1cf bd 6b ad lda voice2lookup_alt,x + 382 a1d2 4c 1a a3 jmp setvoice + 383 a1d5 + 384 a1d5 vlook3_alt + 385 a1d5 bd eb ad lda voice3lookup_alt,x + 386 a1d8 4c 1a a3 jmp setvoice + 387 a1db + 388 a1db vlook4_alt + 389 a1db bd 6b ae lda voice4lookup_alt,x + 390 a1de 4c 1a a3 jmp setvoice + 391 a1e1 + 392 a1e1 ; ---- Note Off -------------------------------------------------------------- + 393 a1e1 ; 8c nn vv + 394 a1e1 + 395 a1e1 noteoff + 396 a1e1 a4 49 ldy channel ; Y now contains channel # + 397 a1e3 + 398 a1e3 ; Special Case: Channel 5 used for Poly mode + 399 a1e3 c0 04 cpy #$04 + 400 a1e5 d0 06 bne noteoff_check + 401 a1e7 + 402 a1e7 20 58 a6 jsr get_poly_voice_off + 403 a1ea 4c f4 a1 jmp noteoff_off + 404 a1ed + 405 a1ed noteoff_check + 406 a1ed ;For Channels 1-4 + 407 a1ed ;Check if it matches the last. If not, ignore. + 408 a1ed b9 68 00 lda lastnote,y + 409 a1f0 c5 fc cmp mididata0 + 410 a1f2 d0 05 bne noteoff_x + 411 a1f4 + 412 a1f4 noteoff_off + 413 a1f4 a9 00 lda #$00 ; Off + 414 a1f6 4c 1a a3 jmp setvoice + 415 a1f9 + 416 a1f9 noteoff_x + 417 a1f9 60 rts + 418 a1fa + 419 a1fa ; ---- Control Change -------------------------------------------------------- + 420 a1fa ; Bc CC vv + 421 a1fa + 422 a1fa controlchange + 423 a1fa a4 49 ldy channel ; Y now contains channel # + 424 a1fc a5 fc lda mididata0 ; Controller number + 425 a1fe + 426 a1fe c9 00 cmp #00 ; Bank select - decimal + 427 a200 f0 15 beq bankselect + 428 a202 + 429 a202 c9 01 cmp #01 ; Modulation Wheel (coarse) - decimal + 430 a204 f0 57 beq modwheel + 431 a206 + 432 a206 c9 07 cmp #07 ; Volume (coarse) - decimal + 433 a208 f0 5a beq volume + 434 a20a + 435 a20a c9 4a cmp #74 ; Brightness - decimal + 436 a20c f0 6d beq screencolors + 437 a20e + 438 a20e c9 78 cmp #120 ; All Sound Off - decimal + 439 a210 f0 7d beq soundoff + 440 a212 + 441 a212 c9 7b cmp #123 ; All Notes Off - decimal + 442 a214 f0 79 beq soundoff + 443 a216 + 444 a216 ; Ignore all the rest + 445 a216 60 rts + 446 a217 + 447 a217 ; ---- Bank Select ----------------------------------------------------------- + 448 a217 ; Bc 00 vv + 449 a217 + 450 a217 bankselect + 451 a217 a5 fd lda mididata1 + 452 a219 29 03 and #$03 ; A contains bank, 0-3 + 453 a21b 85 4a sta bank + 454 a21d + 455 a21d showbank + 0 a21d HEXPOKE (voice_display+132),bank + 1 a21d a9 fb lda #<(voice_display+132) + 2 a21f 85 22 sta $22 + 3 a221 a9 1e lda #>(voice_display+132) + 4 a223 85 23 sta $23 + 5 a225 + 6 a225 a5 4a lda bank + 7 a227 20 e2 a5 jsr hexstr + 457 a22a + 0 a22a PLOT 9,13 + 1 a22a a0 09 ldy #9 + 2 a22c a2 0d ldx #13 + 3 a22e 18 clc + 4 a22f 20 0a e5 jsr $E50A + 459 a232 + 460 a232 a5 4a lda bank + 461 a234 + 462 a234 c9 00 cmp #$00 + 463 a236 f0 0d beq ntsc + 464 a238 + 465 a238 c9 01 cmp #$01 + 466 a23a f0 11 beq pal + 467 a23c + 468 a23c c9 02 cmp #$02 + 469 a23e f0 15 beq alt + 470 a240 + 471 a240 c9 03 cmp #$03 + 472 a242 f0 11 beq alt + 473 a244 + 474 a244 ; Ignore the rest + 475 a244 60 rts + 476 a245 + 477 a245 ntsc + 0 a245 PRINTSTRING ntscstring + 1 a245 a0 a5 ldy #>ntscstring + 2 a247 a9 49 lda #palstring + 2 a24f a9 44 lda #altstring + 2 a257 a9 4e lda #(voice_display+110) + 4 a272 85 23 sta $23 + 5 a274 + 6 a274 ad 0e 90 lda sound_volume + 7 a277 20 e2 a5 jsr hexstr + 510 a27a 60 rts + 511 a27b + 512 a27b ; ---- Brightness Controller (used for screen color)-------------------------- + 513 a27b ; Bc 4a vv + 514 a27b + 515 a27b screencolors + 516 a27b 18 clc + 517 a27c a5 fd lda mididata1 ; 7-bit + 518 a27e + 519 a27e 29 07 and #%00000111 ; Get border + 520 a280 85 6c sta temp1 + 521 a282 + 522 a282 a5 fd lda mididata1 + 523 a284 29 78 and #%01111000 ; Get background + 524 a286 0a asl ; Shift 1 bit left + 525 a287 + 526 a287 05 6c ora temp1 ; Put border back in + 527 a289 09 08 ora #%00001000 ; No Reverse Mode + 528 a28b + 529 a28b 8d 0f 90 sta screen_colors + 530 a28e 60 rts + 531 a28f + 532 a28f ; ---- Sound Off / All Notes Off Controller----------------------------------- + 533 a28f ; Bc 78 xx + 534 a28f ; Bc 7B xx + 535 a28f + 536 a28f soundoff + 537 a28f a9 00 lda #$00 ; Off + 538 a291 4c 1a a3 jmp setvoice + 539 a294 + 540 a294 + 541 a294 ; ---- Program Change -------------------------------------------------------- + 542 a294 ; Cc pn + 543 a294 + 544 a294 programchange + 545 a294 ; Blank the unused MIDI byte + 546 a294 a9 2d lda #45 ; - + 547 a296 8d 53 1e sta midi_display+6 + 548 a299 8d 54 1e sta midi_display+7 + 549 a29c + 550 a29c ; Get low nybble and replace, since there are only 16 viznut waveforms + 551 a29c a5 fc lda mididata0 + 552 a29e 29 0f and #$0f + 553 a2a0 85 fc sta mididata0 ; Note that this is the waveform NUMBER, not the VALUE! + 554 a2a2 + 555 a2a2 a4 49 ldy channel ; Y now contains channel # + 556 a2a4 99 10 10 sta waveform1,y ; Store waveform used + 557 a2a7 + 558 a2a7 c0 00 cpy #00 + 559 a2a9 f0 0d beq pc_0 + 560 a2ab + 561 a2ab c0 01 cpy #01 + 562 a2ad f0 18 beq pc_1 + 563 a2af + 564 a2af c0 02 cpy #02 + 565 a2b1 f0 23 beq pc_2 + 566 a2b3 + 567 a2b3 c0 03 cpy #03 ; Not sure if viznut's waveforms applies to the noise voice, + 568 a2b5 f0 2e beq pc_3 ; but keep it in away. + 569 a2b7 + 570 a2b7 ; Ignore all other channels + 571 a2b7 60 rts + 572 a2b8 + 573 a2b8 ; Update the screen with Program# (viznut waveform code) + 574 a2b8 ; Note that these are not actually used until setvoice is called below [1] + 575 a2b8 + 576 a2b8 pc_0 + 0 a2b8 HEXPOKE (voice_display+ 5),waveform1 + 1 a2b8 a9 7c lda #<(voice_display+ 5) + 2 a2ba 85 22 sta $22 + 3 a2bc a9 1e lda #>(voice_display+ 5) + 4 a2be 85 23 sta $23 + 5 a2c0 + 6 a2c0 ad 10 10 lda waveform1 + 7 a2c3 20 e2 a5 jsr hexstr + 578 a2c6 60 rts + 579 a2c7 + 580 a2c7 pc_1 + 0 a2c7 HEXPOKE (voice_display+27),waveform2 + 1 a2c7 a9 92 lda #<(voice_display+27) + 2 a2c9 85 22 sta $22 + 3 a2cb a9 1e lda #>(voice_display+27) + 4 a2cd 85 23 sta $23 + 5 a2cf + 6 a2cf ad 11 10 lda waveform2 + 7 a2d2 20 e2 a5 jsr hexstr + 582 a2d5 60 rts + 583 a2d6 + 584 a2d6 pc_2 + 0 a2d6 HEXPOKE (voice_display+49),waveform3 + 1 a2d6 a9 a8 lda #<(voice_display+49) + 2 a2d8 85 22 sta $22 + 3 a2da a9 1e lda #>(voice_display+49) + 4 a2dc 85 23 sta $23 + 5 a2de + 6 a2de ad 12 10 lda waveform3 + 7 a2e1 20 e2 a5 jsr hexstr + 586 a2e4 60 rts + 587 a2e5 + 588 a2e5 pc_3 + 0 a2e5 HEXPOKE (voice_display+71),waveform4 + 1 a2e5 a9 be lda #<(voice_display+71) + 2 a2e7 85 22 sta $22 + 3 a2e9 a9 1e lda #>(voice_display+71) + 4 a2eb 85 23 sta $23 + 5 a2ed + 6 a2ed ad 13 10 lda waveform4 + 7 a2f0 20 e2 a5 jsr hexstr + 590 a2f3 60 rts + 591 a2f4 + 592 a2f4 + 593 a2f4 ;--------------------------------------------------------- + 594 a2f4 ; Set a voice using viznut's setwave function. + 595 a2f4 ; If a sound is already playing, fine. But if not, need a "short" delay. TODO *** + 596 a2f4 + 597 a2f4 viznut + 598 a2f4 a4 49 ldy channel ; Channel # (0-3) + 599 a2f6 b9 53 a5 lda voice_to_register,y + 600 a2f9 8d 20 10 sta setwavechannel + 601 a2fc + 602 a2fc a5 5e lda currentvalue ; X now contains initial frequency of selected channel + 603 a2fe 8d 21 10 sta setwavefrequency + 604 a301 + 605 a301 a4 49 ldy channel + 606 a303 b9 10 10 lda waveform1,y ; Retrieve the last desired waveform# for this channel + 607 a306 aa tax + 608 a307 bd db a8 lda viznutwaveforms,x ; Retrieve the desired shift register contents for that waveform# + 609 a30a 8d 22 10 sta setwaveshiftreg + 610 a30d + 611 a30d ; Set X,Y,A as required and set the waveform. + 612 a30d ac 20 10 ldy setwavechannel + 613 a310 ae 21 10 ldx setwavefrequency + 614 a313 ad 22 10 lda setwaveshiftreg + 615 a316 20 00 11 jsr setwave + 616 a319 + 617 a319 ; TODO, update the screen + 618 a319 60 rts + 619 a31a + 620 a31a + 621 a31a ;*************************************************************************** + 622 a31a ;******************* Set/Display Functions ******************************* + 623 a31a ;*************************************************************************** + 624 a31a + 625 a31a ; Dispatcher for setting the appropriate voice and updating the screen + 626 a31a ; Channel# in Y (Channel 0 = Voice 1, etc) + 627 a31a ; Value to set it to in A. + 628 a31a + 629 a31a setvoice + 630 a31a 85 5e sta currentvalue + 631 a31c + 632 a31c ; Before setting the voice, check if a viznut waveform was selected previously [1] + 633 a31c ; If so, handle that separately. + 634 a31c ;lda waveform1,y + 635 a31c ;bne viznut + 636 a31c + 637 a31c ; Nope, carry on. + 638 a31c a5 5e lda currentvalue + 639 a31e a4 49 ldy channel ; Y now contains channel # + 640 a320 + 641 a320 c0 00 cpy #$00 + 642 a322 f0 0d beq v1 + 643 a324 + 644 a324 c0 01 cpy #$01 + 645 a326 f0 1b beq v2 + 646 a328 + 647 a328 c0 02 cpy #$02 + 648 a32a f0 29 beq v3 + 649 a32c + 650 a32c c0 03 cpy #$03 + 651 a32e f0 37 beq v4 + 652 a330 + 653 a330 ; Ignore all other channels + 654 a330 60 rts + 655 a331 + 656 a331 ; ---- Voice 1 ------- + 657 a331 v1 + 658 a331 8d 0a 90 sta sound_voice1 + 0 a334 HEXPOKE (voice_display+00),sound_voice1 + 1 a334 a9 77 lda #<(voice_display+00) + 2 a336 85 22 sta $22 + 3 a338 a9 1e lda #>(voice_display+00) + 4 a33a 85 23 sta $23 + 5 a33c + 6 a33c ad 0a 90 lda sound_voice1 + 7 a33f 20 e2 a5 jsr hexstr + 660 a342 60 rts + 661 a343 + 662 a343 ; ---- Voice 2 ------- + 663 a343 v2 + 664 a343 8d 0b 90 sta sound_voice2 + 0 a346 HEXPOKE (voice_display+22),sound_voice2 + 1 a346 a9 8d lda #<(voice_display+22) + 2 a348 85 22 sta $22 + 3 a34a a9 1e lda #>(voice_display+22) + 4 a34c 85 23 sta $23 + 5 a34e + 6 a34e ad 0b 90 lda sound_voice2 + 7 a351 20 e2 a5 jsr hexstr + 666 a354 60 rts + 667 a355 + 668 a355 ; ---- Voice 3 ------- + 669 a355 v3 + 670 a355 8d 0c 90 sta sound_voice3 + 0 a358 HEXPOKE (voice_display+44),sound_voice3 + 1 a358 a9 a3 lda #<(voice_display+44) + 2 a35a 85 22 sta $22 + 3 a35c a9 1e lda #>(voice_display+44) + 4 a35e 85 23 sta $23 + 5 a360 + 6 a360 ad 0c 90 lda sound_voice3 + 7 a363 20 e2 a5 jsr hexstr + 672 a366 60 rts + 673 a367 + 674 a367 ; ---- Voice 4 ------- + 675 a367 v4 + 676 a367 8d 0d 90 sta sound_noise + 0 a36a HEXPOKE (voice_display+66),sound_noise + 1 a36a a9 b9 lda #<(voice_display+66) + 2 a36c 85 22 sta $22 + 3 a36e a9 1e lda #>(voice_display+66) + 4 a370 85 23 sta $23 + 5 a372 + 6 a372 ad 0d 90 lda sound_noise + 7 a375 20 e2 a5 jsr hexstr + 678 a378 60 rts + 679 a379 + 680 a379 ; ---------------------------------------------------------------------------- + 681 a379 + 682 a379 setcolors + 683 a379 a2 00 ldx #$00 + 684 a37b a9 00 lda #$00 + 685 a37d setcolorsloop + 686 a37d 9d 00 96 sta $9600,x + 687 a380 9d 00 97 sta $9700,x + 688 a383 e8 inx + 689 a384 e0 00 cpx #$00 + 690 a386 d0 f5 bne setcolorsloop + 691 a388 60 rts + 692 a389 + 693 a389 ; ---------------------------------------------------------------------------- + 694 a389 ; Draw Main Screen + 695 a389 + 696 a389 mainscreen + 697 a389 20 5f e5 jsr CLRSCREEN + 698 a38c a9 1a lda #26 ; Decimal, white and red + 699 a38e 8d 0f 90 sta screen_colors + 700 a391 a9 06 lda #$06 ; Blue + 701 a393 8d 86 02 sta $0286 ; Cursor Color + 0 a396 PRINTSTRING maintext + 1 a396 a0 a3 ldy #>maintext + 2 a398 a9 e7 lda #credits + 2 a3b2 a9 82 lda #nouart + 2 a56d a9 cc lda #theirq + 75 a5a0 - sta $0315 + 76 a5a0 else + 77 a5a0 a9 b4 lda #thenmi + 80 a5a7 8d 19 03 sta $0319 + 81 a5aa eif + 82 a5aa + 83 a5aa ; Disable timer interrupts + 84 a5aa + 85 a5aa a9 60 lda #%01100000 + 86 a5ac 8d 2e 91 sta $912e ; disable and acknowledge interrupts + 87 a5af 8d 2d 91 sta $912d + 88 a5b2 ;sta $911e ; disable NMIs (Restore key) + 89 a5b2 + 90 a5b2 58 cli + 91 a5b3 60 rts + 92 a5b4 + 93 a5b4 ; ---------------------------------------------------------------------------- + 94 a5b4 ; The IRQ. + 95 a5b4 + 96 a5b4 thenmi + 97 a5b4 ifconst USE_NMI + 98 a5b4 48 pha + 99 a5b5 8a txa + 100 a5b6 48 pha + 101 a5b7 98 tya + 102 a5b8 48 pha + 103 a5b9 eif + 104 a5b9 + 105 a5b9 theirq + 106 a5b9 ; Fetch the received byte + 107 a5b9 ad 00 9c lda UART_RXTX ;get data + 108 a5bc a4 5c ldy write_pointer + 109 a5be 99 00 12 sta buffer,y + 110 a5c1 e6 5c inc write_pointer + 111 a5c3 + 112 a5c3 ; Clear the interrupt from the UART by reading the status register + 113 a5c3 ad 02 9c lda UART_ISR + 114 a5c6 + 115 a5c6 4c 56 ff jmp $ff56 ; Use this in place of rti because it restores the A,X,Y registers from the stack + 116 a5c9 ;jmp $eabf ; return to normal IRQ (scans keyboard and stuff) + 117 a5c9 + 118 a5c9 + 119 a5c9 ; ---------------------------------------------------------------------------- + 120 a5c9 ; Handle the RESTORE key + 121 a5c9 + 122 a5c9 RESTORE + 123 a5c9 4c c7 fe jmp $fec7 ; Continue as if no cartridge installed + 124 a5cc + 125 a5cc + 126 a5cc ; ---------------------------------------------------------------------------- + 127 a5cc ; Strings + 128 a5cc + 129 a5cc nouart + 130 a5cc 7f 7f 20 75* byte.b 127,127, " uart NOT FOUND! ", 127,127 + 131 a5e1 00 byte.b 0 + 132 a5e2 + 133 a5e2 ; EOF! +------- FILE vicmidi.asm +------- FILE utils.asm LEVEL 2 PASS 2 + 0 a5e2 include "utils.asm" + 1 a5e2 ; VIC Version by Schema/AIC (Leif Bloomquist) + 2 a5e2 ; Original by Six/Style (Oliver VieBrooks) + 3 a5e2 + 4 a5e2 ; Fast POKE of hex value to screen + 5 a5e2 ; also see HEXPOKE macro + 6 a5e2 ; print hex char $ of number in a at location referenced by screen_temp + 7 a5e2 + 8 a5e2 hexstr + 9 a5e2 a0 00 ldy #$00 + 10 a5e4 48 pha + 11 a5e5 29 f0 and #$f0 + 12 a5e7 18 clc + 13 a5e8 4a lsr + 14 a5e9 4a lsr + 15 a5ea 4a lsr + 16 a5eb 4a lsr + 17 a5ec aa tax + 18 a5ed bd 1e a6 lda hexstring,x + 19 a5f0 91 22 sta ($22),y + 20 a5f2 + 21 a5f2 c8 iny + 22 a5f3 68 pla + 23 a5f4 29 0f and #$0f + 24 a5f6 aa tax + 25 a5f7 bd 1e a6 lda hexstring,x + 26 a5fa 91 22 sta ($22),y + 27 a5fc 60 rts + 28 a5fd + 29 a5fd + 30 a5fd ; print hex char $ of number in a SLOW! + 31 a5fd 00 hexx dc.b $00 + 32 a5fe + 33 a5fe printhexstr + 34 a5fe 8e fd a5 stx hexx + 35 a601 48 pha + 36 a602 29 f0 and #$f0 + 37 a604 18 clc + 38 a605 4a lsr + 39 a606 4a lsr + 40 a607 4a lsr + 41 a608 4a lsr + 42 a609 aa tax + 43 a60a bd 1e a6 lda hexstring,x + 44 a60d 20 d2 ff jsr $ffd2 + 45 a610 + 46 a610 68 pla + 47 a611 29 0f and #$0f + 48 a613 aa tax + 49 a614 bd 1e a6 lda hexstring,x + 50 a617 20 d2 ff jsr $ffd2 + 51 a61a ae fd a5 ldx hexx + 52 a61d 60 rts + 53 a61e + 54 a61e hexstring + 55 a61e 30 31 32 33* .byte.b "0123456789ABCDEF" + 56 a62e + 57 a62e + 58 a62e ; ============================================================== + 59 a62e ; Most defaults are NTSC. This code overrides for PAL. + 60 a62e ; ============================================================== + 61 a62e + 62 a62e setup_pal + 63 a62e ad e4 ed lda $EDE4 + 64 a631 c9 0c cmp #$0C + 65 a633 f0 07 beq DOPAL + 66 a635 + 67 a635 ; NTSC System detected + 68 a635 a9 00 lda #$00 + 69 a637 85 4a sta bank + 70 a639 4c 1d a2 jmp showbank ; There's an rts there + 71 a63c + 72 a63c ; PAL System detected + 73 a63c DOPAL + 74 a63c a9 01 lda #$01 + 75 a63e 85 4a sta bank + 76 a640 4c 1d a2 jmp showbank ; There's an rts there + 77 a643 + 78 a643 ; EOF! +------- FILE vicmidi.asm +------- FILE polymode.asm LEVEL 2 PASS 2 + 0 a643 include "polymode.asm" + 1 a643 + 2 a643 ;*************************************************************************** + 3 a643 ;*************** Determine next Channel in Poly Mode (set Y) ************** + 4 a643 ;*************************************************************************** + 5 a643 get_poly_voice + 6 a643 a0 00 ldy #$00 + 7 a645 + 8 a645 get_poly_voice_loop + 9 a645 b9 61 00 lda poly_flags,y ; 0=not in use, 1=in use + 10 a648 f0 08 beq get_poly_voice_x + 11 a64a c8 iny + 12 a64b c0 04 cpy #$04 ; Note that we're only checking the first 3 voices - n/a to noise voice. + 13 a64d d0 f6 bne get_poly_voice_loop + 14 a64f + 15 a64f ; No free voices, ignore + 16 a64f a0 04 ldy #$04 ; Invalid channel, will be ignored by Note On code + 17 a651 60 rts + 18 a652 + 19 a652 get_poly_voice_x + 20 a652 a9 01 lda #$01 + 21 a654 99 61 00 sta poly_flags,y + 22 a657 60 rts + 23 a658 + 24 a658 + 25 a658 ;*************************************************************************** + 26 a658 ;******** Determine Channel to turn off in Poly Mode (set Y) ************** + 27 a658 ;*************************************************************************** + 28 a658 get_poly_voice_off + 29 a658 + 30 a658 a0 00 ldy #$00 + 31 a65a + 32 a65a get_poly_voice_off_loop + 33 a65a b9 61 00 lda poly_flags,y ; Is the channel in use? + 34 a65d f0 07 beq poly_next ; No, so skip it + 35 a65f + 36 a65f b9 68 00 lda lastnote,y ; Get last note on this voice + 37 a662 c5 fc cmp mididata0 ; Compare to note received + 38 a664 f0 0b beq get_poly_voice_off_x ; Matched! + 39 a666 + 40 a666 poly_next + 41 a666 c8 iny ; Next channel + 42 a667 c0 04 cpy #$04 ; Note that we're only checking the first 3 voices - n/a to noise voice. + 43 a669 d0 ef bne get_poly_voice_off_loop + 44 a66b + 45 a66b ; No match to the note to turn off, ignore + 46 a66b a0 04 ldy #$04 ; Invalid channel, will be ignored by Note Off code + 47 a66d ee 0f 90 inc screen_colors ; DEBUG + 48 a670 60 rts + 49 a671 + 50 a671 get_poly_voice_off_x + 51 a671 a9 00 lda #$00 + 52 a673 99 61 00 sta poly_flags,y + 53 a676 60 rts + 54 a677 +------- FILE vicmidi.asm +------- FILE keyboard.asm LEVEL 2 PASS 2 + 0 a677 include "keyboard.asm" + 1 a677 ;******************************************************************************************* + 2 a677 ;******************************** keyboard stuff ***************************************** + 3 a677 ;******************************************************************************************* + 4 a677 + 5 a677 ; -------------------------------------------------------------------------------------------------- + 6 a677 ;;;;;;;;;;;;;;; keyboard stuff + 7 a677 ;previous keyboard column bits + 8 a677 00 4e c0 = $4E ; 2,4,6,8,(...) + 9 a677 00 4f c1 = $4F ; q,e,t,u,(...) + 10 a677 00 50 c2 = $50 ; w,r,y,i,p,(...) + 11 a677 00 51 c3 = $51 ; 1,3,5,7,(...) + 12 a677 + 13 a677 91 20 kb_column = $9120 + 14 a677 91 21 kb_row = $9121 + 15 a677 + 16 a677 ; 9121 9120: (Write column value to this address) + 17 a677 ; + 18 a677 ; 7f bf df ef f7 fb fd fe + 19 a677 ; + 20 a677 ; fe 2 q CBM Space RunStop Control Lft_arr 1 + 21 a677 ; fd 4 e s z Shift_L a w 3 + 22 a677 ; fb 6 t f c x d r 5 + 23 a677 ; f7 8 u h b v g y 7 + 24 a677 ; ef 0 o k m n j i 9 + 25 a677 ; df - @ : . , l p + + 26 a677 ; bf Home Up_arr = Shift_R / ; * GBP + 27 a677 ; 7f F7 F5 F3 F1 Down Right Return Del + 28 a677 + 29 a677 GetKey + 30 a677 78 sei + 31 a678 ; this should not be done, we want to compare the OLD recorded status with new one + 32 a678 ;lda #$0 + 33 a678 ;sta kb_column + 34 a678 ;lda kb_row + 35 a678 ;cmp #$FF + 36 a678 ;beq NoKey ; no key at all pressed + 37 a678 + 38 a678 Check7F + 39 a678 ;now check for each column + 40 a678 a9 7f lda #$7F + 41 a67a 8d 20 91 sta kb_column + 42 a67d ad 21 91 lda kb_row + 43 a680 49 ff eor #$FF ; inversed accumulator contains all bits in this column + 44 a682 c5 4e cmp c0 + 45 a684 f0 08 beq CheckBF ; these arent the droids you are looking for move along + 46 a686 85 4e sta c0 + 47 a688 8d 00 1e sta $1E00 + 48 a68b 4c cd a6 jmp KeyDone + 49 a68e CheckBF + 50 a68e ;now check for each column + 51 a68e a9 bf lda #$BF + 52 a690 8d 20 91 sta kb_column + 53 a693 ad 21 91 lda kb_row + 54 a696 49 ff eor #$FF ; inversed accumulator contains all bits in this column + 55 a698 c5 4f cmp c1 + 56 a69a f0 08 beq CheckFD ; these arent the droids you are looking for move along + 57 a69c 85 4f sta c1 + 58 a69e 8d 01 1e sta $1E01 + 59 a6a1 4c cd a6 jmp KeyDone + 60 a6a4 CheckFD + 61 a6a4 ;now check for each column + 62 a6a4 a9 fd lda #$FD + 63 a6a6 8d 20 91 sta kb_column + 64 a6a9 ad 21 91 lda kb_row + 65 a6ac 49 ff eor #$FF ; inversed accumulator contains all bits in this column + 66 a6ae c5 50 cmp c2 + 67 a6b0 f0 08 beq CheckFE ; these arent the droids you are looking for move along + 68 a6b2 85 50 sta c2 + 69 a6b4 8d 02 1e sta $1E02 + 70 a6b7 4c cd a6 jmp KeyDone + 71 a6ba CheckFE + 72 a6ba ;now check for each column + 73 a6ba a9 fe lda #$FE + 74 a6bc 8d 20 91 sta kb_column + 75 a6bf ad 21 91 lda kb_row + 76 a6c2 49 ff eor #$FF ; inversed accumulator contains all bits in this column + 77 a6c4 c5 51 cmp c3 + 78 a6c6 f0 05 beq KeyDone ; these arent the droids you are looking for move along + 79 a6c8 85 51 sta c3 + 80 a6ca 8d 03 1e sta $1E03 + 81 a6cd KeyDone + 82 a6cd 58 cli + 83 a6ce 60 rts + 84 a6cf + 85 a6cf ; --------------------------------------------------------------------------- + 86 a6cf + 87 a6cf setchars + 88 a6cf a2 00 ldx #$00 + 89 a6d1 a9 51 lda #$51 + 90 a6d3 setcharsloop1 + 91 a6d3 9d 00 1e sta $1E00,x + 92 a6d6 e8 inx + 93 a6d7 e0 00 cpx #$00 + 94 a6d9 d0 f8 bne setcharsloop1 + 95 a6db a2 00 ldx #$00 + 96 a6dd a9 66 lda #$66 + 97 a6df setcharsloop2 + 98 a6df 9d 00 1f sta $1F00,x + 99 a6e2 e8 inx + 100 a6e3 e0 00 cpx #$00 + 101 a6e5 d0 f8 bne setcharsloop2 + 102 a6e7 60 rts + 103 a6e8 + 104 a6e8 + 105 a6e8 + 106 a6e8 ; --------------------------------------------------------------------------- + 107 a6e8 ; Quick hack using KERNAL routines to read the keyboard + 108 a6e8 + 109 a6e8 ReadKey + 110 a6e8 20 1e eb jsr ISCNKY ; Call this manually since the main timer IRQ is disabled. + 111 a6eb + 112 a6eb a5 c5 lda $C5 ; Current key? + 113 a6ed c9 40 cmp #$40 ; None + 114 a6ef d0 11 bne keypressed + 115 a6f1 + 116 a6f1 ; No key was pressed. But was one pressed previously? + 117 a6f1 ad 23 10 lda midinoteout + 118 a6f4 f0 0b beq key_x ; No + 119 a6f6 + 120 a6f6 ; Yes, so turn that note off. + 121 a6f6 20 5d a7 jsr sendnoteoff + 122 a6f9 a9 00 lda #$00 + 123 a6fb 8d 23 10 sta midinoteout + 124 a6fe + 125 a6fe ce 0f 90 dec screen_colors + 126 a701 + 127 a701 key_x + 128 a701 60 rts + 129 a702 + 130 a702 + 131 a702 keypressed ; A contains key code + 132 a702 aa tax + 133 a703 bd ae a7 lda notelookup,x + 134 a706 f0 f9 beq key_x ; Note was 0, in this context meaning no note + 135 a708 + 136 a708 ; Same note as before? + 137 a708 cd 23 10 cmp midinoteout + 138 a70b f0 f4 beq key_x ; Yes, do nothing + 139 a70d + 140 a70d ; New note - send it + 141 a70d + 142 a70d 8d 23 10 sta midinoteout + 143 a710 20 17 a7 jsr sendnoteon + 144 a713 + 145 a713 ee 0f 90 inc screen_colors + 146 a716 + 147 a716 60 rts + 148 a717 + 149 a717 + 150 a717 + 151 a717 ; --------------------------------------------------------------------------- + 152 a717 ; Send a NOTE ON MIDI Message. + 153 a717 + 154 a717 sendnoteon + 155 a717 20 a3 a7 jsr wait_tx + 156 a71a ad ab a7 lda noteonval ; Note on + 157 a71d 8d 00 9c sta UART_RXTX + 158 a720 + 159 a720 20 a3 a7 jsr wait_tx + 160 a723 ad 23 10 lda midinoteout + 161 a726 8d 00 9c sta UART_RXTX + 162 a729 + 163 a729 20 a3 a7 jsr wait_tx + 164 a72c ad ad a7 lda defaultvelocity + 165 a72f 8d 00 9c sta UART_RXTX + 166 a732 + 167 a732 ; Display + 0 a732 HEXPOKE (midi_display+0),noteonval + 1 a732 a9 4d lda #<(midi_display+0) + 2 a734 85 22 sta $22 + 3 a736 a9 1e lda #>(midi_display+0) + 4 a738 85 23 sta $23 + 5 a73a + 6 a73a ad ab a7 lda noteonval + 7 a73d 20 e2 a5 jsr hexstr + 0 a740 HEXPOKE (midi_display+3),midinoteout + 1 a740 a9 50 lda #<(midi_display+3) + 2 a742 85 22 sta $22 + 3 a744 a9 1e lda #>(midi_display+3) + 4 a746 85 23 sta $23 + 5 a748 + 6 a748 ad 23 10 lda midinoteout + 7 a74b 20 e2 a5 jsr hexstr + 0 a74e HEXPOKE (midi_display+6),defaultvelocity + 1 a74e a9 53 lda #<(midi_display+6) + 2 a750 85 22 sta $22 + 3 a752 a9 1e lda #>(midi_display+6) + 4 a754 85 23 sta $23 + 5 a756 + 6 a756 ad ad a7 lda defaultvelocity + 7 a759 20 e2 a5 jsr hexstr + 171 a75c + 172 a75c 60 rts + 173 a75d + 174 a75d + 175 a75d ; --------------------------------------------------------------------------- + 176 a75d ; Send a NOTE OFF MIDI Message. + 177 a75d + 178 a75d sendnoteoff + 179 a75d 20 a3 a7 jsr wait_tx + 180 a760 ad ac a7 lda noteoffval ; Note off + 181 a763 8d 00 9c sta UART_RXTX + 182 a766 + 183 a766 20 a3 a7 jsr wait_tx + 184 a769 ad 23 10 lda midinoteout + 185 a76c 8d 00 9c sta UART_RXTX + 186 a76f + 187 a76f 20 a3 a7 jsr wait_tx + 188 a772 ad ad a7 lda defaultvelocity ; Decimal - convention for velocity when velocity not supported. + 189 a775 8d 00 9c sta UART_RXTX + 190 a778 + 191 a778 ; Display + 0 a778 HEXPOKE (midi_display+0),noteoffval + 1 a778 a9 4d lda #<(midi_display+0) + 2 a77a 85 22 sta $22 + 3 a77c a9 1e lda #>(midi_display+0) + 4 a77e 85 23 sta $23 + 5 a780 + 6 a780 ad ac a7 lda noteoffval + 7 a783 20 e2 a5 jsr hexstr + 0 a786 HEXPOKE (midi_display+3),midinoteout + 1 a786 a9 50 lda #<(midi_display+3) + 2 a788 85 22 sta $22 + 3 a78a a9 1e lda #>(midi_display+3) + 4 a78c 85 23 sta $23 + 5 a78e + 6 a78e ad 23 10 lda midinoteout + 7 a791 20 e2 a5 jsr hexstr + 0 a794 HEXPOKE (midi_display+6),defaultvelocity + 1 a794 a9 53 lda #<(midi_display+6) + 2 a796 85 22 sta $22 + 3 a798 a9 1e lda #>(midi_display+6) + 4 a79a 85 23 sta $23 + 5 a79c + 6 a79c ad ad a7 lda defaultvelocity + 7 a79f 20 e2 a5 jsr hexstr + 195 a7a2 + 196 a7a2 60 rts + 197 a7a3 + 198 a7a3 + 199 a7a3 ; --------------------------------------------------------------------------- + 200 a7a3 ; Quick hack to wait for THR to be empty. Ideally sending would be + 201 a7a3 ; interrupt-driven with a ring buffer. + 202 a7a3 + 203 a7a3 wait_tx + 204 a7a3 ad 05 9c lda UART_LSR + 205 a7a6 29 20 and #32 + 206 a7a8 f0 f9 beq wait_tx + 207 a7aa 60 rts + 208 a7ab + 209 a7ab noteonval + 210 a7ab 90 byte.b $90 + 211 a7ac + 212 a7ac noteoffval + 213 a7ac 80 byte.b $80 + 214 a7ad + 215 a7ad defaultvelocity + 216 a7ad 40 byte.b 64 ; Decimal - convention for velocity when velocity not supported. + 217 a7ae + 218 a7ae notelookup + 219 a7ae + 220 a7ae ; MIDI Note# Comments + 221 a7ae 00 byte.b 0 ; + 222 a7af 3f byte.b 63 ; + 223 a7b0 42 byte.b 66 ; + 224 a7b1 46 byte.b 70 ; + 225 a7b2 49 byte.b 73 ; + 226 a7b3 00 byte.b 0 ; + 227 a7b4 50 byte.b 80 ; + 228 a7b5 53 byte.b 83 ; + 229 a7b6 00 byte.b 0 ; + 230 a7b7 3e byte.b 62 ; + 231 a7b8 41 byte.b 65 ; + 232 a7b9 45 byte.b 69 ; + 233 a7ba 48 byte.b 72 ; + 234 a7bb 4c byte.b 76 ; + 235 a7bc 4f byte.b 79 ; + 236 a7bd 00 byte.b 0 ; + 237 a7be 00 byte.b 0 ; + 238 a7bf 00 byte.b 0 ; + 239 a7c0 00 byte.b 0 ; + 240 a7c1 00 byte.b 0 ; + 241 a7c2 00 byte.b 0 ; + 242 a7c3 00 byte.b 0 ; + 243 a7c4 00 byte.b 0 ; + 244 a7c5 00 byte.b 0 ; + 245 a7c6 00 byte.b 0 ; + 246 a7c7 00 byte.b 0 ; + 247 a7c8 00 byte.b 0 ; + 248 a7c9 00 byte.b 0 ; + 249 a7ca 00 byte.b 0 ; + 250 a7cb 00 byte.b 0 ; + 251 a7cc 00 byte.b 0 ; + 252 a7cd 00 byte.b 0 ; + 253 a7ce 00 byte.b 0 ; + 254 a7cf 00 byte.b 0 ; + 255 a7d0 00 byte.b 0 ; + 256 a7d1 00 byte.b 0 ; + 257 a7d2 00 byte.b 0 ; + 258 a7d3 00 byte.b 0 ; + 259 a7d4 00 byte.b 0 ; + 260 a7d5 00 byte.b 0 ; + 261 a7d6 00 byte.b 0 ; + 262 a7d7 00 byte.b 0 ; + 263 a7d8 00 byte.b 0 ; + 264 a7d9 00 byte.b 0 ; + 265 a7da 00 byte.b 0 ; + 266 a7db 00 byte.b 0 ; + 267 a7dc 00 byte.b 0 ; + 268 a7dd 00 byte.b 0 ; + 269 a7de 3c byte.b 60 ; Middle C (C5) + 270 a7df 40 byte.b 64 ; + 271 a7e0 43 byte.b 67 ; + 272 a7e1 47 byte.b 71 ; + 273 a7e2 4a byte.b 74 ; + 274 a7e3 4d byte.b 77 ; + 275 a7e4 51 byte.b 81 ; + 276 a7e5 00 byte.b 0 ; + 277 a7e6 3d byte.b 61 ; + 278 a7e7 00 byte.b 0 ; + 279 a7e8 44 byte.b 68 ; + 280 a7e9 00 byte.b 0 ; + 281 a7ea 4b byte.b 75 ; + 282 a7eb 4e byte.b 78 ; + 283 a7ec 52 byte.b 82 ; + 284 a7ed 00 byte.b 0 ; + 285 a7ee 00 byte.b 0 ; No key Pressed + 286 a7ef 00 byte.b 0 ; + 287 a7f0 00 byte.b 0 ; + 288 a7f1 00 byte.b 0 ; + 289 a7f2 00 byte.b 0 ; + 290 a7f3 00 byte.b 0 ; + 291 a7f4 00 byte.b 0 ; + 292 a7f5 00 byte.b 0 ; + 293 a7f6 00 byte.b 0 ; + 294 a7f7 00 byte.b 0 ; + 295 a7f8 00 byte.b 0 ; + 296 a7f9 00 byte.b 0 ; + 297 a7fa 00 byte.b 0 ; + 298 a7fb 00 byte.b 0 ; + 299 a7fc 00 byte.b 0 ; + 300 a7fd 00 byte.b 0 ; + 301 a7fe 00 byte.b 0 ; + 302 a7ff 00 byte.b 0 ; + 303 a800 00 byte.b 0 ; + 304 a801 00 byte.b 0 ; + 305 a802 00 byte.b 0 ; + 306 a803 00 byte.b 0 ; + 307 a804 00 byte.b 0 ; + 308 a805 00 byte.b 0 ; + 309 a806 00 byte.b 0 ; + 310 a807 00 byte.b 0 ; + 311 a808 00 byte.b 0 ; + 312 a809 00 byte.b 0 ; + 313 a80a 00 byte.b 0 ; + 314 a80b 00 byte.b 0 ; + 315 a80c 00 byte.b 0 ; + 316 a80d 00 byte.b 0 ; + 317 a80e 00 byte.b 0 ; + 318 a80f 00 byte.b 0 ; + 319 a810 00 byte.b 0 ; + 320 a811 00 byte.b 0 ; + 321 a812 00 byte.b 0 ; + 322 a813 00 byte.b 0 ; + 323 a814 00 byte.b 0 ; + 324 a815 00 byte.b 0 ; + 325 a816 00 byte.b 0 ; + 326 a817 00 byte.b 0 ; + 327 a818 00 byte.b 0 ; + 328 a819 00 byte.b 0 ; + 329 a81a 00 byte.b 0 ; + 330 a81b 00 byte.b 0 ; + 331 a81c 00 byte.b 0 ; + 332 a81d 00 byte.b 0 ; + 333 a81e 00 byte.b 0 ; + 334 a81f 00 byte.b 0 ; + 335 a820 00 byte.b 0 ; + 336 a821 00 byte.b 0 ; + 337 a822 00 byte.b 0 ; + 338 a823 00 byte.b 0 ; + 339 a824 00 byte.b 0 ; + 340 a825 00 byte.b 0 ; + 341 a826 00 byte.b 0 ; + 342 a827 00 byte.b 0 ; + 343 a828 00 byte.b 0 ; + 344 a829 00 byte.b 0 ; + 345 a82a 00 byte.b 0 ; + 346 a82b 00 byte.b 0 ; + 347 a82c 00 byte.b 0 ; + 348 a82d 00 byte.b 0 ; + 349 a82e 00 byte.b 0 ; + 350 a82f 00 byte.b 0 ; + 351 a830 00 byte.b 0 ; + 352 a831 00 byte.b 0 ; + 353 a832 00 byte.b 0 ; + 354 a833 00 byte.b 0 ; + 355 a834 00 byte.b 0 ; + 356 a835 00 byte.b 0 ; + 357 a836 00 byte.b 0 ; + 358 a837 00 byte.b 0 ; + 359 a838 00 byte.b 0 ; + 360 a839 00 byte.b 0 ; + 361 a83a 00 byte.b 0 ; + 362 a83b 00 byte.b 0 ; + 363 a83c 00 byte.b 0 ; + 364 a83d 00 byte.b 0 ; + 365 a83e 00 byte.b 0 ; + 366 a83f 00 byte.b 0 ; + 367 a840 00 byte.b 0 ; + 368 a841 00 byte.b 0 ; + 369 a842 00 byte.b 0 ; + 370 a843 00 byte.b 0 ; + 371 a844 00 byte.b 0 ; + 372 a845 00 byte.b 0 ; + 373 a846 00 byte.b 0 ; + 374 a847 00 byte.b 0 ; + 375 a848 00 byte.b 0 ; + 376 a849 00 byte.b 0 ; + 377 a84a 00 byte.b 0 ; + 378 a84b 00 byte.b 0 ; + 379 a84c 00 byte.b 0 ; + 380 a84d 00 byte.b 0 ; + 381 a84e 00 byte.b 0 ; + 382 a84f 00 byte.b 0 ; + 383 a850 00 byte.b 0 ; + 384 a851 00 byte.b 0 ; + 385 a852 00 byte.b 0 ; + 386 a853 00 byte.b 0 ; + 387 a854 00 byte.b 0 ; + 388 a855 00 byte.b 0 ; + 389 a856 00 byte.b 0 ; + 390 a857 00 byte.b 0 ; + 391 a858 00 byte.b 0 ; + 392 a859 00 byte.b 0 ; + 393 a85a 00 byte.b 0 ; + 394 a85b 00 byte.b 0 ; + 395 a85c 00 byte.b 0 ; + 396 a85d 00 byte.b 0 ; + 397 a85e 00 byte.b 0 ; + 398 a85f 00 byte.b 0 ; + 399 a860 00 byte.b 0 ; + 400 a861 00 byte.b 0 ; + 401 a862 00 byte.b 0 ; + 402 a863 00 byte.b 0 ; + 403 a864 00 byte.b 0 ; + 404 a865 00 byte.b 0 ; + 405 a866 00 byte.b 0 ; + 406 a867 00 byte.b 0 ; + 407 a868 00 byte.b 0 ; + 408 a869 00 byte.b 0 ; + 409 a86a 00 byte.b 0 ; + 410 a86b 00 byte.b 0 ; + 411 a86c 00 byte.b 0 ; + 412 a86d 00 byte.b 0 ; + 413 a86e 00 byte.b 0 ; + 414 a86f 00 byte.b 0 ; + 415 a870 00 byte.b 0 ; + 416 a871 00 byte.b 0 ; + 417 a872 00 byte.b 0 ; + 418 a873 00 byte.b 0 ; + 419 a874 00 byte.b 0 ; + 420 a875 00 byte.b 0 ; + 421 a876 00 byte.b 0 ; + 422 a877 00 byte.b 0 ; + 423 a878 00 byte.b 0 ; + 424 a879 00 byte.b 0 ; + 425 a87a 00 byte.b 0 ; + 426 a87b 00 byte.b 0 ; + 427 a87c 00 byte.b 0 ; + 428 a87d 00 byte.b 0 ; + 429 a87e 00 byte.b 0 ; + 430 a87f 00 byte.b 0 ; + 431 a880 00 byte.b 0 ; + 432 a881 00 byte.b 0 ; + 433 a882 00 byte.b 0 ; + 434 a883 00 byte.b 0 ; + 435 a884 00 byte.b 0 ; + 436 a885 00 byte.b 0 ; + 437 a886 00 byte.b 0 ; + 438 a887 00 byte.b 0 ; + 439 a888 00 byte.b 0 ; + 440 a889 00 byte.b 0 ; + 441 a88a 00 byte.b 0 ; + 442 a88b 00 byte.b 0 ; + 443 a88c 00 byte.b 0 ; + 444 a88d 00 byte.b 0 ; + 445 a88e 00 byte.b 0 ; + 446 a88f 00 byte.b 0 ; + 447 a890 00 byte.b 0 ; + 448 a891 00 byte.b 0 ; + 449 a892 00 byte.b 0 ; + 450 a893 00 byte.b 0 ; + 451 a894 00 byte.b 0 ; + 452 a895 00 byte.b 0 ; + 453 a896 00 byte.b 0 ; + 454 a897 00 byte.b 0 ; + 455 a898 00 byte.b 0 ; + 456 a899 00 byte.b 0 ; + 457 a89a 00 byte.b 0 ; + 458 a89b 00 byte.b 0 ; + 459 a89c 00 byte.b 0 ; + 460 a89d 00 byte.b 0 ; + 461 a89e 00 byte.b 0 ; + 462 a89f 00 byte.b 0 ; + 463 a8a0 00 byte.b 0 ; + 464 a8a1 00 byte.b 0 ; + 465 a8a2 00 byte.b 0 ; + 466 a8a3 00 byte.b 0 ; + 467 a8a4 00 byte.b 0 ; + 468 a8a5 00 byte.b 0 ; + 469 a8a6 00 byte.b 0 ; + 470 a8a7 00 byte.b 0 ; + 471 a8a8 00 byte.b 0 ; + 472 a8a9 00 byte.b 0 ; + 473 a8aa 00 byte.b 0 ; + 474 a8ab 00 byte.b 0 ; + 475 a8ac 00 byte.b 0 ; + 476 a8ad 00 byte.b 0 ; +------- FILE vicmidi.asm + 824 a8ae setwaveorg +------- FILE setwave.asm LEVEL 2 PASS 2 + 0 a8ae include "setwave.asm" + 1 a8ae ;A short generic routine for setting any shift register value for any pulse + 2 a8ae ;channel in about 150 cpu clocks. Use it freely. + 3 a8ae + 4 a8ae ; USAGE: y = channel ($0a..$0c) + 5 a8ae ; x = initial frequency + 6 a8ae ; a = shift register contents + 7 a8ae ; + 8 a8ae ; WARNING for purists: self-modifying code, illegal opcodes. + 9 a8ae ; + 10 a8ae ; code align assertion: make sure that the loop is within a page. + 11 a8ae ; oscillator assertion: make sure that the channel has been at $7e + 12 a8ae ; for some time before calling this function. + 13 a8ae ; put TMP and TMP2 in the zero page. + 14 a8ae + 15 a8ae 8e d0 a8 stx initfreq ; 4 + 16 a8b1 + 17 a8b1 8c bf a8 sty ch0 ; 4 + 18 a8b4 8c ca a8 sty ch1 ; 4 + 19 a8b7 be ce a8 ldx ldfqmasks-$a,y ; 4 + 20 a8ba 85 57 sta TMP ; 3 + 21 a8bc + 22 a8bc 09 7f ora #$7f ; 2 + 23 a8be + 24 a8be 8f 0c 90 .byte.b $8f,$0C,$90 ; axs $900c ; 4 [$900c] = a AND x *ILLEGAL OPCODE* + 25 a8c1 + 26 a8c1 a8 bf ch0 = *-2 + 27 a8c1 84 58 sty TMP2 ; 3 + 28 a8c3 a0 07 ldy #7 ; 2 + 29 a8c5 + 30 a8c5 l0 + 31 a8c5 a9 7f lda #$7f ; 2 + 32 a8c7 07 57 .byte.b $07,TMP ; aso TMP ; 5 asl tmp; a = [tmp] OR $7f *ILLEGAL OPCODE* + 33 a8c9 8f 0c 90 .byte.b $8F,$0C,$90 ; axs $900c ; 4 [$900c] = a AND x *ILLEGAL OPCODE* + 34 a8c9 a8 ca ch1 = *-2 + 35 a8cc 88 dey ; 2 + 36 a8cd d0 f6 bne l0 ; 3 + 37 a8cf + 38 a8cf a9 80 lda #128 ; 2 + 39 a8cf a8 d0 initfreq = *-1 + 40 a8d1 ea nop ; 2 + 41 a8d2 a4 58 ldy TMP2 ; 3 + 42 a8d4 noset + 43 a8d4 99 00 90 sta $9000,y ; 5 + 44 a8d7 + 45 a8d7 60 rts ; 6 total clocks 11+4+3+2+16*7+16+6 eq 154 + 46 a8d8 + 47 a8d8 ldfqmasks + 48 a8d8 fe .byte.b $fe ; $900a - 1 x 16 clocks/bit + 49 a8d9 fd .byte.b $fd ; $900b - 2 x 8 clocks/bit + 50 a8da fb .byte.b $fb ; $900c - 4 x 4 clocks/bit + 51 a8db + 52 a8db + 53 a8db viznutwaveforms + 54 a8db 00 .byte.b 0 ; MIDI Program #1 default 0000000011111111 + 55 a8dc 02 .byte.b 2 ; MIDI Program #2 "10" 0000001011111101 + 56 a8dd 04 .byte.b 4 ; MIDI Program #3 "100" 0000010011111011 + 57 a8de 06 .byte.b 6 ; MIDI Program #4 "110" 0000011011111001 + 58 a8df 08 .byte.b 8 ; MIDI Program #5 "1000" 0000100011110111 + 59 a8e0 0a .byte.b 10 ; MIDI Program #6 "1010" 0000101011110101 + 60 a8e1 0b .byte.b 11 ; MIDI Program #7 "1011" 0000110011110011 + 61 a8e2 0e .byte.b 14 ; MIDI Program #8 "1110" 0000111011110001 + 62 a8e3 12 .byte.b 18 ; MIDI Program #9 "10010" 0001001011101101 + 63 a8e4 14 .byte.b 20 ; MIDI Program #10 "10100" 0001010011101011 + 64 a8e5 16 .byte.b 22 ; MIDI Program #11 "10110" 0001011011101001 + 65 a8e6 18 .byte.b 24 ; MIDI Program #12 "11000" 0001100011100111 + 66 a8e7 1a .byte.b 26 ; MIDI Program #13 "11010" 0001101011100101 + 67 a8e8 24 .byte.b 36 ; MIDI Program #14 "100100" 0010010011011011 + 68 a8e9 2a .byte.b 42 ; MIDI Program #15 "101010" 0010101011010101 + 69 a8ea 2c .byte.b 44 ; MIDI Program #16 "101100" 0010110011010011 +------- FILE vicmidi.asm + 826 a8eb +------- FILE lookup-ntsc.asm LEVEL 2 PASS 2 + 0 a8eb include "lookup-ntsc.asm" + 1 a8eb ; -------------------------------------------------------------------------------------------------- + 2 a8eb ; Note Lookups NTSC - 128 bytes each, map MIDI Note# to a VIC register value + 3 a8eb ; From http://sleepingelephant.com/ipw-web/bulletin/bb/viewtopic.php?t=3643 + 4 a8eb + 5 a8eb voice1lookup_ntsc + 6 a8eb 00 byte.b 0 + 7 a8ec 00 byte.b 0 + 8 a8ed 00 byte.b 0 + 9 a8ee 00 byte.b 0 + 10 a8ef 00 byte.b 0 + 11 a8f0 00 byte.b 0 + 12 a8f1 00 byte.b 0 + 13 a8f2 00 byte.b 0 + 14 a8f3 00 byte.b 0 + 15 a8f4 00 byte.b 0 + 16 a8f5 00 byte.b 0 + 17 a8f6 00 byte.b 0 + 18 a8f7 00 byte.b 0 + 19 a8f8 00 byte.b 0 + 20 a8f9 00 byte.b 0 + 21 a8fa 00 byte.b 0 + 22 a8fb 00 byte.b 0 + 23 a8fc 00 byte.b 0 + 24 a8fd 00 byte.b 0 + 25 a8fe 00 byte.b 0 + 26 a8ff 00 byte.b 0 + 27 a900 00 byte.b 0 + 28 a901 00 byte.b 0 + 29 a902 00 byte.b 0 + 30 a903 85 byte.b 133 + 31 a904 8c byte.b 140 + 32 a905 92 byte.b 146 + 33 a906 98 byte.b 152 + 34 a907 9e byte.b 158 + 35 a908 a3 byte.b 163 + 36 a909 a9 byte.b 169 + 37 a90a ad byte.b 173 + 38 a90b b2 byte.b 178 + 39 a90c b6 byte.b 182 + 40 a90d ba byte.b 186 + 41 a90e be byte.b 190 + 42 a90f c2 byte.b 194 + 43 a910 c5 byte.b 197 + 44 a911 c9 byte.b 201 + 45 a912 cc byte.b 204 + 46 a913 cf byte.b 207 + 47 a914 d1 byte.b 209 + 48 a915 d4 byte.b 212 + 49 a916 d6 byte.b 214 + 50 a917 d9 byte.b 217 + 51 a918 db byte.b 219 + 52 a919 dd byte.b 221 + 53 a91a df byte.b 223 + 54 a91b e0 byte.b 224 + 55 a91c e2 byte.b 226 + 56 a91d e4 byte.b 228 + 57 a91e e5 byte.b 229 + 58 a91f e7 byte.b 231 + 59 a920 e8 byte.b 232 + 60 a921 e9 byte.b 233 + 61 a922 eb byte.b 235 + 62 a923 ec byte.b 236 + 63 a924 ed byte.b 237 + 64 a925 ee byte.b 238 + 65 a926 ef byte.b 239 + 66 a927 f0 byte.b 240 + 67 a928 00 byte.b 0 + 68 a929 00 byte.b 0 + 69 a92a 00 byte.b 0 + 70 a92b 00 byte.b 0 + 71 a92c 00 byte.b 0 + 72 a92d 00 byte.b 0 + 73 a92e 00 byte.b 0 + 74 a92f 00 byte.b 0 + 75 a930 00 byte.b 0 + 76 a931 00 byte.b 0 + 77 a932 00 byte.b 0 + 78 a933 00 byte.b 0 + 79 a934 00 byte.b 0 + 80 a935 00 byte.b 0 + 81 a936 00 byte.b 0 + 82 a937 00 byte.b 0 + 83 a938 00 byte.b 0 + 84 a939 00 byte.b 0 + 85 a93a 00 byte.b 0 + 86 a93b 00 byte.b 0 + 87 a93c 00 byte.b 0 + 88 a93d 00 byte.b 0 + 89 a93e 00 byte.b 0 + 90 a93f 00 byte.b 0 + 91 a940 00 byte.b 0 + 92 a941 00 byte.b 0 + 93 a942 00 byte.b 0 + 94 a943 00 byte.b 0 + 95 a944 00 byte.b 0 + 96 a945 00 byte.b 0 + 97 a946 00 byte.b 0 + 98 a947 00 byte.b 0 + 99 a948 00 byte.b 0 + 100 a949 00 byte.b 0 + 101 a94a 00 byte.b 0 + 102 a94b 00 byte.b 0 + 103 a94c 00 byte.b 0 + 104 a94d 00 byte.b 0 + 105 a94e 00 byte.b 0 + 106 a94f 00 byte.b 0 + 107 a950 00 byte.b 0 + 108 a951 00 byte.b 0 + 109 a952 00 byte.b 0 + 110 a953 00 byte.b 0 + 111 a954 00 byte.b 0 + 112 a955 00 byte.b 0 + 113 a956 00 byte.b 0 + 114 a957 00 byte.b 0 + 115 a958 00 byte.b 0 + 116 a959 00 byte.b 0 + 117 a95a 00 byte.b 0 + 118 a95b 00 byte.b 0 + 119 a95c 00 byte.b 0 + 120 a95d 00 byte.b 0 + 121 a95e 00 byte.b 0 + 122 a95f 00 byte.b 0 + 123 a960 00 byte.b 0 + 124 a961 00 byte.b 0 + 125 a962 00 byte.b 0 + 126 a963 00 byte.b 0 + 127 a964 00 byte.b 0 + 128 a965 00 byte.b 0 + 129 a966 00 byte.b 0 + 130 a967 00 byte.b 0 + 131 a968 00 byte.b 0 + 132 a969 00 byte.b 0 + 133 a96a 00 byte.b 0 + 134 a96b + 135 a96b voice2lookup_ntsc + 136 a96b 00 byte.b 0 + 137 a96c 00 byte.b 0 + 138 a96d 00 byte.b 0 + 139 a96e 00 byte.b 0 + 140 a96f 00 byte.b 0 + 141 a970 00 byte.b 0 + 142 a971 00 byte.b 0 + 143 a972 00 byte.b 0 + 144 a973 00 byte.b 0 + 145 a974 00 byte.b 0 + 146 a975 00 byte.b 0 + 147 a976 00 byte.b 0 + 148 a977 00 byte.b 0 + 149 a978 00 byte.b 0 + 150 a979 00 byte.b 0 + 151 a97a 00 byte.b 0 + 152 a97b 00 byte.b 0 + 153 a97c 00 byte.b 0 + 154 a97d 00 byte.b 0 + 155 a97e 00 byte.b 0 + 156 a97f 00 byte.b 0 + 157 a980 00 byte.b 0 + 158 a981 00 byte.b 0 + 159 a982 00 byte.b 0 + 160 a983 00 byte.b 0 + 161 a984 00 byte.b 0 + 162 a985 00 byte.b 0 + 163 a986 00 byte.b 0 + 164 a987 00 byte.b 0 + 165 a988 00 byte.b 0 + 166 a989 00 byte.b 0 + 167 a98a 00 byte.b 0 + 168 a98b 00 byte.b 0 + 169 a98c 00 byte.b 0 + 170 a98d 00 byte.b 0 + 171 a98e 00 byte.b 0 + 172 a98f 85 byte.b 133 + 173 a990 8c byte.b 140 + 174 a991 92 byte.b 146 + 175 a992 98 byte.b 152 + 176 a993 9e byte.b 158 + 177 a994 a3 byte.b 163 + 178 a995 a9 byte.b 169 + 179 a996 ad byte.b 173 + 180 a997 b2 byte.b 178 + 181 a998 b6 byte.b 182 + 182 a999 ba byte.b 186 + 183 a99a be byte.b 190 + 184 a99b c2 byte.b 194 + 185 a99c c5 byte.b 197 + 186 a99d c9 byte.b 201 + 187 a99e cc byte.b 204 + 188 a99f cf byte.b 207 + 189 a9a0 d1 byte.b 209 + 190 a9a1 d4 byte.b 212 + 191 a9a2 d6 byte.b 214 + 192 a9a3 d9 byte.b 217 + 193 a9a4 db byte.b 219 + 194 a9a5 dd byte.b 221 + 195 a9a6 df byte.b 223 + 196 a9a7 e0 byte.b 224 + 197 a9a8 e2 byte.b 226 + 198 a9a9 e4 byte.b 228 + 199 a9aa e5 byte.b 229 + 200 a9ab e7 byte.b 231 + 201 a9ac e8 byte.b 232 + 202 a9ad e9 byte.b 233 + 203 a9ae eb byte.b 235 + 204 a9af ec byte.b 236 + 205 a9b0 ed byte.b 237 + 206 a9b1 ee byte.b 238 + 207 a9b2 ef byte.b 239 + 208 a9b3 f0 byte.b 240 + 209 a9b4 00 byte.b 0 + 210 a9b5 00 byte.b 0 + 211 a9b6 00 byte.b 0 + 212 a9b7 00 byte.b 0 + 213 a9b8 00 byte.b 0 + 214 a9b9 00 byte.b 0 + 215 a9ba 00 byte.b 0 + 216 a9bb 00 byte.b 0 + 217 a9bc 00 byte.b 0 + 218 a9bd 00 byte.b 0 + 219 a9be 00 byte.b 0 + 220 a9bf 00 byte.b 0 + 221 a9c0 00 byte.b 0 + 222 a9c1 00 byte.b 0 + 223 a9c2 00 byte.b 0 + 224 a9c3 00 byte.b 0 + 225 a9c4 00 byte.b 0 + 226 a9c5 00 byte.b 0 + 227 a9c6 00 byte.b 0 + 228 a9c7 00 byte.b 0 + 229 a9c8 00 byte.b 0 + 230 a9c9 00 byte.b 0 + 231 a9ca 00 byte.b 0 + 232 a9cb 00 byte.b 0 + 233 a9cc 00 byte.b 0 + 234 a9cd 00 byte.b 0 + 235 a9ce 00 byte.b 0 + 236 a9cf 00 byte.b 0 + 237 a9d0 00 byte.b 0 + 238 a9d1 00 byte.b 0 + 239 a9d2 00 byte.b 0 + 240 a9d3 00 byte.b 0 + 241 a9d4 00 byte.b 0 + 242 a9d5 00 byte.b 0 + 243 a9d6 00 byte.b 0 + 244 a9d7 00 byte.b 0 + 245 a9d8 00 byte.b 0 + 246 a9d9 00 byte.b 0 + 247 a9da 00 byte.b 0 + 248 a9db 00 byte.b 0 + 249 a9dc 00 byte.b 0 + 250 a9dd 00 byte.b 0 + 251 a9de 00 byte.b 0 + 252 a9df 00 byte.b 0 + 253 a9e0 00 byte.b 0 + 254 a9e1 00 byte.b 0 + 255 a9e2 00 byte.b 0 + 256 a9e3 00 byte.b 0 + 257 a9e4 00 byte.b 0 + 258 a9e5 00 byte.b 0 + 259 a9e6 00 byte.b 0 + 260 a9e7 00 byte.b 0 + 261 a9e8 00 byte.b 0 + 262 a9e9 00 byte.b 0 + 263 a9ea 00 byte.b 0 + 264 a9eb + 265 a9eb voice3lookup_ntsc + 266 a9eb 00 byte.b 0 + 267 a9ec 00 byte.b 0 + 268 a9ed 00 byte.b 0 + 269 a9ee 00 byte.b 0 + 270 a9ef 00 byte.b 0 + 271 a9f0 00 byte.b 0 + 272 a9f1 00 byte.b 0 + 273 a9f2 00 byte.b 0 + 274 a9f3 00 byte.b 0 + 275 a9f4 00 byte.b 0 + 276 a9f5 00 byte.b 0 + 277 a9f6 00 byte.b 0 + 278 a9f7 00 byte.b 0 + 279 a9f8 00 byte.b 0 + 280 a9f9 00 byte.b 0 + 281 a9fa 00 byte.b 0 + 282 a9fb 00 byte.b 0 + 283 a9fc 00 byte.b 0 + 284 a9fd 00 byte.b 0 + 285 a9fe 00 byte.b 0 + 286 a9ff 00 byte.b 0 + 287 aa00 00 byte.b 0 + 288 aa01 00 byte.b 0 + 289 aa02 00 byte.b 0 + 290 aa03 00 byte.b 0 + 291 aa04 00 byte.b 0 + 292 aa05 00 byte.b 0 + 293 aa06 00 byte.b 0 + 294 aa07 00 byte.b 0 + 295 aa08 00 byte.b 0 + 296 aa09 00 byte.b 0 + 297 aa0a 00 byte.b 0 + 298 aa0b 00 byte.b 0 + 299 aa0c 00 byte.b 0 + 300 aa0d 00 byte.b 0 + 301 aa0e 00 byte.b 0 + 302 aa0f 00 byte.b 0 + 303 aa10 00 byte.b 0 + 304 aa11 00 byte.b 0 + 305 aa12 00 byte.b 0 + 306 aa13 00 byte.b 0 + 307 aa14 00 byte.b 0 + 308 aa15 00 byte.b 0 + 309 aa16 00 byte.b 0 + 310 aa17 00 byte.b 0 + 311 aa18 00 byte.b 0 + 312 aa19 00 byte.b 0 + 313 aa1a 00 byte.b 0 + 314 aa1b 85 byte.b 133 + 315 aa1c 8c byte.b 140 + 316 aa1d 92 byte.b 146 + 317 aa1e 98 byte.b 152 + 318 aa1f 9e byte.b 158 + 319 aa20 a3 byte.b 163 + 320 aa21 a9 byte.b 169 + 321 aa22 ad byte.b 173 + 322 aa23 b2 byte.b 178 + 323 aa24 b6 byte.b 182 + 324 aa25 ba byte.b 186 + 325 aa26 be byte.b 190 + 326 aa27 c2 byte.b 194 + 327 aa28 c5 byte.b 197 + 328 aa29 c9 byte.b 201 + 329 aa2a cc byte.b 204 + 330 aa2b cf byte.b 207 + 331 aa2c d1 byte.b 209 + 332 aa2d d4 byte.b 212 + 333 aa2e d6 byte.b 214 + 334 aa2f d9 byte.b 217 + 335 aa30 db byte.b 219 + 336 aa31 dd byte.b 221 + 337 aa32 df byte.b 223 + 338 aa33 e0 byte.b 224 + 339 aa34 e2 byte.b 226 + 340 aa35 e4 byte.b 228 + 341 aa36 e5 byte.b 229 + 342 aa37 e7 byte.b 231 + 343 aa38 e8 byte.b 232 + 344 aa39 e9 byte.b 233 + 345 aa3a eb byte.b 235 + 346 aa3b ec byte.b 236 + 347 aa3c ed byte.b 237 + 348 aa3d ee byte.b 238 + 349 aa3e ef byte.b 239 + 350 aa3f f0 byte.b 240 + 351 aa40 00 byte.b 0 + 352 aa41 00 byte.b 0 + 353 aa42 00 byte.b 0 + 354 aa43 00 byte.b 0 + 355 aa44 00 byte.b 0 + 356 aa45 00 byte.b 0 + 357 aa46 00 byte.b 0 + 358 aa47 00 byte.b 0 + 359 aa48 00 byte.b 0 + 360 aa49 00 byte.b 0 + 361 aa4a 00 byte.b 0 + 362 aa4b 00 byte.b 0 + 363 aa4c 00 byte.b 0 + 364 aa4d 00 byte.b 0 + 365 aa4e 00 byte.b 0 + 366 aa4f 00 byte.b 0 + 367 aa50 00 byte.b 0 + 368 aa51 00 byte.b 0 + 369 aa52 00 byte.b 0 + 370 aa53 00 byte.b 0 + 371 aa54 00 byte.b 0 + 372 aa55 00 byte.b 0 + 373 aa56 00 byte.b 0 + 374 aa57 00 byte.b 0 + 375 aa58 00 byte.b 0 + 376 aa59 00 byte.b 0 + 377 aa5a 00 byte.b 0 + 378 aa5b 00 byte.b 0 + 379 aa5c 00 byte.b 0 + 380 aa5d 00 byte.b 0 + 381 aa5e 00 byte.b 0 + 382 aa5f 00 byte.b 0 + 383 aa60 00 byte.b 0 + 384 aa61 00 byte.b 0 + 385 aa62 00 byte.b 0 + 386 aa63 00 byte.b 0 + 387 aa64 00 byte.b 0 + 388 aa65 00 byte.b 0 + 389 aa66 00 byte.b 0 + 390 aa67 00 byte.b 0 + 391 aa68 00 byte.b 0 + 392 aa69 00 byte.b 0 + 393 aa6a 00 byte.b 0 + 394 aa6b + 395 aa6b + 396 aa6b voice4lookup_ntsc + 397 aa6b 00 byte.b 0 + 398 aa6c 00 byte.b 0 + 399 aa6d 00 byte.b 0 + 400 aa6e 00 byte.b 0 + 401 aa6f 00 byte.b 0 + 402 aa70 00 byte.b 0 + 403 aa71 00 byte.b 0 + 404 aa72 00 byte.b 0 + 405 aa73 00 byte.b 0 + 406 aa74 00 byte.b 0 + 407 aa75 00 byte.b 0 + 408 aa76 00 byte.b 0 + 409 aa77 00 byte.b 0 + 410 aa78 00 byte.b 0 + 411 aa79 00 byte.b 0 + 412 aa7a 00 byte.b 0 + 413 aa7b 00 byte.b 0 + 414 aa7c 00 byte.b 0 + 415 aa7d 00 byte.b 0 + 416 aa7e 00 byte.b 0 + 417 aa7f 00 byte.b 0 + 418 aa80 00 byte.b 0 + 419 aa81 00 byte.b 0 + 420 aa82 00 byte.b 0 + 421 aa83 00 byte.b 0 + 422 aa84 00 byte.b 0 + 423 aa85 00 byte.b 0 + 424 aa86 00 byte.b 0 + 425 aa87 00 byte.b 0 + 426 aa88 00 byte.b 0 + 427 aa89 00 byte.b 0 + 428 aa8a 00 byte.b 0 + 429 aa8b 00 byte.b 0 + 430 aa8c 00 byte.b 0 + 431 aa8d 00 byte.b 0 + 432 aa8e 00 byte.b 0 + 433 aa8f 85 byte.b 133 + 434 aa90 8c byte.b 140 + 435 aa91 92 byte.b 146 + 436 aa92 98 byte.b 152 + 437 aa93 9e byte.b 158 + 438 aa94 a3 byte.b 163 + 439 aa95 a9 byte.b 169 + 440 aa96 ad byte.b 173 + 441 aa97 b2 byte.b 178 + 442 aa98 b6 byte.b 182 + 443 aa99 ba byte.b 186 + 444 aa9a be byte.b 190 + 445 aa9b c2 byte.b 194 + 446 aa9c c5 byte.b 197 + 447 aa9d c9 byte.b 201 + 448 aa9e cc byte.b 204 + 449 aa9f cf byte.b 207 + 450 aaa0 d1 byte.b 209 + 451 aaa1 d4 byte.b 212 + 452 aaa2 d6 byte.b 214 + 453 aaa3 d9 byte.b 217 + 454 aaa4 db byte.b 219 + 455 aaa5 dd byte.b 221 + 456 aaa6 df byte.b 223 + 457 aaa7 e0 byte.b 224 + 458 aaa8 e2 byte.b 226 + 459 aaa9 e4 byte.b 228 + 460 aaaa e5 byte.b 229 + 461 aaab e7 byte.b 231 + 462 aaac e8 byte.b 232 + 463 aaad e9 byte.b 233 + 464 aaae eb byte.b 235 + 465 aaaf ec byte.b 236 + 466 aab0 ed byte.b 237 + 467 aab1 ee byte.b 238 + 468 aab2 ef byte.b 239 + 469 aab3 f0 byte.b 240 + 470 aab4 00 byte.b 0 + 471 aab5 00 byte.b 0 + 472 aab6 00 byte.b 0 + 473 aab7 00 byte.b 0 + 474 aab8 00 byte.b 0 + 475 aab9 00 byte.b 0 + 476 aaba 00 byte.b 0 + 477 aabb 00 byte.b 0 + 478 aabc 00 byte.b 0 + 479 aabd 00 byte.b 0 + 480 aabe 00 byte.b 0 + 481 aabf 00 byte.b 0 + 482 aac0 00 byte.b 0 + 483 aac1 00 byte.b 0 + 484 aac2 00 byte.b 0 + 485 aac3 00 byte.b 0 + 486 aac4 00 byte.b 0 + 487 aac5 00 byte.b 0 + 488 aac6 00 byte.b 0 + 489 aac7 00 byte.b 0 + 490 aac8 00 byte.b 0 + 491 aac9 00 byte.b 0 + 492 aaca 00 byte.b 0 + 493 aacb 00 byte.b 0 + 494 aacc 00 byte.b 0 + 495 aacd 00 byte.b 0 + 496 aace 00 byte.b 0 + 497 aacf 00 byte.b 0 + 498 aad0 00 byte.b 0 + 499 aad1 00 byte.b 0 + 500 aad2 00 byte.b 0 + 501 aad3 00 byte.b 0 + 502 aad4 00 byte.b 0 + 503 aad5 00 byte.b 0 + 504 aad6 00 byte.b 0 + 505 aad7 00 byte.b 0 + 506 aad8 00 byte.b 0 + 507 aad9 00 byte.b 0 + 508 aada 00 byte.b 0 + 509 aadb 00 byte.b 0 + 510 aadc 00 byte.b 0 + 511 aadd 00 byte.b 0 + 512 aade 00 byte.b 0 + 513 aadf 00 byte.b 0 + 514 aae0 00 byte.b 0 + 515 aae1 00 byte.b 0 + 516 aae2 00 byte.b 0 + 517 aae3 00 byte.b 0 + 518 aae4 00 byte.b 0 + 519 aae5 00 byte.b 0 + 520 aae6 00 byte.b 0 + 521 aae7 00 byte.b 0 + 522 aae8 00 byte.b 0 + 523 aae9 00 byte.b 0 + 524 aaea 00 byte.b 0 + 525 aaeb + 526 aaeb ; EOF! +------- FILE vicmidi.asm +------- FILE lookup-pal.asm LEVEL 2 PASS 2 + 0 aaeb include "lookup-pal.asm" + 1 aaeb ; -------------------------------------------------------------------------------------------------- + 2 aaeb ; Note Lookups PAL - 128 bytes each, map MIDI Note# to a VIC register value + 3 aaeb ; From http://sleepingelephant.com/ipw-web/bulletin/bb/viewtopic.php?t=3643 + 4 aaeb + 5 aaeb voice1lookup_pal + 6 aaeb 00 byte.b 0 + 7 aaec 00 byte.b 0 + 8 aaed 00 byte.b 0 + 9 aaee 00 byte.b 0 + 10 aaef 00 byte.b 0 + 11 aaf0 00 byte.b 0 + 12 aaf1 00 byte.b 0 + 13 aaf2 00 byte.b 0 + 14 aaf3 00 byte.b 0 + 15 aaf4 00 byte.b 0 + 16 aaf5 00 byte.b 0 + 17 aaf6 00 byte.b 0 + 18 aaf7 00 byte.b 0 + 19 aaf8 00 byte.b 0 + 20 aaf9 00 byte.b 0 + 21 aafa 00 byte.b 0 + 22 aafb 00 byte.b 0 + 23 aafc 00 byte.b 0 + 24 aafd 00 byte.b 0 + 25 aafe 00 byte.b 0 + 26 aaff 00 byte.b 0 + 27 ab00 00 byte.b 0 + 28 ab01 00 byte.b 0 + 29 ab02 00 byte.b 0 + 30 ab03 7b byte.b 123 ; (122.60) <- not reachable in PAL + 31 ab04 82 byte.b 130 + 32 ab05 89 byte.b 137 + 33 ab06 90 byte.b 144 + 34 ab07 96 byte.b 150 + 35 ab08 9c byte.b 156 + 36 ab09 a1 byte.b 161 + 37 ab0a a7 byte.b 167 + 38 ab0b ac byte.b 172 + 39 ab0c b0 byte.b 176 + 40 ab0d b5 byte.b 181 + 41 ab0e b9 byte.b 185 + 42 ab0f bd byte.b 189 + 43 ab10 c1 byte.b 193 + 44 ab11 c4 byte.b 196 + 45 ab12 c7 byte.b 199 + 46 ab13 ca byte.b 202 + 47 ab14 cd byte.b 205 + 48 ab15 d0 byte.b 208 + 49 ab16 d3 byte.b 211 + 50 ab17 d5 byte.b 213 + 51 ab18 d8 byte.b 216 + 52 ab19 da byte.b 218 + 53 ab1a dc byte.b 220 + 54 ab1b de byte.b 222 + 55 ab1c e0 byte.b 224 + 56 ab1d e2 byte.b 226 + 57 ab1e e3 byte.b 227 + 58 ab1f e5 byte.b 229 + 59 ab20 e6 byte.b 230 + 60 ab21 e8 byte.b 232 + 61 ab22 e9 byte.b 233 + 62 ab23 ea byte.b 234 + 63 ab24 eb byte.b 235 + 64 ab25 ec byte.b 236 + 65 ab26 ed byte.b 237 + 66 ab27 ee byte.b 238 + 67 ab28 00 byte.b 0 + 68 ab29 00 byte.b 0 + 69 ab2a 00 byte.b 0 + 70 ab2b 00 byte.b 0 + 71 ab2c 00 byte.b 0 + 72 ab2d 00 byte.b 0 + 73 ab2e 00 byte.b 0 + 74 ab2f 00 byte.b 0 + 75 ab30 00 byte.b 0 + 76 ab31 00 byte.b 0 + 77 ab32 00 byte.b 0 + 78 ab33 00 byte.b 0 + 79 ab34 00 byte.b 0 + 80 ab35 00 byte.b 0 + 81 ab36 00 byte.b 0 + 82 ab37 00 byte.b 0 + 83 ab38 00 byte.b 0 + 84 ab39 00 byte.b 0 + 85 ab3a 00 byte.b 0 + 86 ab3b 00 byte.b 0 + 87 ab3c 00 byte.b 0 + 88 ab3d 00 byte.b 0 + 89 ab3e 00 byte.b 0 + 90 ab3f 00 byte.b 0 + 91 ab40 00 byte.b 0 + 92 ab41 00 byte.b 0 + 93 ab42 00 byte.b 0 + 94 ab43 00 byte.b 0 + 95 ab44 00 byte.b 0 + 96 ab45 00 byte.b 0 + 97 ab46 00 byte.b 0 + 98 ab47 00 byte.b 0 + 99 ab48 00 byte.b 0 + 100 ab49 00 byte.b 0 + 101 ab4a 00 byte.b 0 + 102 ab4b 00 byte.b 0 + 103 ab4c 00 byte.b 0 + 104 ab4d 00 byte.b 0 + 105 ab4e 00 byte.b 0 + 106 ab4f 00 byte.b 0 + 107 ab50 00 byte.b 0 + 108 ab51 00 byte.b 0 + 109 ab52 00 byte.b 0 + 110 ab53 00 byte.b 0 + 111 ab54 00 byte.b 0 + 112 ab55 00 byte.b 0 + 113 ab56 00 byte.b 0 + 114 ab57 00 byte.b 0 + 115 ab58 00 byte.b 0 + 116 ab59 00 byte.b 0 + 117 ab5a 00 byte.b 0 + 118 ab5b 00 byte.b 0 + 119 ab5c 00 byte.b 0 + 120 ab5d 00 byte.b 0 + 121 ab5e 00 byte.b 0 + 122 ab5f 00 byte.b 0 + 123 ab60 00 byte.b 0 + 124 ab61 00 byte.b 0 + 125 ab62 00 byte.b 0 + 126 ab63 00 byte.b 0 + 127 ab64 00 byte.b 0 + 128 ab65 00 byte.b 0 + 129 ab66 00 byte.b 0 + 130 ab67 00 byte.b 0 + 131 ab68 00 byte.b 0 + 132 ab69 00 byte.b 0 + 133 ab6a 00 byte.b 0 + 134 ab6b + 135 ab6b voice2lookup_pal + 136 ab6b 00 byte.b 0 + 137 ab6c 00 byte.b 0 + 138 ab6d 00 byte.b 0 + 139 ab6e 00 byte.b 0 + 140 ab6f 00 byte.b 0 + 141 ab70 00 byte.b 0 + 142 ab71 00 byte.b 0 + 143 ab72 00 byte.b 0 + 144 ab73 00 byte.b 0 + 145 ab74 00 byte.b 0 + 146 ab75 00 byte.b 0 + 147 ab76 00 byte.b 0 + 148 ab77 00 byte.b 0 + 149 ab78 00 byte.b 0 + 150 ab79 00 byte.b 0 + 151 ab7a 00 byte.b 0 + 152 ab7b 00 byte.b 0 + 153 ab7c 00 byte.b 0 + 154 ab7d 00 byte.b 0 + 155 ab7e 00 byte.b 0 + 156 ab7f 00 byte.b 0 + 157 ab80 00 byte.b 0 + 158 ab81 00 byte.b 0 + 159 ab82 00 byte.b 0 + 160 ab83 00 byte.b 0 + 161 ab84 00 byte.b 0 + 162 ab85 00 byte.b 0 + 163 ab86 00 byte.b 0 + 164 ab87 00 byte.b 0 + 165 ab88 00 byte.b 0 + 166 ab89 00 byte.b 0 + 167 ab8a 00 byte.b 0 + 168 ab8b 00 byte.b 0 + 169 ab8c 00 byte.b 0 + 170 ab8d 00 byte.b 0 + 171 ab8e 00 byte.b 0 + 172 ab8f 7b byte.b 123 ; (122.60) <- not reachable in PAL + 173 ab90 82 byte.b 130 + 174 ab91 89 byte.b 137 + 175 ab92 90 byte.b 144 + 176 ab93 96 byte.b 150 + 177 ab94 9c byte.b 156 + 178 ab95 a1 byte.b 161 + 179 ab96 a7 byte.b 167 + 180 ab97 ac byte.b 172 + 181 ab98 b0 byte.b 176 + 182 ab99 b5 byte.b 181 + 183 ab9a b9 byte.b 185 + 184 ab9b bd byte.b 189 + 185 ab9c c1 byte.b 193 + 186 ab9d c4 byte.b 196 + 187 ab9e c7 byte.b 199 + 188 ab9f ca byte.b 202 + 189 aba0 cd byte.b 205 + 190 aba1 d0 byte.b 208 + 191 aba2 d3 byte.b 211 + 192 aba3 d5 byte.b 213 + 193 aba4 d8 byte.b 216 + 194 aba5 da byte.b 218 + 195 aba6 dc byte.b 220 + 196 aba7 de byte.b 222 + 197 aba8 e0 byte.b 224 + 198 aba9 e2 byte.b 226 + 199 abaa e3 byte.b 227 + 200 abab e5 byte.b 229 + 201 abac e6 byte.b 230 + 202 abad e8 byte.b 232 + 203 abae e9 byte.b 233 + 204 abaf ea byte.b 234 + 205 abb0 eb byte.b 235 + 206 abb1 ec byte.b 236 + 207 abb2 ed byte.b 237 + 208 abb3 ee byte.b 238 + 209 abb4 00 byte.b 0 + 210 abb5 00 byte.b 0 + 211 abb6 00 byte.b 0 + 212 abb7 00 byte.b 0 + 213 abb8 00 byte.b 0 + 214 abb9 00 byte.b 0 + 215 abba 00 byte.b 0 + 216 abbb 00 byte.b 0 + 217 abbc 00 byte.b 0 + 218 abbd 00 byte.b 0 + 219 abbe 00 byte.b 0 + 220 abbf 00 byte.b 0 + 221 abc0 00 byte.b 0 + 222 abc1 00 byte.b 0 + 223 abc2 00 byte.b 0 + 224 abc3 00 byte.b 0 + 225 abc4 00 byte.b 0 + 226 abc5 00 byte.b 0 + 227 abc6 00 byte.b 0 + 228 abc7 00 byte.b 0 + 229 abc8 00 byte.b 0 + 230 abc9 00 byte.b 0 + 231 abca 00 byte.b 0 + 232 abcb 00 byte.b 0 + 233 abcc 00 byte.b 0 + 234 abcd 00 byte.b 0 + 235 abce 00 byte.b 0 + 236 abcf 00 byte.b 0 + 237 abd0 00 byte.b 0 + 238 abd1 00 byte.b 0 + 239 abd2 00 byte.b 0 + 240 abd3 00 byte.b 0 + 241 abd4 00 byte.b 0 + 242 abd5 00 byte.b 0 + 243 abd6 00 byte.b 0 + 244 abd7 00 byte.b 0 + 245 abd8 00 byte.b 0 + 246 abd9 00 byte.b 0 + 247 abda 00 byte.b 0 + 248 abdb 00 byte.b 0 + 249 abdc 00 byte.b 0 + 250 abdd 00 byte.b 0 + 251 abde 00 byte.b 0 + 252 abdf 00 byte.b 0 + 253 abe0 00 byte.b 0 + 254 abe1 00 byte.b 0 + 255 abe2 00 byte.b 0 + 256 abe3 00 byte.b 0 + 257 abe4 00 byte.b 0 + 258 abe5 00 byte.b 0 + 259 abe6 00 byte.b 0 + 260 abe7 00 byte.b 0 + 261 abe8 00 byte.b 0 + 262 abe9 00 byte.b 0 + 263 abea 00 byte.b 0 + 264 abeb + 265 abeb voice3lookup_pal + 266 abeb 00 byte.b 0 + 267 abec 00 byte.b 0 + 268 abed 00 byte.b 0 + 269 abee 00 byte.b 0 + 270 abef 00 byte.b 0 + 271 abf0 00 byte.b 0 + 272 abf1 00 byte.b 0 + 273 abf2 00 byte.b 0 + 274 abf3 00 byte.b 0 + 275 abf4 00 byte.b 0 + 276 abf5 00 byte.b 0 + 277 abf6 00 byte.b 0 + 278 abf7 00 byte.b 0 + 279 abf8 00 byte.b 0 + 280 abf9 00 byte.b 0 + 281 abfa 00 byte.b 0 + 282 abfb 00 byte.b 0 + 283 abfc 00 byte.b 0 + 284 abfd 00 byte.b 0 + 285 abfe 00 byte.b 0 + 286 abff 00 byte.b 0 + 287 ac00 00 byte.b 0 + 288 ac01 00 byte.b 0 + 289 ac02 00 byte.b 0 + 290 ac03 00 byte.b 0 + 291 ac04 00 byte.b 0 + 292 ac05 00 byte.b 0 + 293 ac06 00 byte.b 0 + 294 ac07 00 byte.b 0 + 295 ac08 00 byte.b 0 + 296 ac09 00 byte.b 0 + 297 ac0a 00 byte.b 0 + 298 ac0b 00 byte.b 0 + 299 ac0c 00 byte.b 0 + 300 ac0d 00 byte.b 0 + 301 ac0e 00 byte.b 0 + 302 ac0f 00 byte.b 0 + 303 ac10 00 byte.b 0 + 304 ac11 00 byte.b 0 + 305 ac12 00 byte.b 0 + 306 ac13 00 byte.b 0 + 307 ac14 00 byte.b 0 + 308 ac15 00 byte.b 0 + 309 ac16 00 byte.b 0 + 310 ac17 00 byte.b 0 + 311 ac18 00 byte.b 0 + 312 ac19 00 byte.b 0 + 313 ac1a 00 byte.b 0 + 314 ac1b 7b byte.b 123 ; (122.60) <- not reachable in PAL + 315 ac1c 82 byte.b 130 + 316 ac1d 89 byte.b 137 + 317 ac1e 90 byte.b 144 + 318 ac1f 96 byte.b 150 + 319 ac20 9c byte.b 156 + 320 ac21 a1 byte.b 161 + 321 ac22 a7 byte.b 167 + 322 ac23 ac byte.b 172 + 323 ac24 b0 byte.b 176 + 324 ac25 b5 byte.b 181 + 325 ac26 b9 byte.b 185 + 326 ac27 bd byte.b 189 + 327 ac28 c1 byte.b 193 + 328 ac29 c4 byte.b 196 + 329 ac2a c7 byte.b 199 + 330 ac2b ca byte.b 202 + 331 ac2c cd byte.b 205 + 332 ac2d d0 byte.b 208 + 333 ac2e d3 byte.b 211 + 334 ac2f d5 byte.b 213 + 335 ac30 d8 byte.b 216 + 336 ac31 da byte.b 218 + 337 ac32 dc byte.b 220 + 338 ac33 de byte.b 222 + 339 ac34 e0 byte.b 224 + 340 ac35 e2 byte.b 226 + 341 ac36 e3 byte.b 227 + 342 ac37 e5 byte.b 229 + 343 ac38 e6 byte.b 230 + 344 ac39 e8 byte.b 232 + 345 ac3a e9 byte.b 233 + 346 ac3b ea byte.b 234 + 347 ac3c eb byte.b 235 + 348 ac3d ec byte.b 236 + 349 ac3e ed byte.b 237 + 350 ac3f ee byte.b 238 + 351 ac40 00 byte.b 0 + 352 ac41 00 byte.b 0 + 353 ac42 00 byte.b 0 + 354 ac43 00 byte.b 0 + 355 ac44 00 byte.b 0 + 356 ac45 00 byte.b 0 + 357 ac46 00 byte.b 0 + 358 ac47 00 byte.b 0 + 359 ac48 00 byte.b 0 + 360 ac49 00 byte.b 0 + 361 ac4a 00 byte.b 0 + 362 ac4b 00 byte.b 0 + 363 ac4c 00 byte.b 0 + 364 ac4d 00 byte.b 0 + 365 ac4e 00 byte.b 0 + 366 ac4f 00 byte.b 0 + 367 ac50 00 byte.b 0 + 368 ac51 00 byte.b 0 + 369 ac52 00 byte.b 0 + 370 ac53 00 byte.b 0 + 371 ac54 00 byte.b 0 + 372 ac55 00 byte.b 0 + 373 ac56 00 byte.b 0 + 374 ac57 00 byte.b 0 + 375 ac58 00 byte.b 0 + 376 ac59 00 byte.b 0 + 377 ac5a 00 byte.b 0 + 378 ac5b 00 byte.b 0 + 379 ac5c 00 byte.b 0 + 380 ac5d 00 byte.b 0 + 381 ac5e 00 byte.b 0 + 382 ac5f 00 byte.b 0 + 383 ac60 00 byte.b 0 + 384 ac61 00 byte.b 0 + 385 ac62 00 byte.b 0 + 386 ac63 00 byte.b 0 + 387 ac64 00 byte.b 0 + 388 ac65 00 byte.b 0 + 389 ac66 00 byte.b 0 + 390 ac67 00 byte.b 0 + 391 ac68 00 byte.b 0 + 392 ac69 00 byte.b 0 + 393 ac6a 00 byte.b 0 + 394 ac6b + 395 ac6b + 396 ac6b voice4lookup_pal + 397 ac6b 00 byte.b 0 + 398 ac6c 00 byte.b 0 + 399 ac6d 00 byte.b 0 + 400 ac6e 00 byte.b 0 + 401 ac6f 00 byte.b 0 + 402 ac70 00 byte.b 0 + 403 ac71 00 byte.b 0 + 404 ac72 00 byte.b 0 + 405 ac73 00 byte.b 0 + 406 ac74 00 byte.b 0 + 407 ac75 00 byte.b 0 + 408 ac76 00 byte.b 0 + 409 ac77 00 byte.b 0 + 410 ac78 00 byte.b 0 + 411 ac79 00 byte.b 0 + 412 ac7a 00 byte.b 0 + 413 ac7b 00 byte.b 0 + 414 ac7c 00 byte.b 0 + 415 ac7d 00 byte.b 0 + 416 ac7e 00 byte.b 0 + 417 ac7f 00 byte.b 0 + 418 ac80 00 byte.b 0 + 419 ac81 00 byte.b 0 + 420 ac82 00 byte.b 0 + 421 ac83 00 byte.b 0 + 422 ac84 00 byte.b 0 + 423 ac85 00 byte.b 0 + 424 ac86 00 byte.b 0 + 425 ac87 00 byte.b 0 + 426 ac88 00 byte.b 0 + 427 ac89 00 byte.b 0 + 428 ac8a 00 byte.b 0 + 429 ac8b 00 byte.b 0 + 430 ac8c 00 byte.b 0 + 431 ac8d 00 byte.b 0 + 432 ac8e 00 byte.b 0 + 433 ac8f 85 byte.b 133 ; (122.60) <- not reachable in PAL + 434 ac90 8c byte.b 140 + 435 ac91 92 byte.b 146 + 436 ac92 98 byte.b 152 + 437 ac93 9e byte.b 158 + 438 ac94 a3 byte.b 163 + 439 ac95 a9 byte.b 169 + 440 ac96 ad byte.b 173 + 441 ac97 b2 byte.b 178 + 442 ac98 b6 byte.b 182 + 443 ac99 ba byte.b 186 + 444 ac9a be byte.b 190 + 445 ac9b c2 byte.b 194 + 446 ac9c c5 byte.b 197 + 447 ac9d c9 byte.b 201 + 448 ac9e cc byte.b 204 + 449 ac9f cf byte.b 207 + 450 aca0 d1 byte.b 209 + 451 aca1 d4 byte.b 212 + 452 aca2 d6 byte.b 214 + 453 aca3 d9 byte.b 217 + 454 aca4 db byte.b 219 + 455 aca5 dd byte.b 221 + 456 aca6 df byte.b 223 + 457 aca7 e0 byte.b 224 + 458 aca8 e2 byte.b 226 + 459 aca9 e4 byte.b 228 + 460 acaa e5 byte.b 229 + 461 acab e7 byte.b 231 + 462 acac e8 byte.b 232 + 463 acad e9 byte.b 233 + 464 acae eb byte.b 235 + 465 acaf ec byte.b 236 + 466 acb0 ed byte.b 237 + 467 acb1 ee byte.b 238 + 468 acb2 ef byte.b 239 + 469 acb3 f0 byte.b 240 + 470 acb4 00 byte.b 0 + 471 acb5 00 byte.b 0 + 472 acb6 00 byte.b 0 + 473 acb7 00 byte.b 0 + 474 acb8 00 byte.b 0 + 475 acb9 00 byte.b 0 + 476 acba 00 byte.b 0 + 477 acbb 00 byte.b 0 + 478 acbc 00 byte.b 0 + 479 acbd 00 byte.b 0 + 480 acbe 00 byte.b 0 + 481 acbf 00 byte.b 0 + 482 acc0 00 byte.b 0 + 483 acc1 00 byte.b 0 + 484 acc2 00 byte.b 0 + 485 acc3 00 byte.b 0 + 486 acc4 00 byte.b 0 + 487 acc5 00 byte.b 0 + 488 acc6 00 byte.b 0 + 489 acc7 00 byte.b 0 + 490 acc8 00 byte.b 0 + 491 acc9 00 byte.b 0 + 492 acca 00 byte.b 0 + 493 accb 00 byte.b 0 + 494 accc 00 byte.b 0 + 495 accd 00 byte.b 0 + 496 acce 00 byte.b 0 + 497 accf 00 byte.b 0 + 498 acd0 00 byte.b 0 + 499 acd1 00 byte.b 0 + 500 acd2 00 byte.b 0 + 501 acd3 00 byte.b 0 + 502 acd4 00 byte.b 0 + 503 acd5 00 byte.b 0 + 504 acd6 00 byte.b 0 + 505 acd7 00 byte.b 0 + 506 acd8 00 byte.b 0 + 507 acd9 00 byte.b 0 + 508 acda 00 byte.b 0 + 509 acdb 00 byte.b 0 + 510 acdc 00 byte.b 0 + 511 acdd 00 byte.b 0 + 512 acde 00 byte.b 0 + 513 acdf 00 byte.b 0 + 514 ace0 00 byte.b 0 + 515 ace1 00 byte.b 0 + 516 ace2 00 byte.b 0 + 517 ace3 00 byte.b 0 + 518 ace4 00 byte.b 0 + 519 ace5 00 byte.b 0 + 520 ace6 00 byte.b 0 + 521 ace7 00 byte.b 0 + 522 ace8 00 byte.b 0 + 523 ace9 00 byte.b 0 + 524 acea 00 byte.b 0 + 525 aceb + 526 aceb ; EOF! +------- FILE vicmidi.asm +------- FILE lookup-alt.asm LEVEL 2 PASS 2 + 0 aceb include "lookup-alt.asm" + 1 aceb ; -------------------------------------------------------------------------------------------------- + 2 aceb ; Note Lookups Alternate - 128 bytes each, map MIDI Note# to a VIC register value + 3 aceb ; From http://sleepingelephant.com/ipw-web/bulletin/bb/viewtopic.php?t=3643 + 4 aceb + 5 aceb voice1lookup_alt + 6 aceb 00 byte.b 0 + 7 acec 00 byte.b 0 + 8 aced 00 byte.b 0 + 9 acee 00 byte.b 0 + 10 acef 00 byte.b 0 + 11 acf0 00 byte.b 0 + 12 acf1 00 byte.b 0 + 13 acf2 00 byte.b 0 + 14 acf3 00 byte.b 0 + 15 acf4 00 byte.b 0 + 16 acf5 00 byte.b 0 + 17 acf6 00 byte.b 0 + 18 acf7 00 byte.b 0 + 19 acf8 00 byte.b 0 + 20 acf9 00 byte.b 0 + 21 acfa 00 byte.b 0 + 22 acfb 00 byte.b 0 + 23 acfc 00 byte.b 0 + 24 acfd 00 byte.b 0 + 25 acfe 00 byte.b 0 + 26 acff 00 byte.b 0 + 27 ad00 00 byte.b 0 + 28 ad01 00 byte.b 0 + 29 ad02 00 byte.b 0 + 30 ad03 ff byte.b 255 + 31 ad04 86 byte.b 134 + 32 ad05 8d byte.b 141 + 33 ad06 93 byte.b 147 + 34 ad07 99 byte.b 153 + 35 ad08 9f byte.b 159 + 36 ad09 a4 byte.b 164 + 37 ad0a aa byte.b 170 + 38 ad0b ae byte.b 174 + 39 ad0c b3 byte.b 179 + 40 ad0d b7 byte.b 183 + 41 ad0e bb byte.b 187 + 42 ad0f bf byte.b 191 + 43 ad10 c3 byte.b 195 + 44 ad11 c6 byte.b 198 + 45 ad12 c9 byte.b 201 + 46 ad13 cc byte.b 204 + 47 ad14 cf byte.b 207 + 48 ad15 d2 byte.b 210 + 49 ad16 d4 byte.b 212 + 50 ad17 d7 byte.b 215 + 51 ad18 d9 byte.b 217 + 52 ad19 db byte.b 219 + 53 ad1a dd byte.b 221 + 54 ad1b df byte.b 223 + 55 ad1c e1 byte.b 225 + 56 ad1d e2 byte.b 226 + 57 ad1e e4 byte.b 228 + 58 ad1f e6 byte.b 230 + 59 ad20 e7 byte.b 231 + 60 ad21 e8 byte.b 232 + 61 ad22 ea byte.b 234 + 62 ad23 eb byte.b 235 + 63 ad24 ec byte.b 236 + 64 ad25 ed byte.b 237 + 65 ad26 ee byte.b 238 + 66 ad27 ef byte.b 239 + 67 ad28 00 byte.b 0 + 68 ad29 00 byte.b 0 + 69 ad2a 00 byte.b 0 + 70 ad2b 00 byte.b 0 + 71 ad2c 00 byte.b 0 + 72 ad2d 00 byte.b 0 + 73 ad2e 00 byte.b 0 + 74 ad2f 00 byte.b 0 + 75 ad30 00 byte.b 0 + 76 ad31 00 byte.b 0 + 77 ad32 00 byte.b 0 + 78 ad33 00 byte.b 0 + 79 ad34 00 byte.b 0 + 80 ad35 00 byte.b 0 + 81 ad36 00 byte.b 0 + 82 ad37 00 byte.b 0 + 83 ad38 00 byte.b 0 + 84 ad39 00 byte.b 0 + 85 ad3a 00 byte.b 0 + 86 ad3b 00 byte.b 0 + 87 ad3c 00 byte.b 0 + 88 ad3d 00 byte.b 0 + 89 ad3e 00 byte.b 0 + 90 ad3f 00 byte.b 0 + 91 ad40 00 byte.b 0 + 92 ad41 00 byte.b 0 + 93 ad42 00 byte.b 0 + 94 ad43 00 byte.b 0 + 95 ad44 00 byte.b 0 + 96 ad45 00 byte.b 0 + 97 ad46 00 byte.b 0 + 98 ad47 00 byte.b 0 + 99 ad48 00 byte.b 0 + 100 ad49 00 byte.b 0 + 101 ad4a 00 byte.b 0 + 102 ad4b 00 byte.b 0 + 103 ad4c 00 byte.b 0 + 104 ad4d 00 byte.b 0 + 105 ad4e 00 byte.b 0 + 106 ad4f 00 byte.b 0 + 107 ad50 00 byte.b 0 + 108 ad51 00 byte.b 0 + 109 ad52 00 byte.b 0 + 110 ad53 00 byte.b 0 + 111 ad54 00 byte.b 0 + 112 ad55 00 byte.b 0 + 113 ad56 00 byte.b 0 + 114 ad57 00 byte.b 0 + 115 ad58 00 byte.b 0 + 116 ad59 00 byte.b 0 + 117 ad5a 00 byte.b 0 + 118 ad5b 00 byte.b 0 + 119 ad5c 00 byte.b 0 + 120 ad5d 00 byte.b 0 + 121 ad5e 00 byte.b 0 + 122 ad5f 00 byte.b 0 + 123 ad60 00 byte.b 0 + 124 ad61 00 byte.b 0 + 125 ad62 00 byte.b 0 + 126 ad63 00 byte.b 0 + 127 ad64 00 byte.b 0 + 128 ad65 00 byte.b 0 + 129 ad66 00 byte.b 0 + 130 ad67 00 byte.b 0 + 131 ad68 00 byte.b 0 + 132 ad69 00 byte.b 0 + 133 ad6a 00 byte.b 0 + 134 ad6b + 135 ad6b voice2lookup_alt + 136 ad6b 00 byte.b 0 + 137 ad6c 00 byte.b 0 + 138 ad6d 00 byte.b 0 + 139 ad6e 00 byte.b 0 + 140 ad6f 00 byte.b 0 + 141 ad70 00 byte.b 0 + 142 ad71 00 byte.b 0 + 143 ad72 00 byte.b 0 + 144 ad73 00 byte.b 0 + 145 ad74 00 byte.b 0 + 146 ad75 00 byte.b 0 + 147 ad76 00 byte.b 0 + 148 ad77 00 byte.b 0 + 149 ad78 00 byte.b 0 + 150 ad79 00 byte.b 0 + 151 ad7a 00 byte.b 0 + 152 ad7b 00 byte.b 0 + 153 ad7c 00 byte.b 0 + 154 ad7d 00 byte.b 0 + 155 ad7e 00 byte.b 0 + 156 ad7f 00 byte.b 0 + 157 ad80 00 byte.b 0 + 158 ad81 00 byte.b 0 + 159 ad82 00 byte.b 0 + 160 ad83 00 byte.b 0 + 161 ad84 00 byte.b 0 + 162 ad85 00 byte.b 0 + 163 ad86 00 byte.b 0 + 164 ad87 00 byte.b 0 + 165 ad88 00 byte.b 0 + 166 ad89 00 byte.b 0 + 167 ad8a 00 byte.b 0 + 168 ad8b 00 byte.b 0 + 169 ad8c 00 byte.b 0 + 170 ad8d 00 byte.b 0 + 171 ad8e 00 byte.b 0 + 172 ad8f ff byte.b 255 + 173 ad90 86 byte.b 134 + 174 ad91 8d byte.b 141 + 175 ad92 93 byte.b 147 + 176 ad93 99 byte.b 153 + 177 ad94 9f byte.b 159 + 178 ad95 a4 byte.b 164 + 179 ad96 aa byte.b 170 + 180 ad97 ae byte.b 174 + 181 ad98 b3 byte.b 179 + 182 ad99 b7 byte.b 183 + 183 ad9a bb byte.b 187 + 184 ad9b bf byte.b 191 + 185 ad9c c3 byte.b 195 + 186 ad9d c6 byte.b 198 + 187 ad9e c9 byte.b 201 + 188 ad9f cc byte.b 204 + 189 ada0 cf byte.b 207 + 190 ada1 d2 byte.b 210 + 191 ada2 d4 byte.b 212 + 192 ada3 d7 byte.b 215 + 193 ada4 d9 byte.b 217 + 194 ada5 db byte.b 219 + 195 ada6 dd byte.b 221 + 196 ada7 df byte.b 223 + 197 ada8 e1 byte.b 225 + 198 ada9 e2 byte.b 226 + 199 adaa e4 byte.b 228 + 200 adab e6 byte.b 230 + 201 adac e7 byte.b 231 + 202 adad e8 byte.b 232 + 203 adae ea byte.b 234 + 204 adaf eb byte.b 235 + 205 adb0 ec byte.b 236 + 206 adb1 ed byte.b 237 + 207 adb2 ee byte.b 238 + 208 adb3 ef byte.b 239 + 209 adb4 00 byte.b 0 + 210 adb5 00 byte.b 0 + 211 adb6 00 byte.b 0 + 212 adb7 00 byte.b 0 + 213 adb8 00 byte.b 0 + 214 adb9 00 byte.b 0 + 215 adba 00 byte.b 0 + 216 adbb 00 byte.b 0 + 217 adbc 00 byte.b 0 + 218 adbd 00 byte.b 0 + 219 adbe 00 byte.b 0 + 220 adbf 00 byte.b 0 + 221 adc0 00 byte.b 0 + 222 adc1 00 byte.b 0 + 223 adc2 00 byte.b 0 + 224 adc3 00 byte.b 0 + 225 adc4 00 byte.b 0 + 226 adc5 00 byte.b 0 + 227 adc6 00 byte.b 0 + 228 adc7 00 byte.b 0 + 229 adc8 00 byte.b 0 + 230 adc9 00 byte.b 0 + 231 adca 00 byte.b 0 + 232 adcb 00 byte.b 0 + 233 adcc 00 byte.b 0 + 234 adcd 00 byte.b 0 + 235 adce 00 byte.b 0 + 236 adcf 00 byte.b 0 + 237 add0 00 byte.b 0 + 238 add1 00 byte.b 0 + 239 add2 00 byte.b 0 + 240 add3 00 byte.b 0 + 241 add4 00 byte.b 0 + 242 add5 00 byte.b 0 + 243 add6 00 byte.b 0 + 244 add7 00 byte.b 0 + 245 add8 00 byte.b 0 + 246 add9 00 byte.b 0 + 247 adda 00 byte.b 0 + 248 addb 00 byte.b 0 + 249 addc 00 byte.b 0 + 250 addd 00 byte.b 0 + 251 adde 00 byte.b 0 + 252 addf 00 byte.b 0 + 253 ade0 00 byte.b 0 + 254 ade1 00 byte.b 0 + 255 ade2 00 byte.b 0 + 256 ade3 00 byte.b 0 + 257 ade4 00 byte.b 0 + 258 ade5 00 byte.b 0 + 259 ade6 00 byte.b 0 + 260 ade7 00 byte.b 0 + 261 ade8 00 byte.b 0 + 262 ade9 00 byte.b 0 + 263 adea 00 byte.b 0 + 264 adeb + 265 adeb voice3lookup_alt + 266 adeb 00 byte.b 0 + 267 adec 00 byte.b 0 + 268 aded 00 byte.b 0 + 269 adee 00 byte.b 0 + 270 adef 00 byte.b 0 + 271 adf0 00 byte.b 0 + 272 adf1 00 byte.b 0 + 273 adf2 00 byte.b 0 + 274 adf3 00 byte.b 0 + 275 adf4 00 byte.b 0 + 276 adf5 00 byte.b 0 + 277 adf6 00 byte.b 0 + 278 adf7 00 byte.b 0 + 279 adf8 00 byte.b 0 + 280 adf9 00 byte.b 0 + 281 adfa 00 byte.b 0 + 282 adfb 00 byte.b 0 + 283 adfc 00 byte.b 0 + 284 adfd 00 byte.b 0 + 285 adfe 00 byte.b 0 + 286 adff 00 byte.b 0 + 287 ae00 00 byte.b 0 + 288 ae01 00 byte.b 0 + 289 ae02 00 byte.b 0 + 290 ae03 00 byte.b 0 + 291 ae04 00 byte.b 0 + 292 ae05 00 byte.b 0 + 293 ae06 00 byte.b 0 + 294 ae07 00 byte.b 0 + 295 ae08 00 byte.b 0 + 296 ae09 00 byte.b 0 + 297 ae0a 00 byte.b 0 + 298 ae0b 00 byte.b 0 + 299 ae0c 00 byte.b 0 + 300 ae0d 00 byte.b 0 + 301 ae0e 00 byte.b 0 + 302 ae0f 00 byte.b 0 + 303 ae10 00 byte.b 0 + 304 ae11 00 byte.b 0 + 305 ae12 00 byte.b 0 + 306 ae13 00 byte.b 0 + 307 ae14 00 byte.b 0 + 308 ae15 00 byte.b 0 + 309 ae16 00 byte.b 0 + 310 ae17 00 byte.b 0 + 311 ae18 00 byte.b 0 + 312 ae19 00 byte.b 0 + 313 ae1a 00 byte.b 0 + 314 ae1b ff byte.b 255 + 315 ae1c 86 byte.b 134 + 316 ae1d 8d byte.b 141 + 317 ae1e 93 byte.b 147 + 318 ae1f 99 byte.b 153 + 319 ae20 9f byte.b 159 + 320 ae21 a4 byte.b 164 + 321 ae22 aa byte.b 170 + 322 ae23 ae byte.b 174 + 323 ae24 b3 byte.b 179 + 324 ae25 b7 byte.b 183 + 325 ae26 bb byte.b 187 + 326 ae27 bf byte.b 191 + 327 ae28 c3 byte.b 195 + 328 ae29 c6 byte.b 198 + 329 ae2a c9 byte.b 201 + 330 ae2b cc byte.b 204 + 331 ae2c cf byte.b 207 + 332 ae2d d2 byte.b 210 + 333 ae2e d4 byte.b 212 + 334 ae2f d7 byte.b 215 + 335 ae30 d9 byte.b 217 + 336 ae31 db byte.b 219 + 337 ae32 dd byte.b 221 + 338 ae33 df byte.b 223 + 339 ae34 e1 byte.b 225 + 340 ae35 e2 byte.b 226 + 341 ae36 e4 byte.b 228 + 342 ae37 e6 byte.b 230 + 343 ae38 e7 byte.b 231 + 344 ae39 e8 byte.b 232 + 345 ae3a ea byte.b 234 + 346 ae3b eb byte.b 235 + 347 ae3c ec byte.b 236 + 348 ae3d ed byte.b 237 + 349 ae3e ee byte.b 238 + 350 ae3f ef byte.b 239 + 351 ae40 00 byte.b 0 + 352 ae41 00 byte.b 0 + 353 ae42 00 byte.b 0 + 354 ae43 00 byte.b 0 + 355 ae44 00 byte.b 0 + 356 ae45 00 byte.b 0 + 357 ae46 00 byte.b 0 + 358 ae47 00 byte.b 0 + 359 ae48 00 byte.b 0 + 360 ae49 00 byte.b 0 + 361 ae4a 00 byte.b 0 + 362 ae4b 00 byte.b 0 + 363 ae4c 00 byte.b 0 + 364 ae4d 00 byte.b 0 + 365 ae4e 00 byte.b 0 + 366 ae4f 00 byte.b 0 + 367 ae50 00 byte.b 0 + 368 ae51 00 byte.b 0 + 369 ae52 00 byte.b 0 + 370 ae53 00 byte.b 0 + 371 ae54 00 byte.b 0 + 372 ae55 00 byte.b 0 + 373 ae56 00 byte.b 0 + 374 ae57 00 byte.b 0 + 375 ae58 00 byte.b 0 + 376 ae59 00 byte.b 0 + 377 ae5a 00 byte.b 0 + 378 ae5b 00 byte.b 0 + 379 ae5c 00 byte.b 0 + 380 ae5d 00 byte.b 0 + 381 ae5e 00 byte.b 0 + 382 ae5f 00 byte.b 0 + 383 ae60 00 byte.b 0 + 384 ae61 00 byte.b 0 + 385 ae62 00 byte.b 0 + 386 ae63 00 byte.b 0 + 387 ae64 00 byte.b 0 + 388 ae65 00 byte.b 0 + 389 ae66 00 byte.b 0 + 390 ae67 00 byte.b 0 + 391 ae68 00 byte.b 0 + 392 ae69 00 byte.b 0 + 393 ae6a 00 byte.b 0 + 394 ae6b + 395 ae6b + 396 ae6b voice4lookup_alt + 397 ae6b 00 byte.b 0 + 398 ae6c 00 byte.b 0 + 399 ae6d 00 byte.b 0 + 400 ae6e 00 byte.b 0 + 401 ae6f 00 byte.b 0 + 402 ae70 00 byte.b 0 + 403 ae71 00 byte.b 0 + 404 ae72 00 byte.b 0 + 405 ae73 00 byte.b 0 + 406 ae74 00 byte.b 0 + 407 ae75 00 byte.b 0 + 408 ae76 00 byte.b 0 + 409 ae77 00 byte.b 0 + 410 ae78 00 byte.b 0 + 411 ae79 00 byte.b 0 + 412 ae7a 00 byte.b 0 + 413 ae7b 00 byte.b 0 + 414 ae7c 00 byte.b 0 + 415 ae7d 00 byte.b 0 + 416 ae7e 00 byte.b 0 + 417 ae7f 00 byte.b 0 + 418 ae80 00 byte.b 0 + 419 ae81 00 byte.b 0 + 420 ae82 00 byte.b 0 + 421 ae83 00 byte.b 0 + 422 ae84 00 byte.b 0 + 423 ae85 00 byte.b 0 + 424 ae86 00 byte.b 0 + 425 ae87 00 byte.b 0 + 426 ae88 00 byte.b 0 + 427 ae89 00 byte.b 0 + 428 ae8a 00 byte.b 0 + 429 ae8b 00 byte.b 0 + 430 ae8c 00 byte.b 0 + 431 ae8d 00 byte.b 0 + 432 ae8e 00 byte.b 0 + 433 ae8f ff byte.b 255 + 434 ae90 86 byte.b 134 + 435 ae91 8d byte.b 141 + 436 ae92 93 byte.b 147 + 437 ae93 99 byte.b 153 + 438 ae94 9f byte.b 159 + 439 ae95 a4 byte.b 164 + 440 ae96 aa byte.b 170 + 441 ae97 ae byte.b 174 + 442 ae98 b3 byte.b 179 + 443 ae99 b7 byte.b 183 + 444 ae9a bb byte.b 187 + 445 ae9b bf byte.b 191 + 446 ae9c c3 byte.b 195 + 447 ae9d c6 byte.b 198 + 448 ae9e c9 byte.b 201 + 449 ae9f cc byte.b 204 + 450 aea0 cf byte.b 207 + 451 aea1 d2 byte.b 210 + 452 aea2 d4 byte.b 212 + 453 aea3 d7 byte.b 215 + 454 aea4 d9 byte.b 217 + 455 aea5 db byte.b 219 + 456 aea6 dd byte.b 221 + 457 aea7 df byte.b 223 + 458 aea8 e1 byte.b 225 + 459 aea9 e2 byte.b 226 + 460 aeaa e4 byte.b 228 + 461 aeab e6 byte.b 230 + 462 aeac e7 byte.b 231 + 463 aead e8 byte.b 232 + 464 aeae ea byte.b 234 + 465 aeaf eb byte.b 235 + 466 aeb0 ec byte.b 236 + 467 aeb1 ed byte.b 237 + 468 aeb2 ee byte.b 238 + 469 aeb3 ef byte.b 239 + 470 aeb4 00 byte.b 0 + 471 aeb5 00 byte.b 0 + 472 aeb6 00 byte.b 0 + 473 aeb7 00 byte.b 0 + 474 aeb8 00 byte.b 0 + 475 aeb9 00 byte.b 0 + 476 aeba 00 byte.b 0 + 477 aebb 00 byte.b 0 + 478 aebc 00 byte.b 0 + 479 aebd 00 byte.b 0 + 480 aebe 00 byte.b 0 + 481 aebf 00 byte.b 0 + 482 aec0 00 byte.b 0 + 483 aec1 00 byte.b 0 + 484 aec2 00 byte.b 0 + 485 aec3 00 byte.b 0 + 486 aec4 00 byte.b 0 + 487 aec5 00 byte.b 0 + 488 aec6 00 byte.b 0 + 489 aec7 00 byte.b 0 + 490 aec8 00 byte.b 0 + 491 aec9 00 byte.b 0 + 492 aeca 00 byte.b 0 + 493 aecb 00 byte.b 0 + 494 aecc 00 byte.b 0 + 495 aecd 00 byte.b 0 + 496 aece 00 byte.b 0 + 497 aecf 00 byte.b 0 + 498 aed0 00 byte.b 0 + 499 aed1 00 byte.b 0 + 500 aed2 00 byte.b 0 + 501 aed3 00 byte.b 0 + 502 aed4 00 byte.b 0 + 503 aed5 00 byte.b 0 + 504 aed6 00 byte.b 0 + 505 aed7 00 byte.b 0 + 506 aed8 00 byte.b 0 + 507 aed9 00 byte.b 0 + 508 aeda 00 byte.b 0 + 509 aedb 00 byte.b 0 + 510 aedc 00 byte.b 0 + 511 aedd 00 byte.b 0 + 512 aede 00 byte.b 0 + 513 aedf 00 byte.b 0 + 514 aee0 00 byte.b 0 + 515 aee1 00 byte.b 0 + 516 aee2 00 byte.b 0 + 517 aee3 00 byte.b 0 + 518 aee4 00 byte.b 0 + 519 aee5 00 byte.b 0 + 520 aee6 00 byte.b 0 + 521 aee7 00 byte.b 0 + 522 aee8 00 byte.b 0 + 523 aee9 00 byte.b 0 + 524 aeea 00 byte.b 0 + 525 aeeb + 526 aeeb ; EOF! +------- FILE vicmidi.asm + 830 aeeb + 831 aeeb ; ---------------------------------------------------------------------------- + 832 aeeb ; Binary includes + 833 aeeb + 834 aeeb fontorg + 835 aeeb incbin "font.bin" + 836 b2eb + 837 b2eb ; EOF! diff --git a/Code/vicmidi-nmi.prg b/Code/vicmidi-nmi.prg new file mode 100644 index 0000000000000000000000000000000000000000..0dfb2e2db3d6fbc5db3ce6ff4196ac58f343e5b3 GIT binary patch literal 4845 zcmd^CeNa=`6+aM2_s?F+FsgngFgc3F+kbt;W?E~B>OJtb!i_Y4> z?Cf*8J3fuuc7>TxBM{)RhT2bSJ5jp3R5-~~~Q8E=J+!*=VDCzxxB#n}{d&nz2 zWJMqOSr4fVkfQ<89*{CgW48ptQej$%2vK21unBgdQm7KP3ys3_LX%J@)C&#b)DdBm zuvuhTQOAn2SaCKh=CC)Wj*yAIz~-}?KO>`$}~`TYqm=XS&XrPdaI-_q|!CiX8K&6QP%qzYk)q!)4m)8tw} zs*HmO1y^f0?t)q``r|na zq7mFUx27e#Q&YrDFR!GAbyg}Ih~N!~^jbPuHeMGF3z&liT)|8G;=Wkg8D4rV4s|g& z5Qnp3@N^u`R$#B?lrta_Hn2rp%pzdf!O*1vaS3~zutSU4;1ZUAju*BBwqWsMotuw= z^DyulUQF{!d*klXyfn6$?v=zilOAI-yi!k`$%rwGS2`7E7=`Hu3A*6*E;urA1xEhK zldq3S^RNVxTHK%L?~$%!0i`x^YLTMRQ%xe(^hz($(sn~=XrK#p6C?kk>&c-m;6jt% z?}E9Z$rD{LFEsgsE|@5~N6RSQ=JoR4!_gHHx%!D#by~*|rA+a^H^I2!L zxdK69VIc$B6moxV4GwdOrP_&^Z8teeYE2IFT81Iyc}oSUcbF_TT)P}5Te02ZByRJ1 zv&CvPBj?^q>P=QF!|b$|R^Q#_Hd{(bz1427sH(9zs~NJ@wBAxe_E^j|Cqs5vipxx9 zD`~Pgip$In2KkM)nrepGRfgF*NwuAzf5)?So0+lONOhT+#A>+JY_piGOsU;bQ{i09 zKuevQK=ZDh4N&LaMIbFbgOO@PjW4M2g=^#me(27k4-P&Z7id#C+DqDM>kD{s+eMYH z8~nKk6MP52C#euhNn(;uN)Qu#e5>?hkyA+lajr_@#TAFe<%c)$Wv`ZXlm)@pyQvdq zjc*Dj`mF2kSkKM0wUOO*FYF>Vdo?Mw*VsxHleRYSLs_28;S*Rs7}ED0UUGhWUS@2? z!@+3aekFPDPF#trp=f|NJh^h!Q(s=aCjTp@b;Tv-(%|UF;S5=WFaL7u!fq)+5q>yT z2Xe}Je9wI1PvWJ7&N|>@q(*t;$mvvf)1P!hdBUl>6|Xiq99(?Za_6i~P7!P(=&cv~ zq%-$eJF<2$L1Cl!*h*w8#YBajxyM$?$wHN=(r>^=L8|HkJ$x3u@N4ugCNvlt>X)Z3B7F-PGN+$rNqYK&Z}f}cql+9iz6et0?#Bl8 z`1IfX+Mp3d@y|^#NOg*r;}7w2{Gncg$-X=yPx0RNA}Cx}YJo~86qw9qRy#aw7>kO( zT3%5FPeTbjV{<&r{Qq8maAe@XnSlfE44i&kHhxrOUqfpwkHlUhDW?j}-jjPk(;;&9mVPzxnO^fB5sI zzyAHowb8Nb6CY0g(CAAUq{z$5PSgWNstxqKe|zq4QbcIVOF!J!|W{Kc8KeuXc9_ul^_ zeF0p(HadQNLTUfa2Q};w^N)Kj|I_muUCqtBk#?-W@&19BhJ7< z{TV%&5CCiNcnmDv9~(4HOdh?*ubHE@Qz`)C~0bJRad z;5-!)ECECukM(e=mGfq3Q}SEU%t-y<`LG*G|7jO!|7o}Aeem$D zvAn3H`}t<2e;8cZM{fn~zaGor&d0oI`_UhDL(fCIPcdbw#O^EmmF_F~xLjD*SbVDI zjcR&7Xt!t`sX6UG6-qy7VC+94WE82`dDIyO8c&s}*B7o@1;cV{YvjTO&?Mr}U_O;} zp#O~?*GBYjbZyx}V2$t7#i?%$*CX-8(K_I(ZU|k=y4E zX%_%7theirq - 74 a5a7 8d 15 03 sta $0315 - 75 a5aa - 76 a5aa ; Disable timer interrupts - 77 a5aa - 78 a5aa a9 60 lda #%01100000 - 79 a5ac 8d 2e 91 sta $912e ; disable and acknowledge interrupts - 80 a5af 8d 2d 91 sta $912d - 81 a5b2 ;sta $911e ; disable NMIs (Restore key) - 82 a5b2 - 83 a5b2 58 cli - 84 a5b3 60 rts - 85 a5b4 - 86 a5b4 ; ---------------------------------------------------------------------------- - 87 a5b4 ; The IRQ. - 88 a5b4 - 89 a5b4 theirq - 90 a5b4 ; Fetch the received byte - 91 a5b4 ad 00 9c lda UART_RXTX ;get data - 92 a5b7 a4 5c ldy write_pointer - 93 a5b9 99 00 12 sta buffer,y - 94 a5bc e6 5c inc write_pointer - 95 a5be - 96 a5be ; Clear the interrupt from the UART by reading the status register - 97 a5be ad 02 9c lda UART_ISR - 98 a5c1 - 99 a5c1 4c 56 ff jmp $ff56 ; Use this in place of rti because it restores the A,X,Y registers from the stack - 100 a5c4 ;jmp $eabf ; return to normal IRQ (scans keyboard and stuff) - 101 a5c4 - 102 a5c4 - 103 a5c4 ; ---------------------------------------------------------------------------- - 104 a5c4 ; Handle the RESTORE key - 105 a5c4 - 106 a5c4 RESTORE - 107 a5c4 4c c7 fe jmp $fec7 ; Continue as if no cartridge installed - 108 a5c7 - 109 a5c7 - 110 a5c7 ; ---------------------------------------------------------------------------- - 111 a5c7 ; Strings - 112 a5c7 - 113 a5c7 nouart - 114 a5c7 7f 7f 20 75* byte.b 127,127, " uart NOT FOUND! ", 127,127 - 115 a5dc 00 byte.b 0 - 116 a5dd - 117 a5dd ; EOF! + 70 a5a0 ifnconst USE_NMI + 71 a5a0 ; Point to my interrupt vector + 72 a5a0 a9 b4 lda #theirq + 75 a5a7 8d 15 03 sta $0315 + 76 a5aa - else + 77 a5aa - lda #thenmi + 80 a5aa - sta $0319 + 81 a5aa eif + 82 a5aa + 83 a5aa ; Disable timer interrupts + 84 a5aa + 85 a5aa a9 60 lda #%01100000 + 86 a5ac 8d 2e 91 sta $912e ; disable and acknowledge interrupts + 87 a5af 8d 2d 91 sta $912d + 88 a5b2 ;sta $911e ; disable NMIs (Restore key) + 89 a5b2 + 90 a5b2 58 cli + 91 a5b3 60 rts + 92 a5b4 + 93 a5b4 ; ---------------------------------------------------------------------------- + 94 a5b4 ; The IRQ. + 95 a5b4 + 96 a5b4 thenmi + 97 a5b4 - ifconst USE_NMI + 98 a5b4 - pha + 99 a5b4 - txa + 100 a5b4 - pha + 101 a5b4 - tya + 102 a5b4 - pha + 103 a5b4 eif + 104 a5b4 + 105 a5b4 theirq + 106 a5b4 ; Fetch the received byte + 107 a5b4 ad 00 9c lda UART_RXTX ;get data + 108 a5b7 a4 5c ldy write_pointer + 109 a5b9 99 00 12 sta buffer,y + 110 a5bc e6 5c inc write_pointer + 111 a5be + 112 a5be ; Clear the interrupt from the UART by reading the status register + 113 a5be ad 02 9c lda UART_ISR + 114 a5c1 + 115 a5c1 4c 56 ff jmp $ff56 ; Use this in place of rti because it restores the A,X,Y registers from the stack + 116 a5c4 ;jmp $eabf ; return to normal IRQ (scans keyboard and stuff) + 117 a5c4 + 118 a5c4 + 119 a5c4 ; ---------------------------------------------------------------------------- + 120 a5c4 ; Handle the RESTORE key + 121 a5c4 + 122 a5c4 RESTORE + 123 a5c4 4c c7 fe jmp $fec7 ; Continue as if no cartridge installed + 124 a5c7 + 125 a5c7 + 126 a5c7 ; ---------------------------------------------------------------------------- + 127 a5c7 ; Strings + 128 a5c7 + 129 a5c7 nouart + 130 a5c7 7f 7f 20 75* byte.b 127,127, " uart NOT FOUND! ", 127,127 + 131 a5dc 00 byte.b 0 + 132 a5dd + 133 a5dd ; EOF! ------- FILE vicmidi.asm ------- FILE utils.asm LEVEL 2 PASS 2 0 a5dd include "utils.asm" diff --git a/Docs/DASM/DASM-new.TXT b/Docs/DASM/DASM-new.TXT new file mode 100644 index 0000000..fcd5c1d --- /dev/null +++ b/Docs/DASM/DASM-new.TXT @@ -0,0 +1,769 @@ + +DOCUMENTATION FOR DASM, a high level macro cross assembler for: + + -6502 (and 6507) + -68705 + -6803 + -HD6303 (extension of 6803) + -68HC11 + + +ABSTRACT + + This file contains the main documentation for DASM. It explains how + to use Dasm and what the supported assembler directives are. + + DASM's homepage is https://dasm-assembler.github.io/ since release + 2.20.12. + + +LEGALESE + + the DASM macro assembler (aka small systems cross assembler) + + Copyright (c) 1988-2002 by Matthew Dillon. + Copyright (c) 1995 by Olaf "Rhialto" Seibert. + Copyright (c) 2003-2008 by Andrew Davie. + Copyright (c) 2008 by Peter H. Froehlich. + Copyright (c) 2019-2020 by the DASM team. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +PREFACE FROM MATT: + + Over the last year my work has included writing software to drive small + single-chip microcomputers for various things (remote telemetry units, + for instance). I have had need to program quite a few different + processors over that time. + + At the beginning, I used an awful macro assembler running on an IBM-PC. + I *really* wanted to do it on my Amiga. Thus the writing of this + program. + + Feel free to suggest other similar processors for me to add to the list! + The processor type is specified with a pseudo-op (see below). This + assembler produces only binary output in one of three formats described + below. In general, one has a master assembly file which INCLUDEs all + the modules. + + Also provided is FTOHEX which converts an output file in one of the + three formats to an intel-hex format suitable for many intelligent + prom programmers (I have a GTEK). + + YES it's packed with features! + +FEATURES: + + -fast assembly + -supports several common 8 bit processor models (NOT 8086, thank god!) + -takes as many passes as needed + -automatic checksum generation, special symbol '...' + -several binary output formats available. Format 2 allows reverse + indexed origins. + -multiple segments, BSS segments (no generation), relocatable origin. + -expressions, as in C but [] is used instead of () for parenthesis. + (all expressions are computed with 32 bit integers) + -no real limitation on label size, label values are 32 bits. + -complex pseudo ops, repeat loops, macros, etc.... + + +PREFACE FROM ANDREW (APRIL/2003) + + The documentation is lagging a bit behind the modifications. + Essentially the information contained herein is correct, but + there have been minor changes to the formatting of output data. + + Please see the accompanying text files in the distribution's + root directory for a list of recent changes to DASM. + + +PREFACE FROM PETER (APRIL/2008) + + Everything Andrew says above is still true, there have been a + few sporadic updates to the documentation but no major ones, + not even Olaf Seibert's changes from 1995 have been integrated, + to say nothing of Thomas Mathys' F8 backend from 2004. We are + urgently looking for volunteers to help with the documentation! + + +COMMAND LINE: + + dasm sourcefile [options] + + options: -f# output format 1-3 (default 1, see below) + -oname output file name (else a.out) + -lname list file name (else none generated) + -Lname list file name, containing all passes + -sname symbol dump file name (else none generated) + -v# verboseness 0-4 (default 0, see below) + -d debug mode (for developers) + -Dsymbol define symbol, set to 0 + -Dsymbol=expression define symbol, set to expression + -Msymbol=expression define symbol using EQM (same as -D) + -Idir search directory for include and incbin + -p# maximum number of passes + -P# maximum number of passes, with fewer checks + -T# symbol table sorting (default 0 = alphabetical, + 1 = address/value) + -E# error format (default 0 = MS, 1 = Dillon, 2 = GNU) + -S strict syntax checking + + Example: dasm master.asm -f2 -oout -llist -v3 -DVER=4 + +Note: A slash (/) or dash (-) must prefix options. + + +Return Value: + + The assembler will return 0 on successful compilation, 1 otherwise. + + +FORMAT OPTIONS: + + 1 (DEFAULT) + + The output file contains a two byte origin in LSB,MSB order, then + data until the end of the file. + + Restrictions: Any instructions which generate output (within an + initialized segment) must do so with an ascending PC. Initialized + segments must occur in ascending order. + + 2 RAS (Random Access Segment) + + The output file contains one or more hunks. Each hunk consists + of a 2 byte origin (LSB,MSB), 2 byte length (LSB,MSB), and that + number of data bytes. The hunks occur in the same order as + initialized segments in the assembly. There are no restrictions + to segment ordering (i.e. reverse indexed ORG statements are + allowed). The next hunk begins after the previous hunk's data, + until the end of the file. + + 3 RAW (Raw) + + The output file contains data only (format #1 without the 2 byte + header). Restrictions are the same as for format #1. + + Format 3 RAW (Raw format) + Same as format 1, but NO header origin is generated. You get + nothing but data. + +VERBOSE OPTIONS: + + 0 (default) + + Only warnings and errors are generated + + 1 + -Segment list information generated after each pass + -Include file names are displayed + -statistics on why the assembler is going to make another pass + R1,R2 reason code: R3 + where R1 is the number of times the assembler encountered + something requiring another pass to resolve. R2 is the + number of references to unknown symbols which occured in the + pass (but only R1 determines the need for another pass). R3 + is a BITMASK of the reasons why another pass is required. + See the end of this document for bit designations. + + 2 + mismatches between program labels and equates are displayed + on every pass (usually none occur in the first pass unless you + have re-declared a symbol name). + + displayed information for symbols: + ???? = unknown value + str = symbol is a string + eqm = symbol is an eqm macro + (r) = symbol has been referenced + (s) = symbol created with SET or EQM pseudo-op + + 3 + Unresolved and unreferenced symbols are displayed every pass + (unsorted, sorry) + + 4 + An entire symbol list is displayed every pass to STDOUT. + (unsorted, sorry) + + + +PROCESSOR MODEL: + + The processor model is chosen with the PROCESSOR pseudo-op and should + be the first thing you do in your assembly file. Different processor + models use different integer formats (see below). The word order does + not effect the headers in the output files (-f1 and -f2), which are + always LSB,MSB. The word ordering effects all address, word, and + long generation. + + Only one PROCESSOR pseudo-op may be declared in the entire assembly, + and should be the first thing encountered. + + -6502 LSB,MSB + -68HC11 MSB,LSB + -68705 MSB,LSB + -6803 MSB,LSB + -HD6303 MSB,LSB + -F8 ? + +SEGMENTS: + The SEG pseudo-op creates/sets the current segment. Each segment has + it's own origin and is optionally an 'uninitialized' segment. + Unitialized segments produce no output and have no restrictions. This + is useful for determining the size of a certain assembly sequence + without generating code, and for assigning RAM to labels. + + 'Initialized' segments produce output. The following should be + considered when generating roms: + + (1) The default fill character when using ORG (and format 1 or 3) to + skip forward is 00. This is a GLOBAL default and effects all + segments. See ORG. + + (2) The default fill character for DS is 00 and is independant of + the default fill character for ORG (see DS). + +GENERAL: + Most everything is recursive. You cannot have a macro DEFINITION + within a macro definition, but can nest macro calls, repeat loops, + and include files. + + The other major feature in this assembler is the SUBROUTINE pseudo-op, + which logically separates local labels (starting with a dot). This + allows you to reuse label names (for example, .1 .fail) rather than + think up crazy combinations of the current subroutine to keep it all + unique. + + Almost nothing need be resolved in pass 1. The assembler will make + multiple passes in an attempt to resolve the assembly (including just + one pass if everything is resolved immediately). + + +PSEUDOPS: + + INCLUDE "name" + + Include another assembly file. + +[label] INCBIN "name" + + Include another file literally in the output. + + INCDIR "directory name" + + Add the given directory name to the list of places where + INCLUDE and INCBIN search their files. First, the names are + tried relative to the current directory, if that fails and + the name is not an absolute pathname, the list is tried. + You can optionally end the name with a /. AmigaDOS filename + conventions imply that two slashes at the + end of an INCDIR (dir//) indicates the parent directory, and + so does an INCLUDE /filename. + + The command-line option -Idir is equivalent to an INCDIR + directive placed before the source file. + + Currently the list is not cleared between passes, but each + exact directory name is added to the list only once. + This may change in subsequent releases. + +[label] SEG[.U] name + + This sets the current segment, creating it if neccessary. If + a .U extension is specified on segment creation, the segment + is an UNINITIALIZED segment. The .U is not needed when going + back to an already created uninitialized segment, though it + makes the code more readable. + +[label] DC[.BWL] exp,exp,exp ... + + Declare data in the current segment. No output is generated if + within a .U segment. Note that the byte ordering for the + selected processor is used for each entry. + + The default size extension is a byte. + + BYTE, WORD and LONG are synonyms for DC.B, DC.W and DC.L. + +[label] DS[.BWL] exp[,filler] + + declare space (default filler is 0). Data is not generated if + within an uninitialized segment. Note that the number of bytes + generated is exp * entrysize (1,2, or 4) + + The default size extension is a byte. + + Note that the default filler is always 0 (has nothing to do + with the ORG default filler). + +[label] DV[.BWL] eqmlabel exp,exp,exp.... + + This is equivalent to DC, but each exp in the list is passed + through the symbolic expression specified by the EQM label. + The expression is held in a special symbol dotdot '..' on each + call to the EQM label. + + See EQM below + +[label] HEX hh hh hh.. + + This sets down raw HEX data. Spaces are optional between bytes. + NO EXPRESSIONS are allowed. Note that you do NOT place a $ + in front of the digits. This is a short form for creating + tables compactly. Data is always layed down on a byte-by-byte + basis. + + Example: HEX 1A45 45 13254F 3E12 + + ERR + + Abort assembly. + +[label] ORG exp[,DefaultFillVal] + + This pseudop sets the current origin. You can also set the + global default fill character (a byte value) with this + pseudoop. NOTE that no filler is generated until the first + data-generating opcode/psueoop is encountered after this one. + Sequences like: + + org 0,255 + org 100,0 + org 200 + dc 23 + + will result in 200 zero's and a 23. This allows you to specify + some ORG, then change your mind and specify some other (lower + address) ORG without causing an error (assuming nothing is + generated inbetween). + + Normally, DS and ALIGN are used to generate specific filler + values. + +[label] RORG exp + + This activates the relocatable origin. All generated + addresses, including '.', although physically placed at the + true origin, will use values from the relocatable origin. + While in effect both the physical origin and relocatable origin + are updated. + + The relocatable origin can skip around (no limitations). The + relocatable origin is a function of the segment. That is, you + can still SEG to another segment that does not have a + relocatable origin activated, do other (independant) stuff + there, and then switch back to the current segment and continue + where you left off. + + PROCESSOR model + + do not quote. model is one of: 6502,6803,HD6303,68705,68HC11,F8 + Can only be executed once, and should be the first thing + encountered by the assembler. + + ECHO exp,exp,exp + + The expressions (which may also be strings), are echoed on the + screen and into the list file. + +[label] REND + + Deactivate the relocatable origin for the current segment. + Generation uses the real origin for reference. + +[label] ALIGN N[,fill] + + Align the current PC to an N byte boundry. The default + fill character is always 0, and has nothing to do with + the default fill character specifiable in an ORG. + +[label] SUBROUTINE name + + This isn't really a subroutine, but a boundry between sets of + temporary labels (which begin with a dot). Temporary label + names are unique within segments of code bounded by SUBROUTINE: + + CHARLIE subroutine + ldx #10 + .1 dex + bne .1 + BEN subroutine + ldx #20 + .qq dex + bne .qq + + Automatic temporary label boundries occur for each macro level. + Usually temporary labels are used in macros and within actual + subroutines (so you don't have to think up a thousand different + names) + + +symbol EQU exp + +symbol = exp + + The expression is evaluated and the result assigned to the + symbol. + + If this option is enabled, you can use the common idiom of + + . EQU . + 3 (or . = .+3) + + in other words, you can assign to "." (or "*" if OlafStar + is also enabled) instead of an ORG or RORG directive. + More formally, a directive of the form ". EQU expr" is + interpreted as if it were written " (R)ORG expr". + The RORG is used if a relocatable origin is already in effect, + otherwise ORG is used. Note that the first example is NOT + equivalent with "DS.B 3" when the rorg is in effect. + +symbol EQM exp + + The STRING representing the expression is assigned to the + symbol. Occurances of the label in later expressions causes + the string to be evaluated for each occurance. Also used in + conjuction with the DV psuedo-op. + +symbol SET exp + + Same as EQU, but the symbol may be reassigned later. + +symbol SETSTR exp + + The expression is converted to a string, and assigned to the + symbol. Typical use case is within a macro, to allow the + macro to echo or otherwise use the name of an argument. + + MAC name + + Declare a macro. lines between MAC and ENDM are the macro. + You cannot recursively declare a macro. You CAN recursively + use a macro (reference a macro in a macro). No label is + allowed to the left of MAC or ENDM. + + Arguments passed to macros are referenced with: {#}. The first + argument passed to a macro would thus be {1}. You should + always use LOCAL labels (.name) inside macros which you use + more than once. {0} represents an EXACT substitution of the + ENTIRE argument line. + + ENDM + + end of macro def. NO LABEL ALLOWED ON THE LEFT! + + MEXIT + + Used in conjuction with conditionals. Exits the current macro + level. + +[label] IFCONST exp + + Is TRUE if the expression result is defined, FALSE otherwise + and NO error is generated if the expression is undefined. + +[label] IFNCONST exp + + Is TRUE if the expression result is undefined, FALSE otherwise + and NO error is generated if the expression is undefined. + +[label] IF exp + + Is TRUE if the expression result is defined AND non-zero. + Is FALSE if the expression result is defined AND zero. + Neither IF or ELSE will be executed if the expression result + is undefined. If the expression is undefined, another assembly + pass is automatically taken. + + If this happens, phase errors in the next pass only will not + be reported unless the verboseness is 1 or more. + +[label] ELSE + + ELSE the current IF. + +[label] ENDIF +[label] EIF + + Terminate an IF. ENDIF and EIF are equivalent. + +[label] REPEAT exp +[label] REPEND + + Repeat code between REPEAT/REPEND 'exp' times. + +#if DAD + if exp == 0, + the code repeats forever. exp is evaluated once. + + If exp == 0, the repeat loop is ignored. + If exp < 0, a warning "REPEAT parameter < 0 (ignored)" is generated and the repeat loop is ignored. +#endif + + Y SET 0 + REPEAT 10 + X SET 0 + REPEAT 10 + DC X,Y + X SET X + 1 + REPEND + Y SET Y + 1 + REPEND + + generates an output table: 0,0 1,0 2,0 ... 9,0 0,1 1,1 2,1 + ... 9,1, etc... + + Labels within a REPEAT/REPEND should be temporary labels with a + SUBROUTINE pseudo-op to keep them unique. + + The Label to the left of REPEND is assigned AFTER the loop + FINISHES. + + +[label] XXX[.force] operand + + XXX is some mnemonic, not necessarily three characters long. + The .FORCE optional extension is used to force specific + addressing modes (see below). + +[label] LIST ON or OFF + + Globally turns listing on or off, starting with the current + line. + + When you give LOCALON or LOCALOFF the effect is local to the + current macro or included file. For a line to be listed both + the global and local list switches must be on. + + All pseudo-ops (and incidentally also the mnemonics) can be + prefixed with a . for compatibility with other assemblers. + So .IF is the same as IF. This works only because lone .FORCE + extensions are meaningless. + +GENERAL: + + The label will be set to the current ORG/RORG either before or after + a pseudo-op is executed. Most of the time, the label to the left of a + pseudo-op is the current ORG/RORG. The following pseudo-op's labels are + created AFTER execution of the pseudo-op: + + SEG, ORG, RORG, REND, ALIGN + +EXTENSIONS: + + FORCE extensions are used to force an addressing mode. In some cases, + you can optimize the assembly to take fewer passes by telling it the + addressing mode. Force extensions are also used with DS,DC, and DV + to determine the element size. NOT ALL EXTENSIONS APPLY TO ALL + PROCESSORS! + + example: lda.z charlie + + i -implied + ind -indirect word + 0 -implied + 0x -implied indexing (0,x) + 0y -implied indexing (0,y) + b -byte address + bx -byte address indexed x + by -byte address indexed y + w -word address + wx -word address indexed x + wy -word address indexed y + l -longword (4 bytes) (DS/DC/DV) + r -relative + u -uninitialized (SEG) + + First character equivalent substitutions: + + b z d (byte, zeropage, direct) + w e a (word, extended, absolute) + + +ASSEMBLER PASSES: + The assembler may have to make several passes through the source + code to resolve all generation. The number of passes is not + limited to two. Since this may result in an unexpected, verbose + option 2, 3, and 4 have been provided to allow determination of the + cause. The assembler will give up if it thinks it can't do the + assembly in *any* number of passes. + + Error reporting could be better.... + + The check if another pass might resolve the source is pretty good, but + not perfect. You can specify the maximum number of passes to do + (default -p10), and with the -P option you can override the normal check. + This allows the following contrived example to resolve in 12 passes: + + org 1 + repeat [[x < 11] ? [x-11]] + 11 + dc.b x + repend + x: + +EXPRESSIONS: + [] may be used to group expressions. The precedense of operators + is the same as for the C language in almost all respects. Use + brackets [] when you are unsure. The reason () cannot be used to + group expressions is due to a conflict with the 6502 and other + assembly languages. + + It is possible to use () instead of [] in expressions following + pseudo-ops, but not following mnemonics. So this works: + if target & (pet3001 | pet4001), but this doesn't: + lda #target & (pet3001 | pet4001). + + Some operators, such as ||, can return a resolved value even if + one of the expressions is not resolved. Operators are as follows: + + NOTE WELL! Some operations will result in non-byte values when a + byte value was wanted. For example: ~1 is NOT $FF, but + $FFFFFFFF. Preceding it with a < (take LSB of) will solve the + problem. ALL ARITHMETIC IS CARRIED OUT IN 32 BITS. The final + Result will be automatically truncated to the maximum handleable + by the particular machine language (usually a word) when applied + to standard mnemonics. + + prec UNARY + + 20 ~exp one's complement. + 20 -exp negation + 20 !exp not expression (returns 0 if exp non-zero, 1 if exp zero) + 20 exp take MSB byte of an expression + + BINARY + + 19 * multiplication + 19 / division + 19 % mod + 18 + addition + 18 - subtraction + 17 >>,<< shift right, shift left + 16 >,>= greater, greater equal + 16 <,<= smaller, smaller equal + 15 == equal to. Try to use this instead of = + 15 = exactly the same as == (exists compatibility) + 15 != not equal to + 14 & logical and + 13 ^ logical xor + 12 | logical or + 11 && left expression is true AND right expression is true + 10 || left expression is true OR right expression is true + 9 ? if left expression is true, result is right expression, + else result is 0. [10 ? 20] returns 20 + 8 [] group expressions + 7 , separate expressions in list (also used in + addressing mode resolution, BE CAREFUL! + + Note: The effect of the C conditional operator a ? b : c can be + had with [a ? b - c] + c. + + Constants: + + nnn decimal + 0nnn octal + %nnn binary + $nnn hex + 'c character + "cc.." string (NOT zero terminated if in DC/DS/DV) + [exp]d the constant expressions is evaluated and it's decimal + result turned into an ascii string. + + Symbols: + + ... -holds CHECKSUM so far (of actual-generated stuff) + .. -holds evaluated value in DV pseudo op + .name -represents a temporary symbol name. Temporary symbols + may be reused inside MACROS and between SUBROUTINES, but + may not be referenced across macros or across SUBROUTINEs. + . -current program counter (as of the beginning of the + instruction). + name -beginning with an alpha character and containing letters, + numbers, or '_'. Represents some global symbol name. + * -synonym for ., when not confused as an operator. + nnn$ -temporary label, much like .name, except that defining + a non-temporary label has the effect that SUBROUTINE + has on .name. They are unique within macros, like + .name. Note that 0$ and 00$ are distinct, as are 8$ + and 010$. + (mainly for compatibility with other assemblers.) + +Dynamic Symbol/Labels + + When used in a symbol name, the "," operator indicates one or more + arguments that follow should be evaluated, and the resulting values + should concatenated to the label, to create a "dynamic" symbol name. + +symbol,ARG1[,ARG2,...] + + String literals can be specified with quotes around the string + text. Expression operators can also be used, but due to label + parsing constraints, they should not contain spacing. + + The concat-eval "," operator also works on the expression side + of EQU/SET pseudo-ops, so dynamic labels can be used with opcodes. + +WHY codes: + Each bit in the WHY word (verbose option 1) is a reason (why + the assembler needs to do another pass), as follows: + + bit 0 expression in mnemonic not resolved + 1 - + 2 expression in a DC not resolved + 3 expression in a DV not resolved (probably in DV's EQM symbol) + 4 expression in a DV not resolved (could be in DV's EQM symbol) + 5 expression in a DS not resolved + 6 expression in an ALIGN not resolved + 7 ALIGN: Relocatable origin not known (if in RORG at the time) + 8 ALIGN: Normal origin not known (if in ORG at the time) + 9 EQU: expression not resolved + 10 EQU: value mismatch from previous pass (phase error) + 11 IF: expression not resolved + 12 REPEAT: expression not resolved + + 13 a program label has been defined after it has been + referenced (forward reference) and thus we need another + pass + 14 a program label's value is different from that of the + previous pass (phase error) + + Certain errors will cause the assembly to abort immediately, others + will wait until the current pass is other. The remaining allow another + pass to occur in the hopes the error will fix itself. + + +HISTORIC VERSIONS: (pre github) + + V2.12 + -Fixed macro naming bug (macros wouldn't work if the name after + the 'mac' was in upper case). + + V2.11 + -Fixed exp bug, exp MSB (it used to + be reversed). + -Fixed many bugs in macros and other things + -Added automatic checksumming ... no more doing checksums manually! + -Added several new processors, including 6502. + -Source is now 16/32 bit int compatible, and will compile on an + IBM-PC (the ultimate portability test) + + V2.01 + + -can now have REPEAT/REPEND's within macros + -fill field for DS.W is a word (used to be a byte fill) + -fill field for DS.L is a long (used to be a byte fill) +