;----------------------------------------------------------------------- ; [PEGASUS-7] Sensor Box for "Strange Attractor" : October.1994 ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h rx_fifo ds 8192 tx_fifo ds 8192 rx_top ds 2 rx_end ds 2 tx_top ds 2 tx_end ds 2 rsb ds 1 dcb ds 1 channel ds 1 keyno ds 1 timer ds 1 led ds 1 ch_ctr ds 1 ch_status ds 8 bit_mask ds 1 sw ds 1 para ds 3 ;##### I/O Map ##### cseg sio_a equ 0018h sio_b equ 001ah 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,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+0) ld (hl),a inc de res 5,d ld (rx_top),de exx ex af,af' ei reti org 0066h retn ;##### Main ##### main: ld hl,08000h ld a,0f0h _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,00000000b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_put pio_a,11111111b ; io_set pio_b,0cfh ; Mode 3 io_set pio_b,11111111b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_set sio_b,00011000b ; Channel Reset B io_set sio_b,00000100b ; Resister Point = 4 io_set sio_b,11000100b ; Mode io_set sio_b,00000001b ; Resister Point = 1 io_set sio_b,00000000b ; Interrupt Mode io_set sio_b,00000010b ; Resister Point = 2 io_set sio_b,20h ; Vector Address 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,00010000b ; Interrupt Mode io_set sio_a,00000101b ; Resister Point = 5 io_set sio_a,01101000b ; Transmit Start io_set sio_a,00000011b ; Resister Point = 3 io_set sio_a,11000001b ; Receive Start im 2 ei ld a,10 ld (timer),a ld a,10 ld (para+0),a ld a,20 ld (para+1),a ld a,25 ld (para+2),a in a,(sio_a+0) ; dummy read loop: call rx_data_check call tx_data_check call timer_check jr loop ;##### Subroutines ##### led_display: ld c,0 ld a,(led) bit 0,a jr z,1$ set 7,c 1$: bit 1,a jr z,2$ set 6,c 2$: bit 2,a jr z,3$ set 5,c 3$: bit 3,a jr z,4$ set 4,c 4$: bit 4,a jr z,5$ set 3,c 5$: bit 5,a jr z,6$ set 2,c 6$: bit 6,a jr z,7$ set 1,c 7$: bit 7,a jr z,8$ set 0,c 8$: ld a,c xor 0ffh out (pio_a+0),a ret get_mask: ld c,0 ld a,(ch_ctr) cp 0 jr nz,11$ set 0,c jr 18$ 11$: cp 1 jr nz,12$ set 1,c jr 18$ 12$: cp 2 jr nz,13$ set 2,c jr 18$ 13$: cp 3 jr nz,14$ set 3,c jr 18$ 14$: cp 4 jr nz,15$ set 4,c jr 18$ 15$: cp 5 jr nz,16$ set 5,c jr 18$ 16$: cp 6 jr nz,17$ set 6,c jr 18$ 17$: cp 7 jr nz,18$ set 7,c 18$: ld a,c ret tx_data_check: ld de,(tx_end) ld hl,(tx_top) and a ; CY <-- 0 sbc hl,de ret z io_set sio_a,00000000b ; Resister Point = 0 in a,(sio_a+1) bit 2,a ret z ld a,10100000b or d ld h,a ld l,e ld a,(hl) out (sio_a),a inc de res 5,d ld (tx_end),de ret tx_fifo_set: push hl push de ld de,(tx_top) ld a,10100000b or d ld h,a ld l,e ld (hl),b inc de res 5,d ld (tx_top),de pop de pop hl ret rx_data_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) inc de res 5,d ld (rx_end),de bit 7,b jr z,50$ ; running ld a,b cp 0f8h ret nc cp 0f0h jr c,10$ xor a ld (rsb),a ret 10$: ld a,b and 00001111b ld (channel),a ld a,b and 11110000b ld (rsb),a xor a ld (dcb),a ret 50$: ld a,(rsb) cp 0 ret z cp 0c0h jr z,70$ cp 0d0h jr z,70$ ld a,(dcb) cp 0 jr nz,90$ inc a ld (dcb),a ld a,b ld (keyno),a ret 70$: ld c,b ld a,(rsb) ld d,a ld a,(channel) or d ld b,a call tx_fifo_set ld b,c call tx_fifo_set ret 90$: xor a ld (dcb),a ld c,b ld a,(rsb) ld d,a ld a,(channel) or d ld b,a call tx_fifo_set ld a,(keyno) ld b,a call tx_fifo_set ld b,c call tx_fifo_set ld a,(rsb) cp 0a0h ret nz ld a,(channel) cp 00eh ret nz ld a,(keyno) cp 0 jr z,_00 cp 1 jr z,_01 cp 2 jr z,_02 ret _00: ld a,c ld (para+0),a ret _01: ld a,c ld (para+1),a ret _02: ld a,c ld (para+2),a ret timer_check: ld a,(timer) dec a ld (timer),a cp 0 ret nz ld a,(para+0) ; Init = 10 ld (timer),a ld a,(ch_ctr) inc a and 00000111b ld (ch_ctr),a ld e,a ld d,0 ld hl,ch_status add hl,de ; (hl) = address ld a,(hl) ; Get Channel Status cp 0 jr z,_sw_check dec a ld (hl),a cp 0 jr nz,_tim_1 call get_mask xor 0ffh ld b,a ld a,(led) and b ld (led),a call led_display ret _tim_1: ld b,a ld a,(para+1) ; Init = 20 cp b ret nz ld b,09fh call tx_fifo_set ld a,(ch_ctr) ld b,a call tx_fifo_set ld b,0 call tx_fifo_set ret _sw_check: call get_mask ld e,a ; Mask in a,(pio_b) xor 0ffh and e ld c,a ; New Status ld a,(sw) and e ld d,a ; Old Status cp c ret z ; not event ld a,e xor 0ffh ld b,a ld a,(sw) and b or c ld (sw),a ld a,c cp 0 ret z ; off event ld b,09fh call tx_fifo_set ld a,(ch_ctr) ld b,a call tx_fifo_set ld b,1 call tx_fifo_set ld a,(para+2) ; Init = 25 ld (hl),a ld a,(led) or e ld (led),a call led_display ret end