' Advanced Communication Board Developer Toolkit ' (c)Copyright 1993-1995, Sealevel Systems Incorporated ' '==================================================================== ' BASIC Asynchronous DMA Test Program '==================================================================== DATAPORT = &H238 'ACB Base Adderss Control = DATAPORT + 1 'Channel A CONTROL Port ESCC = 0 '==================================================================== ' INITIALIZE THE 8530 SCC '==================================================================== READ REG 'CHANNEL RESET OUT Control, REG 'A AND B READ D OUT Control, D 'CHECK FOR PRESENCE OF ESCC (85230) OUT Control, 15 'ENABLE ACCESS OUT Control, &H1 'TO WR7' (TESTING BIT) OUT Control, 15 'WAS WRITE SUCCESSFUL? IF (INP(Control) AND &H1) = &H1 THEN 'YES - GO ON... OUT Control, 15 'ENABLE ACCESS OUT Control, &H0 'TO WR7 (TESTING BIT) OUT Control, 15 'WAS WRITE SUCCESSFUL? IF (INP(Control) AND &H1) = 0 THEN 'YES - WE HAVE AN ESCC! 'ESCC DETECTED - TAKE ACTION ESCC = 1 OUT Control, 15 'ENABLE ACCESS OUT Control, &H1 'TO WR7' OUT Control, 7 'EX_READ_ENABLE OUT Control, &H50 'AND DTR_REQ_TIMING OUT Control, 15 'ENABLE ACCESS OUT Control, &H0 'TO WR7 ELSE 'ESCC NOT DETECTED - MUST HAVE 8530 ESCC = 0 END IF ELSE 'ESCC NOT DETECTED - MUST HAVE 8530 ESCC = 0 END IF 'FINISH INITIALIZING SCC/ESCC L1: READ REG 'GET REGISTER # IF REG = 255 THEN GOTO MENU 'TEST FOR END OF DATA OUT Control, REG 'SET REGISTER # READ D 'READ DATA OUT Control, D 'SEND DATA GOTO L1 'LOOP UNTIL DONE '==================================================================== ' PRINT THE MENU '==================================================================== MENU: CLS COLOR 0, 7 LOCATE 1, 23: PRINT " - BASIC DMA DEMO PROCEDURES - ": COLOR 7, 0 LOCATE 3, 25: PRINT "1) Receive a block via DMA" LOCATE 4, 25: PRINT "2) Transmit a block via DMA" LOCATE 5, 25: PRINT "3) Exit" LOCATE 10, 23: COLOR 0, 7 IF ESCC = 1 THEN PRINT "Detected an 85230." ELSE PRINT "85230 chip not detected." END IF COLOR 7, 0 LOCATE 7, 25: INPUT "Selection: ", SLECT SELECT CASE SLECT CASE 1: GOTO RXBLOCK CASE 2: GOTO TXBLOCK CASE 3: CLS : END END SELECT GOTO MENU '==================================================================== ' TRANSMIT A BLOCK '==================================================================== TXBLOCK: CLS LOCATE 1, 20 COLOR 0, 7: PRINT " - BLOCK TRANSMIT ROUTINE VIA DMA - " COLOR 7, 0 LOCATE 3, 1: INPUT "String to transmit: ", BLOCK$ MODE1 = &HC0 'DMA REQUEST ON TRANSMIT MODE2 = &H49 'DMA READ TRANSFER GOTO SETDMA 'INITILIZE DMA AND START XFER '==================================================================== ' RECEIVE A BLOCK '==================================================================== RXBLOCK: CLS BLOCK$ = "" LOCATE 1, 20 COLOR 0, 7: PRINT " - BLOCK RECEIVE ROUTINE VIA DMA - " COLOR 7, 0 LOCATE 3, 1: INPUT "Block size to receive: ", BLOCKSIZE FOR X = 1 TO BLOCKSIZE BLOCK$ = BLOCK$ + " " 'BUILD STRING SPACE NEXT X MODE1 = &HE0 'DMA REQUEST ON RECEIVE MODE2 = &H45 'DMA WRITE TRANSFER '==================================================================== ' INITIALIZE THE DMA CONTROLLER '==================================================================== SETDMA: OUT 10, 5 'MASK DMA CHANNEL 1 OUT Control, 1 'WR1 - DMA REQUEST ON TX OR RX OUT Control, MODE1 'SET SCC DMA REQUEST MODE - TX OR RX OUT 11, MODE2 'DMA MODE REGISTER - SET TX OR RX N = VARSEG(BLOCK$) 'STRING SEGMENT S = SADD(BLOCK$) 'STRING OFFSET NEWSEG = (N * 16) + S 'GET 20 BIT ADDRESS LBYTE = (NEWSEG AND 255) 'LOW BYTE OF ADDRESS SHR8 = (NEWSEG \ 256) HBYTE = (SHR8 AND 255) 'HIGH BYTE OF ADDRESS DPAGE = ((SHR8 \ 256) AND 15) 'DMA PAGE REGISTER GETS UPPER 4 BITS OUT 2, LBYTE 'SET DMA ADDRESS REGISTER OUT 2, HBYTE OUT &H83, DPAGE 'SET DMA PAGE REGISTER OUT &HC, 0 'RESET INTERNAL F/F OUT 3, LEN(BLOCK$) - 1 'TRANSFER COUNT - LOW BYTE OUT 3, 0 'TRANSFER COUNT - HIGH BYTE OUT 10, 1 'UNMASK DMA CHANNEL 1 - START TRANSFER LOCATE 5, 1: PRINT "Transfer count: " COUNT: OUT &HC, 0 'RESET INTERNAL F/F C1 = INP(3) 'TRANSFER COUNT - LOW BYTE C2 = INP(3) 'TRANSFER COUNT - HIGH BYTE CT = C1 + (256 * C2) LOCATE 5, 17: PRINT CT 'DMA TRANSFER COUNT IF CT <> 65535 THEN GOTO COUNT 'CHECK FOR TRANSFER COMPLETE OUT 10, 5 'MASK DMA CHANNEL 1 PRINT IF MODE1 = &HE0 THEN 'PRINT BLOCK IF IN RECEIVE MODE PRINT "Block received: "; COLOR 0, 7: PRINT BLOCK$: COLOR 7, 0 PRINT END IF PRINT "Transfer complete - press any key to continue" DO LOOP WHILE INKEY$ = "" GOTO MENU '==================================================================== ' INITIALIZATION VALUES '==================================================================== DATA 9, &HC0 'FORCE HARDWARE RESET DATA 4, &H44 'X16 CLOCK MODE, 1 STOP BIT / CHAR DATA 3, &HC0 'RX 8 BITS / CHARACTER DATA 2, 0 'INTERRUPT VECTOR - NOT USED DATA 5, &H60 'TX 8 BITS / CHAR DATA 6, 0 'ADDRESS - NOT USED DATA 7, 0 'SYNC FLAG - NOT USED DATA 10, 0 'NRZ MODE DATA 11, &H56 'RX CLOCK, TX CLOCK = B.R.G. DATA 12, 6 'TIME CONSTANT - LOW BYTE - 19.2K BAUD DATA 13, 0 'TIME CONSTANT - HIGH BYTE DATA 14, 3 'BAUD RATE GENERATOR ENABLED / SOURCE DATA 15, 0 'MISCELLANEOUS CONTROL BITS - NOT USED DATA 0, &HD0 'RESET TX UNDERRUN LATCH AND EXTERNAL/STATUS INTS DATA 0, &H10 'ERROR RESET DATA 0, &H10 'ERROR RESET DATA 3, &HC1 'RECEIVER ENABLED DATA 5, &H68 'TRANSMITTER ENABLED DATA 255 'END OF DATA '==================================================================== ' End of File '====================================================================