{ sample2.pas ...for the PIOD24, compile with TP7 } Uses Strings, crt; Const True = 1; False = 0; var TempX, TempY: byte; function AskForBaseAddress(OldOne : String) : integer; const Msg : string[3] = '0'; var NewOne, Success, Dummy, Error : Word; AddrInputPosX, AddrInputPosY : Word; begin if (OldOne = 'OLD') then OldOne := Msg; AddrInputPosX := WhereX; AddrInputPosY := WhereY; Success := 0; repeat GotoXY(AddrInputPosX, AddrInputPosY); ClrEol; Readln(Msg); Val('$' + Msg, NewOne, Error); if ((NewOne <= $3F8) AND (NewOne >= $100)) then begin Success := 1; Dummy := NewOne; end else if (Msg = '') then begin GotoXY(AddrInputPosX, AddrInputPosY); WriteLn(OldOne); Msg := OldOne; Success := 1; Val('$' + Msg, Dummy, Error); end else begin GotoXY( TempX, TempY); clreol; WriteLn( 'range error, please type a number between 100 and 3f8'); end; until (Success = 1); AskForBaseAddress := Dummy; end; var PromptSpaceX: byte; PromptSpaceY: byte; IntPromptX: byte; IntPromptY: byte; Register8, index: byte; BaseAddr, done: integer; ch: char; begin ClrScr; Writeln( 'PIOD24 SAMPLE TWO'); Writeln( ''); WriteLn( 'This program initializes the PIOD24 control register at offset 8'); Writeln( 'note: the client driver for this device must be installed first'); Writeln( ''); Writeln( '----------------------------------------------------------------'); WriteLn( ''); Register8 := 0; PromptSpaceX := WhereX; { redundant } PromptSpaceY := WhereY; { redundant } TempX := WhereX; TempY := WhereY; WriteLn( 'what is the board''s base I/O address in hex?'); BaseAddr := AskForBaseAddress( '300'); repeat index := PromptSpaceY; repeat GotoXY( 1, index); clreol; Inc( index); { clear lines below the msg } until index = 25; GotoXY( PromptSpaceX, PromptSpaceY); WriteLn( 'press I for interrupt selection'); WriteLn( 'press C for clock source selection'); WriteLn( 'press L for counter link selection'); WriteLn( 'press E to exit'); ch := ReadKey; case ch of 'i', 'I': begin { display the user's choice } WriteLn( 'Interrupt Selection (press a number key)'); WriteLn( ''); { prompt the user for the interrupt source } WriteLn( '0 No interrupt'); WriteLn( '1 External'); WriteLn( '2 8255 PC0 (digital I/O)'); WriteLn( '3 Counter 0'); WriteLn( '4 Counter 1'); WriteLn( '5 Counter 2'); WriteLn( '6 8255 PC3 (digital I/O)'); ch := ReadKey; if (ch < '0') or (ch > '6') then { range check } begin WriteLn( 'interrupt selection error, press a key to continue'); ReadKey; gotoxy( 1, PromptSpaceY); end else begin { change bits 5, 6, and 7 of the interrupt control register } Register8 := Register8 and $1f; Register8 := Register8 or ((byte(ch) - $30) shl 5); port[ BaseAddr + 8] := Register8; WriteLn( ''); Write( 'press a key to continue'); { hold the display } ReadKey; end; end; 'c', 'C': begin { display the user's choice } WriteLn( ''); WriteLn( 'Clock Source Selection (press a number key):'); { prompt the user for the counter to be programmed } WriteLn( '0 Counter 0 source = 10MHz'); WriteLn( '1 Counter 0 source = external clock 0'); WriteLn( '2 Counter 1 source = 10MHz'); WriteLn( '3 Counter 1 source = 1MHz'); WriteLn( '4 Counter 2 source = 1MHz'); WriteLn( '5 Counter 2 source = external clock 1'); ch := Readkey; if (ch < '0') or (ch > '5') then { range check } begin { on error clear the data input section of the screen } WriteLn( 'Clock source selection error, press a key to continue'); ReadKey; GotoXY( 1, PromptSpaceY); end else { change bits 2, 3, and 4 } begin case ch of '0': Register8 := Register8 and $fb; { clear bit 2 } '1': Register8 := Register8 or 4; { set bit 2 } '2': Register8 := Register8 and $f7; { clear bit 3 } '3': Register8 := Register8 or 8; { set bit 3 } '4': Register8 := Register8 and $ef; { clear bit 4 } '5': Register8 := Register8 or $10; { set bit 4 } end; port[ BaseAddr + 8] := Register8; { clear the data input section of the screen } WriteLn( ''); WriteLn( 'press a key to continue'); { hold the display } ReadKey; end; end; 'l', 'L': begin { display the user's choice } WriteLn( 'Counter Link Selection (press a number key):'); { prompt the user for the counter to be programmed } WriteLn( '0 no links'); WriteLn( '1 Counters 1 and 2 linked'); WriteLn( '2 Counters 0 and 1 and 2 linked'); ch := ReadKey; if (ch < '0') or (ch > '2') then { range check } begin { on error clear the data input section of the screen } WriteLn( 'Counter link selection error, press a key to continue'); ReadKey; GotoXY( 1, PromptSpaceY); end else { modify bits 0 and 1 of the interrupt control reg } begin Register8 := Register8 and $fc; { clear bits 0 and 1 } case ch of '1': inc( Register8); '2': inc( Register8, 2); end; port[ BaseAddr + 8] := Register8; WriteLn( 'press a key to continue'); { hold the display } ReadKey; end; end; 'e', 'E': done := TRUE; end; until done = TRUE; end.