; MOS6526 .ifndef _VIA_INC_ .ifndef _CIA_INC_ _CIA_INC_ = 1 .if (::PLATFORM = 64) | (::PLATFORM = 128) ; cia.inc defines C-64 and 1581 symbols, so it might be included along with, e.g., ted.inc ; C-64 keyboard matrix positions STOP_COLUMN = %01111111 STOP_ROW = %01111111 LEFT_SHIFT_COLUMN = %11111101 LEFT_SHIFT_ROW = %01111111 ALL_COLUMNS = %00000000 NO_ROWS = %11111111 .endif ; the two CIAs in the C-64 CIA1_BASE = $dc00 CIA_PIO0 = %00000001 CIA_PIO1 = %00000010 CIA_PIO2 = %00000100 CIA_PIO3 = %00001000 CIA_PIO4 = %00010000 CIA_PIO5 = %00100000 CIA_PIO6 = %01000000 CIA_PIO7 = %10000000 CIA1_PRA = CIA1_BASE + $00; Port register A KBD_COLUMN0 = ~CIA_PIO0 KBD_COLUMN1 = ~CIA_PIO1 KBD_COLUMN2 = ~CIA_PIO2 KBD_COLUMN3 = ~CIA_PIO3 KBD_COLUMN4 = ~CIA_PIO4 KBD_COLUMN5 = ~CIA_PIO4 KBD_COLUMN6 = ~CIA_PIO5 KBD_COLUMN7 = ~CIA_PIO5 JOY2_UP = ~CIA_PIO0 JOY2_DOWN = ~CIA_PIO1 JOY2_LEFT = ~CIA_PIO2 JOY2_RIGHT = ~CIA_PIO3 JOY2_FIRE = ~CIA_PIO4 PADDLE_ENPORT1 = CIA_PIO6 PADDLE_ENPORT2 = CIA_PIO7 PADDLE_EN_MASK = CIA_PIO5 | CIA_PIO4 | CIA_PIO3 | CIA_PIO2 | CIA_PIO1 | CIA_PIO0 CIA1_PRB = CIA1_BASE + $01; Port register B KBD_ROW0 = ~CIA_PIO0 KBD_ROW1 = ~CIA_PIO1 KBD_ROW2 = ~CIA_PIO2 KBD_ROW3 = ~CIA_PIO3 KBD_ROW4 = ~CIA_PIO4 KBD_ROW5 = ~CIA_PIO5 KBD_ROW6 = ~CIA_PIO6 KBD_ROW7 = ~CIA_PIO7 JOY1_UP = ~CIA_PIO0 JOY1_DOWN = ~CIA_PIO1 JOY1_LEFT = ~CIA_PIO2 JOY1_RIGHT = ~CIA_PIO3 JOY1_FIRE = ~CIA_PIO4 CIA1_DDRA = CIA1_BASE + $02; Data direction register A CIA_PIO0_OUTPUT = CIA_PIO0 CIA_PIO0_INPUT = %00000000 CIA_PIO1_OUTPUT = CIA_PIO1 CIA_PIO1_INPUT = %00000000 CIA_PIO2_OUTPUT = CIA_PIO2 CIA_PIO2_INPUT = %00000000 CIA_PIO3_OUTPUT = CIA_PIO3 CIA_PIO3_INPUT = %00000000 CIA_PIO4_OUTPUT = CIA_PIO4 CIA_PIO4_INPUT = %00000000 CIA_PIO5_OUTPUT = CIA_PIO5 CIA_PIO5_INPUT = %00000000 CIA_PIO6_OUTPUT = CIA_PIO6 CIA_PIO6_INPUT = %00000000 CIA_PIO7_OUTPUT = CIA_PIO7 CIA_PIO7_INPUT = %00000000 CIA1_DDRB = CIA1_BASE + $03; Data direction register B CIA1_TA_LO = CIA1_BASE + $04; Timer A, low byte CIA1_TA_HI = CIA1_BASE + $05; Timer A, high byte CIA1_TB_LO = CIA1_BASE + $06; Timer B, low byte CIA1_TB_HI = CIA1_BASE + $07; Timer B, high byte CIA1_TOD_10S = CIA1_BASE + $08; Time of day, 1/10 seconds CIA1_TOD_SEC = CIA1_BASE + $09; Time of day, seconds CIA1_TOD_MIN = CIA1_BASE + $0a; Time of day, minutes CIA1_TOD_HRS = CIA1_BASE + $0b; Time of day, hours TOD_AMPM = %10000000 TOD_AM = %00000000 TOD_PM = %10000000 TOD_HRS_MASK = %00011111 CIA1_SDR = CIA1_BASE + $0c; Serial data register CIA1_ICR = CIA1_BASE + $0d; Interrupt control register TIMERA_IRQ = %00000001 TIMERB_IRQ = %00000010 TOD_IRQ = %00000100 SERIAL_IRQ = %00001000 FLAG1_IRQ = %00010000 EVERY_IRQ = %01111111 CIA_INTERRUPT = %10000000 CIA_CLR_INTF = %00000000 CIA_SET_INTF = %10000000 CIA1_CRA = CIA1_BASE + $0e; Control Register A TIMER_STOP = %00000000 TIMER_START = %00000001 OUTPUT_TO_PB6 = %00000010 OUTPUT_PULSE = %00000000 OUTPUT_TOGGLE = %00000100 CONTINUOUS = %00000000 ONE_SHOT = %00001000 FORCE_LOAD = %00010000 COUNT_PHI2 = %00000000 COUNT_CNT = %00100000 IOMODE_INPUT = %00000000 IOMODE_OUTPUT = %01000000 TOD_FREQ_60HZ = %00000000 TOD_FREQ_50HZ = %10000000 TOD_FREQ_MASK = TOD_FREQ_50HZ CIA1_CRB = CIA1_BASE + $0f; Control Register B ;TIMER_STOP = %00000000 ;TIMER_START = %00000001 OUTPUT_TO_PB7 = %00000010 ;OUTPUT_PULSE = %00000000 ;OUTPUT_TOGGLE = %00000100 ;CONTINUOUS = %00000000 ;ONE_SHOT = %00001000 ;FORCE_LOAD = %00010000 ;COUNT_PHI2 = %00000000 COUNT_CNT_POS = %00100000 COUNT_TA_UNDF = %01000000 COUNT_TA_UFCN = %01100000 COUNT_CRB_MASK = COUNT_TA_UFCN TOD_SET_CLOCK = %00000000 TOD_SET_ALARM = %10000000 CIA2_BASE = $dd00 ;CIA_PIO0 = %00000001 ;CIA_PIO1 = %00000010 ;CIA_PIO2 = %00000100 ;CIA_PIO3 = %00001000 ;CIA_PIO4 = %00010000 ;CIA_PIO5 = %00100000 ;CIA_PIO6 = %01000000 ;CIA_PIO7 = %10000000 CIA2_PRA = CIA2_BASE + $00; Port register A VIC2_BANK = %00000011 VIC2_BANK0 = %00000000 VIC2_BANK1 = CIA_PIO0 VIC2_BANK2 = CIA_PIO1 VIC2_BANK3 = CIA_PIO1 | CIA_PIO0 VIC2_BANK_SHIFT = 0 VIC2_BANK_MASK = VIC2_BANK .define VIC2_MAKE_BANK(address) .lobyte(((address & $c000) >> 14) ^ 3) RS232_TXD = CIA_PIO2 SERIAL_ATN_OUT = CIA_PIO3 SERIAL_CLK_OUT = CIA_PIO4 SERIAL_DATA_OUT = CIA_PIO5 SERIAL_CLK_IN = CIA_PIO6 SERIAL_DATA_IN = CIA_PIO7 CIA2_PRB = CIA2_BASE + $01; Port register B RS232_RXD = CIA_PIO0 RS232_RTS = CIA_PIO1 RS232_DTR = CIA_PIO2 RS232_RING = CIA_PIO3 RS232_CARRIER = CIA_PIO4 USERPORT_PB5 = CIA_PIO5 RS232_CTS = CIA_PIO6 RS232_DSR = CIA_PIO7 CIA2_DDRA = CIA2_BASE + $02; Data direction register A ;CIA_PIO0_OUTPUT = CIA_PIO0 ;CIA_PIO0_INPUT = %00000000 ;CIA_PIO1_OUTPUT = CIA_PIO1 ;CIA_PIO1_INPUT = %00000000 CIA_VIC2_BANK_OUTPUT = CIA_PIO0 | CIA_PIO1 CIA_VIC2_BANK_INPUT = %00000000 ;CIA_PIO2_OUTPUT = CIA_PIO2 ;CIA_PIO2_INPUT = %00000000 CIA_RS232_TXD_OUTPUT = CIA_PIO2 CIA_RS232_TXD_INPUT = %00000000 ;CIA_PIO3_OUTPUT = CIA_PIO3 ;CIA_PIO3_INPUT = %00000000 CIA_SERIAL_ATN_OUT_OUTPUT = CIA_PIO3 CIA_SERIAL_ATN_OUT_INPUT = %00000000 ;CIA_PIO4_OUTPUT = CIA_PIO4 ;CIA_PIO4_INPUT = %00000000 CIA_SERIAL_CLK_OUT_OUTPUT = CIA_PIO4 CIA_SERIAL_CLK_OUT_INPUT = %00000000 ;CIA_PIO5_OUTPUT = CIA_PIO5 ;CIA_PIO5_INPUT = %00000000 CIA_SERIAL_DATA_OUT_OUTPUT = CIA_PIO5 CIA_SERIAL_DATA_OUT_INPUT = %00000000 ;CIA_PIO6_OUTPUT = CIA_PIO6 ;CIA_PIO6_INPUT = %00000000 CIA_SERIAL_CLK_IN_OUTPUT = CIA_PIO6 CIA_SERIAL_CLK_IN_INPUT = %00000000 ;CIA_PIO7_OUTPUT = CIA_PIO7 ;CIA_PIO7_INPUT = %00000000 CIA_SERIAL_DATA_IN_OUTPUT = CIA_PIO7 CIA_SERIAL_DATA_IN_INPUT = %00000000 CIA2_DDRB = CIA2_BASE + $03; Data direction register B CIA2_TA_LO = CIA2_BASE + $04; Timer A, low byte CIA2_TA_HI = CIA2_BASE + $05; Timer A, high byte CIA2_TB_LO = CIA2_BASE + $06; Timer B, low byte CIA2_TB_HI = CIA2_BASE + $07; Timer B, high byte CIA2_TOD_10S = CIA2_BASE + $08; Time of day, 1/10 seconds CIA2_TOD_SEC = CIA2_BASE + $09; Time of day, seconds CIA2_TOD_MIN = CIA2_BASE + $0a; Time of day, minutes CIA2_TOD_HRS = CIA2_BASE + $0b; Time of day, hours ;TOD_AMPM = %10000000 ;TOD_AM = %00000000 ;TOD_PM = %10000000 ;TOD_HRS_MASK = %00011111 CIA2_SDR = CIA2_BASE + $0c; Serial data register CIA2_ICR = CIA2_BASE + $0d; Interrupt control register TIMERA_NMI = %00000001 TIMERB_NMI = %00000010 TOD_NMI = %00000100 SERIAL_NMI = %00001000 FLAG1_NMI = %00010000 EVERY_NMI = %01111111 ;CIA_INTERRUPT = %10000000 ;CIA_CLR_INTF = %00000000 ;CIA_SET_INTF = %10000000 CIA2_CRA = CIA2_BASE + $0e; Control Register A ;TIMER_STOP = %00000000 ;TIMER_START = %00000001 ;OUTPUT_TO_PB6 = %00000010 ;OUTPUT_PULSE = %00000000 ;OUTPUT_TOGGLE = %00000100 ;CONTINUOUS = %00000000 ;ONE_SHOT = %00001000 ;FORCE_LOAD = %00010000 ;COUNT_PHI2 = %00000000 ;COUNT_CNT = %00100000 SERIAL_INPUT = %00000000 SERIAL_OUTPUT = %01000000 ;TOD_FREQ_60HZ = %00000000 ;TOD_FREQ_50HZ = %10000000 CIA2_CRB = CIA2_BASE + $0f; Control Register B ;TIMER_STOP = %00000000 ;TIMER_START = %00000001 ;OUTPUT_TO_PB7 = %00000010 ;OUTPUT_PULSE = %00000000 ;OUTPUT_TOGGLE = %00000100 ;CONTINUOUS = %00000000 ;ONE_SHOT = %00001000 ;FORCE_LOAD = %00010000 ;COUNT_PHI2 = %00000000 ;COUNT_CNT_POS = %00100000 ;COUNT_TA_UNDF = %01000000 ;COUNT_TA_UFCN = %01100000 ;COUNT_CRB_MASK = COUNT_TA_UFCN ;TOD_SET_CLOCK = %00000000 ;TOD_SET_ALARM = %10000000 ; the CIA in the 1571 (not CR) and 1581 ; on 1571, only the fast serial interface is connected ; on 1571CR, only the fast serial interface is implemented (MOS5710) CIA_BASE = $4000 ;CIA_PIO0 = %00000001 ;CIA_PIO1 = %00000010 ;CIA_PIO2 = %00000100 ;CIA_PIO3 = %00001000 ;CIA_PIO4 = %00010000 ;CIA_PIO5 = %00100000 ;CIA_PIO6 = %01000000 ;CIA_PIO7 = %10000000 CIA_PRA = CIA_BASE + $00; Port register A SIDE_SELECT = CIA_PIO0 DISK_INSERTED = CIA_PIO1 DISK_IS_INSERTED = %00000000 NO_DISK_IS_INSERTED = DISK_INSERTED MOTOR = CIA_PIO2 MOTOR_ON = %00000000 MOTOR_OFF = MOTOR DEVICE_NUMBER = CIA_PIO3 | CIA_PIO4 DEVICE_NUMBER_8 = %00000000 DEVICE_NUMBER_9 = CIA_PIO3 DEVICE_NUMBER_10 = CIA_PIO4 DEVICE_NUMBER_11 = CIA_PIO3 | CIA_PIO4 DEVICE_NUMBER_SHIFT = 3 DEVICE_NUMBER_MASK = DEVICE_NUMBER POWER_LED = CIA_PIO5 DRIVE_LED = CIA_PIO6 DISK_CHANGE = CIA_PIO7 DISK_CHANGED = %00000000 NO_DISK_CHANGED = DISK_CHANGE CIA_PRB = CIA_BASE + $01; Port register B DATA_IN = CIA_PIO0 DATA_OUT = CIA_PIO1 CLK_IN = CIA_PIO2 CLK_OUT = CIA_PIO3 ATNA_ENABLE_OUT = CIA_PIO4 FSM_BUS_DRIVER_DIRECTION = CIA_PIO5 FSM_BUS_DRIVER_INPUT = %00000000 FSM_BUS_DRIVER_OUTPUT = FSM_BUS_DRIVER_DIRECTION WRITE_PROTECT = CIA_PIO6 ATN_IN = CIA_PIO7 CIA_DDRA = CIA_BASE + $02; Data direction register A ;CIA_PIO0_OUTPUT = CIA_PIO0 ;CIA_PIO0_INPUT = %00000000 ;CIA_PIO1_OUTPUT = CIA_PIO1 ;CIA_PIO1_INPUT = %00000000 ;CIA_PIO2_OUTPUT = CIA_PIO2 ;CIA_PIO2_INPUT = %00000000 ;CIA_PIO3_OUTPUT = CIA_PIO3 ;CIA_PIO3_INPUT = %00000000 ;CIA_PIO4_OUTPUT = CIA_PIO4 ;CIA_PIO4_INPUT = %00000000 ;CIA_PIO5_OUTPUT = CIA_PIO5 ;CIA_PIO5_INPUT = %00000000 ;CIA_PIO6_OUTPUT = CIA_PIO6 ;CIA_PIO6_INPUT = %00000000 ;CIA_PIO7_OUTPUT = CIA_PIO7 ;CIA_PIO7_INPUT = %00000000 CIA_DDRB = CIA_BASE + $03; Data direction register B DATA_IN_OUTPUT = CIA_PIO0 DATA_IN_INPUT = %00000000 DATA_OUT_OUTPUT = CIA_PIO1 DATA_OUT_INPUT = %00000000 CLK_IN_OUTPUT = CIA_PIO2 CLK_IN_INPUT = %00000000 CLK_OUT_OUTPUT = CIA_PIO3 CLK_OUT_INPUT = %00000000 ATNA_ENABLE_OUT_OUTPUT = CIA_PIO4 ATNA_ENABLE_OUT_INPUT = %00000000 FSM_BUS_DRIVER_DIRECTION_OUTPUT = CIA_PIO5 FSM_BUS_DRIVER_DIRECTION_INPUT = %00000000 WRITE_PROTECT_OUTPUT = CIA_PIO6 WRITE_PROTECT_INPUT = %00000000 CIA_ATN_IN_OUTPUT = CIA_PIO7 CIA_ATN_IN_INPUT = %00000000 CIA_TA_LO = CIA_BASE + $04; Timer A, low byte CIA_TA_HI = CIA_BASE + $05; Timer A, high byte CIA_TB_LO = CIA_BASE + $06; Timer B, low byte CIA_TB_HI = CIA_BASE + $07; Timer B, high byte CIA_TOD_10S = CIA_BASE + $08; Time of day, 1/10 seconds CIA_TOD_SEC = CIA_BASE + $09; Time of day, seconds CIA_TOD_MIN = CIA_BASE + $0a; Time of day, minutes CIA_TOD_HRS = CIA_BASE + $0b; Time of day, hours ;TOD_AMPM = %10000000 ;TOD_AM = %00000000 ;TOD_PM = %10000000 ;TOD_HRS_MASK = %00011111 CIA_SDR = CIA_BASE + $0c; Serial data register CIA_ICR = CIA_BASE + $0d; Interrupt control register ;TIMERA_IRQ = %00000001 ;TIMERB_IRQ = %00000010 ;TOD_IRQ = %00000100 ;SERIAL_IRQ = %00001000 ;FLAG1_IRQ = %00010000 ;EVERY_IRQ = %01111111 ;CIA_INTERRUPT = %10000000 ;CIA_CLR_INTF = %00000000 ;CIA_SET_INTF = %10000000 CIA_CRA = CIA_BASE + $0e; Control Register A ;TIMER_STOP = %00000000 ;TIMER_START = %00000001 ;OUTPUT_TO_PB6 = %00000010 ;OUTPUT_PULSE = %00000000 ;OUTPUT_TOGGLE = %00000100 ;CONTINUOUS = %00000000 ;ONE_SHOT = %00001000 ;FORCE_LOAD = %00010000 ;COUNT_PHI2 = %00000000 ;COUNT_CNT = %00100000 ;IOMODE_INPUT = %00000000 ;IOMODE_OUTPUT = %01000000 ;TOD_FREQ_60HZ = %00000000 ;TOD_FREQ_50HZ = %10000000 ;TOD_FREQ_MASK = TOD_FREQ_50HZ CIA_CRB = CIA_BASE + $0f; Control Register B ;TIMER_STOP = %00000000 ;TIMER_START = %00000001 ;OUTPUT_TO_PB7 = %00000010 ;OUTPUT_PULSE = %00000000 ;OUTPUT_TOGGLE = %00000100 ;CONTINUOUS = %00000000 ;ONE_SHOT = %00001000 ;FORCE_LOAD = %00010000 ;COUNT_PHI2 = %00000000 ;COUNT_CNT_POS = %00100000 ;COUNT_TA_UNDF = %01000000 ;COUNT_TA_UFCN = %01100000 ;COUNT_CRB_MASK = COUNT_TA_UFCN ;TOD_SET_CLOCK = %00000000 ;TOD_SET_ALARM = %10000000 .endif; !_CIA_INC_ .endif; !_VIA_INC_