diff --git a/Source/HBIOS/acia.asm b/Source/HBIOS/acia.asm index 58d6ec0d..7cfb5691 100644 --- a/Source/HBIOS/acia.asm +++ b/Source/HBIOS/acia.asm @@ -27,9 +27,25 @@ ACIA_ACIA .EQU 1 ACIAA_BASE .EQU $80 + $20 ; MODULE A ACIAB_BASE .EQU $40 + $20 ; MODULE B ; +#IF (INTMODE == 0) +; +ACIA_RTSON .EQU %00010110 ; NO RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD +ACIA_RTSOFF .EQU %01010110 ; NO RCV INT, RTS DEASSERTED, 8N1, CLK/64 BAUD +; +#ENDIF +; +#IF (INTMODE == 1) +; ACIA_RTSON .EQU %10010110 ; RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD ACIA_RTSOFF .EQU %11010110 ; RCV INT, RTS DEASSERTED, 8N1, CLK/64 BAUD ; +#ENDIF + +#IF (INTMODE > 1) + .ECHO "*** ERROR: UNSUPPORTED INTMODE FOR ACIA DRIVER!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR +#ENDIF +; ; ; ACIA_PREINIT: @@ -55,7 +71,7 @@ ACIA_PREINIT0: POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE POP BC ; RESTORE LOOP CONTROL ; - LD A,(IY + 1) ; GET THE ACIA TYPE DETECTED + LD A,(IY+1) ; GET THE ACIA TYPE DETECTED OR A ; SET FLAGS JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND ; @@ -75,7 +91,7 @@ ACIA_PREINIT2: ; ACIA_INITUNIT: CALL ACIA_DETECT ; DETERMINE ACIA TYPE - LD (IY + 1),A ; SAVE IN CONFIG TABLE + LD (IY+1),A ; SAVE IN CONFIG TABLE OR A ; SET FLAGS RET Z ; ABORT IF NOTHING THERE @@ -84,7 +100,8 @@ ACIA_INITUNIT: LD A,(HL) ; PUT IN ACCUM INC (HL) ; INCREMENT IT (FOR NEXT LOOP) LD (IY),A ; UDPATE UNIT NUM - +; +#IF (INTMODE == 1) ; ADD IM1 INT CALL LIST ENTRY LD L,(IY+6) ; GET RCVBUF PTR LD H,(IY+7) ; ... INTO HL @@ -95,6 +112,7 @@ ACIA_INITUNIT: LD H,(HL) ; ... LD L,A ; ... CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST +#ENDIF ; SET DEFAULT CONFIG LD DE,-1 ; LEAVE CONFIG ALONE @@ -117,7 +135,7 @@ ACIA_INIT1: PUSH HL ; COPY CFG DATA PTR POP IY ; ... TO IY - LD A,(IY + 1) ; GET ACIA TYPE + LD A,(IY+1) ; GET ACIA TYPE OR A ; SET FLAGS CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO @@ -130,6 +148,8 @@ ACIA_INIT1: ; ; INTERRUPT HANDLERS ; +#IF (INTMODE > 0) +; ACIAA_INT: LD IY,ACIAA_CFG ; POINT TO CONFIG ; @@ -216,6 +236,8 @@ ACIAB_INT1: OR $FF ; NZ SET TO INDICATE INT HANDLED RET ; AND RETURN ; +#ENDIF +; ; DRIVER FUNCTION TABLE ; ACIA_FNTBL: @@ -232,6 +254,19 @@ ACIA_FNTBL: ; ; ; +#IF (INTMODE == 0) +; +ACIA_IN: + CALL ACIA_IST ; CHAR WAITING? + JR Z,ACIA_IN ; LOOP IF NOT + LD C,(IY+3) ; C := ACIA BASE PORT + INC C ; BUMP TO DATA PORT + IN E,(C) ; GET BYTE + XOR A ; SIGNAL SUCCESS + RET +; +#ELSE +; ACIA_IN: LD A,(IY+2) ; GET MODULE ID OR A ; SET FLAGS @@ -251,7 +286,7 @@ ACIAA_IN: CP 5 ; BUFFER LOW THRESHOLD JR NZ,ACIAA_IN0 ; IF NOT, BYPASS SETTING RTS - LD C,(IY + 3) ; C := ACIA CMD PORT + LD C,(IY+3) ; C := ACIA CMD PORT LD A,ACIA_RTSON ; ASSERT RTS OUT (C),A ; DO IT ACIAA_IN0: @@ -278,7 +313,7 @@ ACIAB_IN: CP 5 ; BUFFER LOW THRESHOLD JR NZ,ACIAB_IN0 ; IF NOT, BYPASS SETTING RTS - LD C,(IY + 3) ; C := ACIA CMD PORT + LD C,(IY+3) ; C := ACIA CMD PORT LD A,ACIA_RTSON ; ASSERT RTS OUT (C),A ; DO IT ACIAB_IN0: @@ -295,12 +330,14 @@ ACIAB_IN1: XOR A ; SIGNAL SUCCESS RET ; AND DONE ; +#ENDIF +; ; ; ACIA_OUT: CALL ACIA_OST ; READY FOR CHAR? JR Z,ACIA_OUT ; LOOP IF NOT - LD C,(IY + 3) ; C := ACIA CMD PORT + LD C,(IY+3) ; C := ACIA CMD PORT INC C ; BUMP TO DATA PORT OUT (C),E ; SEND CHAR FROM E XOR A ; SIGNAL SUCCESS @@ -308,6 +345,19 @@ ACIA_OUT: ; ; ; +#IF (INTMODE == 0) +; +ACIA_IST: + LD C,(IY+3) ; STATUS PORT + IN A,(C) ; GET STATUS + AND $01 ; ISOLATE BIT 0 (RX READY) + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + XOR A ; ZERO ACCUM + INC A ; ASCCUM := 1 TO SIGNAL 1 CHAR WAITING + RET ; DONE +; +#ELSE +; ACIA_IST: LD A,(IY+2) ; GET MODULE ID OR A ; SET FLAGS @@ -329,10 +379,12 @@ ACIAB_IST: JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING RET ; AND DONE ; +#ENDIF +; ; ; ACIA_OST: - LD C,(IY + 3) ; CMD PORT + LD C,(IY+3) ; CMD PORT IN A,(C) ; GET STATUS AND $02 ; ISOLATE BIT 2 (TX EMPTY) JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING @@ -346,15 +398,17 @@ ACIA_INITDEV: HB_DI ; AVOID CONFLICTS ; ; PROGRAM THE ACIA CHIP - LD C,(IY + 3) ; COMMAND PORT + LD C,(IY+3) ; COMMAND PORT LD A,$FF ; MASTER RESET OUT (C),A ; DO IT LD A,ACIA_RTSON ; NORMAL OPERATION OUT (C),A ; DO IT +; +#IF (INTMODE > 0) ; ; RESET THE RECEIVE BUFFER - LD E,(IY + 6) - LD D,(IY + 7) ; DE := _CNT + LD E,(IY+6) + LD D,(IY+7) ; DE := _CNT XOR A ; A := 0 LD (DE),A ; _CNT = 0 INC DE ; DE := ADR OF _HD @@ -371,6 +425,8 @@ ACIA_INITDEV: LD (HL),E INC HL LD (HL),D ; _TL := _BUF +; +#ENDIF ; HB_EI ; READY FOR INTS AGAIN XOR A ; SIGNAL SUCCESS @@ -379,8 +435,8 @@ ACIA_INITDEV: ; ; ACIA_QUERY: - LD E,(IY + 4) ; FIRST CONFIG BYTE TO E - LD D,(IY + 5) ; SECOND CONFIG BYTE TO D + LD E,(IY+4) ; FIRST CONFIG BYTE TO E + LD D,(IY+5) ; SECOND CONFIG BYTE TO D XOR A ; SIGNAL SUCCESS RET ; DONE ; @@ -408,7 +464,7 @@ ACIA_DETECT: ACIA_DETECT1: ; ACIA FOUND, RECORD IT ;LD A,C ; BASE PORT ADDRESS TO A - ;LD (IY + 3),A ; SAVE ACTIVE BASE PORT + ;LD (IY+3),A ; SAVE ACTIVE BASE PORT LD A,ACIA_ACIA ; RETURN CHIP TYPE RET ; DONE ; @@ -436,12 +492,12 @@ ACIA_PRTCFG: LD A,(IY) ; DEVICE NUM CALL PRTDECB ; PRINT DEVICE NUM PRTS(": IO=0x$") ; FORMATTING - LD A,(IY + 3) ; GET BASE PORT + LD A,(IY+3) ; GET BASE PORT CALL PRTHEXBYTE ; PRINT BASE PORT ; PRINT THE ACIA TYPE CALL PC_SPACE ; FORMATTING - LD A,(IY + 1) ; GET ACIA TYPE BYTE + LD A,(IY+1) ; GET ACIA TYPE BYTE RLCA ; MAKE IT A WORD OFFSET LD HL,ACIA_TYPE_MAP ; POINT HL TO TYPE MAP TABLE CALL ADDHLA ; HL := ENTRY @@ -451,13 +507,13 @@ ACIA_PRTCFG: CALL WRITESTR ; PRINT IT ; ; ALL DONE IF NO ACIA WAS DETECTED - LD A,(IY + 1) ; GET ACIA TYPE BYTE + LD A,(IY+1) ; GET ACIA TYPE BYTE OR A ; SET FLAGS RET Z ; IF ZERO, NOT PRESENT ; PRTS(" MODE=$") ; FORMATTING - LD E,(IY + 4) ; LOAD CONFIG - LD D,(IY + 5) ; ... WORD TO DE + LD E,(IY+4) ; LOAD CONFIG + LD D,(IY+5) ; ... WORD TO DE CALL PS_PRTSC0 ; PRINT CONFIG ; XOR A @@ -476,6 +532,13 @@ ACIA_STR_ACIA .DB "ACIA$" ; ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT ; +#IF (INTMODE == 0) +; +ACIAA_RCVBUF .EQU 0 +ACIAB_RCVBUF .EQU 0 +; +#ELSE +; ; RECEIVE BUFFERS ; ACIAA_RCVBUF: @@ -496,6 +559,8 @@ ACIAB_BUF .FILL 32,0 ; RECEIVE RING BUFFER ACIAB_BUFEND .EQU $ ; END OF BUFFER ACIAB_BUFSZ .EQU $ - ACIAB_BUF ; SIZE OF RING BUFFER ; +#ENDIF +; ; ACIA PORT TABLE ; ACIA_CFG: diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index c30ab09f..6d3970e4 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -507,7 +507,7 @@ BROK: LD A,E ; 112233445566d1d0 CC RRA ; CC112233445566d1 d0 RRA ; d0CC112233445566 d1 - RRA ; d1d0CC1122334455 66 + RRA ; d1d0CC1122334455 66 LD D,A RRA ; 66d1d0CC11223344 55 AND $60 ; 0011110000000000 00 @@ -555,6 +555,8 @@ BROK: LD HL,SIO_INITVALS ; POINT TO INIT VALUES LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE OTIR ; WRITE ALL VALUES +; +#IF (INTMODE > 0) ; ; RESET THE RECEIVE BUFFER LD E,(IY+6) @@ -575,6 +577,8 @@ BROK: LD (HL),E INC HL LD (HL),D ; _TL := _BUF +; +#ENDIF ; HB_EI ; READY FOR INTS AGAIN XOR A ; SIGNAL SUCCESS