; ;================================================================================================== ; NABU INTERRUPT INTERCEPTOR ;================================================================================================== ; NABU_INT1CLR .EQU $68 NABU_TICCNT .EQU $FFEA ; TICCNT AT $FFEA IS COPIED DOWN TO $000B ; ; NABU INTERRUPT ENABLE PORT AND STATUS PORTS ARE MANAGED BY THE ; PSG IO PORTS. ; ; INTERRUPT ENABLE (OUTPUT) - PSG PORT A ; ; D7 - HCCA Receive ; D6 - HCCA Send ; D5 - Keyboard ; D4 - Video Frame Sync ; D3 - Option Card 0 (J9) ; D2 - Option Card 1 (J10) ; D1 - Option Card 2 (J11) ; DO - Option Card 3 (J12) ; ; STATUS BYTE (INPUT) - PSG PORT B ; ; D7 - N.C. ; D6 - Overrun Error (HCCA UART) ; D5 - Framing Error (HCCA UART) ; D4 - Printer Busy ; D3 - A2 Priority ; D2 - A1 Priority ; D1 - AO Priority ; DO - Interrupt Request ; ; PORTS TO MANAGE PSG ; NABU_RSEL .EQU $41 ; SELECT PSG REGISTER NABU_RDAT .EQU $40 ; WRITE TO SELECTED REGISTER NABU_RIN .EQU $40 ; READ FROM SELECTED REGISTER ; DEVECHO "NABU: IO=" DEVECHO NABU_INT1CLR DEVECHO "\n" ; ; ; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION ; NABU_PREINIT: ; INITIALIZE THE NABU PSG I/O PORTS ; PORT A IN WRITE MODE AND SET ALL BITS TO ZERO ; PORT B IN READ MODE ; CALL NABU_SETPSG ; ;#IF (INTMODE == 1) ; ; ADD TO INTERRUPT CHAIN ; LD HL,NABU_STAT ; CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST ;#ENDIF ; ;#IF (INTMODE == 2) ; LD HL,NABU_STAT ; LD (IVT(INT_NABUKB)),HL ; IVT INDEX ;#ENDIF ; RET ; NABU_INIT: CALL NEWLINE ; FORMATTING PRTS("NABU: INT1$") ; XOR A ; OUT (NABU_INT1CLR),A RET ; DONE ; NABU_SETPSG: ; SET I/O PORT MODES LD A,7 ; PSG R7 (ENABLE REG) OUT (NABU_RSEL),A ; SELECT IT LD A,%01111111 ; PORT B INPUT, PORT A OUPUT OUT (NABU_RDAT),A ; SET IT ; ; SET PORT A TO VALUE 0 LD A,14 ; PSG R14 (PORT A DATA) OUT (NABU_RSEL),A ; SELECT IT #IF (INTMODE > 0) LD A,%00100000 ; ENABLE NABU KB INTS #ELSE XOR A #ENDIF OUT (NABU_RDAT),A ; SET IT ; LD A,15 OUT (NABU_RSEL),A IN A,(NABU_RIN) RET ; ; INTERRUPT ENTRY POINT ; NABU_STAT: ; CALL NABU_SETPSG ; XOR A ; OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT LD HL,(NABU_TICCNT) ; INCREMENT NABU TICK COUNTER INC HL ; ... IN HBIOS PROXY LD (NABU_TICCNT),HL ; LD A,(NABU_HBTICK) ; INCREMENT INTERNAL TICK CTR ; INC A ; LD (NABU_HBTICK),A ; CP $0A ; CALL HB_TICK EVERY 10 INTERRUPTS (50HZ) ; RET NZ ; NOT TIME THEN JUST RETURN CALL HB_TICK ; DO NORMAL HBIOS TICK XOR A ; LD (NABU_HBTICK),A ; RESET HBTICK COUNTER INC A ; INTERRUPT HANDLED RET ; NABU_HBTICK: .DB 0 ; INTERNAL TICK CTR ;