;----------------------------------------------------------------------- ; LCD System Message Box : Feb.1993 ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h rx_fifo ds 16384 rx_top ds 2 rx_end ds 2 rsb ds 1 dcb ds 1 channel ds 1 keyno ds 1 disp_main ds 1 disp_sub ds 1 sw_status ds 2 mon_write ds 1 mon_erase ds 1 ddd ds 5 disp_data ds 1 ;##### I/O Map, Defines ##### cseg s_gen equ 0017h sio_a equ 0018h sio_b equ 001ah pio_a equ 001ch pio_b equ 001eh lcd equ 0080h tail equ 0000h ;##### MACRO ##### clear macro @1 xor a ld (@1),a endm move macro @1,@2 ld a,@2 ld (@1),a endm inc_a macro @1 ld a,(@1) inc a ld (@1),a endm inc_chk macro @1,@2 inc_a @1 cp @2 jp c,99$ clear @1 99$: endm brc macro @1,@2 cp @1 jp c,@2 endm brz macro @1,@2 cp @1 jp z,@2 endm 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 lcd_set macro @1 ld a,@1 out (lcd+1),a endm lcd_out macro @1 out (lcd),a endm lcd_put macro @1 ld a,@1 lcd_out endm lcd_mes macro @1,@2,@3 ld hl,@1*40+@2-41 ld de,@3 call lcd_disp_mess endm lcd_add macro lcd_set 46h ; Address Set lcd_put l lcd_put h lcd_set 42h ; Data Set endm add_set macro @1 ld a,(@1) add a,a ld e,a ld d,0 ld hl,monitor_add add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl endm ;##### RESET ##### org 0000h ld sp,0ffffh di jp main ;##### INT / NMI ##### org 0020h dw _midi_ _midi_: ex af,af' exx ld de,(rx_top) ld a,10000000b or d ld h,a ld l,e in a,(sio_a) ld (hl),a inc de res 6,d ld (rx_top),de exx ex af,af' ei reti org 0066h retn ;##### Initialize --> Main Loop ##### main: ld hl,08000h ld a,0f0h _ram_clear_loop: ld (hl),0 inc hl cp h jp nc,_ram_clear_loop call lcd_initial_set ; io_set pio_a,0cfh ; Mode 3 io_set pio_a,00000000b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_set pio_b,0cfh ; Mode 3 io_set pio_b,00000011b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_put pio_b,0 io_put pio_a,0ffh ; LED All Off io_put pio_b,80h io_put pio_b,0 ; io_put s_gen,00000000b ; Clock Generator io_put 0f0h,003h ; WDT Disable io_put 0f0h,0b1h ; WDT Disable io_put 0f4h,001h ; Daisy Chain io_put 010h,0 ; CTC #1 Int. Disable io_put 011h,0 ; CTC #2 Int. Disable io_put 012h,0 ; CTC #3 Int. Disable io_put 013h,0 ; CTC #4 Int. Disable io_set sio_b,00011000b ; Channel Reset B io_set sio_b,1 ; Resister Point = 1B io_set sio_b,0 ; Interrupt Mode io_set sio_b,2 ; Resister Point = 2B io_set sio_b,20h ; Reset Address xor a ld i,a ; High Address io_set sio_a,00011000b ; Channel Reset A io_set sio_a,4 ; Resister Point = 4 io_set sio_a,10000100b ; Mode io_set sio_a,1 ; Resister Point = 1 io_set sio_a,00011000b ; Interrupt Mode io_set sio_a,3 ; Resister Point = 3 io_set sio_a,11000001b ; Receive Start im 2 call init_menu ei loop: call sw_scan call midi_check jp loop ;##### MIDI ##### midi_check: ld de,(rx_end) ld hl,(rx_top) and a ; CY <-- 0 sbc hl,de ret z ld a,10000000b or d ld h,a ld l,e ld b,(hl) ; [B] = Rx Data inc de res 6,d ld (rx_end),de ld a,b ; ********** call led_display ; ********** ld a,(disp_main) cp 1 jp nz,_non_momitor ld a,b cp 0f0h ret nc add_set mon_erase lcd_add ld a,' ' lcd_out lcd_out inc_chk mon_erase,104 add_set mon_write lcd_add ld a,b srl a srl a srl a srl a ld l,a ld h,0 ld de,hex_table add hl,de ld a,(hl) lcd_out ld a,b and 00001111b ld l,a ld h,0 ld de,hex_table add hl,de ld a,(hl) lcd_out inc_chk mon_write,104 ret hex_table: db '0123456789ABCDEF' monitor_add: dw 1,4,7,10,13,16,19,22,25,28,31,34,37 dw 41,44,47,50,53,56,59,62,65,68,71,74,77 dw 81,84,87,90,93,96,99,102,105,108,111,114,117 dw 121,124,127,130,133,136,139,142,145,148,151,154,157 dw 161,164,167,170,173,176,179,182,185,188,191,194,197 dw 201,204,207,210,213,216,219,222,225,228,231,234,237 dw 241,244,247,250,253,256,259,262,265,268,271,274,277 dw 281,284,287,290,293,296,299,302,305,308,311,314,317 _non_momitor: bit 7,b jp z,_m_50 ; running ld a,b cp 0f8h ret nc brc 0f0h,_m_10 clear rsb ret _m_10: ld a,b and 00001111b ld (channel),a ld a,b and 11110000b ld (rsb),a clear dcb ret _m_50: ld a,(rsb) cp 0 ret z cp 0c0h ret z cp 0d0h ret z ld a,(dcb) cp 0 jp nz,_m_90 inc a ld (dcb),a ld a,b ld (keyno),a ret _m_90: clear dcb ld a,(disp_main) cp 2 ret nz ld a,(rsb) cp 0a0h ret nz ld a,(channel) cp 00fh ret nz ld a,(keyno) cp 95 ret nz ld a,b ld (disp_data),a brc 200,_d_22 sub 200 ld (disp_data),a move ddd+4,2 jp _d_2 _d_22: brc 100,_d_1 sub 100 ld (disp_data),a move ddd+4,1 jp _d_2 _d_1: move ddd+4,0 ld a,(disp_data) cp 10 jp nc,_d_2 move ddd+3,0 jp _d_15 _d_2: ld a,(disp_data) brc 90,_d_3 sub 90 ld (disp_data),a move ddd+3,9 jp _d_15 _d_3: brc 80,_d_4 sub 80 ld (disp_data),a move ddd+3,8 jp _d_15 _d_4: brc 70,_d_5 sub 70 ld (disp_data),a move ddd+3,7 jp _d_15 _d_5: brc 60,_d_6 sub 60 ld (disp_data),a move ddd+3,6 jp _d_15 _d_6: brc 50,_d_7 sub 50 ld (disp_data),a move ddd+3,5 jp _d_15 _d_7: brc 40,_d_8 sub 40 ld (disp_data),a move ddd+3,4 jp _d_15 _d_8: brc 30,_d_9 sub 30 ld (disp_data),a move ddd+3,3 jp _d_15 _d_9: brc 20,_d_10 sub 20 ld (disp_data),a move ddd+3,2 jp _d_15 _d_10: brc 10,_d_11 sub 10 ld (disp_data),a move ddd+3,1 jp _d_15 _d_11: move ddd+3,0 _d_15: ld a,(disp_data) ld (ddd+2),a move ddd+0,28 ; Start Point (X) ld a,(ddd+2) call bar_char_sub move ddd+0,15 ; Start Point (X) ld a,(ddd+3) call bar_char_sub move ddd+0,2 ; Start Point (X) ld a,(ddd+4) call bar_char_sub ret bar_char_sub: add a,a ld l,a ld h,0 ld de,bar_select add hl,de ld e,(hl) inc hl ld d,(hl) ; [DE] = Dot Data clear ddd+1 ; Start Point (Y) _d_20: ld a,(ddd+1) add a,a ld l,a ld h,0 ld bc,bar_y_sel add hl,bc ld c,(hl) inc hl ld b,(hl) ld a,(ddd+0) ld l,a ld h,0 add hl,bc ; [HL] = Draw Point lcd_add ld b,10 _d_30: ld a,(de) brz 0,_d_32 ld a,0ffh jp _d_35 _d_32: ld a,' ' _d_35: lcd_out inc de dec b jp nz,_d_30 inc_a ddd+1 cp 8 jp nz,_d_20 ret bar_select: dw bar_char_0,bar_char_1,bar_char_2,bar_char_3,bar_char_4 dw bar_char_5,bar_char_6,bar_char_7,bar_char_8,bar_char_9 bar_y_sel: dw 0,40,80,120,160,200,240,280 bar_char_0: db 0,1,1,1,1,1,1,1,1,0 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 0,1,1,1,1,1,1,1,1,0 bar_char_1: db 0,0,0,1,1,1,1,0,0,0 db 0,0,1,1,1,1,1,0,0,0 db 0,0,0,0,1,1,1,0,0,0 db 0,0,0,0,1,1,1,0,0,0 db 0,0,0,0,1,1,1,0,0,0 db 0,0,0,0,1,1,1,0,0,0 db 0,0,0,0,1,1,1,0,0,0 db 0,1,1,1,1,1,1,1,1,0 bar_char_2: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,0,0,0 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 bar_char_3: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,1,1,1,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 bar_char_4: db 0,0,0,0,0,1,1,1,0,0 db 0,0,0,0,0,1,1,1,0,0 db 1,1,1,0,0,1,1,1,0,0 db 1,1,1,0,0,1,1,1,0,0 db 1,1,1,0,0,1,1,1,0,0 db 1,1,1,1,1,1,1,1,1,1 db 0,0,0,0,0,1,1,1,0,0 db 0,0,0,0,0,1,1,1,0,0 bar_char_5: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,0,0,0 db 1,1,1,0,0,0,0,0,0,0 db 1,1,1,1,1,1,1,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 bar_char_6: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,0,0,0 db 1,1,1,0,0,0,0,0,0,0 db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 bar_char_7: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 bar_char_8: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 0,1,1,1,1,1,1,1,1,0 db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 bar_char_9: db 1,1,1,1,1,1,1,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 0,0,0,0,0,0,0,1,1,1 db 1,1,1,0,0,0,0,1,1,1 db 1,1,1,1,1,1,1,1,1,1 ;##### LCD Screens ##### lcd_initial_set: ; lcd_set 40h ; System Set lcd_put 30h ; Screen lcd_put 85h ; Field(X) lcd_put 7 ; Field(Y) lcd_put 39 ; C/R lcd_put 48 ; TC/R lcd_put 3fh ; L/F lcd_put 40 ; APL lcd_put 0 ; APH ; lcd_set 44h ; Scroll lcd_put 0 ; Start Address #1(L) lcd_put 0 ; (H) lcd_put 40h ; Line #1 lcd_put 0 ; Start Address #2(L) lcd_put 10h ; (H) lcd_put 40h ; Line #2 ; lcd_set 5ah ; HDot Scroll lcd_put 0 ; Scroll=0 ; lcd_set 5bh ; Overlay lcd_put 01h ; Character + Graphic ; lcd_set 58h ; Display OFF lcd_put 14h ; Parameter ; lcd_set 5dh ; Cursor Form lcd_put 04h ; X=5 lcd_put 86h ; Y=7 lcd_set 4ch ; Right lcd_set 46h ; Address Set lcd_put 0 lcd_put 0 ; lcd_set 52h ; Erase call wait_long call wait_long call wait_long lcd_set 59h ; Display ON lcd_put 14h ; Cursor OFF ret init_menu: ;;;; call lcd_initial_set clear disp_main clear disp_sub clear rx_top clear rx_end clear rsb clear dcb lcd_mes 1,1,init_mess_1 lcd_mes 2,1,init_mess_2 lcd_mes 3,1,init_mess_3 lcd_mes 4,1,init_mess_4 lcd_mes 5,1,init_mess_5 lcd_mes 6,1,init_mess_6 lcd_mes 7,1,init_mess_7 lcd_mes 8,1,init_mess_8 call disp_cursor ret init_mess_1: db '=== (^_^) MIDI DISPLAY by Y.N (^_^) ===',tail init_mess_2: db '| |',tail init_mess_3: db '| [A] Universal MIDI Stream Monitor |',tail init_mess_4: db '| [B] "Chaotic Grains" Bar Counter |',tail init_mess_5: db '| [C] (reserved) |',tail init_mess_6: db '| [D] (reserved) |',tail init_mess_7: db '| [E] (reserved) |',tail init_mess_8: db '|______________________________________|',tail clear_screen: lcd_mes 1,1,init_mess_0 lcd_mes 2,1,init_mess_0 lcd_mes 3,1,init_mess_0 lcd_mes 4,1,init_mess_0 lcd_mes 5,1,init_mess_0 lcd_mes 6,1,init_mess_0 lcd_mes 7,1,init_mess_0 lcd_mes 8,1,init_mess_0 ret init_mess_0: db ' ',tail disp_momitor: call clear_screen move mon_write,0 move mon_erase,16 move disp_main,1 ret disp_bar: call clear_screen move disp_main,2 ret ;##### Subroutines ##### wait_long: ld b,0ffh 1$: call wait_sub dec b jr nz,1$ ret wait_sub: ld a,0ffh 1$: nop dec a jr nz,1$ ret led_display: xor 0ffh out (pio_a+0),a io_put pio_b,80h io_put pio_b,0 ret lcd_disp_mess: lcd_add 1$: ld a,(de) cp tail ret z out (lcd),a inc de jp 1$ sw_scan: inc_a sw_status+0 cp 50 ret c clear sw_status+0 ld a,(sw_status+1) ; Old Status = [B] ld b,a in a,(pio_b) and 00000011b ld (sw_status+1),a ; Newest Status = [C] ld c,a xor b ret z ; Non Event ld a,c brz 00000011b,init_menu ; Both ON cp 0 ret z ; Both OFF ld a,b cp 0 ret nz ; Off Event ld a,c brz 00000010b,_20$ ; SW(1) ON brz 00000001b,_30$ ; SW(2) ON ret _20$: inc_chk disp_sub,5 call disp_cursor ret _30$: ld a,(disp_main) cp 1 ret z cp 2 ret z brz 0,_disp_menu ret _disp_menu: ld a,(disp_sub) brz 0,disp_momitor brz 1,disp_bar ret disp_cursor: ld a,(disp_main) brz 0,_disp_main ret _disp_main: ld a,(disp_sub) brz 0,10$_ brz 1,20$_ brz 2,30$_ brz 3,40$_ brz 4,50$_ ret 10$_: lcd_mes 3,3,_21_ lcd_mes 4,3,_12_ lcd_mes 5,3,_13_ lcd_mes 6,3,_14_ lcd_mes 7,3,_15_ ret 20$_: lcd_mes 3,3,_11_ lcd_mes 4,3,_22_ lcd_mes 5,3,_13_ lcd_mes 6,3,_14_ lcd_mes 7,3,_15_ ret 30$_: lcd_mes 3,3,_11_ lcd_mes 4,3,_12_ lcd_mes 5,3,_23_ lcd_mes 6,3,_14_ lcd_mes 7,3,_15_ ret 40$_: lcd_mes 3,3,_11_ lcd_mes 4,3,_12_ lcd_mes 5,3,_13_ lcd_mes 6,3,_24_ lcd_mes 7,3,_15_ ret 50$_: lcd_mes 3,3,_11_ lcd_mes 4,3,_12_ lcd_mes 5,3,_13_ lcd_mes 6,3,_14_ lcd_mes 7,3,_25_ ret _11_: db ' [A] ',tail _12_: db ' [B] ',tail _13_: db ' [C] ',tail _14_: db ' [D] ',tail _15_: db ' [E] ',tail _21_: db 0ffh,'[A]',0ffh,tail _22_: db 0ffh,'[B]',0ffh,tail _23_: db 0ffh,'[C]',0ffh,tail _24_: db 0ffh,'[D]',0ffh,tail _25_: db 0ffh,'[E]',0ffh,tail end