;----------------------------------------------------------------------- ; MIDI SW Matrix Module Program [Z-80] ;----------------------------------------------------------------------- name x80main p65c02 ;##### MemoryEI/O MAP ##### program_area equ 00000h int_area equ 00038h work equ 04000h ram_area equ 04100h stack_pointer equ 5fffh uart0 equ 08000h uart1 equ 08001h pia0 equ 09000h pia1 equ 09001h pia2 equ 09002h pia3 equ 09003h dipsw equ 0a000h ext1 equ 0b000h ext2 equ 0c000h ;##### RAM Map ##### org work work0 ds 1 work1 ds 1 work2 ds 1 work3 ds 1 rxtop ds 1 rxend ds 1 rxdata ds 1 rsb ds 1 exclusive_flag ds 1 ex_id ds 1 ex_chno ds 1 ex_function ds 1 ex_group ds 1 ex_machine ds 1 ex_data ds 1 ex_eox ds 1 matrix_data ds 1 matrix_address ds 1 org ram_area rxfifo ds 256 ;##### Macro Defines ##### macro &push db 0f5h ; push af endmac macro &pop db 0f1h ; pop af endmac macro &ex db 008h ; ex af,af' db 0d9h ; exx endmac macro &stack db 031h ; ld sp,nn db .low.\0 db .high.\0 endmac macro &lda db 03ah ; ld a,(nn) db .low.\0 db .high.\0 endmac macro &sta db 032h ; ld (nn),a db .low.\0 db .high.\0 endmac macro &movi db 03eh ; ld a,n db \0 db 032h ; ld (nn),a db .low.\1 db .high.\1 endmac macro &move db 03ah ; ld a,(nn) db .low.\0 db .high.\0 db 032h ; ld (nn),a db .low.\1 db .high.\1 endmac macro &movex db 03ah ; ld a,(nn) db .low.\0 db .high.\0 db 0eeh,0ffh ; xor a,0ffh db 032h ; ld (nn),a db .low.\1 db .high.\1 endmac macro &jsr db 0cdh ; call xx,nn db .low.\0 db .high.\0 endmac macro &jsrnz db 0c4h ; call nz,nn db .low.\0 db .high.\0 endmac macro &jmp db 0c3h ; jp xx,nn db .low.\0 db .high.\0 endmac macro &beq db 0cah ; jp z,nn db .low.\0 db .high.\0 endmac macro &bne db 0c2h ; jp nz,nn db .low.\0 db .high.\0 endmac macro &rts db 0c9h ; ret xx endmac macro &equal_return db 0c8h ; ret z endmac macro ¬_equal_return db 0c0h ; ret nz endmac macro &and db 0e6h ; and a,n db \0 endmac macro &eor db 0eeh ; xor a,n db \0 endmac macro &ora db 0f6h ; or a,n db \0 endmac macro &cmp db 0feh ; cp a,n db \0 endmac macro &inc db 03ch ; inc a endmac macro &dec db 03dh ; dec a endmac macro &seth db 026h ; ld h,n db .high.\0 endmac macro &setl db 03ah ; ld a,(nn) db .low.\0 db .high.\0 db 06fh ; ld l,a endmac macro &gethl db 07eh ; ld a,(hl) endmac macro &puthl db 077h ; ld (hl),a endmac macro &nop db 000h ; endmac ;##### Program Start ( <-- Power ON Reset ) ##### org program_area &stack stack_pointer db 0f3h ; db 0edh,56h ; &jmp main_routine ;##### MIDI INT Sequence ##### org int_area &ex &setl rxtop &lda uart0 &puthl db 2ch ; db 7dh ; &sta rxtop &ex db 0fbh ; db 0edh,4dh ; ;##### Main Program Area ##### main_routine: &jsr waiting &jsr io_initial loop: &jsr midi_rx_check &jmp loop ;##### Matrix Data Write Routine ##### matrix_write: &movi 1,pia0 ; CS &move matrix_address,pia1 ; Address &move matrix_data,pia2 ; Data &nop &movi 0,pia0 ; CS &nop &movi 1,pia0 ; CS &rts ;##### MIDI Receive Data Check Sequence ##### midi_rx_check: &lda rxend db 47h ; &lda rxtop db 0b8h ; &equal_return db 78h ; &inc &sta rxend db 68h ; &seth rxfifo &gethl &sta rxdata &cmp 0f0h &bne midi_rx_not_exclusive_start_mark &movi 1,exclusive_flag &movi 0,rsb &rts midi_rx_not_exclusive_start_mark: &lda exclusive_flag &cmp 0 &bne midi_rx_exclusive &rts ;********************* Exclusive Only !!! midi_rx_exclusive: &lda exclusive_flag &cmp 1 &bne midi_exclusive_not_1st &movi 2,exclusive_flag &move rxdata,ex_id &rts midi_exclusive_not_1st: &cmp 2 &bne midi_exclusive_not_2nd &movi 3,exclusive_flag &move rxdata,ex_chno &rts midi_exclusive_not_2nd: &cmp 3 &bne midi_exclusive_not_3rd &movi 4,exclusive_flag &move rxdata,ex_function &rts midi_exclusive_not_3rd: &cmp 4 &bne midi_exclusive_not_4th &movi 5,exclusive_flag &move rxdata,ex_group &rts midi_exclusive_not_4th: &cmp 5 &bne midi_exclusive_not_5th &movi 6,exclusive_flag &move rxdata,ex_machine &rts midi_exclusive_not_5th: &cmp 6 &bne midi_exclusive_not_6th &movi 7,exclusive_flag &move rxdata,ex_data &rts midi_exclusive_not_6th: &move rxdata,ex_eox &lda ex_id &cmp 40h &bne midi_rx_exclusive_format_error &lda ex_chno &cmp 0fh &bne midi_rx_exclusive_format_error &lda ex_function &and 11110000b &cmp 70h &bne midi_rx_exclusive_format_error &lda ex_group &cmp 7fh &bne midi_rx_exclusive_format_error &lda ex_eox &cmp 0f7h &bne midi_rx_exclusive_format_error &lda ex_machine &cmp 1 ; MACHINE ID = <1> ********** &bne midi_rx_exclusive_format_error &move ex_data,matrix_data &lda ex_function &cmp 70h &beq midi_rx_exclusive_70 &cmp 71h &beq midi_rx_exclusive_71 &cmp 72h &beq midi_rx_exclusive_72 &cmp 73h &beq midi_rx_exclusive_73 &cmp 74h &beq midi_rx_exclusive_74 &cmp 75h &beq midi_rx_exclusive_75 &cmp 76h &beq midi_rx_exclusive_76 &cmp 77h &beq midi_rx_exclusive_77 &rts midi_rx_exclusive_70: &movi 0,matrix_address &jsr matrix_write &rts midi_rx_exclusive_71: &movi 1,matrix_address &jsr matrix_write &rts midi_rx_exclusive_72: &movi 2,matrix_address &jsr matrix_write &rts midi_rx_exclusive_73: &movi 3,matrix_address &jsr matrix_write &rts midi_rx_exclusive_74: &movi 4,matrix_address &jsr matrix_write &rts midi_rx_exclusive_75: &movi 5,matrix_address &jsr matrix_write &rts midi_rx_exclusive_76: &movi 6,matrix_address &jsr matrix_write &rts midi_rx_exclusive_77: &movi 7,matrix_address &jsr matrix_write &rts midi_rx_exclusive_format_error: &movi 0,exclusive_flag &rts ;##### System I/O Initialize ##### io_initial: ; &ex &seth rxfifo &ex ; &movi 0,work0 &seth work ram_clear_work: &setl work0 db 3eh,00h ; ld a,#0 &puthl &lda work0 &inc &sta work0 &cmp 0 &bne ram_clear_work &seth rxfifo ram_clear_rxfifo: &setl work0 db 3eh,00h ; ld a,#0 &puthl &lda work0 &inc &sta work0 &cmp 0 &bne ram_clear_rxfifo ; <71055 PIA Initialize> &movi 10000000b,pia3 ; Port<2>=<1>=<0>=Out &movi 1,pia0 ; CS &movi 0,pia1 ; Address &movi 0,pia2 ; Data ; <71051 UART Initialize> &movi 0,uart1 &movi 0,uart1 &movi 0,uart1 &movi 01000000b,uart1 ; Software Reset &movi 01001110b,uart1 ; Mode Set &movi 00010100b,uart1 ; Command Set ; &movi 0,matrix_address &movi 0,matrix_data &jsr matrix_write &movi 1,matrix_address &movi 1,matrix_data &jsr matrix_write &movi 2,matrix_address &movi 2,matrix_data &jsr matrix_write &movi 3,matrix_address &movi 3,matrix_data &jsr matrix_write &movi 4,matrix_address &movi 4,matrix_data &jsr matrix_write &movi 5,matrix_address &movi 5,matrix_data &jsr matrix_write &movi 6,matrix_address &movi 6,matrix_data &jsr matrix_write &movi 7,matrix_address &movi 7,matrix_data &jsr matrix_write ; db 0fbh ; &rts ;##### Waiting Timer ##### waiting: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 &rts end