; ; Testing Z80 PIO's with some LED's effects ; .ORG 100H ; CP/M programs start address JP START ; Go to program start ; ; Variable storage space ; Stack1 .DW 0 ; Place to save old stack Sbot .DS 64 ; Temp stack for us to use ; ; Constants ; STOP .EQU $-1 ; Top of our stack BDOS .EQU 5 ; Address of BDOS entry ; ; CP/M BIOS stuff ; iobyte .EQU 03H ; Intel standard I/O definition byte const .EQU 0E606H ; 2 Console status conin .EQU 0E609H ; 3 Console INput conout .EQU 0E60CH ; 4 Console OUTput ; ; Peripheral I/O adresses ; LEDS .EQU 00H ; Digital I/O board PIO1_A_D .EQU 068H ; Z80 PIO #1 PIO1_A_C .EQU 06AH PIO1_B_D .EQU 069H PIO1_B_C .EQU 06BH PIO2_A_D .EQU 06CH ; Z80 PIO #2 PIO2_A_C .EQU 06EH PIO2_B_D .EQU 06DH PIO2_B_C .EQU 06FH PIO3_A_D .EQU 0F0H ; Z80 PIO #3 PIO3_A_C .EQU 0F2H PIO3_B_D .EQU 0F1H PIO3_B_C .EQU 0F3H PIO4_A_D .EQU 0F4H ; Z80 PIO #4 PIO4_A_C .EQU 0F6H PIO4_B_D .EQU 0F5H PIO4_B_C .EQU 0F7H MSG_PIO1_A .DB "PIO #1 channel A", 13, 10, 0 MSG_PIO1_B .DB "PIO #1 channel B", 13, 10, 0 MSG_PIO2_A .DB "PIO #2 channel A", 13, 10, 0 MSG_PIO2_B .DB "PIO #2 channel B", 13, 10, 0 ; ; Start of code segment ; START: ; ------------------------------------------------------------ ; Starting sequence for CP/M programs LD HL, 0000H ; HL = 0 ADD HL, SP ; HL = SP LD (Stack1), HL ; Save original stack LD HL, STOP ; HL = address of new stack LD SP, HL ; Stack pointer = our stack ; ------------------------------------------------------------ ; Initialize Z80 PIO's LD A, 0FH ; Control word for PIO, set output mode OUT (PIO1_A_C), A ; PIO #1 port A OUT (PIO1_B_C), A ; PIO #1 port B OUT (PIO2_A_C), A ; PIO #2 port A OUT (PIO2_B_C), A ; PIO #2 port B OUT (PIO3_A_C), A ; PIO #3 port A OUT (PIO3_B_C), A ; PIO #3 port B OUT (PIO4_A_C), A ; PIO #4 port A OUT (PIO4_B_C), A ; PIO #4 port B ; Turn all LED's OFF XOR A ; LD A, 0 -> XOR A OUT (LEDS), A OUT (PIO1_A_D), A OUT (PIO1_B_D), A OUT (PIO2_A_D), A OUT (PIO2_B_D), A OUT (PIO3_A_D), A OUT (PIO3_B_D), A OUT (PIO4_A_D), A OUT (PIO4_B_D), A ; ------------------------------------------------------------ ; Test Z80 PIO's ; PIO #1 port A LD HL, MSG_PIO1_A ; MSG_PIO1_A HL = address of string CALL SEND_STR_CON ; Send string in (HL) to console LD A, 00000011B OUT (LEDS), A LD A, 01010101B OUT (PIO1_A_D), A CALL DELAY LD A, 00000010B OUT (LEDS), A LD A, 10101010B OUT (PIO1_A_D), A CALL DELAY LD A, 00H OUT (PIO1_A_D), A CALL DELAY CALL DELAY CALL DELAY ; PIO #1 port B LD HL, MSG_PIO1_B ; MSG_PIO1_B HL = address of string CALL SEND_STR_CON ; Send string in (HL) to console LD A, 00001100B OUT (LEDS), A LD A, 01010101B OUT (PIO1_B_D), A CALL DELAY LD A, 00001000B OUT (LEDS), A LD A, 10101010B OUT (PIO1_B_D), A CALL DELAY LD A, 00H OUT (PIO1_B_D), A CALL DELAY CALL DELAY CALL DELAY ; PIO #2 port A LD HL, MSG_PIO2_A ; MSG_PIO2_A HL = address of string CALL SEND_STR_CON ; Send string in (HL) to console LD A, 00110000B OUT (LEDS), A LD A, 01010101B OUT (PIO2_A_D), A CALL DELAY LD A, 00100000B OUT (LEDS), A LD A, 10101010B OUT (PIO2_A_D), A CALL DELAY LD A, 00H OUT (PIO2_A_D), A CALL DELAY CALL DELAY CALL DELAY ; PIO #2 port B LD HL, MSG_PIO2_B ; MSG_PIO2_B HL = address of string CALL SEND_STR_CON ; Send string in (HL) to console LD A, 11000000B OUT (LEDS), A LD A, 01010101B OUT (PIO2_B_D), A CALL DELAY LD A, 10000000B OUT (LEDS), A LD A, 10101010B OUT (PIO2_B_D), A CALL DELAY LD A, 00H OUT (PIO2_B_D), A CALL DELAY CALL DELAY CALL DELAY ; LED's OFF LD A, 0 OUT (LEDS), A ; Send A to Digital I/O board ; ------------------------------------------------------------ ; Finish and return to CP/M LD HL, (Stack1) ; HL = entry stack address LD SP, HL ; SP = value on entry RET ; Return control back to CP/M ;-------------------------------------------------------------------------------------- ; DELAY: ; Routine to add a delay ; PUSH BC PUSH DE LD C, 12 DELAY0: LD D, 0FFH DELAY1: LD B, 0FFH DELAY2: NOP DJNZ DELAY2 DEC D JR NZ, DELAY1 DEC C JR NZ, DELAY0 POP DE POP BC RET ;-------------------------------------------------------------------------------------- ; ; Send zero-terminated string in (HL) to console ; SEND_STR_CON: LD A, (HL) ; Read string char OR A ; Set CPU flags RET Z ; If char = 0 done LD C, A CALL conout ; Send char in C to console INC HL ; Point to next char JR SEND_STR_CON ; Do next char ;-------------------------------------------------------------------------------------- .END