LIST 42 ============================================================================ ;##### RAM Map ##### dseg org 0000h tx_fifo ds 256 tx_top ds 1 tx_end ds 1 status ds 2 counter ds 3 ;##### I/O Map ##### cseg sio_a equ 0018h pio_a equ 001ch pio_b equ 001eh ;##### MACRO ##### io_set macro @1,@2 ld a,@2 out (@1+1),a endm io_put macro @1,@2 ld a,@2 out (@1+0),a endm ;##### RESET ##### org 0000h ld sp,09fffh di jp main ;##### INT / NMI ##### org 0066h retn ;##### Main ##### main: ld hl,08000h ld a,090h _ram_clear_loop: ld (hl),0 inc hl cp h jr nc,_ram_clear_loop io_set pio_a,0cfh ; Mode 3 io_set pio_a,00001010b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_set pio_b,0cfh ; Mode 3 io_set pio_b,11111110b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_set sio_a,00011000b ; Channel Reset A io_set sio_a,00000100b ; Resister Point = 4 io_set sio_a,11000100b ; Mode io_set sio_a,00000001b ; Resister Point = 1 io_set sio_a,00000000b ; Interrupt Mode io_set sio_a,00000101b ; Resister Point = 5 io_set sio_a,01101000b ; Transmit Start io_put pio_b,1 call check ld (status+1),a loop: call sw_check call tx_data_check jr loop ;##### Subroutines ##### tx_data_check: ld a,(tx_end) ld b,a ld a,(tx_top) cp b ret z io_set sio_a,00000000b ; Resister Point = 0 in a,(sio_a+1) bit 2,a ret z ld hl,tx_fifo ld l,b ld a,(hl) out (sio_a),a ld a,b inc a ld (tx_end),a ret tx_data_set: ld hl,tx_fifo ld a,(tx_top) ld l,a inc a ld (tx_top),a ld (hl),b ret ;##### Sw Check ##### check: in a,(pio_a) and 00000010b cp 0 jr z,_check_zero ld a,1 ret _check_zero: xor a ret sw_check: call check ld (status+0),a ld b,a ld a,(status+1) cp b jp z,not_event new_event: ld a,b ld (status+1),a cp 1 jp z,new_on new_off: ld a,(counter+2) cp 0 jr z,_count_1 bit 6,a jr z,_2_5 ld c,1 jp midi_tx _2_5: bit 5,a jr z,_2_4 ld c,2 jp midi_tx _2_4: bit 4,a jr z,_2_3 ld c,3 jp midi_tx _2_3: bit 3,a jr z,_2_2 ld c,4 jp midi_tx _2_2: bit 2,a jr z,_2_1 ld c,5 jp midi_tx _2_1: bit 1,a jr z,_2_0 ld c,6 jp midi_tx _2_0: ld c,7 jp midi_tx _count_1: ld a,(counter+1) cp 0 jp z,_count_0 cp 120 jr c,_linear ld c,8 jp midi_tx _linear: xor 07fh ld c,a jp midi_tx _count_0: ld c,07fh midi_tx: ld b,0d6h call tx_data_set ld a,c ld b,a call tx_data_set ret new_on: xor a ld (counter+0),a ld (counter+1),a ld (counter+2),a ret not_event: ld a,(status+1) cp 0 ret z ld a,(counter+0) inc a ld (counter+0),a bit 7,a ret z xor a ld (counter+0),a ld a,(counter+1) inc a ld (counter+1),a bit 7,a ret z xor a ld (counter+1),a ld a,(counter+2) inc a ld (counter+2),a bit 7,a ret z ld a,01000000b ld (counter+2),a ret ============================================================================