diff --git a/doc/pascalprogramming.md b/doc/pascalprogramming.md index 53b7dff..fa6aa24 100644 --- a/doc/pascalprogramming.md +++ b/doc/pascalprogramming.md @@ -20,7 +20,38 @@ Note that the **char** type is a 32-bit type, and strings contain bytes. Non-ASC When indexing a string, the result is a **char** type with bits 31 to 8 set to zero. When assigning a **char** to an indexed string element, the destination byte is set to bits 7 to 0 from the **char** variable. Bits 31 to 8 are ignored. ## For-in Loop -The for-in-loop which allows iterating over a string or a linear array of scalar variables is supported. It is more efficient than using a for loop for indexing a string or an array, because no bounds checks are needed. +The for-in-loop is supported, which allows iterating over a string or a linear array of scalar variables. It is more efficient than using a for loop for indexing a string or an array, because no bounds checks are needed on each iteration. + +String Example: +``` +var s:string; + c:char; + + ... + + s := 'Test'; + + for c in s do + writeln(ord(c)); + + ... +``` + +Array Example: +``` +var a:array [1..3] of integer; + i:integer; + + ... + + a[1] := 3; a[3] := 2; a[5] := 1; + + for i in a do + writeln(i); + + ... + +``` ## Sets The maximum number of elements in a set is 32. This makes a SET OF CHAR impossible. @@ -39,9 +70,32 @@ The _in_ operator also works for linear arrays, so the _if_ statement will have Note that the array _in_ operator will be more inefficient for larger ranges (i.e. `'A'..'z'`), but more efficient for sparse sets (i.e. `'A','z'`). +A set literal can only appear on the right side of an assignment to a set variable, or when passing an argument of a set type to a procedure/function. + +Example: +``` +program settest; +type weekday = (Mon,Tue,Wed,Thu,Fri,Sat,Sun); + days = set of weekday; + +var s:days; + d:weekday; + +begin + s := [Sat,Sun]; (* set literal *) + + d := Sun; + if d in [Sat,Sun] then (* array literal, IN operator for arrays *) + writeln('weekend'); + + if d in s then (* IN operator for sets *) + writeln('also weekend'); +end. +``` + ## Break and Continue Statements -Wirth Pascal has no statement to exit a loop. Other Pascal dialects have the _break_ and _continue_ statements to exit the loop or skip to the next iteration. +Wirth Pascal has no statement to exit a loop other than the loop condition. Other Pascal dialects have the _break_ and _continue_ statements to exit the loop or skip to the next iteration. Tridora-Pascal only supports the _break_ statement at the moment. diff --git a/doc/vga.md b/doc/vga.md index 25b9cdd..b53f56d 100644 --- a/doc/vga.md +++ b/doc/vga.md @@ -39,7 +39,7 @@ Video memory uses a linear layout, with words using an address increment of one. The first word (horizontal pixel coordinates 0-3) is at address 0, the second (coordinates 4-7) at address 1 etc. The first line starts at address 0, the second at address 80 etc. -To access video memory, the corresponding video memory address must be written to a latch register, then pixel data can be read or written by the I/O register. Reading and writing uses separate latch registers (the "Read Adress" and "Write Address" registers. To read the same word and write it back, both addresses need to be set. +To access video memory, the corresponding video memory address must be written to a latch register, then pixel data can be read or written by the I/O register. Reading and writing uses separate latch registers (the "Read Adress" and "Write Address" registers, _FB_RA_ and _FB_WA_). To read the same word and write it back, both addresses need to be set. Both registers have an auto-increment function. After reading the I/O register, the FB_RA register is ingremented by one. After writing to the I/O register, the FB_WA register is incremented by one. ## Palette Data