diff --git a/source/charroms/apple2-chars.txt b/source/charroms/apple2-chars.txt new file mode 100644 index 0000000..bf553e5 --- /dev/null +++ b/source/charroms/apple2-chars.txt @@ -0,0 +1,575 @@ +n ..###.. +n .#...#. +n .#.#.#. +n .#.#.#. +n .#.##.. +n .#..... +n ..####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#...#. +n .#...#. +n .####.. +n ....... + +n ..###.. +n .#...#. +n .#..... +n .#..... +n .#..... +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .####.. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#####. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..####. +n .#..... +n .#..... +n .#..##. +n .#...#. +n .#...#. +n ..####. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n .....#. +n .....#. +n .....#. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#..#.. +n .#.#... +n .##.... +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#####. +n ....... + +n .#...#. +n .##.##. +n .#.#.#. +n .#.#.#. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n .##..#. +n .#.#.#. +n .#..##. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#..... +n ..###.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#.#.#. +n .##.##. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .##.... +n .##.... +n .##.... +n .##.... +n .##.... +n .#####. +n ....... + +n ....... +n .#..... +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....... +n ....... + +n .#####. +n ....##. +n ....##. +n ....##. +n ....##. +n ....##. +n .#####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n .#####. +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... +n ...#... +n ....... + +n ..#.#.. +n ..#.#.. +n ..#.#.. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ..#.#.. +n ..#.#.. +n .#####. +n ..#.#.. +n .#####. +n ..#.#.. +n ..#.#.. +n ....... + +n ...#... +n ..####. +n .#.#... +n ..###.. +n ...#.#. +n .####.. +n ...#... +n ....... + +n .##..#. +n .##..#. +n ....#.. +n ...#... +n ..#.... +n .#..##. +n .#..##. +n ....... + +n ..##... +n .#..#.. +n .#.#... +n ..#.... +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n ...#... +n ...#... +n ...#... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ...#... +n ..#.... +n .#..... +n .#..... +n .#..... +n ..#.... +n ...#... +n ....... + +n ...#... +n ....#.. +n .....#. +n .....#. +n .....#. +n ....#.. +n ...#... +n ....... + +n ...#... +n .#.#.#. +n ..###.. +n ...#... +n ..###.. +n .#.#.#. +n ...#... +n ....... + +n ....... +n ...#... +n ...#... +n .#####. +n ...#... +n ...#... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ..##... +n ...#... +n ..#.... + +n ....... +n ....... +n ....... +n ..###.. +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ..##... +n ..##... +n ....... + +n ....... +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n ....... +n ....... + +n ..###.. +n .#...#. +n .#..##. +n .#.#.#. +n .##..#. +n .#...#. +n ..###.. +n ....... + +n ...#... +n ..##... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n ..###.. +n .#...#. +n .....#. +n ...##.. +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .....#. +n ....#.. +n ...##.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n ....#.. +n ...##.. +n ..#.#.. +n .#..#.. +n .#####. +n ....#.. +n ....#.. +n ....... + +n .#####. +n .#..... +n .####.. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n ...###. +n ..#.... +n .#..... +n .####.. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n ..#.... +n ..#.... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n ..###.. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n ..####. +n .....#. +n ....#.. +n .###... +n ....... + +n ....... +n ....... +n ..##... +n ..##... +n ....... +n ..##... +n ..##... +n ....... + +n ....... +n ....... +n ..##... +n ..##... +n ....... +n ..##... +n ...#... +n ..#.... + +n ....#.. +n ...#... +n ..#.... +n .#..... +n ..#.... +n ...#... +n ....#.. +n ....... + +n ....... +n ....... +n .####.. +n ....... +n .####.. +n ....... +n ....... +n ....... + +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....#.. +n ...#... +n ..#.... +n ....... + +n ..###.. +n .#...#. +n ....#.. +n ...#... +n ...#... +n ....... +n ...#... +n ....... diff --git a/source/charroms/apple2-lowercase.txt b/source/charroms/apple2-lowercase.txt new file mode 100644 index 0000000..dc50da9 --- /dev/null +++ b/source/charroms/apple2-lowercase.txt @@ -0,0 +1,2303 @@ +n ..###.. +n .#...#. +n .#.#.#. +n .#.#.#. +n .#.##.. +n .#..... +n ..####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#...#. +n .#...#. +n .####.. +n ....... + +n ..###.. +n .#...#. +n .#..... +n .#..... +n .#..... +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .####.. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#####. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..####. +n .#..... +n .#..... +n .#..##. +n .#...#. +n .#...#. +n ..####. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n .....#. +n .....#. +n .....#. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#..#.. +n .#.#... +n .##.... +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#####. +n ....... + +n .#...#. +n .##.##. +n .#.#.#. +n .#.#.#. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n .##..#. +n .#.#.#. +n .#..##. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#..... +n ..###.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#.#.#. +n .##.##. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .##.... +n .##.... +n .##.... +n .##.... +n .##.... +n .#####. +n ....... + +n ....... +n .#..... +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....... +n ....... + +n .#####. +n ....##. +n ....##. +n ....##. +n ....##. +n ....##. +n .#####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n .#####. +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... +n ...#... +n ....... + +n ..#.#.. +n ..#.#.. +n ..#.#.. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ..#.#.. +n ..#.#.. +n .#####. +n ..#.#.. +n .#####. +n ..#.#.. +n ..#.#.. +n ....... + +n ...#... +n ..####. +n .#.#... +n ..###.. +n ...#.#. +n .####.. +n ...#... +n ....... + +n .##..#. +n .##..#. +n ....#.. +n ...#... +n ..#.... +n .#..##. +n .#..##. +n ....... + +n ..##... +n .#..#.. +n .#.#... +n ..#.... +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n ...#... +n ...#... +n ...#... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ...#... +n ..#.... +n .#..... +n .#..... +n .#..... +n ..#.... +n ...#... +n ....... + +n ...#... +n ....#.. +n .....#. +n .....#. +n .....#. +n ....#.. +n ...#... +n ....... + +n ...#... +n .#.#.#. +n ..###.. +n ...#... +n ..###.. +n .#.#.#. +n ...#... +n ....... + +n ....... +n ...#... +n ...#... +n .#####. +n ...#... +n ...#... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ..##... +n ...#... +n ..#.... + +n ....... +n ....... +n ....... +n ..###.. +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ..##... +n ..##... +n ....... + +n ....... +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n ....... +n ....... + +n ..###.. +n .#...#. +n .#..##. +n .#.#.#. +n .##..#. +n .#...#. +n ..###.. +n ....... + +n ...#... +n ..##... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n ..###.. +n .#...#. +n .....#. +n ...##.. +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .....#. +n ....#.. +n ...##.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n ....#.. +n ...##.. +n ..#.#.. +n .#..#.. +n .#####. +n ....#.. +n ....#.. +n ....... + +n .#####. +n .#..... +n .####.. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n ...###. +n ..#.... +n .#..... +n .####.. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n ..#.... +n ..#.... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n ..###.. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n ..####. +n .....#. +n ....#.. +n .###... +n ....... + +n ....... +n ....... +n ..##... +n ..##... +n ....... +n ..##... +n ..##... +n ....... + +n ....... +n ....... +n ..##... +n ..##... +n ....... +n ..##... +n ...#... +n ..#.... + +n ....#.. +n ...#... +n ..#.... +n .#..... +n ..#.... +n ...#... +n ....#.. +n ....... + +n ....... +n ....... +n .####.. +n ....... +n .####.. +n ....... +n ....... +n ....... + +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....#.. +n ...#... +n ..#.... +n ....... + +n ..###.. +n .#...#. +n ....#.. +n ...#... +n ...#... +n ....... +n ...#... +n ....... + +i ..###.. +i .#...#. +i .#.#.#. +i .#.#.#. +i .#.##.. +i .#..... +i ..####. +i ....... + +i ...#... +i ..#.#.. +i .#...#. +i .#...#. +i .#####. +i .#...#. +i .#...#. +i ....... + +i .####.. +i .#...#. +i .#...#. +i .####.. +i .#...#. +i .#...#. +i .####.. +i ....... + +i ..###.. +i .#...#. +i .#..... +i .#..... +i .#..... +i .#...#. +i ..###.. +i ....... + +i .####.. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i .####.. +i ....... + +i .#####. +i .#..... +i .#..... +i .####.. +i .#..... +i .#..... +i .#####. +i ....... + +i .#####. +i .#..... +i .#..... +i .####.. +i .#..... +i .#..... +i .#..... +i ....... + +i ..####. +i .#..... +i .#..... +i .#..##. +i .#...#. +i .#...#. +i ..####. +i ....... + +i .#...#. +i .#...#. +i .#...#. +i .#####. +i .#...#. +i .#...#. +i .#...#. +i ....... + +i ..###.. +i ...#... +i ...#... +i ...#... +i ...#... +i ...#... +i ..###.. +i ....... + +i .....#. +i .....#. +i .....#. +i .....#. +i .....#. +i .#...#. +i ..###.. +i ....... + +i .#...#. +i .#..#.. +i .#.#... +i .##.... +i .#.#... +i .#..#.. +i .#...#. +i ....... + +i .#..... +i .#..... +i .#..... +i .#..... +i .#..... +i .#..... +i .#####. +i ....... + +i .#...#. +i .##.##. +i .#.#.#. +i .#.#.#. +i .#...#. +i .#...#. +i .#...#. +i ....... + +i .#...#. +i .#...#. +i .##..#. +i .#.#.#. +i .#..##. +i .#...#. +i .#...#. +i ....... + +i ..###.. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i ..###.. +i ....... + +i .####.. +i .#...#. +i .#...#. +i .####.. +i .#..... +i .#..... +i .#..... +i ....... + +i ..###.. +i .#...#. +i .#...#. +i .#...#. +i .#.#.#. +i .#..#.. +i ..##.#. +i ....... + +i .####.. +i .#...#. +i .#...#. +i .####.. +i .#.#... +i .#..#.. +i .#...#. +i ....... + +i ..###.. +i .#...#. +i .#..... +i ..###.. +i .....#. +i .#...#. +i ..###.. +i ....... + +i .#####. +i ...#... +i ...#... +i ...#... +i ...#... +i ...#... +i ...#... +i ....... + +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i ..###.. +i ....... + +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i .#...#. +i ..#.#.. +i ...#... +i ....... + +i .#...#. +i .#...#. +i .#...#. +i .#.#.#. +i .#.#.#. +i .##.##. +i .#...#. +i ....... + +i .#...#. +i .#...#. +i ..#.#.. +i ...#... +i ..#.#.. +i .#...#. +i .#...#. +i ....... + +i .#...#. +i .#...#. +i ..#.#.. +i ...#... +i ...#... +i ...#... +i ...#... +i ....... + +i .#####. +i .....#. +i ....#.. +i ...#... +i ..#.... +i .#..... +i .#####. +i ....... + +i .#####. +i .##.... +i .##.... +i .##.... +i .##.... +i .##.... +i .#####. +i ....... + +i ....... +i .#..... +i ..#.... +i ...#... +i ....#.. +i .....#. +i ....... +i ....... + +i .#####. +i ....##. +i ....##. +i ....##. +i ....##. +i ....##. +i .#####. +i ....... + +i ...#... +i ..#.#.. +i .#...#. +i ....... +i ....... +i ....... +i ....... +i ....... + +i ....... +i ....... +i ....... +i ....... +i ....... +i ....... +i .#####. +i ....... + +i ....... +i ....... +i ....... +i ....... +i ....... +i ....... +i ....... +i ....... + +i ...#... +i ...#... +i ...#... +i ...#... +i ...#... +i ....... +i ...#... +i ....... + +i ..#.#.. +i ..#.#.. +i ..#.#.. +i ....... +i ....... +i ....... +i ....... +i ....... + +i ..#.#.. +i ..#.#.. +i .#####. +i ..#.#.. +i .#####. +i ..#.#.. +i ..#.#.. +i ....... + +i ...#... +i ..####. +i .#.#... +i ..###.. +i ...#.#. +i .####.. +i ...#... +i ....... + +i .##..#. +i .##..#. +i ....#.. +i ...#... +i ..#.... +i .#..##. +i .#..##. +i ....... + +i ..##... +i .#..#.. +i .#.#... +i ..#.... +i .#.#.#. +i .#..#.. +i ..##.#. +i ....... + +i ...#... +i ...#... +i ...#... +i ....... +i ....... +i ....... +i ....... +i ....... + +i ...#... +i ..#.... +i .#..... +i .#..... +i .#..... +i ..#.... +i ...#... +i ....... + +i ...#... +i ....#.. +i .....#. +i .....#. +i .....#. +i ....#.. +i ...#... +i ....... + +i ...#... +i .#.#.#. +i ..###.. +i ...#... +i ..###.. +i .#.#.#. +i ...#... +i ....... + +i ....... +i ...#... +i ...#... +i .#####. +i ...#... +i ...#... +i ....... +i ....... + +i ....... +i ....... +i ....... +i ....... +i ....... +i ..##... +i ...#... +i ..#.... + +i ....... +i ....... +i ....... +i ..###.. +i ....... +i ....... +i ....... +i ....... + +i ....... +i ....... +i ....... +i ....... +i ....... +i ..##... +i ..##... +i ....... + +i ....... +i .....#. +i ....#.. +i ...#... +i ..#.... +i .#..... +i ....... +i ....... + +i ..###.. +i .#...#. +i .#..##. +i .#.#.#. +i .##..#. +i .#...#. +i ..###.. +i ....... + +i ...#... +i ..##... +i ...#... +i ...#... +i ...#... +i ...#... +i ..###.. +i ....... + +i ..###.. +i .#...#. +i .....#. +i ...##.. +i ..#.... +i .#..... +i .#####. +i ....... + +i .#####. +i .....#. +i ....#.. +i ...##.. +i .....#. +i .#...#. +i ..###.. +i ....... + +i ....#.. +i ...##.. +i ..#.#.. +i .#..#.. +i .#####. +i ....#.. +i ....#.. +i ....... + +i .#####. +i .#..... +i .####.. +i .....#. +i .....#. +i .#...#. +i ..###.. +i ....... + +i ...###. +i ..#.... +i .#..... +i .####.. +i .#...#. +i .#...#. +i ..###.. +i ....... + +i .#####. +i .....#. +i ....#.. +i ...#... +i ..#.... +i ..#.... +i ..#.... +i ....... + +i ..###.. +i .#...#. +i .#...#. +i ..###.. +i .#...#. +i .#...#. +i ..###.. +i ....... + +i ..###.. +i .#...#. +i .#...#. +i ..####. +i .....#. +i ....#.. +i .###... +i ....... + +i ....... +i ....... +i ..##... +i ..##... +i ....... +i ..##... +i ..##... +i ....... + +i ....... +i ....... +i ..##... +i ..##... +i ....... +i ..##... +i ...#... +i ..#.... + +i ....#.. +i ...#... +i ..#.... +i .#..... +i ..#.... +i ...#... +i ....#.. +i ....... + +i ....... +i ....... +i .####.. +i ....... +i .####.. +i ....... +i ....... +i ....... + +i ..#.... +i ...#... +i ....#.. +i .....#. +i ....#.. +i ...#... +i ..#.... +i ....... + +i ..###.. +i .#...#. +i ....#.. +i ...#... +i ...#... +i ....... +i ...#... +i ....... + +n ..###.. +n .#...#. +n .#.#.#. +n .#.#.#. +n .#.##.. +n .#..... +n ..####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#...#. +n .#...#. +n .####.. +n ....... + +n ..###.. +n .#...#. +n .#..... +n .#..... +n .#..... +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .####.. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#####. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..####. +n .#..... +n .#..... +n .#..##. +n .#...#. +n .#...#. +n ..####. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n .....#. +n .....#. +n .....#. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#..#.. +n .#.#... +n .##.... +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#####. +n ....... + +n .#...#. +n .##.##. +n .#.#.#. +n .#.#.#. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n .##..#. +n .#.#.#. +n .#..##. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#..... +n ..###.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#.#.#. +n .##.##. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .##.... +n .##.... +n .##.... +n .##.... +n .##.... +n .#####. +n ....... + +n ....... +n .#..... +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....... +n ....... + +n .#####. +n ....##. +n ....##. +n ....##. +n ....##. +n ....##. +n .#####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n .#####. +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... +n ...#... +n ....... + +n ..#.#.. +n ..#.#.. +n ..#.#.. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ..#.#.. +n ..#.#.. +n .#####. +n ..#.#.. +n .#####. +n ..#.#.. +n ..#.#.. +n ....... + +n ...#... +n ..####. +n .#.#... +n ..###.. +n ...#.#. +n .####.. +n ...#... +n ....... + +n .##..#. +n .##..#. +n ....#.. +n ...#... +n ..#.... +n .#..##. +n .#..##. +n ....... + +n ..##... +n .#..#.. +n .#.#... +n ..#.... +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n ...#... +n ...#... +n ...#... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ...#... +n ..#.... +n .#..... +n .#..... +n .#..... +n ..#.... +n ...#... +n ....... + +n ...#... +n ....#.. +n .....#. +n .....#. +n .....#. +n ....#.. +n ...#... +n ....... + +n ...#... +n .#.#.#. +n ..###.. +n ...#... +n ..###.. +n .#.#.#. +n ...#... +n ....... + +n ....... +n ...#... +n ...#... +n .#####. +n ...#... +n ...#... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ..##... +n ...#... +n ..#.... + +n ....... +n ....... +n ....... +n ..###.. +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ..##... +n ..##... +n ....... + +n ....... +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n ....... +n ....... + +n ..###.. +n .#...#. +n .#..##. +n .#.#.#. +n .##..#. +n .#...#. +n ..###.. +n ....... + +n ...#... +n ..##... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n ..###.. +n .#...#. +n .....#. +n ...##.. +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .....#. +n ....#.. +n ...##.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n ....#.. +n ...##.. +n ..#.#.. +n .#..#.. +n .#####. +n ....#.. +n ....#.. +n ....... + +n .#####. +n .#..... +n .####.. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n ...###. +n ..#.... +n .#..... +n .####.. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n ..#.... +n ..#.... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n ..###.. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n ..####. +n .....#. +n ....#.. +n .###... +n ....... + +n ....... +n ....... +n ..##... +n ..##... +n ....... +n ..##... +n ..##... +n ....... + +n ....... +n ....... +n ..##... +n ..##... +n ....... +n ..##... +n ...#... +n ..#.... + +n ....#.. +n ...#... +n ..#.... +n .#..... +n ..#.... +n ...#... +n ....#.. +n ....... + +n ....... +n ....... +n .####.. +n ....... +n .####.. +n ....... +n ....... +n ....... + +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....#.. +n ...#... +n ..#.... +n ....... + +n ..###.. +n .#...#. +n ....#.. +n ...#... +n ...#... +n ....... +n ...#... +n ....... + +n ..###.. +n .#...#. +n .#.#.#. +n .#.#.#. +n .#.##.. +n .#..... +n ..####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#...#. +n .#...#. +n .####.. +n ....... + +n ..###.. +n .#...#. +n .#..... +n .#..... +n .#..... +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .####.. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#####. +n ....... + +n .#####. +n .#..... +n .#..... +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..####. +n .#..... +n .#..... +n .#..##. +n .#...#. +n .#...#. +n ..####. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#####. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n .....#. +n .....#. +n .....#. +n .....#. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#..#.. +n .#.#... +n .##.... +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#..... +n .#####. +n ....... + +n .#...#. +n .##.##. +n .#.#.#. +n .#.#.#. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n .##..#. +n .#.#.#. +n .#..##. +n .#...#. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#..... +n .#..... +n .#..... +n ....... + +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#..#.. +n ..##.#. +n ....... + +n .####.. +n .#...#. +n .#...#. +n .####.. +n .#.#... +n .#..#.. +n .#...#. +n ....... + +n ..###.. +n .#...#. +n .#..... +n ..###.. +n .....#. +n .#...#. +n ..###.. +n ....... + +n .#####. +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ....... + +n .#...#. +n .#...#. +n .#...#. +n .#.#.#. +n .#.#.#. +n .##.##. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ..#.#.. +n .#...#. +n .#...#. +n ....... + +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ...#... +n ...#... +n ...#... +n ....... + +n .#####. +n .....#. +n ....#.. +n ...#... +n ..#.... +n .#..... +n .#####. +n ....... + +n .#####. +n .##.... +n .##.... +n .##.... +n .##.... +n .##.... +n .#####. +n ....... + +n ....... +n .#..... +n ..#.... +n ...#... +n ....#.. +n .....#. +n ....... +n ....... + +n .#####. +n ....##. +n ....##. +n ....##. +n ....##. +n ....##. +n .#####. +n ....... + +n ...#... +n ..#.#.. +n .#...#. +n ....... +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ....... +n ....... +n ....... +n ....... +n .#####. +n ....... + +n .#..... +n ..#.... +n ...#... +n ....... +n ....... +n ....... +n ....... +n ....... + +n ....... +n ....... +n ..###.. +n .....#. +n ..####. +n .#...#. +n ..####. +n ....... + +n .#..... +n .#..... +n .#.##.. +n .##..#. +n .#...#. +n .##..#. +n .#.##.. +n ....... + +n ....... +n ....... +n ..####. +n .#..... +n .#..... +n .#..... +n ..####. +n ....... + +n .....#. +n .....#. +n ..##.#. +n .#..##. +n .#...#. +n .#..##. +n ..##.#. +n ....... + +n ....... +n ....... +n ..###.. +n .#...#. +n .#####. +n .#..... +n ..###.. +n ....... + +n ...##.. +n ..#..#. +n ..#.... +n .###... +n ..#.... +n ..#.... +n ..#.... +n ....... + +n ....... +n .....#. +n ..###.. +n .#...#. +n .#...#. +n ..####. +n .....#. +n ..###.. + +n .#..... +n .#..... +n .#.##.. +n .##..#. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n ...#... +n ....... +n ..##... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n ....#.. +n ....... +n ...##.. +n ....#.. +n ....#.. +n ....#.. +n .#..#.. +n ..##... + +n .#..... +n .#..... +n .#...#. +n .#..#.. +n .###... +n .#..#.. +n .#...#. +n ....... + +n ..##... +n ...#... +n ...#... +n ...#... +n ...#... +n ...#... +n ..###.. +n ....... + +n ....... +n ....... +n .##.#.. +n .#.#.#. +n .#.#.#. +n .#.#.#. +n .#.#.#. +n ....... + +n ....... +n ....... +n .#.##.. +n .##..#. +n .#...#. +n .#...#. +n .#...#. +n ....... + +n ....... +n ....... +n ..###.. +n .#...#. +n .#...#. +n .#...#. +n ..###.. +n ....... + +n ....... +n ....... +n .#.##.. +n .##..#. +n .##..#. +n .#.##.. +n .#..... +n .#..... + +n ....... +n ....... +n ..##.#. +n .#..##. +n .#..##. +n ..##.#. +n .....#. +n .....#. + +n ....... +n ....... +n .#.##.. +n .##.... +n .#..... +n .#..... +n .#..... +n ....... + +n ....... +n ....... +n ..####. +n .#..... +n ..###.. +n .....#. +n .####.. +n ....... + +n ..#.... +n ..#.... +n .###... +n ..#.... +n ..#.... +n ..#..#. +n ...##.. +n ....... + +n ....... +n ....... +n .#...#. +n .#...#. +n .#...#. +n .#..##. +n ..##.#. +n ....... + +n ....... +n ....... +n .#...#. +n .#...#. +n .#...#. +n ..#.#.. +n ...#... +n ....... + +n ....... +n ....... +n .#...#. +n .#.#.#. +n .#.#.#. +n .#.#.#. +n ..#.#.. +n ....... + +n ....... +n ....... +n .#...#. +n ..#.#.. +n ...#... +n ..#.#.. +n .#...#. +n ....... + +n ....... +n ....... +n .#...#. +n .#...#. +n .#..##. +n ..##.#. +n .....#. +n ..###.. + +n ....... +n ....... +n .#####. +n ....#.. +n ...#... +n ..#.... +n .#####. +n ....... + +n ....##. +n ...#... +n ...#... +n .##.... +n ...#... +n ...#... +n ....##. +n ....... + +n ...#... +n ...#... +n ...#... +n ....... +n ...#... +n ...#... +n ...#... +n ....... + +n .##.... +n ...#... +n ...#... +n ....##. +n ...#... +n ...#... +n .##.... +n ....... + +n ....... +n ....... +n ..#.... +n .#.#.#. +n ....#.. +n ....... +n ....... +n ....... + +n .#.#.#. +n ..#.#.. +n .#.#.#. +n ..#.#.. +n .#.#.#. +n ..#.#.. +n .#.#.#. +n ....... diff --git a/source/redbook/fp.asm b/source/redbook/fp.asm new file mode 100644 index 0000000..719c7d5 --- /dev/null +++ b/source/redbook/fp.asm @@ -0,0 +1,154 @@ + *********************** + * * + * APPLE-II FLOATING * + * POINT ROUTINES * + * * + * COPYRIGHT 1977 BY * + * APPLE COMPUTER INC. * + * * + * ALL RIGHTS RESERVED * + * * + * S. WOZNIAK * + * * + *********************** + TITLE "FLOATING POINT ROUTINES" + SIGN EPZ $F3 + X2 EPZ $F4 + M2 EPZ $F5 + X1 EPZ $F8 + M1 EPZ $F9 + E EPZ $FC + OVLOC EQU $3F5 + ORG $F425 +F425: 18 ADD CLC CLEAR CARRY +F426: A2 02 LDX #$2 INDEX FOR 3-BYTE ADD. +F428: B5 F9 ADD1 LDA M1,X +F42A: 75 F5 ADC M2,X ADD A BYTE OF MANT2 TO MANT1 +F42C: 95 F9 STA M1,X +F42E: CA DEX INDEX TO NEXT MORE SIGNIF. BYTE. +F42F: 10 F7 BPL ADD1 LOOP UNTIL DONE. +F431: 60 RTS RETURN +F432: 06 F3 MD1 ASL SIGN CLEAR LSB OF SIGN. +F434: 20 37 F4 JSR ABSWAP ABS VAL OF M1, THEN SWAP WITH M2 +F437: 24 F9 ABSWAP BIT M1 MANT1 NEGATIVE? +F439: 10 05 BPL ABSWAP1 NO, SWAP WITH MANT2 AND RETURN. +F43B: 20 A4 F4 JSR FCOMPL YES, COMPLEMENT IT. +F43E: E6 F3 INC SIGN INCR SIGN, COMPLEMENTING LSB. +F440: 38 ABSWAP1 SEC SET CARRY FOR RETURN TO MUL/DIV. +F441: A2 04 SWAP LDX #$4 INDEX FOR 4 BYTE SWAP. +F443: 94 FB SWAP1 STY E-1,X +F445: B5 F7 LDA X1-1,X SWAP A BYTE OF EXP/MANT1 WITH +F447: B4 F3 LDY X2-1,X EXP/MANT2 AND LEAVE A COPY OF +F449: 94 F7 STY X1-1,X MANT1 IN E (3 BYTES). E+3 USED +F44B: 95 F3 STA X2-1,X +F44D: CA DEX ADVANCE INDEX TO NEXT BYTE +F44E: D0 F3 BNE SWAP1 LOOP UNTIL DONE. +F450: 60 RTS RETURN +F451: A9 8E FLOAT LDA #$8E INIT EXP1 TO 14, +F453: 85 F8 STA X1 THEN NORMALIZE TO FLOAT. +F455: A5 F9 NORM1 LDA M1 HIGH-ORDER MANT1 BYTE. +F457: C9 C0 CMP #$C0 UPPER TWO BITS UNEQUAL? +F459: 30 0C BMI RTS1 YES, RETURN WITH MANT1 NORMALIZED +F45B: C6 F8 DEC X1 DECREMENT EXP1. +F45D: 06 FB ASL M1+2 +F45F: 26 FA ROL M1+1 SHIFT MANT1 (3 BYTES) LEFT. +F461: 26 F9 ROL M1 +F463: A5 F8 NORM LDA X1 EXP1 ZERO? +F465: D0 EE BNE NORM1 NO, CONTINUE NORMALIZING. +F467: 60 RTS1 RTS RETURN. +F468: 20 A4 F4 FSUB JSR FCOMPL CMPL MANT1,CLEARS CARRY UNLESS 0 +F46B: 20 7B F4 SWPALGN JSR ALGNSWP RIGHT SHIFT MANT1 OR SWAP WITH +F46E: A5 F4 FADD LDA X2 +F470: C5 F8 CMP X1 COMPARE EXP1 WITH EXP2. +F472: D0 F7 BNE SWPALGN IF #,SWAP ADDENDS OR ALIGN MANTS. +F474: 20 25 F4 JSR ADD ADD ALIGNED MANTISSAS. +F477: 50 EA ADDEND BVC NORM NO OVERFLOW, NORMALIZE RESULT. +F479: 70 05 BVS RTLOG OV: SHIFT M1 RIGHT, CARRY INTO SIGN +F47B: 90 C4 ALGNSWP BCC SWAP SWAP IF CARRY CLEAR, + * ELSE SHIFT RIGHT ARITH. +F47D: A5 F9 RTAR LDA M1 SIGN OF MANT1 INTO CARRY FOR +F47F: 0A ASL RIGHT ARITH SHIFT. +F480: E6 F8 RTLOG INC X1 INCR X1 TO ADJUST FOR RIGHT SHIFT +F482: F0 75 BEQ OVFL EXP1 OUT OF RANGE. +F484: A2 FA RTLOG1 LDX #$FA INDEX FOR 6:BYTE RIGHT SHIFT. +F486: 76 FF ROR1 ROR E+3,X +F488: E8 INX NEXT BYTE OF SHIFT. +F489: D0 FB BNE ROR1 LOOP UNTIL DONE. +F48B: 60 RTS RETURN. +F48C: 20 32 F4 FMUL JSR MD1 ABS VAL OF MANT1, MANT2 +F48F: 65 F8 ADC X1 ADD EXP1 TO EXP2 FOR PRODUCT EXP +F491: 20 E2 F4 JSR MD2 CHECK PROD. EXP AND PREP. FOR MUL +F494: 18 CLC CLEAR CARRY FOR FIRST BIT. +F495: 20 84 F4 MUL1 JSR RTLOG1 M1 AND E RIGHT (PROD AND MPLIER) +F498: 90 03 BCC MUL2 IF CARRY CLEAR, SKIP PARTIAL PROD +F49A: 20 25 F4 JSR ADD ADD MULTIPLICAND TO PRODUCT. +F49D: 88 MUL2 DEY NEXT MUL ITERATION. +F49E: 10 F5 BPL MUL1 LOOP UNTIL DONE. +F4A0: 46 F3 MDEND LSR SIGN TEST SIGN LSB. +F4A2: 90 BF NORMX BCC NORM IF EVEN,NORMALIZE PROD,ELSE COMP +F4A4: 38 FCOMPL SEC SET CARRY FOR SUBTRACT. +F4A5: A2 03 LDX #$3 INDEX FOR 3 BYTE SUBTRACT. +F4A7: A9 00 COMPL1 LDA #$0 CLEAR A. +F4A9: F5 F8 SBC X1,X SUBTRACT BYTE OF EXP1. +F4AB: 95 F8 STA X1,X RESTORE IT. +F4AD: CA DEX NEXT MORE SIGNIFICANT BYTE. +F4AE: D0 F7 BNE COMPL1 LOOP UNTIL DONE. +F4B0: F0 C5 BEQ ADDEND NORMALIZE (OR SHIFT RT IF OVFL). +F4B2: 20 32 F4 FDIV JSR MD1 TAKE ABS VAL OF MANT1, MANT2. +F4B5: E5 F8 SBC X1 SUBTRACT EXP1 FROM EXP2. +F4B7: 20 E2 F4 JSR MD2 SAVE AS QUOTIENT EXP. +F4BA: 38 DIV1 SEC SET CARRY FOR SUBTRACT. +F4BB: A2 02 LDX #$2 INDEX FOR 3-BYTE SUBTRACTION. +F4BD: B5 F5 DIV2 LDA M2,X +F4BF: F5 FC SBC E,X SUBTRACT A BYTE OF E FROM MANT2. +F4C1: 48 PHA SAVE ON STACK. +F4C2: CA DEX NEXT MORE SIGNIFICANT BYTE. +F4C3: 10 F8 BPL DIV2 LOOP UNTIL DONE. +F4C5: A2 FD LDX #$FD INDEX FOR 3-BYTE CONDITIONAL MOVE +F4C7: 68 DIV3 PLA PULL BYTE OF DIFFERENCE OFF STACK +F4C8: 90 02 BCC DIV4 IF M2 0 then error condition exists + 850 + 860 STACK = $0100 ;6502 STACK + 870 + 880 * GOSUB/RETURN usage + 890 + 900 STK_00 = STACK+$00 + 910 STK_10 = STACK+$10 + 920 STK_20 = STACK+$20 + 930 STK_30 = STACK+$30 + 940 + 950 * FOR/NEXT/STEP usage + 960 + 970 STK_40 = STACK+$40 + 980 STK_50 = STACK+$50 + 990 STK_60 = STACK+$60 + 1000 STK_70 = STACK+$70 + 1010 STK_80 = STACK+$80 + 1020 STK_90 = STACK+$90 + 1030 STK_A0 = STACK+$A0 + 1040 STK_B0 = STACK+$B0 + 1050 STK_C0 = STACK+$C0 + 1060 STK_D0 = STACK+$D0 + 1070 + 1080 * I/O addresses + 1090 + 1100 KBD = $C000 + 1110 KBDSTRB = $C010 + 1120 + 1130 * Monitor zero page and low memory + 1140 + 1150 WNDWDTH = $0021 + 1160 CH = $0024 + 1170 CV = $0025 + 1180 GBAS = $0026 + 1190 H2 = $002C + 1200 V2 = $002D + 1210 A1 = $003C + 1220 A2 = $003E + 1230 PROMPT = $0033 + 1240 RNDL = $004E + 1250 RNDH = $004F + 1260 + 1270 IN = $0200 + 1280 + 1290 * Monitor routines + 1300 + 1310 PLOT = $F800 + 1320 HLINE = $F819 + 1330 VLINE = $F828 + 1340 GBASCALC = $F847 + 1350 SETCOL = $F864 + 1360 PREAD = $FB1E + 1370 SETTXT = $FB39 + 1380 SETGR = $FB40 + 1390 VTAB = $FC22 + 1400 WRITE = $FECD + 1410 WRITE0 = $FECF + 1420 READ = $FEFD + 1430 NXTCHAR = $FD75 + 1440 CROUT = $FD8E + 1450 COUT = $FDED + 1460 INPORT = $FE8B + 1470 OUTPORT = $FE95 + 1480 BELL = $FF3A + 1490 + 1500 * ASCII (excess $8000 for xref listing) + 1510 + 1520 ETX = $8003 ;CTRL-C + 1530 LF = $800A + 1540 CR = $800D + 1550 BLANK = $8020 + 1560 DQT = $8022 + 1570 SQT = $8027 + 1580 + 1590 ************************************************** + 1600 * ;Z = unreferenced area + 1610 * ;V = referenced in verb table + 1620 * ;VO = referenced in verb table only + 1630 * ;solo = one reference only (could be in-line) + 1640 + 1650 PUT PART1 + 1660 BASIC JSR COLD + 1670 BASIC2 JMP WARM + 1680 + 1690 SetPrompt ;solo + 1700 STA PROMPT + 1710 JMP COUT + 1720 *> + 1730 + 1740 RTS ;Z + 1750 ** + 1760 + 1770 HE00C + 1780 TXA ;?print a trailing blank? + 1790 AND #$20 + 1800 BEQ HE034 ;=>RTS + 1810 HE011 ;solo + 1820 LDA #BLANK+$80 + 1830 STA P2 + 1840 JMP COUT + 1850 *> + 1860 + 1870 HE018 ;solo + 1880 LDA #32 ;check line length + 1890 HE01A + 1900 CMP CH + 1910 BCS NextByte ;=HS> line too short + 1920 LDA #CR+$80 ;print CR, then 7 blanks + 1930 LDY #7 + 1940 *!LOOP + 1950 JSR COUT + 1960 LDA #BLANK+$80 + 1970 DEY + 1980 *!UNTIL + 1990 + 2000 NextByte ;get next byte 16-bit ptr + 2010 LDY #0 + 2020 LDA (P1),Y + 2030 INCW P1 + 2040 HE034 + 2050 RTS + 2060 ** + 2070 + 2080 * tkn $75 , (with tkn $74 LIST) + 2090 * LIST 5,30 + 2100 + 2110 COMMA_LIST ;VO + 2120 JSR GET16BIT + 2130 JSR HE576 + 2140 HE03B + 2150 CMPW P1;P3 + 2160 BCS HE034 ;=>P1 P3, RTS + 2170 JSR UNPACK + 2180 JMP HE03B + 2190 *> + 2200 + 2210 + 2220 * tkn $76 LIST + 2230 * list entire program + 2240 + 2250 LIST ;VO + 2260 MOVW PP;P1 + 2270 MOVW HIMEM;P3 + 2280 BNE HE03B ;=>always + 2290 + 2300 * tkn $74 LIST + 2310 * specific line number or range of numbers + 2320 * LIST 10: LIST 5,30 + 2330 + 2340 LISTNUM ;VO + 2350 JSR GET16BIT + 2360 JSR HE56D + 2370 MOVW P2;P1 + 2380 BCS HE034 ;=>RTS + 2390 UNPACK ;unpack tokens to mnemonics + 2400 STX XSAVE + 2410 LDA #BLANK+$80 + 2420 STA LEADZR + 2430 JSR NextByte + 2440 TYA + 2450 HE077 + 2460 STA P2 + 2470 JSR NextByte + 2480 TAX + 2490 JSR NextByte + 2500 JSR PRDEC + 2510 *!LOOP + 2520 JSR HE018 + 2530 STY LEADZR + 2540 TAX + 2550 BPL HE0A3 ;=> + 2560 ASL + 2570 BPL HE077 ;=> + 2580 LDA P2 + 2590 *! IF + 2600 JSR HE011 + 2610 *! ENDIF + 2620 TXA + 2630 *! LOOP + 2640 JSR COUT + 2650 HE099 + 2660 LDA #$25 + 2670 JSR HE01A + 2680 TAX + 2690 *! UNTIL + 2700 STA P2 + 2710 HE0A3 + 2720 CMP #$01 + 2730 *! IF + 2740 LDX XSAVE + 2750 JMP CROUT + 2760 *! ENDIF + 2770 PHA + 2780 STY ACC + 2790 LDX #>SYNTABL2 + 2800 STX ACC+1 + 2810 CMP #$51 ;END tkn + 2820 *! IF + 2830 DEC ACC+1 ; in SYNTABL + 2840 SBC #$50 ;TAB tkn + 2850 *! ENDIF + 2860 *! LOOP + 2870 PHA + 2880 LDA (ACC),Y + 2890 *! LOOP + 2900 *! LOOP + 2910 TAX + 2920 DEY + 2930 LDA (ACC),Y + 2940 *! UNTIL + 2950 CPX #$C0 + 2960 *! WHILE + 2970 CPX #0 + 2980 *! UNTIL + 2990 TAX + 3000 PLA + 3010 SBC #1 ;carry is set + 3020 *! UNTIL + 3030 BIT P2 + 3040 *! IF + 3050 JSR HEFF8 + 3060 *! ENDIF + 3070 *! LOOP + 3080 LDA (ACC),Y + 3090 *! WHILE + 3100 TAX + 3110 AND #$3F + 3120 STA P2 + 3130 CLC + 3140 ADC #BLANK+$80 + 3150 JSR COUT + 3160 DEY + 3170 CPX #$C0 + 3180 *! UNTIL + 3190 JSR HE00C + 3200 PLA + 3210 CMP #$5D ;93 ] + 3220 BEQ HE099 ;=> + 3230 CMP #$28 ;40 ( + 3240 *!UNTIL + 3250 BEQ HE099 ;=>always + 3260 + 3270 * tkn $2A ( + 3280 * substring + 3290 * PRINT A$(12,14) + 3300 + 3310 PAREN_SUBSTR ;VO + 3320 JSR HE118 + 3330 STA NOUNSTKL,X + 3340 CMP NOUNSTKH,X + 3350 HE102 + 3360 BCC HE115 ;=LO> + 3370 HE104 + 3380 LDY #ErrMsg05 ;"STRING" + 3390 HE106 + 3400 JMP ERRMESS + 3410 *> + 3420 + 3430 * tkn $23 , + 3440 * substring + 3450 * PRINT A$(3,3) + 3460 + 3470 COMMA_SUBSTR ;VO + 3480 JSR GETBYTE + 3490 CMP NOUNSTKL,X + 3500 BCC HE104 ;=LO>"STRING" + 3510 JSR HEFE4 + 3520 STA NOUNSTKH,X + 3530 HE115 + 3540 JMP HE823 + 3550 *> + 3560 + 3570 HE118 + 3580 JSR GETBYTE + 3590 BEQ HE104 ;=>"STRING" + 3600 SEC + 3610 SBC #1 + 3620 RTS + 3630 ** + 3640 + 3650 * tkn $42 ( + 3660 * string array is destination of the data + 3670 * A$(1)="HELLO" + 3680 + 3690 HE121 ;VO + 3700 JSR HE118 + 3710 STA NOUNSTKL,X + 3720 CLC + 3730 SBC NOUNSTKH,X + 3740 JMP HE102 + 3750 *> + 3760 + 3770 HE12C + 3780 LDY #ErrMsg03 ;"MEM FULL" + 3790 BNE HE106 ;=>always + 3800 + 3810 * tkn $43 , + 3820 * next var in DIM statement is string + 3830 * DIM X(5),A$(5) + 3840 + 3850 * tkn $4E DIM + 3860 * string var. uses tkn $22 ( + 3870 * DIM A$(5) + 3880 + 3890 DIMSTR ;VO + 3900 JSR HE118 + 3910 INX + 3920 HE134 + 3930 LDA NOUNSTKL,X + 3940 STA AUX + 3950 ADC ACC + 3960 PHA + 3970 TAY + 3980 LDA NOUNSTKH,X + 3990 STA AUX+1 + 4000 ADC ACC+1 + 4010 PHA + 4020 CPY PP + 4030 SBC PP+1 + 4040 BCS HE12C ;=HS>"MEM FULL" error + 4050 LDA AUX ;AUX := AUX-2 + 4060 ADC #<0-2 + 4070 STA AUX + 4080 LDA #>0-2 + 4090 TAY + 4100 ADC AUX+1 + 4110 STA AUX+1 + 4120 *!LOOP + 4130 INY + 4140 LDA (AUX),Y + 4150 CMP PV,Y + 4160 BNE DimErr ;=> + 4170 TYA + 4180 *!UNTIL + 4190 *!LOOP + 4200 PLA + 4210 STA (AUX),Y + 4220 STA PV,Y + 4230 DEY + 4240 *!UNTIL + 4250 INX + 4260 RTS + 4270 ** + 4280 + 4290 NOP ;Z + 4300 DimErr + 4310 LDY #ErrMsg17 ;"DIM" + 4320 HE16F + 4330 BNE HE106 ;=>always + 4340 + 4350 INPUTSTR ;input a string + 4360 LDA #0 + 4370 JSR HE70A + 4380 LDY #$02 + 4390 STY NOUNSTKH,X + 4400 JSR HE70A + 4410 STX XSAVE + 4420 TAX + 4430 INC PROMPT ;change '>' to '?' + 4440 JSR RDKEY + 4450 DEC PROMPT ;change '?' to '>' + 4460 TXA + 4470 LDX XSAVE + 4480 STA NOUNSTKH,X + 4490 + 4500 * tkn $70 = + 4510 * string - non-conditional + 4520 * A$ = "HELLO" + 4530 + 4540 HE18C ;VO + 4550 LDA NOUNSTKL+1,X + 4560 STA ACC + 4570 LDA NOUNSTKH+1,X + 4580 STA ACC+1 + 4590 INX + 4600 INX + 4610 JSR HE1BC + 4620 *!LOOP + 4630 LDA NOUNSTKL-2,X + 4640 CMP NOUNSTKH-2,X + 4650 *!WHILE + 4660 INC NOUNSTKL-2,X + 4670 TAY + 4680 LDA (ACC),Y + 4690 LDY NOUNSTKL,X + 4700 CPY P2 + 4710 *! IF + 4720 LDY #ErrMsg18 ;"STR OVFL" + 4730 BNE HE16F ;=>always + 4740 *! ENDIF + 4750 STA (AUX),Y + 4760 INC NOUNSTKL,X + 4770 *!UNTIL + 4780 LDY NOUNSTKL,X + 4790 TXA + 4800 STA (AUX),Y + 4810 JMP HF223 + 4820 *> + 4830 + 4840 HE1BC ;solo + 4850 LDA NOUNSTKL+1,X + 4860 STA AUX + 4870 SEC + 4880 SBC #2 + 4890 STA P2 + 4900 LDA NOUNSTKH+1,X + 4910 STA AUX+1 + 4920 SBC #0 + 4930 STA P2+1 + 4940 LDY #0 + 4950 LDA (P2),Y + 4960 CLC + 4970 SBC AUX + 4980 STA P2 + 4990 RTS + 5000 ** + 5010 + 5020 * tkn $39 = + 5030 * string logic op + 5040 * IF A$ = "CAT" THEN END + 5050 + 5060 HE1D7 ;V + 5070 LDA NOUNSTKL+3,X + 5080 STA ACC + 5090 LDA NOUNSTKH+3,X + 5100 STA ACC+1 + 5110 LDA NOUNSTKL+1,X + 5120 STA AUX + 5130 LDA NOUNSTKH+1,X + 5140 STA AUX+1 + 5150 INX + 5160 INX + 5170 INX + 5180 LDY #0 + 5190 STY NOUNSTKH,X + 5200 STY NOUNSTKC,X + 5210 INY + 5220 STY NOUNSTKL,X + 5230 *!LOOP + 5240 LDA HIMEM+1,X + 5250 CMP NOUNSTKH-3,X + 5260 PHP + 5270 PHA + 5280 LDA NOUNSTKL-1,X + 5290 CMP NOUNSTKH-1,X + 5300 *! IF + 5310 PLA + 5320 PLP + 5330 *! IF + 5340 HE203 + 5350 LSR NOUNSTKL,X + 5360 *! ENDIF + 5370 RTS + 5380 + 5390 *! ENDIF + 5400 TAY + 5410 LDA (ACC),Y + 5420 STA P2 + 5430 PLA + 5440 TAY + 5450 PLP + 5460 BCS HE203 ;=>EXIT LOOP + 5470 LDA (AUX),Y + 5480 CMP P2 + 5490 BNE HE203 ;=>EXIT LOOP + 5500 INC NOUNSTKL-1,X + 5510 INC HIMEM+1,X + 5520 *!UNTIL + 5530 * always + 5540 + 5550 * tkn $3A # + 5560 * string logic op + 5570 * IF A$ # "CAT" THEN END + 5580 + 5590 HE21C ;VO + 5600 JSR HE1D7 + 5610 JMP NOT + 5620 *> + 5630 + 5640 * tkn $14 * + 5650 * num math op + 5660 * A = 27 * 2 + 5670 + 5680 MULT ;V + 5690 JSR HE254 + 5700 *!LOOP + 5710 ASL ACC + 5720 ROL ACC+1 ;add partial product if C flag set + 5730 *! IF + 5740 ADDW P3;AUX;P3 + 5750 *! ENDIF + 5760 DEY + 5770 BEQ HE244 ;=>EXIT LOOP + 5780 ASL P3 + 5790 ROL P3+1 + 5800 *!UNTIL + 5810 JMP HE77E + 5820 *> + 5830 + 5840 HE244 + 5850 LDA P3 + 5860 JSR HE708 + 5870 LDA P3+1 + 5880 STA NOUNSTKC,X + 5890 ASL P2+1 + 5900 BCC HE279 ;=>RTS + 5910 JMP NEGATE + 5920 *> + 5930 + 5940 HE254 + 5950 LDA #$55 + 5960 STA P2+1 + 5970 JSR HE25B + 5980 HE25B + 5990 MOVW ACC;AUX + 6000 JSR GET16BIT + 6010 STY P3 ;P3 := 0 + 6020 STY P3+1 + 6030 LDA ACC+1 + 6040 *!IF + 6050 DEX + 6060 ASL P2+1 + 6070 JSR NEGATE + 6080 JSR GET16BIT + 6090 *!ENDIF + 6100 LDY #$10 + 6110 HE279 + 6120 RTS + 6130 ** + 6140 + 6150 * tkn $1F MOD + 6160 * num op + 6170 * IF X MOD 13 THEN END + 6180 + 6190 MOD ;V + 6200 JSR HEE6C + 6210 BEQ HE244 ;=>always + 6220 + 6230 DB $FF ;Z + 6240 + 6250 HE280 ;solo + 6260 INC PROMPT ;change '>' to '?' + 6270 LDY #0 + 6280 JSR GETCMD + 6290 DEC PROMPT ;change '?' to '>' + 6300 RTS + 6310 ** + 6320 + 6330 * tkn $3D SCRN( + 6340 * PRINT SCRN(X,Y) + 6350 + 6360 SCRN ;VO + 6370 JSR GETBYTE + 6380 LSR ;Areg := Areg/2 + 6390 PHP ;stash carry (lsb) + 6400 JSR GBASCALC + 6410 JSR GETBYTE + 6420 TAY + 6430 LDA (GBAS),Y ;get screen byte + 6440 PLP ;retrieve carry + 6450 *!IF + 6460 LSR ;odd, upper half + 6470 LSR + 6480 LSR + 6490 LSR + 6500 *!ENDIF + 6510 AND #$0F ;Areg := color number + 6520 LDY #0 + 6530 JSR HE708 + 6540 STY NOUNSTKC,X + 6550 DEY + 6560 STY PRFLAG ;PRFLAG := $FF + 6570 + 6580 * tkn $3E , + 6590 * PRINT SCRN(X,Y) + 6600 + 6610 COMMA_SCRN ;VO + 6620 RTS + 6630 ** + 6640 + 6650 DB $FF,$FF,$FF,$FF ;Z + 6660 + 6670 JSR HEFD3 ;old 4K cold start ;Z + 6672 + 6674 * Warm start + 6676 + 6680 WARM ;main compile/execute code + 6690 JSR CROUT ;emit blank line + 6700 HE2B6 + 6710 LSR RUNFLAG ;not running + 6720 LDA #">" + 6730 JSR SetPrompt ;set and print prompt char + 6740 LDY #0 + 6750 STY LEADZR ;no leading zeros for AUTOLN + 6760 BIT AUTOFLAG ;AUTO? + 6762 * if AUTOLN active + 6770 *!IF + 6780 LDX AUTOLN ;yes, print line number + 6790 LDA AUTOLN+1 + 6800 JSR PRDEC + 6810 LDA #BLANK+$80 ;and a blank + 6820 JSR COUT + 6830 *!ENDIF + 6840 LDX #$FF ;init Sreg + 6850 TXS + 6860 JSR GETCMD + 6870 STY TOKNDX + 6880 TXA + 6890 STA TXTNDX + 6900 LDX #$20 + 6910 JSR HE491 + 6920 LDA TXTNDX ;PX := TXTNDX+$0200+C flag + 6930 ADC #<$0200 + 6940 STA PX + 6950 LDA #0 + 6960 TAX + 6970 ADC #>$0200 + 6980 STA PX+1 + 6990 LDA (PX,X) + 7000 AND #$F0 + 7010 CMP #"0" + 7020 *!IF + 7030 JMP HE883 + 7040 *!ENDIF + 7050 LDY #2 ;move two bytes + 7060 *!LOOP + 7070 LDA (PX),Y + 7080 STA ACC-1,Y + 7090 DEY + 7100 *!UNTIL + 7110 JSR HE38A + 7120 LDA TOKNDX + 7130 SBC TXTNDX + 7140 CMP #$04 + 7150 BEQ HE2B6 ;=> + 7160 STA (PX),Y + 7170 LDA PP ;P2 := PP-(PX),Y + 7180 SBC (PX),Y + 7190 STA P2 + 7200 LDA PP+1 + 7210 SBC #0 + 7220 STA P2+1 + 7230 CMPW P2;PV + 7240 BCC MEMFULL ;=>P2 PV + 7250 *!LOOP + 7260 LDA PP ;P3 := PP-(PX),Y + 7270 SBC (PX),Y + 7280 STA P3 + 7290 LDA PP+1 + 7300 SBC #0 + 7310 STA P3+1 + 7320 LDA (PP),Y + 7330 STA (P3),Y + 7340 INCW PP + 7350 CMPW P1;PP + 7360 *!UNTIL + 7370 *!LOOP + 7380 LDA P2,X + 7390 STA PP,X + 7400 DEX + 7410 *!UNTIL + 7420 LDA (PX),Y + 7430 TAY + 7440 *!LOOP + 7450 DEY + 7460 LDA (PX),Y + 7470 STA (P3),Y + 7480 TYA + 7490 *!UNTIL + 7500 BIT AUTOFLAG ;auto line? + 7510 *!IF + 7520 * yes + 7530 *! LOOP + 7540 LDA AUTOLN+1,X ;AUTOLN := AUTOLN+AUTOINC + 7550 ADC AUTOINC+1,X + 7560 STA AUTOLN+1,X + 7570 INX + 7580 *! UNTIL + 7590 *!ENDIF + 7600 BPL HE3E5 ;=>always + 7610 + 7620 DB $00,$00,$00,$00 ;Z + 7630 + 7640 MEMFULL + 7650 LDY #ErrMsg03 ;"MEM FULL" + 7660 BNE ERRMESS ;=>always + 7670 + 7680 * tkn $0A , + 7690 * DEL 0,10 + 7700 + 7710 COMMA_DEL ;VO + 7720 JSR GET16BIT + 7730 MOVW P1;P3 + 7740 JSR HE575 + 7750 MOVW P1;P2 + 7760 BNE HE395 ;=>always? + 7770 + 7780 * tkn $09 DEL + 7790 + 7800 DEL ;VO + 7810 JSR GET16BIT + 7820 HE38A + 7830 JSR HE56D + 7840 MOVW P3;P1 + 7850 HE395 + 7860 LDY #0 + 7870 * memory move: P3PP P2 + 7910 DECW P2 + 7920 DECW P3 + 7930 LDA (P2),Y + 7940 STA (P3),Y + 7950 *!UNTIL + 7960 * always + 7970 + 7980 HE3B7 ;solo + 7990 MOVW P3;PP + 8000 RTS + 8010 ** + 8020 + 8030 *!LOOP + 8040 JSR COUT ;print error message + 8050 INY + 8060 ERRORMESS ;print error message + 8070 LDA ErrorMsgs,Y ;routine entry point + 8080 *!UNTIL + 8090 ORA #$80 + 8100 JMP COUT + 8110 *> + 8120 + 8130 GETCMD + 8140 TYA + 8150 TAX + 8160 JSR NXTCHAR ; + 8170 TXA + 8180 TAY + 8190 LDA #"_" ;underline problem? + 8200 STA IN,Y + 8210 LDX #$FF + 8220 RTS + 8230 ** + 8240 + 8250 RTS ;Z + 8260 ** + 8270 + 8280 HE3DE + 8290 LDY #ErrMsg01 ;"TOO LONG" + 8300 ERRMESS ;print error message and goto mainline + 8310 JSR PRINTERR + 8320 *$E3E3 DOS 3.3 chains here when processing errors + 8330 BIT RUNFLAG + 8340 HE3E5 + 8350 *!IF + 8360 JMP HE2B6 + 8370 *!ENDIF + 8380 JMP HEB9A + 8390 *> + 8400 + 8410 HE3ED ;solo + 8420 ROL + 8430 ADC #$A0 + 8440 CMP IN,X + 8450 BNE HE448 ;=> + 8460 LDA (SYNPAG),Y + 8470 ASL + 8480 *!IF + 8490 DEY + 8500 LDA (SYNPAG),Y + 8510 BMI HE428 ;=> + 8520 INY + 8530 *!ENDIF + 8540 STX TXTNDX + 8550 TYA + 8560 PHA + 8570 LDX #0 + 8580 LDA (SYNPAG,X) + 8590 TAX + 8600 *!LOOP + 8610 LSR + 8620 EOR #$40 + 8630 ORA (SYNPAG),Y + 8640 CMP #$C0 + 8650 *! IF + 8660 INX + 8670 *! ENDIF + 8680 INY + 8690 *!UNTIL + 8700 PLA + 8710 TAY + 8720 TXA + 8730 JMP HF2F8 + 8740 *> + 8750 + 8760 HE41C + 8770 INC TOKNDX + 8780 LDX TOKNDX + 8790 BEQ HE3DE ;=>"TOO LONG" + 8800 STA IN,X + 8810 HE425 + 8820 RTS + 8830 ** + 8840 + 8850 HE426 ;solo + 8860 LDX TXTNDX + 8870 HE428 + 8880 LDA #BLANK+$80 + 8890 *!LOOP + 8900 INX + 8910 CMP IN,X + 8920 *!UNTIL + 8930 LDA (SYNPAG),Y + 8940 AND #$3F + 8950 LSR + 8960 BNE HE3ED ;=> + 8970 LDA IN,X + 8980 *!IF + 8990 ADC #$3F + 9000 CMP #$1A + 9010 BCC HE4B1 ;=LO> + 9020 *!ENDIF + 9030 ADC #$4F + 9040 CMP #$0A + 9050 BCC HE4B1 ;=LO> + 9060 HE448 + 9070 LDX SYNSTKDX + 9080 *!LOOP + 9090 INY + 9100 LDA (SYNPAG),Y + 9110 AND #$E0 + 9120 CMP #$20 + 9130 BEQ HE4CD ;=> + 9140 LDA TXTNDXSTK,X + 9150 STA TXTNDX + 9160 LDA TOKNDXSTK,X + 9170 STA TOKNDX + 9180 *! LOOP + 9190 DEY + 9200 LDA (SYNPAG),Y + 9210 ASL ;dbl + 9220 *! UNTIL + 9230 DEY + 9240 BCS HE49C ;=> + 9250 ASL ;dbl + 9260 BMI HE49C ;=> + 9270 LDY SYNSTKH,X + 9280 STY SYNPAG+1 + 9290 LDY SYNSTKL,X + 9300 INX + 9310 *!UNTIL + 9320 HE470 + 9330 BEQ HE425 ;=>RTS + 9340 CMP #$7E + 9350 BCS HE498 ;=HS> + 9360 DEX + 9370 *!IF + 9380 LDY #ErrMsg01 ;"TOO LONG" + 9390 * BUG FIX: ABOVE LINE SHOULD BE + 9400 * LDY #ErrMsg04 ;"TOO MANY PARENS" + 9410 * REF: CALL-APPLE MAR 1983 P.114 + 9420 BPL HE4A6 ;=>always + 9430 *!ENDIF + 9440 STY SYNSTKL,X + 9450 LDY SYNPAG+1 + 9460 STY SYNSTKH,X + 9470 LDY TXTNDX + 9480 STY TXTNDXSTK,X + 9490 LDY TOKNDX + 9500 STY TOKNDXSTK,X + 9510 AND #$1F + 9520 TAY + 9530 LDA SYNTABLNDX,Y + 9540 HE491 + 9550 ASL ;dbl + 9560 TAY + 9570 LDA #>SYNTABL/2 + 9580 ROL + 9590 STA SYNPAG+1 + 9600 HE498 + 9610 *!IF + 9620 INY + 9630 *!ENDIF + 9640 INY + 9650 HE49C + 9660 STX SYNSTKDX + 9670 LDA (SYNPAG),Y + 9680 BMI HE426 ;=> + 9690 *!IF + 9700 LDY #ErrMsg02 ;"SYNTAX" + 9710 HE4A6 + 9720 JMP ERRMESS + 9730 *!ENDIF + 9740 CMP #$03 + 9750 BCS HE470 ;=HS> + 9760 LSR ;half + 9770 LDX TXTNDX + 9780 INX + 9790 HE4B1 + 9800 LDA IN,X + 9810 BCC HE4BA ;=> + 9820 CMP #DQT+$80 + 9830 BEQ HE4C4 ;=> + 9840 HE4BA + 9850 CMP #"_" ;underline problem? + 9860 BEQ HE4C4 ;=> + 9870 STX TXTNDX + 9880 HE4C0 + 9890 *!LOOP + 9900 JSR HE41C + 9910 INY + 9920 HE4C4 + 9930 DEY + 9940 LDX SYNSTKDX + 9950 *! LOOP + 9960 LDA (SYNPAG),Y + 9970 DEY + 9980 ASL + 9990 BPL HE49C ;=> + 10000 HE4CD + 10010 LDY SYNSTKH,X + 10020 STY SYNPAG+1 + 10030 LDY SYNSTKL,X + 10040 INX + 10050 LDA (SYNPAG),Y + 10060 AND #%10011111 + 10070 *! UNTIL + 10080 STA PCON + 10090 STA PCON+1 + 10100 TYA + 10110 PHA + 10120 STX SYNSTKDX + 10130 LDY TOKNDXSTK-1,X + 10140 STY LEADBL + 10150 CLC + 10160 *! LOOP + 10170 LDA #$0A + 10180 STA CHAR + 10190 LDX #0 + 10200 INY + 10210 LDA IN,Y + 10220 AND #$0F + 10230 *! LOOP + 10240 ADC PCON + 10250 PHA + 10260 TXA + 10270 ADC PCON+1 + 10280 BMI HE517 ;=> + 10290 TAX + 10300 PLA + 10310 DEC CHAR + 10320 *! UNTIL + 10330 STA PCON + 10340 STX PCON+1 + 10350 CPY TOKNDX + 10360 *! UNTIL + 10370 LDY LEADBL + 10380 INY + 10390 STY TOKNDX + 10400 JSR HE41C + 10410 PLA + 10420 TAY + 10430 LDA PCON+1 + 10440 *!UNTIL + 10450 HE517 + 10460 LDY #ErrMsg00 ;">32767" + 10470 BPL HE4A6 ;=>always + 10480 + 10490 *----------------------------- + 10500 * Name PRDEC + 10510 * Purpose Print a 16-bit number in decimal. + 10520 * Input Areg = high byte + 10530 * Xreg = low byte + 10540 * Output + 10550 * Uses + 10560 * Calls + 10570 * Note + 10580 + 10590 PRDEC + 10600 STA PCON+1 + 10610 STX PCON + 10620 LDX #4 + 10630 STX LEADBL + 10640 *!LOOP + 10650 LDA #"0" + 10660 STA CHAR + 10670 *! LOOP + 10680 LDA PCON + 10690 CMP NUMLOW,X + 10700 LDA PCON+1 + 10710 SBC NUMHI,X + 10720 *! WHILE + 10730 STA PCON+1 + 10740 LDA PCON + 10750 SBC NUMLOW,X + 10760 STA PCON + 10770 INC CHAR + 10780 *! UNTIL + 10790 *GETDIG + 10800 LDA CHAR + 10810 INX + 10820 DEX + 10830 BEQ PRDEC5 ;=> + 10840 CMP #"0" + 10850 *! IF + 10860 STA LEADBL + 10870 *! ENDIF + 10880 * if LEADBL is or LEADZR #0 + 10890 BIT LEADBL + 10900 BMI PRDEC5 ;=> + 10910 LDA LEADZR + 10920 BEQ PRDEC6 ;=> + 10930 * then + 10940 PRDEC5 ;PRINT + 10950 JSR COUT + 10960 BIT AUTOFLAG ;auto line? + 10970 *! IF + 10980 STA IN,Y + 10990 INY + 11000 *! ENDIF + 11010 PRDEC6 ;NXTX + 11020 DEX + 11030 *!UNTIL + 11040 RTS + 11050 ** + 11060 + 11070 NUMLOW + 11080 DB 1 + 11090 DB 10 + 11100 DB 100 + 11110 DB 1000 + 11120 DB 10000 + 11130 + 11140 NUMHI + 11150 DB 1/$0100 + 11160 DB 10/$0100 + 11170 DB 100/$0100 + 11180 DB 1000/$0100 + 11190 DB 10000/$0100 + 11200 + 11210 HE56D + 11220 MOVW PP;P3 + 11230 HE575 + 11240 INX + 11250 HE576 + 11260 *!LOOP + 11270 * MOVW P3;P2 + 11280 LDA P3+1 ;P2 := P3 + 11290 STA P2+1 + 11300 LDA P3 + 11310 STA P2 + 11320 * CMPW P2;HIMEM + 11330 CMP HIMEM ;is P2 HIMEM? + 11340 LDA P2+1 + 11350 SBC HIMEM+1 + 11360 *!WHILE + 11370 LDY #1 + 11380 LDA (P2),Y + 11390 SBC ACC + 11400 INY + 11410 LDA (P2),Y + 11420 SBC ACC+1 + 11430 *!WHILE + 11440 LDY #0 + 11450 LDA P3 ;P3 := P3.W + (P2).B + 11460 ADC (P2),Y + 11470 STA P3 + 11480 *! IF + 11490 INC P3+1 + 11500 CLC + 11510 *! ENDIF + 11520 INY + 11530 LDA ACC :is ACC+1 (P2),Y ? + 11540 SBC (P2),Y + 11550 INY + 11560 LDA ACC+1 + 11570 SBC (P2),Y + 11580 *!UNTIL + 11590 RTS + 11600 ** + 11610 + 11620 * tkn $0B NEW + 11621 * turn off AUTO + 11630 * remove program + 11632 * fall into CLR + 11640 + 11650 NEW ;V + 11660 LSR AUTOFLAG ;manual + 11670 MOVW HIMEM;PP + 11680 + 11690 * tkn $0C CLR + 11700 * remove variables + 11702 * remove FOR loops and GOSUBs + 11710 + 11720 CLR ;V + 11730 MOVW LOMEM;PV + 11740 LDA #0 + 11750 STA FORNDX ;no FORs + 11760 STA GOSUBNDX ;no GOSUBs + 11770 STA SYNPAG + 11780 LDA #0 ;Z + 11790 STA $1D ;Z + 11800 RTS + 11810 ** + 11820 + 11830 LDA SRCH ;Z + 11840 HE5CE + 11850 JMP MEMFULL + 11860 *> + 11870 + 11880 *!LOOP + 11890 *! LOOP + 11900 LDY #$FF + 11910 HE5D3 + 11920 STY XSAVE + 11930 *! LOOP + 11940 INY + 11950 LDA (PX),Y + 11960 *! IF + 11970 CMP #$40 + 11980 BNE HE646 ;=>EXIT LOOP + 11990 STA XSAVE + 12000 *! ENDIF + 12010 CMP (SRCH),Y + 12020 *! UNTIL + 12030 *! LOOP + 12040 LDA (SRCH),Y + 12050 HE5E6 + 12060 INY + 12070 LSR + 12080 *! UNTIL + 12090 LDA (SRCH),Y + 12100 PHA + 12110 INY + 12120 LDA (SRCH),Y + 12130 TAY + 12140 PLA + 12150 HE5F2 + 12160 STA SRCH + 12170 STY SRCH+1 + 12180 CMP PV + 12190 *! UNTIL + 12200 CPY PV+1 + 12210 *!UNTIL + 12220 LDY #0 + 12230 *!LOOP + 12240 *! LOOP + 12250 INY + 12260 LDA (PX),Y + 12270 *! UNTIL + 12280 EOR #$40 + 12290 *!UNTIL + 12300 TYA + 12310 ADC #$04 + 12320 PHA + 12330 ADC SRCH + 12340 TAY + 12350 LDA SRCH+1 + 12360 ADC #0 + 12370 PHA + 12380 CPY PP + 12390 SBC PP+1 + 12400 BCS HE5CE ;=HS>"MEM FULL" error + 12410 STY PV + 12420 PLA + 12430 STA PV+1 + 12440 PLA + 12450 TAY + 12460 LDA #0 + 12470 DEY + 12480 STA (SRCH),Y + 12490 DEY + 12500 STA (SRCH),Y + 12510 DEY + 12520 LDA PV+1 + 12530 STA (SRCH),Y + 12540 DEY + 12550 LDA PV + 12560 STA (SRCH),Y + 12570 DEY + 12580 LDA #0 + 12590 *!LOOP + 12600 STA (SRCH),Y + 12610 DEY + 12620 BMI HE5D3 ;=> + 12630 LDA (PX),Y + 12640 *!UNTIL + 12650 HE640 + 12660 LDA LOMEM + 12670 LDY LOMEM+1 + 12680 BNE HE5F2 ;=>always + 12690 + 12700 HE646 + 12710 LDA (SRCH),Y + 12720 CMP #$40 + 12730 BCS HE5E6 ;=HS> + 12740 STA NOUNSTKC-1,X + 12750 TYA + 12760 ADC #$03 + 12770 PHA + 12780 ADC SRCH + 12790 JSR HE70A + 12800 *!LOOP + 12810 JSR GETVERB + 12820 DEY + 12830 *!UNTIL + 12840 TYA + 12850 ADC SRCH+1 + 12860 STA NOUNSTKH,X + 12870 PLA + 12880 BIT XSAVE + 12890 BMI HE684 ;=> + 12900 TAY + 12910 LDA #0 + 12920 JSR HE70A + 12930 STA NOUNSTKH,X + 12940 *!LOOP + 12950 LDA (SRCH),Y + 12960 BPL HE682 ;=>EXIT LOOP + 12970 INC NOUNSTKH,X + 12980 INY + 12990 *!UNTIL + 13000 * always + 13010 + 13020 DB 9 ;Z + 13030 + 13040 HE679 ;solo + 13050 LDA #0 + 13060 STA IFFLAG ;pos + 13070 STA CRFLAG ;pos + 13080 LDX #$20 + 13090 HE681 + 13100 PHA + 13110 HE682 + 13120 LDY #0 + 13130 HE684 + 13140 LDA (PX),Y + 13150 *!LOOP + 13160 BPL HE6A0 ;=>EXIT LOOP + 13170 ASL + 13180 BMI HE640 ;=> + 13190 JSR GETVERB + 13200 JSR HE708 + 13210 JSR GETVERB + 13220 STA NOUNSTKC,X + 13230 HE696 + 13240 BIT IFFLAG + 13250 *! IF + 13260 DEX + 13270 *! ENDIF + 13280 HE69B + 13290 JSR GETVERB + 13300 *!UNTIL + 13310 HE6A0 + 13320 CMP #$28 + 13330 *!IF + 13340 LDA PX + 13350 JSR HE70A + 13360 LDA PX+1 + 13370 STA NOUNSTKH,X + 13380 BIT IFFLAG + 13390 BMI HE6BC ;=> + 13400 LDA #$01 + 13410 JSR HE70A + 13420 LDA #0 + 13430 STA NOUNSTKH,X + 13440 *! LOOP + 13450 INC NOUNSTKH,X + 13460 HE6BC + 13470 JSR GETVERB + 13480 *! UNTIL + 13490 BCS HE696 ;=> + 13500 *!ENDIF + 13510 BIT IFFLAG + 13520 *!IF + 13530 CMP #$04 + 13540 BCS HE69B ;=HS> + 13550 LSR IFFLAG ;pos + 13560 *!ENDIF + 13570 TAY + 13580 STA VERBNOW + 13590 LDA HE980,Y + 13600 AND #%01010101 ;even bits only + 13610 ASL + 13620 STA PRFLAG ;temp + 13630 HE6D8 + 13640 PLA + 13650 TAY + 13660 LDA HE980,Y + 13670 AND #%10101010 ;odd bits only + 13680 CMP PRFLAG + 13690 *!IF + 13700 TYA + 13710 PHA + 13720 JSR HF3EB + 13730 LDA VERBNOW + 13740 BCC HE681 ;=LT> always + 13750 *!ENDIF + 13760 + 13770 * BRANCH: get high/low then JSR + 13780 + 13790 LDA VERBADRL,Y + 13800 STA ACC + 13810 LDA VERBADRH,Y + 13820 STA ACC+1 + 13830 JSR HE6FC + 13840 JMP HE6D8 + 13850 *> + 13860 + 13870 HE6FC + 13880 JMP (ACC) + 13890 *> + 13900 + 13910 GETVERB ;get next verb to use + 13920 INCW PX + 13930 LDA (PX),Y + 13940 RTS + 13950 ** + 13960 + 13970 HE708 + 13980 STY NOUNSTKH-1,X + 13990 HE70A + 14000 DEX + 14010 *!IF + 14020 STA NOUNSTKL,X + 14030 RTS + 14040 *!ENDIF + 14050 + 14060 LDY #$66 ;"PPED AT" ;Z? + 14070 HE712 + 14080 JMP ERRMESS + 14090 *> + 14100 + 14110 *--------- + 14120 * Output Yreg := 0 + 14130 + 14140 GET16BIT ;get a 16 bit value + 14150 LDY #0 + 14160 LDA NOUNSTKL,X + 14170 STA ACC + 14180 LDA NOUNSTKC,X + 14190 STA ACC+1 + 14200 LDA NOUNSTKH,X + 14210 *!IF + 14220 STA ACC+1 + 14230 LDA (ACC),Y ;ACC := (ACC),Y + 14240 PHA ;save low byte + 14250 INY ;Yreg := 1 + 14260 LDA (ACC),Y + 14270 STA ACC+1 + 14280 PLA ;restore low byte + 14290 STA ACC + 14300 DEY ;Yreg := 0 + 14310 *!ENDIF + 14320 INX + 14330 RTS + 14340 ** + 14350 + 14360 * tkn $16 = + 14370 * num var logic op + 14380 * IF X = 13 THEN END + 14390 + 14400 HE733 ;VO + 14410 JSR HE74A + 14420 + 14430 * tkn $37 NOT + 14440 * numeric + 14450 * IF NOT X THEN END + 14460 + 14470 NOT ;V + 14480 JSR GET16BIT + 14490 TYA ;Areg := 0 + 14500 JSR HE708 + 14510 STA NOUNSTKC,X + 14520 CMP ACC + 14530 *!IF + 14540 CMP ACC+1 + 14550 *! IF + 14560 INC NOUNSTKL,X + 14570 *! ENDIF + 14580 *!ENDIF + 14590 RTS + 14600 ** + 14610 + 14620 * tkn $17 # + 14630 * num var logic op + 14640 * IF X # 13 THEN END + 14650 + 14660 * tkn $1B <> + 14670 * num var logic op + 14680 * IF X <> 13 THEN END + 14690 + 14700 HE74A ;V + 14710 JSR SUBTRACT + 14720 JSR SGN + 14730 + 14740 * tkn $31 ABS + 14750 + 14760 ABS ;VO + 14770 JSR GET16BIT + 14780 BIT ACC+1 + 14790 BMI HE772 ;=> + 14800 HE757 ;solo + 14810 DEX + 14820 HE758 + 14830 RTS + 14840 ** + 14850 + 14860 * tkn $30 SGN + 14870 + 14880 SGN ;V + 14890 JSR GET16BIT + 14900 LDA ACC+1 ;is ACC zero? + 14910 *!IF + 14920 LDA ACC + 14930 BEQ HE757 ;=>yes + 14940 *!ENDIF + 14950 LDA #$FF + 14960 JSR HE708 + 14970 STA NOUNSTKC,X + 14980 BIT ACC+1 + 14990 BMI HE758 ;=>RTS + 15000 + 15010 * tkn $36 - + 15020 * unary sign of number + 15030 * X = -5 + 15040 + 15050 NEGATE ;V + 15060 JSR GET16BIT + 15070 HE772 + 15080 TYA ;Areg := 0 + 15090 SEC + 15100 SBC ACC + 15110 JSR HE708 + 15120 TYA + 15130 SBC ACC+1 + 15140 BVC HE7A1 ;=> + 15150 HE77E + 15160 LDY #ErrMsg00 ;">32767" + 15170 BPL HE712 ;=>always + 15180 + 15190 * tkn $13 - + 15200 * num op + 15210 * X=27-2 + 15220 + 15230 SUBTRACT ;V + 15240 JSR NEGATE ;negate, then add + 15250 + 15260 * tkn $12 + + 15270 * num op + 15280 * X=27+2 + 15290 + 15300 ADDITION ;VO + 15310 JSR GET16BIT + 15320 MOVW ACC;AUX + 15330 JSR GET16BIT + 15340 HE793 + 15350 CLC + 15360 LDA ACC + 15370 ADC AUX + 15380 JSR HE708 + 15390 LDA ACC+1 + 15400 ADC AUX+1 + 15410 BVS HE77E ;=> + 15420 HE7A1 + 15430 STA NOUNSTKC,X + 15440 + 15450 * tkn $35 + + 15460 * unary sign of number + 15470 * X = +5 + 15480 + 15490 POSITIVE ;VO + 15500 RTS + 15510 ** + 15520 + 15530 * tkn $50 TAB + 15540 + 15550 TAB ;VO + 15560 JSR GETBYTE + 15570 TAY + 15580 *!IF + 15590 JMP HEECB ;range error? + 15600 *!ENDIF + 15610 DEY + 15620 HE7AE ;solo + 15630 JMP HF3F4 + 15640 *> + 15650 + 15660 * comma tab to next tab posn (every 8 spaces) + 15670 + 15680 HE7B1 + 15690 LDA CH ;get horiz posn + 15700 ORA #$07 ;set bits 0-2 + 15710 TAY + 15720 INY ;incr, is it zero? + 15730 HE7B7 ;Z + 15740 BNE HE7AE ;=>no, adjust CH + 15750 INY ;yes, go to next tab posn + 15760 BNE HE7B1 ;=>always + 15770 BCS HE7B7 ;=>;Z + 15780 RTS ;Z + 15790 ** + 15800 + 15810 DB 0,0 ;Z + 15820 + 15830 * tkn $49 , + 15840 * num print follows + 15850 * PRINT A$,X + 15860 + 15870 HE7C1 ;VO + 15880 JSR HE7B1 + 15890 + 15900 * tkn $46 ; + 15910 * num print follows + 15920 * PRINT A$ ; X + 15930 + 15940 * tkn $62 PRINT + 15950 * num value + 15960 * PRINT 123: PRINT X: PRINT ASC(A$) + 15970 + 15980 PRNTNUM ;VO branch + 15990 JSR GET16BIT + 16000 HE7C7 ;solo + 16010 LDA ACC+1 ;is it positive? + 16020 *!IF + 16030 LDA #"-" ;no, print minus sign + 16040 JSR COUT + 16050 JSR HE772 + 16060 BVC PRNTNUM ;=>always + 16070 *!ENDIF + 16080 DEY ;Yreg := $FF + 16090 STY CRFLAG ;CRFLAG := $FF + 16100 STX ACC+1 ;save Xreg + 16110 LDX ACC + 16120 JSR PRDEC + 16130 LDX ACC+1 ;restore Xreg + 16140 RTS + 16150 ** + 16160 + 16170 * tkn $0D AUTO + 16180 + 16190 AUTO ;VO + 16200 JSR GET16BIT + 16210 MOVW ACC;AUTOLN + 16220 DEY + 16230 STY AUTOFLAG ;AUTOFLAG := $FF + 16240 INY + 16250 LDA #10 ;default increment + 16260 HE7F3 + 16270 STA AUTOINC + 16280 STY AUTOINC+1 + 16290 RTS + 16300 ** + 16310 + 16320 * tkn $0E , + 16330 * AUTO 10,20 + 16340 + 16350 COMMA_AUTO ;VO + 16360 JSR GET16BIT + 16370 LDA ACC + 16380 LDY ACC+1 + 16390 BPL HE7F3 ;=>always + 16400 + 16410 * tkn $56 = + 16420 * FOR X = 5 TO 10 + 16430 + 16440 * tkn $71 = + 16450 * num - non-conditional + 16460 * X = 5 + 16470 + 16480 HE801 ;V + 16490 JSR GET16BIT + 16500 LDA NOUNSTKL,X + 16510 STA AUX + 16520 LDA NOUNSTKH,X + 16530 STA AUX+1 + 16540 LDA ACC + 16550 STA (AUX),Y + 16560 INY + 16570 LDA ACC+1 + 16580 JMP HF207 + 16590 *> + 16600 + 16610 * tkn $25 THEN + 16620 * IF X = 3 THEN Y = 5 + 16630 + 16640 * tkn $5E LET + 16650 + 16660 LET ;VO + 16670 RTS + 16680 ** + 16690 + 16700 * tkn $00 + 16710 * internal begin-of-line + 16720 + 16730 BEGIN_LINE ;VO + 16740 PLA + 16750 PLA + 16760 + 16770 * tkn $03 : + 16780 * statement separation + 16790 * X = 5: A$ = "HELLO" + 16800 + 16810 COLON ;VO + 16820 BIT CRFLAG + 16830 BPL HE822 ;=>RTS + 16840 + 16850 * tkn $63 PRINT + 16860 * dummy print + 16870 * PRINT: PRINT + 16880 + 16890 PRINT_CR ;VO + 16900 JSR CROUT + 16910 + 16920 * tkn $47 ; + 16930 * end of print statement + 16940 * PRINT A$; + 16950 + 16960 HE820 ;VO + 16970 LSR CRFLAG ;pos + 16980 HE822 + 16990 RTS + 17000 ** + 17010 + 17020 * tkn $22 ( + 17030 * string DIM + 17040 * DIM A$(X) + 17050 + 17060 * tkn $34 ( + 17070 * num DIM + 17080 * DIM X(5) + 17090 + 17100 * tkn $38 ( + 17110 * logic statements and num operations + 17120 * IF C AND (A=14 OR B=12) THEN X=(27+3)/13 + 17130 + 17140 * tkn $3F ( + 17150 * used after PEEK, RND, SGN, ABS, and PDL + 17160 + 17170 HE823 ;V + 17180 LDY #$FF + 17190 STY PRFLAG ;PRFLAG := $FF + 17200 + 17210 * tkn $72 ) + 17220 * the only right parenthesis token + 17230 + 17240 RIGHT_PAREN ;VO + 17250 RTS + 17260 ** + 17270 + 17280 * tkn $60 IF + 17290 + 17300 IF ;VO + 17310 JSR HEFCD + 17320 *!IF + 17330 LDA #$25 ;THEN token? + 17340 STA VERBNOW + 17350 DEY + 17360 STY IFFLAG + 17370 *!ENDIF + 17380 INX + 17390 RTS + 17400 ** + 17410 + 17420 * RUN without CLR + 17430 * DOS 3.3 chains here to run a program + 17440 + 17450 RUNWARM ;solo + 17460 LDA PP + 17470 LDY PP+1 + 17480 BNE HE896 ;=>always + 17490 + 17500 * tkn $5C GOSUB + 17510 + 17520 GOSUB ;VO + 17530 LDY #ErrMsg08 ;"16 GOSUBS" + 17540 LDA GOSUBNDX + 17550 CMP #16 ;sixteen GOSUBs? + 17560 BCS HE8A2 ;=HS> yes, error + 17570 TAY + 17580 INC GOSUBNDX + 17590 + 17600 LDA PX + 17610 STA STK_00,Y + 17620 LDA PX+1 + 17630 STA STK_10,Y + 17640 + 17650 LDA PR + 17660 STA STK_20,Y + 17670 LDA PR+1 + 17680 STA STK_30,Y + 17690 + 17700 * tkn $24 THEN + 17710 * followed by a line number + 17720 * IF X=3 THEN 10 + 17730 + 17740 * tkn $5F GOTO + 17750 + 17760 GOTO ;V + 17770 JSR GET16BIT + 17780 JSR HE56D + 17790 *!IF + 17800 LDY #ErrMsg07 ;"BAD BRANCH" + 17810 BNE HE8A2 ;=>always + 17820 *!ENDIF + 17830 LDA P2 + 17840 LDY P2+1 + 17850 + 17860 * main loop for running Integer BASIC programs + 17870 + 17880 *!LOOP + 17890 *! LOOP + 17900 STA PR + 17910 STY PR+1 + 17920 CLC + 17930 ADC #$03 + 17940 *! IF + 17950 INY + 17960 *! ENDIF + 17970 GETNEXT ;fetch next statement from text source + 17980 LDX #$FF + 17990 STX RUNFLAG ;neg + 18000 TXS + 18010 STA PX + 18020 STY PX+1 + 18030 JSR HF02E ;test for ctrl-C & TRACE mode + 18040 LDY #0 + 18050 HE883 + 18060 JSR HE679 ;execute statement + 18070 BIT RUNFLAG + 18080 BPL END ;=> + 18090 CLC + 18100 LDY #0 + 18110 LDA PR + 18120 ADC (PR),Y + 18130 LDY PR+1 + 18140 *! IF + 18150 INY + 18160 *! ENDIF + 18170 HE896 + 18180 CMP HIMEM + 18190 *! UNTIL + 18200 CPY HIMEM+1 + 18210 *!UNTIL + 18220 LDY #ErrMsg06 ;"NO END" + 18230 LSR RUNFLAG ;pos + 18240 HE8A2 + 18250 JMP ERRMESS + 18260 *> + 18270 + 18280 * tkn $5B RETURN + 18290 + 18300 RETURN ;V + 18310 LDY #ErrMsg09 ;"BAD RETURN" + 18320 LDA GOSUBNDX + 18330 BEQ HE8A2 ;=> + 18340 DEC GOSUBNDX + 18350 TAY + 18360 LDA STK_20-1,Y + 18370 STA PR + 18380 LDA STK_30-1,Y + 18390 STA PR+1 + 18400 LDX: STK_00-1,Y + 18410 LDA STK_10-1,Y + 18420 HE8BE + 18430 TAY + 18440 TXA + 18450 JMP GETNEXT + 18460 *> + 18470 + 18480 STOPPED_AT + 18490 LDY #ErrMsg12 ;"STOPPED AT " + 18500 JSR ERRORMESS + 18510 LDY #1 + 18520 LDA (PR),Y + 18530 TAX + 18540 INY + 18550 LDA (PR),Y + 18560 JSR PRDEC + 18570 + 18580 * tkn $51 END + 18590 + 18600 END ;V + 18610 JMP WARM + 18620 *> + 18630 + 18640 *!LOOP + 18650 *! LOOP + 18660 DEC FORNDX + 18670 + 18680 * tkn $59 NEXT + 18690 + 18700 * tkn $5A , + 18710 * NEXT X,Y + 18720 + 18730 NEXT ;VO + 18740 LDY #ErrMsg11 ;"BAD NEXT" + 18750 LDA FORNDX + 18760 HE8DC + 18770 BEQ HE8A2 ;=>no more FORs + 18780 TAY + 18790 LDA NOUNSTKL,X + 18800 CMP STK_40-1,Y + 18810 *! UNTIL + 18820 LDA NOUNSTKH,X + 18830 CMP STK_50-1,Y + 18840 *!UNTIL + 18850 + 18860 LDA STK_60-1,Y + 18870 STA AUX + 18880 LDA STK_70-1,Y + 18890 STA AUX+1 + 18900 + 18910 JSR GET16BIT + 18920 DEX + 18930 JSR HE793 + 18940 JSR HE801 + 18950 DEX + 18960 LDY FORNDX + 18970 LDA STK_D0-1,Y + 18980 STA NOUNSTKC-1,X + 18990 LDA STK_C0-1,Y + 19000 LDY #0 + 19010 JSR HE708 + 19020 JSR SUBTRACT + 19030 JSR SGN + 19040 JSR GET16BIT + 19050 LDY FORNDX + 19060 LDA ACC + 19070 *!IF + 19080 EOR STK_70-1,Y + 19090 BPL HE937 ;=> + 19100 *!ENDIF + 19110 + 19120 LDA STK_80-1,Y + 19130 STA PR + 19140 LDA STK_90-1,Y + 19150 STA PR+1 + 19160 + 19170 LDX STK_A0-1,Y + 19180 LDA STK_B0-1,Y + 19190 BNE HE8BE ;=> + 19200 HE937 + 19210 DEC FORNDX + 19220 RTS + 19230 ** + 19240 + 19250 * tkn $55 FOR + 19260 + 19270 FOR ;VO + 19280 LDY #ErrMsg10 ;"16 FORS" + 19290 LDA FORNDX + 19300 CMP #16 ;sixteen FORs? + 19310 BEQ HE8DC ;=>yes, error + 19320 INC FORNDX + 19330 TAY + 19340 LDA NOUNSTKL,X + 19350 STA STK_40,Y + 19360 LDA NOUNSTKH,X + 19370 JMP HF288 + 19380 *> + 19390 + 19400 RTS ;Z + 19410 ** + 19420 + 19430 * tkn $57 TO + 19440 + 19450 TO ;VO + 19460 JSR GET16BIT + 19470 LDY FORNDX + 19480 + 19490 LDA ACC + 19500 STA STK_C0-1,Y + 19510 LDA ACC+1 + 19520 STA STK_D0-1,Y + 19530 + 19540 LDA #<$0001 + 19550 STA STK_60-1,Y + 19560 LDA #>$0001 + 19570 HE966 ;solo + 19580 STA STK_70-1,Y + 19590 + 19600 LDA PR + 19610 STA STK_80-1,Y + 19620 LDA PR+1 + 19630 STA STK_90-1,Y + 19640 + 19650 LDA PX + 19660 STA STK_A0-1,Y + 19670 LDA PX+1 + 19680 STA STK_B0-1,Y + 19690 RTS + 19700 ** + 19710 + 19720 DB $20,$15 ;Z + 19730 + 19740 + 19750 PUT TABLE1 + 19760 HE980 + 19770 DB $00,$00,$00,$AB,$03,$03,$03,$03 + 19780 DB $03,$03,$03,$03,$03,$03,$03,$03 + 19790 DB $03,$03,$3F,$3F,$C0,$C0,$3C,$3C + 19800 DB $3C,$3C,$3C,$3C,$3C,$30,$0F,$C0 + 19810 DB $C3,$FF,$55,$00,$AB,$AB,$03,$03 + 19820 DB $FF,$FF,$55,$FF,$FF,$55,$CF,$CF + 19830 DB $CF,$CF,$CF,$FF,$55,$C6,$C6,$C6 + 19840 DB $55,$F0,$F0,$CF,$CF,$55,$01,$55 + 19850 DB $FF,$FF,$55,$03,$03,$03,$03,$03 + 19860 DB $03,$03,$03,$03,$03,$03,$03,$03 + 19870 DB $03,$03,$03,$03,$03,$03,$03,$03 + 19880 DB $03,$03,$03,$03,$03,$00,$AB,$03 + 19890 DB $57,$03,$03,$03,$03,$07,$03,$03 + 19900 DB $03,$03,$03,$03,$03,$03,$03,$03 + 19910 DB $03,$03,$AA,$FF,$03,$03,$03,$03 + 19920 DB $03,$03,$03,$03,$03,$03,$03,$03 + 19930 + 19940 * token address tables (verb dispatch tables) + 19950 + 19960 VERBADRL + 19970 DB BEGIN_LINE,>$FFFF,>$FFFF,>COLON + 20320 DB >LOAD,>SAVE,>CON,>RUNNUM + 20330 DB >RUN,>DEL,>COMMA_DEL,>NEW + 20340 DB >CLR,>AUTO,>COMMA_AUTO,>MAN + 20350 DB >VHIMEM,>VLOMEM,>ADDITION,>SUBTRACT + 20360 DB >MULT,>DIVIDE,>HE733,>HE74A + 20370 DB >HF25B,>HF24E,>HF253,>HE74A + 20380 DB >HF249,>VAND,>VOR,>MOD + 20390 DB >EXP,>$FFFF,>HE823,>COMMA_SUBSTR + 20400 DB >GOTO,>LET,>HEFB6,>HEBCB + 20410 DB >$FFFF,>$FFFF,>PAREN_SUBSTR,>$FFFF + 20420 DB >$FFFF,>HEF24,>PEEK,>RND + 20430 DB >SGN,>ABS,>PDL,>$FFFF + 20440 DB >HE823,>POSITIVE,>NEGATE,>NOT + 20450 DB >HE823,>HE1D7,>HE21C,>LEN + 20460 DB >ASC,>SCRN,>COMMA_SCRN,>HE823 + 20470 DB >$FFFF,>$FFFF,>HE121,>DIMSTR + 20480 DB >DIMNUM,>PRNTSTR,>PRNTNUM,>HE820 + 20490 DB >HEE00,>HE7C1,>HF3BA,>SETTXT + 20500 DB >SETGR,>CALL,>DIMSTR,>DIMNUM + 20510 DB >TAB,>END,>HEFB6,>INPUT_PROMPT + 20520 DB >HEBAA,>FOR,>HE801,>TO + 20530 DB >STEP,>NEXT,>NEXT,>RETURN + 20540 DB >GOSUB,>$FFFF,>LET,>GOTO + 20550 DB >IF,>PRNTSTR,>PRNTNUM,>PRINT_CR + 20560 DB >POKE,>GETVAL255,>COLOR,>GETVAL255 + 20570 DB >COMMA_PLOT,>GETVAL255,>COMMA_HLIN,>AT_HLIN + 20580 DB >GETVAL255,>COMMA_VLIN,>AT_VLIN,>IVTAB + 20590 DB >HE18C,>HE801,>RIGHT_PAREN,>$FFFF + 20600 DB >LISTNUM,>COMMA_LIST,>LIST,>POP + 20610 DB >NODSP_STR,>NODSP_NUM,>NOTRACE,>DSP_NUM + 20620 DB >DSP_STR,>TRACE,>PRSLOT,>INSLOT + 20630 + 20640 ErrorMsgs + 20650 + 20660 ErrMsg00 = *-ErrorMsgs+$8100 ;00 + 20670 DCI ">32767" + 20680 + 20690 ErrMsg01 = *-ErrorMsgs+$8100 ;06 + 20700 DCI "TOO LONG" + 20710 + 20720 ErrMsg02 = *-ErrorMsgs+$8100 ;0E + 20730 DCI "SYNTAX" + 20740 + 20750 ErrMsg03 = *-ErrorMsgs+$8100 ;14 + 20760 DCI "MEM FULL" + 20770 + 20780 ErrMsg04 = *-ErrorMsgs+$8100 ;1C + 20790 DCI "TOO MANY PARENS" + 20800 + 20810 ErrMsg05 = *-ErrorMsgs+$8100 ;2B + 20820 DCI "STRING" + 20830 + 20840 ErrMsg06 = *-ErrorMsgs+$8100 ;31 + 20850 DCI "NO END" + 20860 + 20870 ErrMsg07 = *-ErrorMsgs+$8100 ;37 + 20880 DCI "BAD BRANCH" + 20890 + 20900 ErrMsg08 = *-ErrorMsgs+$8100 ;41 + 20910 DCI "16 GOSUBS" + 20920 + 20930 ErrMsg09 = *-ErrorMsgs+$8100 ;4A + 20940 DCI "BAD RETURN" + 20950 + 20960 ErrMsg10 = *-ErrorMsgs+$8100 ;54 + 20970 DCI "16 FORS" + 20980 + 20990 ErrMsg11 = *-ErrorMsgs+$8100 ;5B + 21000 DCI "BAD NEXT" + 21010 + 21020 ErrMsg12 = *-ErrorMsgs+$8100 ;63 + 21030 DCI "STOPPED AT " + 21040 + + 21050 ErrMsg13 = *-ErrorMsgs+$8100 ;6E + 21060 DCI "*** " + 21070 + 21080 ErrMsg14 = *-ErrorMsgs+$8100 ;72 + 21090 ASC " ERR" + 21100 DB CR + 21110 + 21120 ErrMsg15 = *-ErrorMsgs+$8100 ;77 + 21130 DCI ">255" + 21140 + 21150 ErrMsg16 = *-ErrorMsgs+$8100 ;7B + 21160 DCI "RANGE" + 21170 + 21180 ErrMsg17 = *-ErrorMsgs+$8100 ;80 + 21190 DCI "DIM" + 21200 + 21210 ErrMsg18 = *-ErrorMsgs+$8100 ;83 + 21220 DCI "STR OVFL" + 21230 + 21240 ASC "\" ;8B + 21250 DB CR + 21260 + 21270 ErrMsg20 = *-ErrorMsgs+$8100 ;8D + 21280 ASC "RETYPE LINE" + 21290 DB CR+$80 + 21300 + 21310 ErrMsg21 = *-ErrorMsgs+$8100 ;99 + 21320 ASC '?' + 21330 + 21340 PUT PART2 + 21350 + 21360 *continue run w/o deleting vars? + 21370 + 21380 HEB9A ;solo + 21390 LSR RUNFLAG ;pos + 21400 *!IF + 21410 JMP STOPPED_AT + 21420 *!ENDIF + 21430 LDX ACC+1 + 21440 TXS + 21450 LDX ACC + 21460 LDY #ErrMsg20 ;"RETYPE LINE",CR,"?" + 21470 BNE HEBAC ;=>always + 21480 + 21490 * tkn $54 INPUT + 21500 * num with no prompt + 21510 * INPUT X + 21520 + 21530 HEBAA ;VO branch + 21540 LDY #ErrMsg21 ;'?' for INPUT + 21550 HEBAC + 21560 JSR ERRORMESS + 21570 STX ACC + 21580 TSX + 21590 STX ACC+1 + 21600 JSR HF366 + 21610 STY TOKNDX + 21620 LDA #$FF + 21630 STA TXTNDX + 21640 ASL + 21650 STA RUNFLAG ;neg + 21660 LDX #$20 + 21670 LDA #$15 + 21680 JSR HE491 + 21690 INC RUNFLAG + 21700 LDX ACC + 21710 + 21720 * tkn $27 , + 21730 * num inputs + 21740 * INPUT "QUANTITY",Q + 21750 + 21760 HEBCB ;VO + 21770 LDY TXTNDX + 21780 ASL + 21790 *!LOOP + 21800 STA ACC + 21810 INY + 21820 LDA IN,Y + 21830 CMP #$80 + 21840 BEQ HEBAA ;=>end of input? + 21850 EOR #"0" + 21860 CMP #10 + 21870 *!UNTIL + 21880 INY + 21890 INY + 21900 STY TXTNDX + 21910 LDA IN,Y + 21920 PHA + 21930 LDA IN-1,Y + 21940 LDY #0 + 21950 JSR HE708 + 21960 PLA + 21970 STA NOUNSTKC,X + 21980 LDA ACC + 21990 CMP #$33 + 22000 *!IF + 22010 JSR NEGATE + 22020 *!ENDIF + 22030 JMP HE801 + 22040 *> + 22050 + 22060 + 22070 + 22080 DB $FF,$FF,$FF ;Z + 22090 + 22100 PUT TABLE2 + 22110 * token/syntax table + 22120 + 22130 SYNTABL + 22140 DB $50 + 22150 + 22160 DB $20,$4F,$C0 ;Z + 22170 DB "T"+32,"A"-32 ;Z + 22180 DB "D"+32,"O"-32,"M"-32 ;Z + 22190 DB "R"+32,"O"-32 ;Z + 22200 DB "D"+32,"N"-32,"A"-32 ;Z + 22210 DB "P"+32,"E"-32,"T"-32,"S"-32 ;Z + 22220 DB "O"+32,"T"-32 ;Z + 22230 DB "N"+32,"E"-32,"H"-32,"T"-32 ;Z + 22240 + 22250 DB $5C,$80,$00,$40 + 22260 DB $60,$8D,$60,$8B,$7F,$1D,$20,$7E + 22270 DB $8C,$33,$00,$00,$60,$03,$BF,$12 + 22280 + 22290 DB $47,"#"-32,"N"-32,"I"-32 ;IN# + 22300 DB $67,"#"-32,"R"-32,"P"-32 ;PR# + 22310 DB "E"+32,"C"-32,"A"-32,"R"-32,"T"-32 ;TRACE + 22320 DB $79,"P"-32,"S"-32,"D"-32 ;DSP + 22330 DB $69,"P"-32,"S"-32,"D"-32 ;DSP + 22340 DB "E"+32,"C"-32,"A"-32,"R"-32,"T"-32,"O"-32,"N"-32 ;NOTRACE + 22350 DB $79,"P"-32,"S"-32,"D"-32,"O"-32,"N"-32 ;NODSP + 22360 DB $69,"P"-32,"S"-32,"D"-32,"O"-32,"N"-32 ;NODSP + 22370 DB "P"+32,"O"-32,"P"-32 ;POP + 22380 DB "T"+32,"S"-32,"I"-32,"L"-32 ;LIST + 22390 DB $60,","-32 ; + 22400 DB $20,"T"-32,"S"-32,"I"-32,"L"-32 ;LIST + 22410 DB 0 + 22420 DB $40,$89 + 22430 DB ")"+32 ; + 22440 DB $47,"="-32 ; + 22450 DB $17,$68,"="-32 ; + 22460 DB $0A,$58,$7B,$67,"B"-32,"A"-32,"T"-32,"V"-32 ;VTAB + 22470 DB $67,"T"-32,"A"-32 ;AT + 22480 DB $07,","-32 ; + 22490 DB $07,"N"-32,"I"-32,"L"-32,"V"-32 ;VLIN + 22500 DB $67,"T"-32,"A"-32 ;AT + 22510 DB $07,","-32 ; + 22520 DB $07,"N"-32,"I"-32,"L"-32,"H"-32 ;HLIN + 22530 DB $67,","-32 ; + 22540 DB $07,"T"-32,"O"-32,"L"-32,"P"-32 ;PLOT + 22550 DB $67,"="-32,"R"-32,"O"-32,"L"-32,"O"-32,"C"-32 ;COLOR= + 22560 DB $67,","-32 ; + 22570 DB $07,"E"-32,"K"-32,"O"-32,"P"-32 ;POKE + 22580 DB "T"+32,"N"-32,"I"-32,"R"-32,"P"-32 ;PRINT + 22590 DB $7F,$0E,$27,"T"-32,"N"-32,"I"-32,"R"-32,"P"-32 ;PRINT + 22600 DB $7F,$0E,$28,"T"-32,"N"-32,"I"-32,"R"-32,"P"-32 ;PRINT + 22610 DB $64,$07,"F"-32,"I"-32 ;IF + 22620 DB $67,"O"-32,"T"-32,"O"-32,"G"-32 ;GOTO + 22630 DB $78,"T"-32,"E"-32,"L"-32 ;LET + 22640 DB $6B,$7F,$02,"M"-32,"E"-32,"R"-32 ;REM + 22650 DB $67,"B"-32,"U"-32,"S"-32,"O"-32,"G"-32 ;GOSUB + 22660 DB "N"+32,"R"-32,"U"-32,"T"-32,"E"-32,"R"-32 ;RETURN + 22670 DB $7E,","-32 ; + 22680 DB $39,"T"-32,"X"-32,"E"-32,"N"-32 ;NEXT + 22690 DB $67,"P"-32,"E"-32,"T"-32,"S"-32 ;STEP + 22700 DB $27,"O"-32,"T"-32 ;TO + 22710 DB $07,"="-32 ; + 22720 DB $19,"R"-32,"O"-32,"F"-32 ;FOR + 22730 DB $7F,$05,$37,"T"-32,"U"-32,"P"-32,"N"-32,"I"-32 ;INPUT + 22740 DB $7F,$05,$28,"T"-32,"U"-32,"P"-32,"N"-32,"I"-32 ;INPUT + 22750 DB $7F,$05,$2A,"T"-32,"U"-32,"P"-32,"N"-32,"I"-32 ;INPUT + 22760 DB "D"+32,"N"-32,"E"-32 ;END (tkn $51) + 22770 + 22780 SYNTABL2 + 22790 DB 0 + 22800 DB $47,"B"-32,"A"-32,"T"-32 ;TAB (tkn $50) + 22810 DB $7F,$0D,$30,"M"-32,"I"-32,"D"-32 ;DIM + 22820 DB $7F,$0D,$23,"M"-32,"I"-32,"D"-32 ;DIM + 22830 DB $67,"L"-32,"L"-32,"A"-32,"C"-32 ;CALL + 22840 DB "R"+32,"G"-32 ;GR + 22850 DB "T"+32,"X"-32,"E"-32,"T"-32 ;TEXT + 22860 DB 0 ;above are statements + 22870 DB $4D,","+32 ; + 22880 DB $67,","-32 ; + 22890 DB $68,","-32 ; + 22900 DB ";"+32 ; + 22910 DB $67,";"-32 ; + 22920 DB $68,";"-32 ; + 22930 DB $50,","-32 ; + 22940 DB $63,","-32 ; + 22950 DB $7F,$01,$51,$07,"("-32 ; + 22960 DB $29,$84 + 22970 DB $80,"$"+32 ; + 22980 DB $19,$57,$71,$07,"("-32 ; + 22990 DB $14,$71,$07,","-32 ; + 23000 DB $07,"("-32,"N"-32,"R"-32,"C"-32,"S"-32 ;SCRN( + 23010 DB $71,$08,"("-32,"C"-32,"S"-32,"A"-32 ;ASC( + 23020 DB $71,$08,"("-32,"N"-32,"E"-32,"L"-32 ;LEN( + 23030 DB $68,"#"-32 ; + 23040 DB $08,$68,"="-32 ; + 23050 DB $08,$71,$07,"("-32 ; + 23060 DB $60,$75,"T"-32,"O"-32,"N"-32 ;NOT + 23070 DB $75,"-"-32 ; + 23080 DB $75,"+"-32 ; + 23090 DB $51,$07,"("-32,$19 ; + 23100 DB "X"-32,"D"-32,"N"-32,"R"-32 + 23110 DB "L"+32,"D"-32,"P"-32 ;PDL + 23120 DB "S"+32,"B"-32,"A"-32 ;ABS + 23130 DB "N"+32,"G"-32,"S"-32 ;SGN + 23140 DB "D"+32,"N"-32,"R"-32 ;RND + 23150 DB "K"+32,"E"-32,"E"-32,"P"-32 ;PEEK + 23160 DB $51,$07,"("-32 ; + 23170 DB $39,$81,$C1,$4F,$7F,$0F,$2F + 23180 DB 0 ;above are functions + 23190 DB $51,$06,"("-32 ; + 23200 DB $29,"""+32 ;open quote + 23210 DB $0C,"""-32 ;close quote + 23220 DB $57,","-32 ; + 23230 DB $6A,","-32 ; + 23240 DB $42,"N"-32,"E"-32,"H"-32,"T"-32 ;THEN + 23250 DB $60,"N"-32,"E"-32,"H"-32,"T"-32 ;THEN + 23260 DB $4F,$7E,$1E,$35,","-32 ; + 23270 DB $27,$51,$07,"("-32 ; + 23280 DB $09,"+"-32 + 23290 DB "^"+32 ;exponent + 23300 DB "D"+32,"O"-32,"M"-32 ;MOD + 23310 DB "R"+32,"O"-32 ;OR + 23320 DB "D"+32,"N"-32,"A"-32 ;AND + 23330 DB "<"+32 ;less than + 23340 DB ">"+32,"<"-32 ;not equal + 23350 DB "="+32,"<"-32 ;less or equal + 23360 DB ">"+32 ;greater than + 23370 DB "="+32,">"-32 ;greater or equal + 23380 DB "#"+32 ;not equal + 23390 DB "="+32 ;equal + 23400 DB "/"+32 ;divide + 23410 DB "*"+32 ;multiply + 23420 DB "-"+32 ;subtract + 23430 DB "+"+32 ;add + 23440 DB 0 ;above 4 are num ops + 23450 DB $47,":"-32,"M"-32,"E"-32,"M"-32,"O"-32,"L"-32 ;LOMEM: + 23460 DB $67,":"-32,"M"-32,"E"-32,"M"-32,"I"-32,"H"-32 ;HIMEM: + 23470 DB "N"+32,"A"-32,"M"-32 ;MAN + 23480 DB $60,","-32 ;comma for AUTO + 23490 DB $20,"O"-32,"T"-32,"U"-32,"A"-32 ;AUTO + 23500 DB "R"+32,"L"-32,"C"-32 ;CLR + 23510 DB "W"+32,"E"-32,"N"-32 ;NEW + 23520 DB $60,","-32 ;comma for DEL + 23530 DB $20,"L"-32,"E"-32,"D"-32 ;DEL + 23540 DB "N"+32,"U"-32,"R"-32 ;RUN + 23550 DB $60,"N"-32,"U"-32,"R"-32 ;RUN + 23560 DB "N"+32,"O"-32,"C"-32 ;CON + 23570 DB "E"+32,"V"-32,"A"-32,"S"-32 ;SAVE + 23580 DB "D"+32,"A"-32,"O"-32,"L"-32 ;LOAD + 23590 *above are commands + 23600 DB $7A,$7E,$9A,$22,$20 + 23610 DB $00,$60,$03,$BF,$60,$03,$BF,$1F + 23620 + 23630 + 23640 PUT PART3 + 23650 * tkn $48 , + 23660 * string prints + 23670 * PRINT T,A$ + 23680 + 23690 HEE00 ;VO + 23700 JSR HE7B1 + 23710 + 23720 * tkn $45 ; + 23730 * string prints + 23740 * PRINT anytype ; string + 23750 + 23760 * tkn $61 PRINT + 23770 * string var or literal + 23780 * PRINT A$: PRINT "HELLO" + 23790 + 23800 PRNTSTR ;V + 23810 INX + 23820 INX + 23830 LDA NOUNSTKL-1,X + 23840 STA AUX + 23850 LDA NOUNSTKH-1,X + 23860 STA AUX+1 + 23870 LDY NOUNSTKL-2,X + 23880 HEE0F ;*!LOOP + 23890 TYA + 23900 CMP NOUNSTKH-2,X + 23910 BCS HEE1D ;=HS>exit loop + 23920 LDA (AUX),Y + 23930 JSR COUT + 23940 INY + 23950 JMP HEE0F ;*!loop always + 23960 HEE1D + 23970 LDA #$FF + 23980 STA CRFLAG ;CRFLAG := $FF + 23990 RTS + 24000 ** + 24010 + 24020 * tkn $3B LEN( + 24030 + 24040 LEN ;VO + 24050 INX + 24060 LDA #0 + 24070 STA NOUNSTKH,X + 24080 STA NOUNSTKC,X + 24090 LDA NOUNSTKH-1,X + 24100 SEC + 24110 SBC NOUNSTKL-1,X + 24120 STA NOUNSTKL,X + 24130 JMP HE823 + 24140 *> + 24150 + 24160 DB $FF ;Z + 24170 + 24180 GETBYTE + 24190 JSR GET16BIT + 24200 LDA ACC+1 + 24210 BNE HI255ERR ;=>">255" error + 24220 LDA ACC + 24230 RTS + 24240 ** + 24250 + 24260 * tkn $68 , + 24270 * PLOT 20,15 + 24280 + 24290 COMMA_PLOT ;VO + 24300 JSR GETBYTE + 24310 LDY TXTNDX + 24320 CMP #48 + 24330 BCS RANGERR ;=HS> + 24340 CPY #40 + 24350 BCS RANGERR ;=HS> + 24360 JMP PLOT + 24370 *> + 24380 + 24390 * tkn $66 COLOR= + 24400 + 24410 COLOR ;VO + 24420 JSR GETBYTE + 24430 JMP SETCOL + 24440 *> + 24450 + 24460 * tkn $0F MAN + 24470 + 24480 MAN + 24490 LSR AUTOFLAG ;manual + 24500 RTS + 24510 ** + 24520 + 24530 * tkn $6F VTAB + 24540 + 24550 IVTAB ;VO + 24560 JSR HF3B3 + 24570 CMP #24 + 24580 BCS RANGERR ;=HS> + 24590 STA CV + 24600 JMP VTAB + 24610 *> + 24620 + 24630 HI255ERR + 24640 LDY #ErrMsg15 ;">255" + 24650 HEE65 + 24660 JMP ERRMESS + 24670 *> + 24680 + 24690 RANGERR + 24700 LDY #ErrMsg16 ;"RANGE" + 24710 BNE HEE65 ;=>always + 24720 + 24730 * divide routine + 24740 + 24750 HEE6C + 24760 JSR HE254 + 24770 LDA AUX ;is AUX zero? + 24780 *!IF + 24790 LDA AUX+1 + 24800 *! IF + 24810 JMP HE77E ;yes, ">32767" error + 24820 *! ENDIF + 24830 *!ENDIF + 24840 *!LOOP + 24850 ASL ACC + 24860 ROL ACC+1 + 24870 ROL P3 + 24880 ROL P3+1 + 24890 CMPW P3;AUX + 24900 *! IF + 24910 STA P3+1 ;P3 := P3-AUX + 24920 LDA P3 + 24930 SBC AUX + 24940 STA P3 + 24950 INC ACC + 24960 *! ENDIF + 24970 DEY + 24980 *!UNTIL + 24990 RTS + 25000 ** + 25010 + 25020 DB $FF,$FF,$FF,$FF,$FF,$FF ;Z + 25030 + 25040 * tkn $4D CALL + 25050 + 25060 CALL ;VO + 25070 JSR GET16BIT + 25080 JMP (ACC) + 25090 *> + 25100 + 25110 * tkn $6A , + 25120 * HLIN 10,20 AT 30 + 25130 + 25140 COMMA_HLIN ;VO + 25150 JSR GETBYTE + 25160 CMP TXTNDX + 25170 BCC RANGERR ;=LO> + 25180 STA H2 + 25190 RTS + 25200 ** + 25210 + 25220 * tkn $6B AT + 25230 * HLIN 10,20 AT 30 + 25240 + 25250 AT_HLIN ;VO + 25260 JSR GETBYTE + 25270 CMP #48 + 25280 BCS RANGERR ;=HS> + 25290 LDY TXTNDX + 25300 JMP HLINE + 25310 *> + 25320 + 25330 * tkn $6D , + 25340 * VLIN 10,20 AT 30 + 25350 + 25360 COMMA_VLIN ;VO + 25370 JSR GETBYTE + 25380 CMP TXTNDX + 25390 BCC RANGERR ;=LO> + 25400 STA V2 + 25410 RTS + 25420 ** + 25430 + 25440 * tkn $6E AT + 25450 * VLIN 10,20 AT 30 + 25460 + 25470 AT_VLIN ;VO + 25480 JSR GETBYTE + 25490 CMP #40 + 25500 HEECB + 25510 BCS RANGERR ;=HS> + 25520 TAY + 25530 LDA TXTNDX + 25540 JMP VLINE + 25550 *> + 25560 + 25570 PRINTERR + 25580 TYA + 25590 TAX + 25600 LDY #ErrMsg13 ;"*** " + 25610 JSR ERRORMESS + 25620 TXA + 25630 TAY + 25640 JSR ERRORMESS + 25650 LDY #ErrMsg14 ;" ERR" + 25660 JMP PRTERR + 25670 *> + 25680 + 25690 HEEE4 + 25700 JSR HF23F + 25710 *!LOOP + 25720 ASL ACC + 25730 ROL ACC+1 + 25740 *!UNTIL + 25750 BCS HEECB ;=>"RANGE" error + 25760 *!IF + 25770 CMP ACC + 25780 BCS HEECB ;=HS>"RANGE" error + 25790 *!ENDIF + 25800 RTS + 25810 ** + 25820 + 25830 * tkn $2E PEEK + 25840 * uses tkn $3F ( + 25850 + 25860 PEEK ;VO + 25870 JSR GET16BIT + 25880 LDA (ACC),Y + 25890 STY NOUNSTKC-1,X + 25900 JMP HE708 + 25910 *> + 25920 + 25930 * tkn $65 , + 25940 * POKE 20000,5 + 25950 + 25960 * tkn $67 PLOT + 25970 + 25980 * tkn $69 HLIN + 25990 + 26000 * tkn $6C VLIN + 26010 + 26020 GETVAL255 ;VO + 26030 JSR GETBYTE + 26040 LDA ACC + 26050 STA TXTNDX + 26060 RTS + 26070 ** + 26080 + 26090 * tkn $64 POKE + 26100 + 26110 POKE ;VO + 26120 JSR GET16BIT + 26130 LDA TXTNDX + 26140 STA (ACC),Y + 26150 RTS + 26160 ** + 26170 + 26180 * tkn $15 / + 26190 * num op. uses $38 ( + 26200 * A = 27 / 2 + 26210 + 26220 DIVIDE ;VO + 26230 JSR HEE6C + 26240 MOVW ACC;P3 + 26250 JMP HE244 + 26260 *> + 26270 + 26280 * tkn $44 , + 26290 * next var in DIM is num + 26300 * DIM X(5),A(5) + 26310 + 26320 * tkn $4F DIM + 26330 * num var. uses tkn $22 ( + 26340 * DIM A(5) + 26350 + 26360 DIMNUM ;VO + 26370 JSR HEEE4 + 26380 JMP HE134 + 26390 *> + 26400 + 26410 * tkn $2D ( + 26420 * var array + 26430 * X(12) + 26440 + 26450 HEF24 ;VO + 26460 JSR HEEE4 + 26470 LDY NOUNSTKH,X + 26480 LDA NOUNSTKL,X + 26490 ADC #$FE + 26500 *!IF + 26510 DEY + 26520 *!ENDIF + 26530 STA AUX + 26540 STY AUX+1 + 26550 CLC + 26560 ADC ACC + 26570 STA NOUNSTKL,X + 26580 TYA + 26590 ADC ACC+1 + 26600 STA NOUNSTKH,X + 26610 LDY #0 + 26620 LDA NOUNSTKL,X + 26630 CMP (AUX),Y + 26640 INY + 26650 LDA NOUNSTKH,X + 26660 SBC (AUX),Y + 26670 BCS HEECB ;=HS>"RANGE" error + 26680 JMP HE823 + 26690 *> + 26700 + 26710 * tkn $2F RND + 26720 * uses tkn $3F ( + 26730 + 26740 RND ;VO + 26750 JSR GET16BIT + 26760 LDA RNDL + 26770 JSR HE708 + 26780 LDA RNDH + 26790 *!IF + 26800 CMP RNDL + 26810 ADC #0 + 26820 *!ENDIF + 26830 AND #$7F + 26840 STA RNDH + 26850 STA NOUNSTKC,X + 26860 LDY #$11 + 26870 *!LOOP + 26880 LDA RNDH + 26890 ASL + 26900 CLC + 26910 ADC #$40 + 26920 ASL + 26930 ROL RNDL + 26940 ROL RNDH + 26950 DEY + 26960 *!UNTIL + 26970 LDA ACC + 26980 JSR HE708 + 26990 LDA ACC+1 + 27000 STA NOUNSTKC,X + 27010 JMP MOD + 27020 *> + 27030 + 27040 JSR GET16BIT ;Z + 27050 LDY ACC ;is ACC LOMEM? + 27060 CPY LOMEM + 27070 LDA ACC+1 + 27080 SBC LOMEM+1 + 27090 BCC HEFAB ;=LO>yes + 27100 STY HIMEM ;HIMEM := ACC + 27110 LDA ACC+1 + 27120 STA HIMEM+1 + 27130 HEF93 ;Z + 27140 JMP NEW + 27150 *> + 27160 + 27170 JSR GET16BIT ;Z + 27180 LDY ACC ;is ACC LOMEM? + 27190 CPY HIMEM + 27200 LDA ACC+1 + 27210 SBC HIMEM+1 + 27220 BCS HEFAB ;=HS>yes + 27230 STY LOMEM ;LOMEM := ACC + 27240 LDA ACC+1 + 27250 STA LOMEM+1 + 27260 BCC HEF93 ;=LO>always + 27270 + 27280 HEFAB ;Z + 27290 JMP HEECB ;range error? + 27300 *> + 27310 + 27320 DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;Z + 27330 + 27340 * tkn $26 , + 27350 * string inputs + 27360 * INPUT "WHO",W$ + 27370 + 27380 * tkn $52 INPUT + 27390 * string with no prompt + 27400 * INPUT S$ + 27410 + 27420 HEFB6 ;VO + 27430 JSR INPUTSTR + 27440 JMP HEFBF + 27450 *> + 27460 + 27470 * tkn $53 INPUT + 27480 * string or num with prompt + 27490 * INPUT "WHO",W$: INPUT "QUANTITY",Q + 27500 + 27510 INPUT_PROMPT ;VO + 27520 JSR PRNTSTR + 27530 HEFBF + 27540 LDA #$FF + 27550 STA TXTNDX + 27560 LDA #$80 + 27570 STA IN + 27580 RTS + 27590 ** + 27600 + 27610 HEFC9 + 27620 JSR NOT + 27630 INX + 27640 HEFCD ;solo + 27650 JSR NOT + 27660 LDA NOUNSTKL,X + 27670 RTS + 27680 ** + 27690 + 27700 * old 4K cold start + 27710 + 27720 HEFD3 ;Z + 27730 LDA #0 + 27740 STA LOMEM ;LOMEM := $0800 + 27750 STA HIMEM ;HIMEM := $1000 + 27760 LDA #>$0800 + 27770 STA LOMEM+1 + 27780 LDA #>$1000 + 27790 STA HIMEM+1 + 27800 JMP NEW + 27810 *> + 27820 + 27830 HEFE4 ;solo + 27840 CMP NOUNSTKH,X + 27850 *!IF + 27860 CLC + 27870 *!ENDIF + 27880 JMP HE102 + 27890 *> + 27900 + 27910 * tkn $08 RUN + 27920 * run from first line of program + 27930 + 27940 RUN ;VO + 27950 JSR CLR + 27960 JMP RUNWARM + 27970 *> + 27980 + 27990 * tkn $07 RUN + 28000 * RUN 100 + 28010 + 28020 RUNNUM ;VO + 28030 JSR CLR + 28040 JMP GOTO + 28050 *> + 28060 + 28070 HEFF8 ;solo + 28080 CPX #$80 + 28090 *!IF + 28100 DEY + 28110 *!ENDIF + 28120 JMP HE00C + 28130 *> + 28140 + 28142 * Cold start + 28150 * set LOMEM, find HIMEM + 28152 * fall into NEW + 28160 + 28170 COLD + 28180 LDY #<$0800 + 28190 STY NOUNSTKC + 28200 STY LOMEM ;LOMEM := $0800 + 28210 STY HIMEM ;HIMEM := $0800 + 28220 LDA #>$0800 + 28230 STA LOMEM+1 + 28240 STA HIMEM+1 + 28250 *!LOOP + 28260 INC HIMEM+1 ;find top of RAM + 28270 LDA (HIMEM),Y + 28280 EOR #$FF + 28290 STA (HIMEM),Y + 28300 CMP (HIMEM),Y + 28310 *!WHILE + 28320 EOR #$FF + 28330 STA (HIMEM),Y + 28340 CMP (HIMEM),Y + 28350 *!UNTIL + 28360 JMP NEW + 28370 *> + 28380 + 28390 HF025 ;solo + 28400 JMP HF179 + 28410 *> + 28420 + 28430 JSR HF032 ;Z + 28440 JMP HE8BE ;Z + 28450 *> + 28460 + 28470 HF02E ;solo + 28480 LDX PX + 28490 LDA PX+1 + 28500 HF032 ;Z + 28510 LDY KBD ;get keypress + 28520 CPY #ETX+$80 ;is it ctrl-C? + 28530 BNE HF025 ;=>no + 28540 BIT KBDSTRB ;yes, clear keypress + 28550 STX NOUNSTKL + 28560 STA NOUNSTKL+1 + 28570 MOVW PR;NOUNSTKH + 28580 JMP STOPPED_AT + 28590 *> + 28600 + 28610 DB $FF,$FF ;Z + 28620 + 28630 * tkn $10 HIMEM: + 28640 + 28650 VHIMEM ;VO + 28660 JSR GET16BIT + 28670 STX XSAVE + 28680 LDX #0-2 + 28690 SEC + 28700 + 28710 * MOVW ACC;P2 + 28720 * SUBW HIMEM;ACC;AUX + 28730 + 28740 *!LOOP + 28750 LDA ACC+2,X + 28760 STA P2+2,X + 28770 LDA HIMEM+2,X + 28780 SBC ACC+2,X + 28790 STA AUX+2,X + 28800 INX + 28810 *!UNTIL + 28820 BCC HF0AF ;=> + 28830 DEX ;Xreg := $FF + 28840 + 28850 * MOVW PP;P3 + 28860 * SUBW PP;AUX;P2 + 28870 + 28880 *!LOOP + 28890 LDA PP+1,X + 28900 STA P3+1,X + 28910 SBC AUX+1,X + 28920 STA P2+1,X + 28930 INX + 28940 *!UNTIL + 28950 *!IF + 28960 CMPW PV;P2 + 28970 BCC HF08F ;=>PV P2 + 28980 *!ENDIF + 28990 HF07C + 29000 JMP MEMFULL + 29010 *> + 29020 + 29030 *!LOOP + 29040 LDA (P3),Y + 29050 STA (P2),Y + 29060 INCW P2 + 29070 INCW P3 + 29080 HF08F ;solo + 29090 CMPW P3;HIMEM + 29100 *!UNTIL + 29110 HF099 ;solo + 29120 LDX #0-2 + 29130 + 29140 * MOVW P2;HIMEM + 29150 * SUBW PP;AUX;PP + 29160 + 29170 *!LOOP + 29180 LDA P2+2,X + 29190 STA HIMEM+2,X + 29200 LDA PP+2,X + 29210 SBC AUX+2,X + 29220 STA PP+2,X + 29230 INX + 29240 *!UNTIL + 29250 LDX XSAVE + 29260 RTS + 29270 ** + 29280 + 29290 *!LOOP + 29300 LDA (HIMEM),Y + 29310 STA (ACC),Y + 29320 HF0AF ;solo + 29330 DECW ACC + 29340 DECW HIMEM + 29350 CMP PP ;is PP HIMEM? + 29360 LDA HIMEM+1 + 29370 SBC PP+1 + 29380 *!UNTIL + 29390 BCS HF099 ;=HS> always + 29400 + 29410 * tkn $11 LOMEM: + 29420 + 29430 VLOMEM ;VO + 29440 JSR GET16BIT + 29450 LDY ACC ;is ACC PP? + 29460 CPY #PP + 29470 * BUG FIX: ABOVE LINE SHOULD BE + 29480 * CPY PP + 29490 * REF: NONE. FOUND BY INSPECTION. + 29500 LDA ACC+1 + 29510 SBC PP+1 + 29520 HF0D4 + 29530 BCS HF07C ;=HS> yes, MEM FULL error + 29540 STY LOMEM ;LOMEM := ACC + 29550 LDA ACC+1 + 29560 STA LOMEM+1 + 29570 JMP CLR + 29580 *> + 29590 + 29600 * tkn $04 LOAD + 29610 + 29620 LOAD ;VO + 29630 STX XSAVE + 29640 JSR SETHDR + 29650 JSR READ + 29660 LDX #$FF + 29670 SEC + 29680 *!LOOP + 29690 LDA HIMEM+1,X ;AUX := HIMEM-ACC + 29700 SBC ACC+1,X + 29710 STA AUX+1,X + 29720 INX + 29730 *!UNTIL + 29740 BCC HF07C ;=LO>MEM FULL error + 29750 CMPW PV;AUX + 29760 BCS HF0D4 ;=>PV AUX, MEM FULL error + 29770 LDA ACC ;is ACC zero? + 29780 *!IF + 29790 LDA ACC+1 + 29800 BEQ HF118 ;=>yes + 29810 *!ENDIF + 29820 MOVW AUX;PP + 29830 JSR SETPRG + 29840 JSR READ + 29850 HF115 ;solo + 29860 LDX XSAVE + 29870 RTS + 29880 ** + 29890 + 29900 HF118 ;solo + 29910 JSR BELL + 29920 JMP HF115 + 29930 *> + 29940 + 29950 SETHDR + 29960 LDY #$CE + 29970 STY A1 ;A1 := $00CE + 29980 INY + 29990 STY A2 ;A2 := $00CD + 30000 LDY #0 + 30010 STY A1+1 + 30020 STY A2+1 + 30030 RTS + 30040 ** + 30050 + 30060 SETPRG + 30070 *!LOOP + 30080 LDA PP,X + 30090 STA A1,X + 30100 LDY HIMEM,X + 30110 STY A2,X + 30120 DEX + 30130 *!UNTIL + 30140 DECW A2 + 30150 RTS + 30160 ** + 30170 + 30180 STX XSAVE ;Z + 30190 + 30200 * tkn $05 SAVE + 30210 + 30220 SAVE ;VO + 30230 SEC ;ACC := HIMEM-PP + 30240 LDX #0-1 + 30250 *!LOOP + 30260 LDA HIMEM+1,X + 30270 SBC PP+1,X + 30280 STA ACC+1,X + 30290 INX + 30300 *!UNTIL + 30310 JSR SETHDR + 30320 JSR WRITE + 30330 LDX #$01 + 30340 JSR SETPRG + 30350 LDA #$1A + 30360 JSR WRITE0 + 30370 LDX XSAVE + 30380 RTS + 30390 ** + 30400 + 30410 PRTERR + 30420 JSR ERRORMESS + 30430 JMP BELL + 30440 *> + 30450 + 30460 * tkn $77 POP + 30470 + 30480 POP ;VO + 30490 LDA GOSUBNDX + 30500 *!IF + 30510 JMP RETURN ;force error + 30520 *!ENDIF + 30530 DEC GOSUBNDX + 30540 RTS + 30550 ** + 30560 + 30570 * tkn $7D TRACE + 30580 + 30590 TRACE ;VO + 30600 LDA #$FF + 30610 STA NOUNSTKC + 30620 RTS + 30630 ** + 30640 + 30650 * tkn $7A NOTRACE + 30660 + 30670 NOTRACE ;VO + 30680 LSR NOUNSTKC ;clear bit 7 + 30690 RTS + 30700 ** + 30710 + 30720 HF179 ;solo + 30730 BIT NOUNSTKC ;trace mode? + 30740 *!IF + 30750 HF17D + 30760 *yes, print line number + 30770 LDA #"#" + 30780 JSR COUT + 30790 LDY #1 + 30800 LDA (PR),Y + 30810 TAX + 30820 INY + 30830 LDA (PR),Y + 30840 JSR PRDEC + 30850 LDA #BLANK+$80 + 30860 JMP COUT + 30870 *> + 30880 LDA PR ;Z + 30890 LDY PR+1 ;Z + 30900 *!ENDIF + 30910 RTS + 30920 ** + 30930 + 30940 + 30950 + 30960 SYNTABLNDX ;indices into SYNTABL + 30970 DB $C1,$00,$7F,$D1,$CC,$C7,$CF,$CE + 30980 DB $C5,$9A,$98,$8D,$96,$95,$93,$BF + 30990 DB $B2,$32,$12,$0F,$BC,$B0,$AC,$BE + 31000 DB $35,$0C,$61,$30,$10,$0B,$DD,$FB + 31010 + 31020 + 31030 + 31040 HF1B7 ;solo + 31050 LDY #0 + 31060 JSR HE7C7 + 31070 LDA #BLANK+$80 + 31080 JMP COUT + 31090 *> + 31100 + 31110 DB $00,$00,$00,$00,$00,$00,$00,$00 ;Z + 31120 + 31130 HF1C9 + 31140 LDY LOMEM + 31150 LDA LOMEM+1 + 31160 *!LOOP + 31170 PHA + 31180 CPY AUX ;is LOMEM AUX? + 31190 SBC AUX+1 + 31200 BCS HF1F0 ;=HS> yes, exit repeat + 31210 PLA + 31220 STY SRCH ;SRCH := LOMEM + 31230 STA SRCH+1 + 31240 LDY #$FF + 31250 *! LOOP + 31260 *! LOOP + 31270 INY + 31280 LDA (SRCH),Y + 31290 *! UNTIL + 31300 CMP #$40 + 31310 *! UNTIL + 31320 INY + 31330 INY + 31340 LDA (SRCH),Y + 31350 PHA + 31360 DEY + 31370 LDA (SRCH),Y + 31380 TAY + 31390 PLA + 31400 *!UNTIL + 31410 HF1F0 + 31420 PLA + 31430 LDY #0 + 31440 *!LOOP + 31450 LDA (SRCH),Y + 31460 BMI HF1FC ;=> + 31470 LSR + 31480 BEQ HF202 ;=> + 31490 LDA #"$" + 31500 HF1FC + 31510 JSR COUT + 31520 INY + 31530 *!UNTIL + 31540 HF202 + 31550 LDA #"=" + 31560 JMP COUT + 31570 *> + 31580 + 31590 HF207 ;solo + 31600 STA (AUX),Y + 31610 INX + 31620 LDA NOUNSTKC-1,X + 31630 BEQ HF23E ;=>RTS + 31640 JMP HF3D5 + 31650 *> + 31660 + 31670 DB $A0 ;Z + 31680 + 31690 HF212 ;solo + 31700 *!IF + 31710 LDA PR + 31720 LDY PR+1 + 31730 JSR HF17D + 31740 *!ENDIF + 31750 JSR HF1C9 + 31760 LDX XSAVE + 31770 JMP HF1B7 + 31780 *> + 31790 + 31800 HF223 ;solo + 31810 INX + 31820 INX + 31830 LDA NOUNSTKC-1,X + 31840 BEQ HF248 ;=>RTS + 31850 JMP HF3E0 + 31860 *> + 31870 + 31880 HF22C ;solo + 31890 *!IF + 31900 LDA PR + 31910 LDY PR+1 + 31920 JSR HF17D + 31930 *!ENDIF + 31940 JSR HF1C9 + 31950 LDX XSAVE + 31960 JMP HF409 + 31970 *> + 31980 + 31990 INX ;Z + 32000 HF23E + 32010 RTS + 32020 ** + 32030 + 32040 HF23F ;solo + 32050 JSR GET16BIT + 32060 INCW ACC + 32070 HF248 + 32080 RTS + 32090 ** + 32100 + 32110 * tkn $1C < + 32120 * IF X < 13 THEN END + 32130 + 32140 HF249 ;V + 32150 JSR HF25B + 32160 BNE HF263 ;=>NOT + 32170 + 32180 * tkn $19 > + 32190 * IF X > 13 THEN END + 32200 + 32210 HF24E ;VO + 32220 JSR HF253 + 32230 BNE HF263 ;=>NOT + 32240 + 32250 * tkn $1A <= + 32260 * IF X <= 13 THEN END + 32270 + 32280 HF253 ;V + 32290 JSR SUBTRACT + 32300 JSR NEGATE + 32310 BVC HF25E ;=> + 32320 + 32330 * tkn $18 >= + 32340 * IF X >= 13 THEN END + 32350 + 32360 HF25B ;V + 32370 JSR SUBTRACT + 32380 HF25E + 32390 JSR SGN + 32400 LSR NOUNSTKL,X + 32410 HF263 + 32420 JMP NOT + 32430 *> + 32440 + 32450 * tkn $1D AND + 32460 + 32470 VAND ;VO + 32480 JSR HEFC9 + 32490 ORA NOUNSTKL-1,X + 32500 BPL HF272 ;=>always? + 32510 + 32520 * tkn $1E OR + 32530 + 32540 VOR ;VO + 32550 JSR HEFC9 + 32560 AND NOUNSTKL-1,X + 32570 HF272 ;solo + 32580 STA NOUNSTKL,X + 32590 BPL HF263 ;=>NOT + 32600 JMP HEFC9 + 32610 *> + 32620 + 32630 * tkn $58 STEP + 32640 + 32650 STEP ;VO + 32660 JSR GET16BIT + 32670 LDY FORNDX + 32680 LDA ACC + 32690 STA STK_60-1,Y + 32700 LDA ACC+1 + 32710 JMP HE966 + 32720 *> + 32730 + 32740 HF288 ;solo + 32750 STA STK_50,Y + 32760 *!LOOP + 32770 *! LOOP + 32780 DEY + 32790 BMI HF2DF ;=>RTS + 32800 LDA STK_40,Y + 32810 CMP NOUNSTKL,X + 32820 *! UNTIL + 32830 LDA STK_50,Y + 32840 CMP NOUNSTKH,X + 32850 *!UNTIL + 32860 DEC FORNDX + 32870 *!LOOP + 32880 LDA STK_40+1,Y + 32890 STA STK_40,Y + 32900 LDA STK_50+1,Y + 32910 STA STK_50,Y + 32920 LDA STK_C0+1,Y + 32930 STA STK_C0,Y + 32940 LDA STK_D0+1,Y + 32950 STA STK_D0,Y + 32960 LDA STK_60+1,Y + 32970 STA STK_60,Y + 32980 LDA STK_70+1,Y + 32990 STA STK_70,Y + 33000 LDA STK_80+1,Y + 33010 STA STK_80,Y + 33020 LDA STK_90+1,Y + 33030 STA STK_90,Y + 33040 LDA STK_A0+1,Y + 33050 STA STK_A0,Y + 33060 LDA STK_A0+1,Y + 33070 STA STK_A0,Y + 33080 * BUG FIX: ABOVE TWO LINES SHOULD BE + 33090 * LDA STK_B0+1,Y + 33100 * STA STK_B0,Y + 33110 * REF: CHANGED IN DISK VERSION + 33120 INY + 33130 CPY FORNDX + 33140 *!UNTIL + 33150 HF2DF + 33160 RTS + 33170 ** + 33180 + 33190 * tkn $78 NODSP + 33200 * string var + 33210 + 33220 NODSP_STR ;VO + 33230 INX + 33240 + 33250 * tkn $79 NODSP + 33260 * num var + 33270 + 33280 NODSP_NUM ;VO + 33290 LDA #0 + 33300 HF2E3 + 33310 PHA + 33320 LDA NOUNSTKL,X + 33330 SEC + 33340 SBC #$03 + 33350 STA ACC + 33360 LDA NOUNSTKH,X + 33370 SBC #0 + 33380 STA ACC+1 + 33390 PLA + 33400 LDY #0 + 33410 STA (ACC),Y + 33420 INX + 33430 RTS + 33440 ** + 33450 + 33460 HF2F8 ;solo + 33470 CMP #$85 + 33480 *!IF + 33490 JMP HE4C0 + 33500 *!ENDIF + 33510 LDY #$02 + 33520 JMP HE448 + 33530 *> + 33540 + 33550 * tkn $7B DSP + 33560 * string var + 33570 + 33580 DSP_NUM ;VO + 33590 INX + 33600 + 33610 * tkn $7C DSP + 33620 * num var + 33630 + 33640 DSP_STR ;VO + 33650 LDA #$01 + 33660 BNE HF2E3 ;=>always + 33670 + 33680 INX ;Z + 33690 + 33700 * tkn $06 CON + 33710 + 33720 CON ;VO + 33730 MOVW NOUNSTKH;PR + 33740 LDA NOUNSTKL + 33750 LDY NOUNSTKL+1 + 33760 JMP GETNEXT + 33770 *> + 33780 + 33790 LDA #$01 ;Z + 33800 BNE HF2E3 ;=>always + 33810 + 33820 * tkn $3C ASC( + 33830 + 33840 ASC ;VO + 33850 LDA NOUNSTKL,X + 33860 CMP NOUNSTKH,X + 33870 *!IF + 33880 JMP RANGERR + 33890 *!ENDIF + 33900 TAY + 33910 LDA NOUNSTKL+1,X + 33920 STA ACC + 33930 LDA NOUNSTKH+1,X + 33940 STA ACC+1 + 33950 LDA (ACC),Y + 33960 LDY #0 + 33970 INX + 33980 INX + 33990 JSR HE708 + 34000 JMP HF404 + 34010 *> + 34020 + 34030 * tkn $32 PDL + 34040 + 34050 PDL ;VO + 34060 JSR GETBYTE + 34070 STX XSAVE + 34080 AND #$03 + 34090 TAX + 34100 JSR PREAD + 34110 LDX XSAVE + 34120 TYA + 34130 LDY #0 + 34140 JSR HE708 + 34150 STY NOUNSTKC,X + 34160 RTS + 34170 ** + 34180 + 34190 RDKEY ;solo + 34200 JSR NXTCHAR + 34210 HF354 ;solo + 34220 TXA + 34230 PHA + 34240 *!LOOP + 34250 LDA IN,X + 34260 CMP #ETX+$80 ;is it ctrl-C? + 34270 *! IF + 34280 JMP BASIC2 + 34290 *! ENDIF + 34300 DEX + 34310 *!UNTIL + 34320 PLA + 34330 TAX + 34340 RTS + 34350 ** + 34360 + 34370 HF366 ;solo + 34380 JSR HE280 + 34390 TYA + 34400 TAX + 34410 JSR HF354 + 34420 TXA + 34430 TAY + 34440 RTS + 34450 ** + 34460 + 34470 * tkn $20 ^ + 34480 + 34490 EXP ;VO + 34500 JSR GET16BIT + 34510 LDA ACC+1 + 34520 *!IF + 34530 TYA ;Areg := 0 + 34540 DEX + 34550 JSR HE708 + 34560 STY NOUNSTKC,X + 34570 HF37F + 34580 RTS + 34590 *!ENDIF + 34600 STA SRCH+1 ;SRCH := ACC + 34610 LDA ACC + 34620 STA SRCH + 34630 JSR GET16BIT + 34640 MOVW ACC;SRCH2 + 34650 LDA #$01 + 34660 JSR HE708 + 34670 STY NOUNSTKC,X + 34680 HF398 ;*!LOOP + 34690 LDA SRCH ;SRCH := SRCH-1 + 34700 *!IF + 34710 DEC SRCH+1 ;is SRCH negative? + 34720 BMI HF37F ;=>yes, RTS + 34730 *!ENDIF + 34740 DEC SRCH + 34750 LDA SRCH2 + 34760 LDY #0 + 34770 JSR HE708 + 34780 LDA SRCH2+1 + 34790 STA NOUNSTKC,X + 34800 JSR MULT + 34810 JMP HF398 ;*!loop forever + 34820 *> + 34830 + 34840 HF3B3 ;solo + 34850 JSR GETBYTE + 34860 CLC ;Areg := Areg-1 + 34870 ADC #$FF + 34880 HF3B9 + 34890 RTS + 34900 ** + 34910 + 34920 * tkn $4A , + 34930 * end of PRINT statement + 34940 * PRINT A$, + 34950 + 34960 HF3BA ;VO + 34970 JSR HE7B1 + 34980 LSR CRFLAG ;pos + 34990 RTS + 35000 ** + 35010 + 35020 STX RUNFLAG ;Z + 35030 TXS + 35040 JSR HF02E + 35050 JMP HE883 + 35060 *> + 35070 + 35080 * tkn $7E PR# + 35090 + 35100 PRSLOT ;VO + 35110 JSR GETBYTE + 35120 STX XSAVE + 35130 JSR OUTPORT + 35140 LDX XSAVE + 35150 RTS + 35160 ** + 35170 + 35180 DB $FE ;Z + 35190 + 35200 HF3D5 ;solo + 35210 BIT RUNFLAG + 35220 BPL HF3B9 ;=>RTS + 35230 STX XSAVE + 35240 BIT NOUNSTKC + 35250 JMP HF212 + 35260 *> + 35270 + 35280 HF3E0 ;solo + 35290 BIT RUNFLAG + 35300 BPL HF3B9 ;=>RTS + 35310 STX XSAVE + 35320 BIT NOUNSTKC + 35330 JMP HF22C + 35340 *> + 35350 + 35360 HF3EB ;solo + 35370 LDY #0 + 35380 JMP GETVERB + 35390 *> + 35400 + 35410 *!LOOP + 35420 TAY + 35430 JSR CROUT + 35440 HF3F4 ;solo + 35450 TYA + 35460 SEC + 35470 SBC WNDWDTH + 35480 *!UNTIL + 35490 STY CH + 35500 RTS + 35510 ** + 35520 + 35530 DB $00,$00,$00 ;Z + 35540 DB $FF,$FF,$FF,$FF ;Z + 35550 + 35560 HF404 ;solo + 35570 STY NOUNSTKC,X + 35580 JMP HE823 + 35590 *> + 35600 + 35610 HF409 ;solo + 35620 LDY #0 + 35630 BEQ HF411 ;=>always + 35640 *!LOOP + 35650 JSR COUT + 35660 INY + 35670 HF411 + 35680 LDA (AUX),Y + 35690 *!UNTIL + 35700 LDA #$FF + 35710 STA CRFLAG ;CRFLAG := $FF + 35720 RTS + 35730 ** + 35740 + 35750 * tkn $7F IN# + 35760 + 35770 INSLOT ;VO + 35780 JSR GETBYTE + 35790 STX XSAVE + 35800 JSR INPORT + 35810 LDX XSAVE + 35820 RTS + 35830 ** + 35840 LST OFF diff --git a/source/redbook/miniasm.asm b/source/redbook/miniasm.asm new file mode 100644 index 0000000..acd2dfd --- /dev/null +++ b/source/redbook/miniasm.asm @@ -0,0 +1,207 @@ + 1 *********************** + 2 * * + 3 * APPLE-II * + 4 * MINI-ASSEMBLER * + 5 * * + 6 * COPYRIGHT 1977 BY * + 7 * APPLE COMPUTER INC. * + 8 * * + 9 * ALL RIGHTS RESERVED * + 10 * * + 11 * S. WOZNIAK * + 12 * A. BAUM * + 13 *********************** + 14 ; TITLE "APPLE-II MINI-ASSEMBLER" + 15 FORMAT EQU $2E + 16 LENGTH EQU $2F + 17 MODE EQU $31 + 18 PROMPT EQU $33 + 19 YSAV EQU $34 + 20 L EQU $35 + 21 PCL EQU $3A + 22 PCH EQU $3B + 23 A1H EQU $3D + 24 A2L EQU $3E + 25 A2H EQU $3F + 26 A4L EQU $42 + 27 A4H EQU $43 + 28 FMT EQU $44 + 29 IN EQU $200 + 30 INSDS2 EQU $F88E + 31 INSTDSP EQU $F8D0 + 32 PRBL2 EQU $F94A + 33 PCADJ EQU $F953 + 34 CHAR1 EQU $F9B4 + 35 CHAR2 EQU $F9BA + 36 MNEML EQU $F9C0 + 37 MNEMR EQU $FA00 + 38 CURSUP EQU $FC1A + 39 GETLNZ EQU $FD67 + 40 COUT EQU $FDED + 41 BL1 EQU $FE00 + 42 A1PCLP EQU $FE78 + 43 BELL EQU $FF3A + 44 GETNUM EQU $FFA7 + 45 TOSUB EQU $FFBE + 46 ZMODE EQU $FFC7 + 47 CHRTBL EQU $FFCC + 48 ORG $F500 +F500: E9 81 49 REL SBC #$81 ;IS FMT COMPATIBLE +F502: 4A 50 LSR ;WITH RELATIVE MODE? +F503: D0 14 51 BNE ERR3 ; NO. +F505: A4 3F 52 LDY A2H +F507: A6 3E 53 LDX A2L ;DOUBLE DECREMENT +F509: D0 01 54 BNE REL2 +F50B: 88 55 DEY +F50C: CA 56 REL2 DEX +F50D: 8A 57 TXA +F50E: 18 58 CLC +F50F: E5 3A 59 SBC PCL ;FORM ADDR-PC-2 +F511: 85 3E 60 STA A2L +F513: 10 01 61 BPL REL3 +F515: C8 62 INY +F516: 98 63 REL3 TYA +F517: E5 3B 64 SBC PCH +F519: D0 6B 65 ERR3 BNE ERR ;ERROR IF >1-BYTE BRANCH +F51B: A4 2F 66 FINDOP LDY LENGTH +F51D: B9 3D 00 67 FNDOP2 LDA A1H,Y ;MOVE INST TO (PC) +F520: 91 3A 68 STA (PCL),Y +F522: 88 69 DEY +F523: 10 F8 70 BPL FNDOP2 +F525: 20 1A FC 71 JSR CURSUP +F528: 20 1A FC 72 JSR CURSUP ;RESTORE CURSOR +F52B: 20 D0 F8 73 JSR INSTDSP ;TYPE FORMATTED LINE +F52E: 20 53 F9 74 JSR PCADJ ;UPDATE PC +F531: 84 3B 75 STY PCH +F533: 85 3A 76 STA PCL +F535: 4C 95 F5 77 JMP NXTLINE ;GET NEXT LINE +F538: 20 BE FF 78 FAKEMON3 JSR TOSUB ;GO TO DELIM HANDLER +F53B: A4 34 79 LDY YSAV ;RESTORE Y-INDEX +F53D: 20 A7 FF 80 FAKEMON JSR GETNUM ;READ PARAM +F540: 84 34 81 STY YSAV ;SAVE Y-INDEX +F542: A0 17 82 LDY #$17 ;INIT DELIMITER INDEX +F544: 88 83 FAKEMON2 DEY ;CHECK NEXT DELIM +F545: 30 4B 84 BMI RESETZ ;ERR IF UNRECOGNIZED DELIM +F547: D9 CC FF 85 CMP CHRTBL,Y ;COMPARE WITH DELIM TABLE +F54A: D0 F8 86 BNE FAKEMON2 ;NO MATCH +F54C: C0 15 87 CPY #$15 ;MATCH, IS IT CR? +F54E: D0 E8 88 BNE FAKEMON3 ;NO, HANDLE IT IN MONITOR +F550: A5 31 89 LDA MODE +F552: A0 00 90 LDY #$0 +F554: C6 34 91 DEC YSAV +F556: 20 00 FE 92 JSR BL1 ;HANDLE CR OUTSIDE MONITOR +F559: 4C 95 F5 93 JMP NXTLINE +F55C: A5 3D 94 TRYNEXT LDA A1H ;GET TRIAL OPCODE +F55E: 20 8E F8 95 JSR INSDS2 ;GET FMT+LENGTH FOR OPCODE +F561: AA 96 TAX +F562: BD 00 FA 97 LDA MNEMR,X ;GET LOWER MNEMONIC BYTE +F565: C5 42 98 CMP A4L ;MATCH? +F567: D0 13 99 BNE NEXTOP ;NO, TRY NEXT OPCODE. +F569: BD C0 F9 100 LDA MNEML,X ;GET UPPER MNEMONIC BYTE +F56C: C5 43 101 CMP A4H ;MATCH? +F56E: D0 0C 102 BNE NEXTOP ;NO, TRY NEXT OPCODE +F570: A5 44 103 LDA FMT +F572: A4 2E 104 LDY FORMAT ;GET TRIAL FORMAT +F574: C0 9D 105 CPY #$9D ;TRIAL FORMAT RELATIVE? +F576: F0 88 106 BEQ REL ;YES. +F578: C5 2E 107 NREL CMP FORMAT ;SAME FORMAT? +F57A: F0 9F 108 BEQ FINDOP ;YES. +F57C: C6 3D 109 NEXTOP DEC A1H ;NO, TRY NEXT OPCODE +F57E: D0 DC 110 BNE TRYNEXT +F580: E6 44 111 INC FMT ;NO MORE, TRY WITH LEN=2 +F582: C6 35 112 DEC L ;WAS L=2 ALREADY? +F584: F0 D6 113 BEQ TRYNEXT ;NO. +F586: A4 34 114 ERR LDY YSAV ;YES, UNRECOGNIZED INST. +F588: 98 115 ERR2 TYA +F589: AA 116 TAX +F58A: 20 4A F9 117 JSR PRBL2 ;PRINT ^ UNDER LAST READ +F58D: A9 DE 118 LDA #$DE ;CHAR TO INDICATE ERROR +F58F: 20 ED FD 119 JSR COUT ;POSITION. +F592: 20 3A FF 120 RESETZ JSR BELL +F595: A9 A1 121 NXTLINE LDA #$A1 ;'!' +F597: 85 33 122 STA PROMPT ;INITIALIZE PROMPT +F599: 20 67 FD 123 JSR GETLNZ ;GET LINE. +F59C: 20 C7 FF 124 JSR ZMODE ;INIT SCREEN STUFF +F59F: AD 00 02 125 LDA IN ;GET CHAR +F5A2: C9 A0 126 CMP #$A0 ;ASCII BLANK? +F5A4: F0 13 127 BEQ SPACE ;YES +F5A6: C8 128 INY +F5A7: C9 A4 129 CMP #$A4 ;ASCII '$' IN COL 1? +F5A9: F0 92 130 BEQ FAKEMON ;YES, SIMULATE MONITOR +F5AB: 88 131 DEY ;NO, BACKUP A CHAR +F5AC: 20 A7 FF 132 JSR GETNUM ;GET A NUMBER +F5AF: C9 93 133 CMP #$93 ;':' TERMINATOR? +F5B1: D0 D5 134 ERR4 BNE ERR2 ;NO, ERR. +F5B3: 8A 135 TXA +F5B4: F0 D2 136 BEQ ERR2 ;NO ADR PRECEDING COLON. +F5B6: 20 78 FE 137 JSR A1PCLP ;MOVE ADR TO PCL, PCH. +F5B9: A9 03 138 SPACE LDA #$3 ;COUNT OF CHARS IN MNEMONIC +F5BB: 85 3D 139 STA A1H +F5BD: 20 34 F6 140 NXTMN JSR GETNSP ;GET FIRST MNEM CHAR. +F5C0: 0A 141 NXTM ASL +F5C1: E9 BE 142 SBC #$BE ;SUBTRACT OFFSET +F5C3: C9 C2 143 CMP #$C2 ;LEGAL CHAR? +F5C5: 90 C1 144 BCC ERR2 ;NO. +F5C7: 0A 145 ASL ;COMPRESS-LEFT JUSTIFY +F5C8: 0A 146 ASL +F5C9: A2 04 147 LDX #$4 +F5CB: 0A 148 NXTM2 ASL ;DO 5 TRIPLE WORD SHIFTS +F5CC: 26 42 149 ROL A4L +F5CE: 26 43 150 ROL A4H +F5D0: CA 151 DEX +F5D1: 10 F8 152 BPL NXTM2 +F5D3: C6 3D 153 DEC A1H ;DONE WITH 3 CHARS? +F5D5: F0 F4 154 BEQ NXTM2 ;YES, BUT DO 1 MORE SHIFT +F5D7: 10 E4 155 BPL NXTMN ;NO +F5D9: A2 05 156 FORM1 LDX #$5 ;5 CHARS IN ADDR MODE +F5DB: 20 34 F6 157 FORM2 JSR GETNSP ;GET FIRST CHAR OF ADDR +F5DE: 84 34 158 STY YSAV +F5E0: DD B4 F9 159 CMP CHAR1,X ;FIRST CHAR MATCH PATTERN? +F5E3: D0 13 160 BNE FORM3 ;NO +F5E5: 20 34 F6 161 JSR GETNSP ;YES, GET SECOND CHAR +F5E8: DD BA F9 162 CMP CHAR2,X ;MATCHES SECOND HALF? +F5EB: F0 0D 163 BEQ FORM5 ;YES. +F5ED: BD BA F9 164 LDA CHAR2,X ;NO, IS SECOND HALF ZERO? +F5F0: F0 07 165 BEQ FORM4 ;YES. +F5F2: C9 A4 166 CMP #$A4 ;NO,SECOND HALF OPTIONAL? +F5F4: F0 03 167 BEQ FORM4 ;YES. +F5F6: A4 34 168 LDY YSAV +F5F8: 18 169 FORM3 CLC ;CLEAR BIT-NO MATCH +F5F9: 88 170 FORM4 DEY ;BACK UP 1 CHAR +F5FA: 26 44 171 FORM5 ROL FMT ;FORM FORMAT BYTE +F5FC: E0 03 172 CPX #$3 ;TIME TO CHECK FOR ADDR. +F5FE: D0 0D 173 BNE FORM7 ;NO +F600: 20 A7 FF 174 JSR GETNUM ;YES +F603: A5 3F 175 LDA A2H +F605: F0 01 176 BEQ FORM6 ;HIGH-ORDER BYTE ZERO +F607: E8 177 INX ;NO, INCR FOR 2-BYTE +F608: 86 35 178 FORM6 STX L ;STORE LENGTH +F60A: A2 03 179 LDX #$3 ;RELOAD FORMAT INDEX +F60C: 88 180 DEY ;BACKUP A CHAR +F60D: 86 3D 181 FORM7 STX A1H ;SAVE INDEX +F60F: CA 182 DEX ;DONE WITH FORMAT CHECK? +F610: 10 C9 183 BPL FORM2 ;NO. +F612: A5 44 184 LDA FMT ;YES, PUT LENGTH +F614: 0A 185 ASL ;IN LOW BITS +F615: 0A 186 ASL +F616: 05 35 187 ORA L +F618: C9 20 188 CMP #$20 +F61A: B0 06 189 BCS FORM8 ;ADD "$" IF NONZERO LENGTH +F61C: A6 35 190 LDX L ;AND DON'T ALREADY HAVE IT +F61E: F0 02 191 BEQ FORM8 +F620: 09 80 192 ORA #$80 +F622: 85 44 193 FORM8 STA FMT +F624: 84 34 194 STY YSAV +F626: B9 00 02 195 LDA IN,Y ;GET NEXT NONBLANK +F629: C9 BB 196 CMP #$BB ;';' START OF COMMENT? +F62B: F0 04 197 BEQ FORM9 ;YES +F62D: C9 8D 198 CMP #$8D ;CARRIAGE RETURN? +F62F: D0 80 199 BNE ERR4 ;NO, ERR. +F631: 4C 5C F5 200 FORM9 JMP TRYNEXT +F634: B9 00 02 201 GETNSP LDA IN,Y +F637: C8 202 INY +F638: C9 A0 203 CMP #$A0 ;GET NEXT NON BLANK CHAR +F63A: F0 F8 204 BEQ GETNSP +F63C: 60 205 RTS + 206 ORG $F666 +F666: 4C 92 F5 207 MINIASM JMP RESETZ diff --git a/source/redbook/monitor.asm b/source/redbook/monitor.asm new file mode 100644 index 0000000..d24c973 --- /dev/null +++ b/source/redbook/monitor.asm @@ -0,0 +1,1187 @@ + 1 *************************** + 2 * * + 3 * APPLE II * + 4 * SYSTEM MONITOR * + 5 * * + 6 * COPYRIGHT 1977 BY * + 7 * APPLE COMPUTER, INC. * + 8 * * + 9 * ALL RIGHTS RESERVED * + 10 * * + 11 * S. WOZNIAK * + 12 * A. BAUM * + 13 * * + 14 *************************** + 15 ; TITLE "APPLE II SYSTEM MONITOR" + 16 LOC0 EQU $00 + 17 LOC1 EQU $01 + 18 WNDLFT EQU $20 + 19 WNDWDTH EQU $21 + 20 WNDTOP EQU $22 + 21 WNDBTM EQU $23 + 22 CH EQU $24 + 23 CV EQU $25 + 24 GBASL EQU $26 + 25 GBASH EQU $27 + 26 BASL EQU $28 + 27 BASH EQU $29 + 28 BAS2L EQU $2A + 29 BAS2H EQU $2B + 30 H2 EQU $2C + 31 LMNEM EQU $2C + 32 RTNL EQU $2C + 33 V2 EQU $2D + 34 RMNEM EQU $2D + 35 RTNH EQU $2D + 36 MASK EQU $2E + 37 CHKSUM EQU $2E + 38 FORMAT EQU $2E + 39 LASTIN EQU $2F + 40 LENGTH EQU $2F + 41 SIGN EQU $2F + 42 COLOR EQU $30 + 43 MODE EQU $31 + 44 INVFLG EQU $32 + 45 PROMPT EQU $33 + 46 YSAV EQU $34 + 47 YSAV1 EQU $35 + 48 CSWL EQU $36 + 49 CSWH EQU $37 + 50 KSWL EQU $38 + 51 KSWH EQU $39 + 52 PCL EQU $3A + 53 PCH EQU $3B + 54 XQT EQU $3C + 55 A1L EQU $3C + 56 A1H EQU $3D + 57 A2L EQU $3E + 58 A2H EQU $3F + 59 A3L EQU $40 + 60 A3H EQU $41 + 61 A4L EQU $42 + 62 A4H EQU $43 + 63 A5L EQU $44 + 64 A5H EQU $45 + 65 ACC EQU $45 + 66 XREG EQU $46 + 67 YREG EQU $47 + 68 STATUS EQU $48 + 69 SPNT EQU $49 + 70 RNDL EQU $4E + 71 RNDH EQU $4F + 72 ACL EQU $50 + 73 ACH EQU $51 + 74 XTNDL EQU $52 + 75 XTNDH EQU $53 + 76 AUXL EQU $54 + 77 AUXH EQU $55 + 78 PICK EQU $95 + 79 IN EQU $0200 + 80 USRADR EQU $03F8 + 81 NMI EQU $03FB + 82 IRQLOC EQU $03FE + 83 IOADR EQU $C000 + 84 KBD EQU $C000 + 85 KBDSTRB EQU $C010 + 86 TAPEOUT EQU $C020 + 87 SPKR EQU $C030 + 88 TXTCLR EQU $C050 + 89 TXTSET EQU $C051 + 90 MIXCLR EQU $C052 + 91 MIXSET EQU $C053 + 92 LOWSCR EQU $C054 + 93 HISCR EQU $C055 + 94 LORES EQU $C056 + 95 HIRES EQU $C057 + 96 TAPEIN EQU $C060 + 97 PADDL0 EQU $C064 + 98 PTRIG EQU $C070 + 99 BASIC EQU $E000 + 100 BASIC2 EQU $E003 + 101 ORG $F800 ;ROM START ADDRESS +F800: 4A 102 PLOT LSR ;Y-COORD/2 +F801: 08 103 PHP ;SAVE LSB IN CARRY +F802: 20 47 F8 104 JSR GBASCALC ;CALC BASE ADR IN GBASL,H +F805: 28 105 PLP ;RESTORE LSB FROM CARRY +F806: A9 0F 106 LDA #$0F ;MASK $0F IF EVEN +F808: 90 02 107 BCC RTMASK +F80A: 69 E0 108 ADC #$E0 ;MASK $F0 IF ODD +F80C: 85 2E 109 RTMASK STA MASK +F80E: B1 26 110 PLOT1 LDA (GBASL),Y ;DATA +F810: 45 30 111 EOR COLOR ; EOR COLOR +F812: 25 2E 112 AND MASK ; AND MASK +F814: 51 26 113 EOR (GBASL),Y ; EOR DATA +F816: 91 26 114 STA (GBASL),Y ; TO DATA +F818: 60 115 RTS +F819: 20 00 F8 116 HLINE JSR PLOT ;PLOT SQUARE +F81C: C4 2C 117 HLINE1 CPY H2 ;DONE? +F81E: B0 11 118 BCS RTS1 ; YES, RETURN +F820: C8 119 INY ; NO, INC INDEX (X-COORD) +F821: 20 0E F8 120 JSR PLOT1 ;PLOT NEXT SQUARE +F824: 90 F6 121 BCC HLINE1 ;ALWAYS TAKEN +F826: 69 01 122 VLINEZ ADC #$01 ;NEXT Y-COORD +F828: 48 123 VLINE PHA ; SAVE ON STACK +F829: 20 00 F8 124 JSR PLOT ; PLOT SQUARE +F82C: 68 125 PLA +F82D: C5 2D 126 CMP V2 ;DONE? +F82F: 90 F5 127 BCC VLINEZ ; NO, LOOP +F831: 60 128 RTS1 RTS +F832: A0 2F 129 CLRSCR LDY #$2F ;MAX Y, FULL SCRN CLR +F834: D0 02 130 BNE CLRSC2 ;ALWAYS TAKEN +F836: A0 27 131 CLRTOP LDY #$27 ;MAX Y, TOP SCREEN CLR +F838: 84 2D 132 CLRSC2 STY V2 ;STORE AS BOTTOM COORD + 133 ; FOR VLINE CALLS +F83A: A0 27 134 LDY #$27 ;RIGHTMOST X-COORD (COLUMN) +F83C: A9 00 135 CLRSC3 LDA #$00 ;TOP COORD FOR VLINE CALLS +F83E: 85 30 136 STA COLOR ;CLEAR COLOR (BLACK) +F840: 20 28 F8 137 JSR VLINE ;DRAW VLINE +F843: 88 138 DEY ;NEXT LEFTMOST X-COORD +F844: 10 F6 139 BPL CLRSC3 ;LOOP UNTIL DONE +F846: 60 140 RTS +F847: 48 141 GBASCALC PHA ;FOR INPUT 000DEFGH +F848: 4A 142 LSR +F849: 29 03 143 AND #$03 +F84B: 09 04 144 ORA #$04 ; GENERATE GBASH=000001FG +F84D: 85 27 145 STA GBASH +F84F: 68 146 PLA ; AND GBASL=HDEDE000 +F850: 29 18 147 AND #$18 +F852: 90 02 148 BCC GBCALC +F854: 69 7F 149 ADC #$7F +F856: 85 26 150 GBCALC STA GBASL +F858: 0A 151 ASL +F859: 0A 152 ASL +F85A: 05 26 153 ORA GBASL +F85C: 85 26 154 STA GBASL +F85E: 60 155 RTS +F85F: A5 30 156 NXTCOL LDA COLOR ;INCREMENT COLOR BY 3 +F861: 18 157 CLC +F862: 69 03 158 ADC #$03 +F864: 29 0F 159 SETCOL AND #$0F ;SETS COLOR=17*A MOD 16 +F866: 85 30 160 STA COLOR +F868: 0A 161 ASL ;BOTH HALF BYTES OF COLOR EQUAL +F869: 0A 162 ASL +F86A: 0A 163 ASL +F86B: 0A 164 ASL +F86C: 05 30 165 ORA COLOR +F86E: 85 30 166 STA COLOR +F870: 60 167 RTS +F871: 4A 168 SCRN LSR ;READ SCREEN Y-COORD/2 +F872: 08 169 PHP ;SAVE LSB (CARRY) +F873: 20 47 F8 170 JSR GBASCALC ;CALC BASE ADDRESS +F876: B1 26 171 LDA (GBASL),Y ;GET BYTE +F878: 28 172 PLP ;RESTORE LSB FROM CARRY +F879: 90 04 173 SCRN2 BCC RTMSKZ ;IF EVEN, USE LO H +F87B: 4A 174 LSR +F87C: 4A 175 LSR +F87D: 4A 176 LSR ;SHIFT HIGH HALF BYTE DOWN +F87E: 4A 177 LSR +F87F: 29 0F 178 RTMSKZ AND #$0F ;MASK 4-BITS +F881: 60 179 RTS +F882: A6 3A 180 INSDS1 LDX PCL ;PRINT PCL,H +F884: A4 3B 181 LDY PCH +F886: 20 96 FD 182 JSR PRYX2 +F889: 20 48 F9 183 JSR PRBLNK ;FOLLOWED BY A BLANK +F88C: A1 3A 184 LDA (PCL,X) ;GET OP CODE +F88E: A8 185 INSDS2 TAY +F88F: 4A 186 LSR ;EVEN/ODD TEST +F890: 90 09 187 BCC IEVEN +F892: 6A 188 ROR ;BIT 1 TEST +F893: B0 10 189 BCS ERR ;XXXXXX11 INVALID OP +F895: C9 A2 190 CMP #$A2 +F897: F0 0C 191 BEQ ERR ;OPCODE $89 INVALID +F899: 29 87 192 AND #$87 ;MASK BITS +F89B: 4A 193 IEVEN LSR ;LSB INTO CARRY FOR L/R TEST +F89C: AA 194 TAX +F89D: BD 62 F9 195 LDA FMT1,X ;GET FORMAT INDEX BYTE +F8A0: 20 79 F8 196 JSR SCRN2 ;R/L H-BYTE ON CARRY +F8A3: D0 04 197 BNE GETFMT +F8A5: A0 80 198 ERR LDY #$80 ;SUBSTITUTE $80 FOR INVALID OPS +F8A7: A9 00 199 LDA #$00 ;SET PRINT FORMAT INDEX TO 0 +F8A9: AA 200 GETFMT TAX +F8AA: BD A6 F9 201 LDA FMT2,X ;INDEX INTO PRINT FORMAT TABLE +F8AD: 85 2E 202 STA FORMAT ;SAVE FOR ADR FIELD FORMATTING +F8AF: 29 03 203 AND #$03 ;MASK FOR 2-BIT LENGTH + 204 ; (P=1 BYTE, 1=2 BYTE, 2=3 BYTE) +F8B1: 85 2F 205 STA LENGTH +F8B3: 98 206 TYA ;OPCODE +F8B4: 29 8F 207 AND #$8F ;MASK FOR 1XXX1010 TEST +F8B6: AA 208 TAX ; SAVE IT +F8B7: 98 209 TYA ;OPCODE TO A AGAIN +F8B8: A0 03 210 LDY #$03 +F8BA: E0 8A 211 CPX #$8A +F8BC: F0 0B 212 BEQ MNNDX3 +F8BE: 4A 213 MNNDX1 LSR +F8BF: 90 08 214 BCC MNNDX3 ;FORM INDEX INTO MNEMONIC TABLE +F8C1: 4A 215 LSR +F8C2: 4A 216 MNNDX2 LSR ;1) 1XXX1010->00101XXX +F8C3: 09 20 217 ORA #$20 ;2) XXXYYY01->00111XXX +F8C5: 88 218 DEY ;3) XXXYYY10->00110XXX +F8C6: D0 FA 219 BNE MNNDX2 ;4) XXXYY100->00100XXX +F8C8: C8 220 INY ;5) XXXXX000->000XXXXX +F8C9: 88 221 MNNDX3 DEY +F8CA: D0 F2 222 BNE MNNDX1 +F8CC: 60 223 RTS +F8CD: FF FF FF 224 DFB $FF,$FF,$FF +F8D0: 20 82 F8 225 INSTDSP JSR INSDS1 ;GEN FMT, LEN BYTES +F8D3: 48 226 PHA ;SAVE MNEMONIC TABLE INDEX +F8D4: B1 3A 227 PRNTOP LDA (PCL),Y +F8D6: 20 DA FD 228 JSR PRBYTE +F8D9: A2 01 229 LDX #$01 ;PRINT 2 BLANKS +F8DB: 20 4A F9 230 PRNTBL JSR PRBL2 +F8DE: C4 2F 231 CPY LENGTH ;PRINT INST (1-3 BYTES) +F8E0: C8 232 INY ;IN A 12 CHR FIELD +F8E1: 90 F1 233 BCC PRNTOP +F8E3: A2 03 234 LDX #$03 ;CHAR COUNT FOR MNEMONIC PRINT +F8E5: C0 04 235 CPY #$04 +F8E7: 90 F2 236 BCC PRNTBL +F8E9: 68 237 PLA ;RECOVER MNEMONIC INDEX +F8EA: A8 238 TAY +F8EB: B9 C0 F9 239 LDA MNEML,Y +F8EE: 85 2C 240 STA LMNEM ;FETCH 3-CHAR MNEMONIC +F8F0: B9 00 FA 241 LDA MNEMR,Y ; (PACKED IN 2-BYTES) +F8F3: 85 2D 242 STA RMNEM +F8F5: A9 00 243 PRMN1 LDA #$00 +F8F7: A0 05 244 LDY #$05 +F8F9: 06 2D 245 PRMN2 ASL RMNEM ;SHIFT 5 BITS OF +F8FB: 26 2C 246 ROL LMNEM ; CHARACTER INTO A +F8FD: 2A 247 ROL ; (CLEARS CARRY) +F8FE: 88 248 DEY +F8FF: D0 F8 249 BNE PRMN2 +F901: 69 BF 250 ADC #$BF ;ADD "?" OFFSET +F903: 20 ED FD 251 JSR COUT ;OUTPUT A CHAR OF MNEM +F906: CA 252 DEX +F907: D0 EC 253 BNE PRMN1 +F909: 20 48 F9 254 JSR PRBLNK ;OUTPUT 3 BLANKS +F90C: A4 2F 255 LDY LENGTH +F90E: A2 06 256 LDX #$06 ;CNT FOR 6 FORMAT BITS +F910: E0 03 257 PRADR1 CPX #$03 +F912: F0 1C 258 BEQ PRADR5 ;IF X=3 THEN ADDR. +F914: 06 2E 259 PRADR2 ASL FORMAT +F916: 90 0E 260 BCC PRADR3 +F918: BD B3 F9 261 LDA CHAR1-1,X +F91B: 20 ED FD 262 JSR COUT +F91E: BD B9 F9 263 LDA CHAR2-1,X +F921: F0 03 264 BEQ PRADR3 +F923: 20 ED FD 265 JSR COUT +F926: CA 266 PRADR3 DEX +F927: D0 E7 267 BNE PRADR1 +F929: 60 268 RTS +F92A: 88 269 PRADR4 DEY +F92B: 30 E7 270 BMI PRADR2 +F92D: 20 DA FD 271 JSR PRBYTE +F930: A5 2E 272 PRADR5 LDA FORMAT +F932: C9 E8 273 CMP #$E8 ;HANDLE REL ADR MODE +F934: B1 3A 274 LDA (PCL),Y ;SPECIAL (PRINT TARGET, +F936: 90 F2 275 BCC PRADR4 ; NOT OFFSET) +F938: 20 56 F9 276 RELADR JSR PCADJ3 +F93B: AA 277 TAX ;PCL,PCH+OFFSET+1 TO A,Y +F93C: E8 278 INX +F93D: D0 01 279 BNE PRNTYX ;+1 TO Y,X +F93F: C8 280 INY +F940: 98 281 PRNTYX TYA +F941: 20 DA FD 282 PRNTAX JSR PRBYTE ;OUTPUT TARGET ADR +F944: 8A 283 PRNTX TXA ; OF BRANCH AND RETURN +F945: 4C DA FD 284 JMP PRBYTE +F948: A2 03 285 PRBLNK LDX #$03 ;BLANK COUNT +F94A: A9 A0 286 PRBL2 LDA #$A0 ;LOAD A SPACE +F94C: 20 ED FD 287 PRBL3 JSR COUT ;OUTPUT A BLANK +F94F: CA 288 DEX +F950: D0 F8 289 BNE PRBL2 ;LOOP UNTIL COUNT=0 +F952: 60 290 RTS +F953: 38 291 PCADJ SEC ;0=1-BYTE, 1=2-BYTE +F954: A5 2F 292 PCADJ2 LDA LENGTH ; 2=3-BYTE +F956: A4 3B 293 PCADJ3 LDY PCH +F958: AA 294 TAX ;TEST DISPLACEMENT SIGN +F959: 10 01 295 BPL PCADJ4 ; (FOR REL BRANCH) +F95B: 88 296 DEY ;EXTEND NEG BY DEC PCH +F95C: 65 3A 297 PCADJ4 ADC PCL +F95E: 90 01 298 BCC RTS2 ;PCL+LENGTH(OR DISPL)+1 TO A +F960: C8 299 INY ; CARRY INTO Y (PCH) +F961: 60 300 RTS2 RTS + 301 * FMT1 BYTES: XXXXXXY0 INSTRS + 302 * IF Y=0 THEN LEFT HALF BYTE + 303 * IF Y=1 THEN RIGHT HALF BYTE + 304 * (X=INDEX) +F962: 04 20 54 305 FMT1 DFB $04,$20,$54,$30,$0D +F965: 30 0D +F967: 80 04 90 306 DFB $80,$04,$90,$03,$22 +F96A: 03 22 +F96C: 54 33 0D 307 DFB $54,$33,$0D,$80,$04 +F96F: 80 04 +F971: 90 04 20 308 DFB $90,$04,$20,$54,$33 +F974: 54 33 +F976: 0D 80 04 309 DFB $0D,$80,$04,$90,$04 +F979: 90 04 +F97B: 20 54 3B 310 DFB $20,$54,$3B,$0D,$80 +F97E: 0D 80 +F980: 04 90 00 311 DFB $04,$90,$00,$22,$44 +F983: 22 44 +F985: 33 0D C8 312 DFB $33,$0D,$C8,$44,$00 +F988: 44 00 +F98A: 11 22 44 313 DFB $11,$22,$44,$33,$0D +F98D: 33 0D +F98F: C8 44 A9 314 DFB $C8,$44,$A9,$01,$22 +F992: 01 22 +F994: 44 33 0D 315 DFB $44,$33,$0D,$80,$04 +F997: 80 04 +F999: 90 01 22 316 DFB $90,$01,$22,$44,$33 +F99C: 44 33 +F99E: 0D 80 04 317 DFB $0D,$80,$04,$90 +F9A1: 90 +F9A2: 26 31 87 318 DFB $26,$31,$87,$9A ;$ZZXXXY01 INSTR'S +F9A5: 9A +F9A6: 00 319 FMT2 DFB $00 ;ERR +F9A7: 21 320 DFB $21 ;IMM +F9A8: 81 321 DFB $81 ;Z-PAGE +F9A9: 82 322 DFB $82 ;ABS +F9AA: 00 323 DFB $00 ;IMPLIED +F9AB: 00 324 DFB $00 ;ACCUMULATOR +F9AC: 59 325 DFB $59 ;(ZPAG,X) +F9AD: 4D 326 DFB $4D ;(ZPAG),Y +F9AE: 91 327 DFB $91 ;ZPAG,X +F9AF: 92 328 DFB $92 ;ABS,X +F9B0: 86 329 DFB $86 ;ABS,Y +F9B1: 4A 330 DFB $4A ;(ABS) +F9B2: 85 331 DFB $85 ;ZPAG,Y +F9B3: 9D 332 DFB $9D ;RELATIVE +F9B4: AC A9 AC 333 CHAR1 ASC ",),#($" +F9B7: A3 A8 A4 +F9BA: D9 00 D8 334 CHAR2 DFB $D9,$00,$D8,$A4,$A4,$00 +F9BD: A4 A4 00 + 335 *CHAR2: "Y",0,"X$$",0 + 336 * MNEML IS OF FORM: + 337 * (A) XXXXX000 + 338 * (B) XXXYY100 + 339 * (C) 1XXX1010 + 340 * (D) XXXYYY10 + 341 * (E) XXXYYY01 + 342 * (X=INDEX) +F9C0: 1C 8A 1C 343 MNEML DFB $1C,$8A,$1C,$23,$5D,$8B +F9C3: 23 5D 8B +F9C6: 1B A1 9D 344 DFB $1B,$A1,$9D,$8A,$1D,$23 +F9C9: 8A 1D 23 +F9CC: 9D 8B 1D 345 DFB $9D,$8B,$1D,$A1,$00,$29 +F9CF: A1 00 29 +F9D2: 19 AE 69 346 DFB $19,$AE,$69,$A8,$19,$23 +F9D5: A8 19 23 +F9D8: 24 53 1B 347 DFB $24,$53,$1B,$23,$24,$53 +F9DB: 23 24 53 +F9DE: 19 A1 348 DFB $19,$A1 ;(A) FORMAT ABOVE +F9E0: 00 1A 5B 349 DFB $00,$1A,$5B,$5B,$A5,$69 +F9E3: 5B A5 69 +F9E6: 24 24 350 DFB $24,$24 ;(B) FORMAT +F9E8: AE AE A8 351 DFB $AE,$AE,$A8,$AD,$29,$00 +F9EB: AD 29 00 +F9EE: 7C 00 352 DFB $7C,$00 ;(C) FORMAT +F9F0: 15 9C 6D 353 DFB $15,$9C,$6D,$9C,$A5,$69 +F9F3: 9C A5 69 +F9F6: 29 53 354 DFB $29,$53 ;(D) FORMAT +F9F8: 84 13 34 355 DFB $84,$13,$34,$11,$A5,$69 +F9FB: 11 A5 69 +F9FE: 23 A0 356 DFB $23,$A0 ;(E) FORMAT +FA00: D8 62 5A 357 MNEMR DFB $D8,$62,$5A,$48,$26,$62 +FA03: 48 26 62 +FA06: 94 88 54 358 DFB $94,$88,$54,$44,$C8,$54 +FA09: 44 C8 54 +FA0C: 68 44 E8 359 DFB $68,$44,$E8,$94,$00,$B4 +FA0F: 94 00 B4 +FA12: 08 84 74 360 DFB $08,$84,$74,$B4,$28,$6E +FA15: B4 28 6E +FA18: 74 F4 CC 361 DFB $74,$F4,$CC,$4A,$72,$F2 +FA1B: 4A 72 F2 +FA1E: A4 8A 362 DFB $A4,$8A ;(A) FORMAT +FA20: 00 AA A2 363 DFB $00,$AA,$A2,$A2,$74,$74 +FA23: A2 74 74 +FA26: 74 72 364 DFB $74,$72 ;(B) FORMAT +FA28: 44 68 B2 365 DFB $44,$68,$B2,$32,$B2,$00 +FA2B: 32 B2 00 +FA2E: 22 00 366 DFB $22,$00 ;(C) FORMAT +FA30: 1A 1A 26 367 DFB $1A,$1A,$26,$26,$72,$72 +FA33: 26 72 72 +FA36: 88 C8 368 DFB $88,$C8 ;(D) FORMAT +FA38: C4 CA 26 369 DFB $C4,$CA,$26,$48,$44,$44 +FA3B: 48 44 44 +FA3E: A2 C8 370 DFB $A2,$C8 ;(E) FORMAT +FA40: FF FF FF 371 DFB $FF,$FF,$FF +FA43: 20 D0 F8 372 STEP JSR INSTDSP ;DISASSEMBLE ONE INST +FA46: 68 373 PLA ; AT (PCL,H) +FA47: 85 2C 374 STA RTNL ;ADJUST TO USER +FA49: 68 375 PLA ; STACK. SAVE +FA4A: 85 2D 376 STA RTNH ; RTN ADR. +FA4C: A2 08 377 LDX #$08 +FA4E: BD 10 FB 378 XQINIT LDA INITBL-1,X ;INIT XEQ AREA +FA51: 95 3C 379 STA XQT,X +FA53: CA 380 DEX +FA54: D0 F8 381 BNE XQINIT +FA56: A1 3A 382 LDA (PCL,X) ;USER OPCODE BYTE +FA58: F0 42 383 BEQ XBRK ;SPECIAL IF BREAK +FA5A: A4 2F 384 LDY LENGTH ;LEN FROM DISASSEMBLY +FA5C: C9 20 385 CMP #$20 +FA5E: F0 59 386 BEQ XJSR ;HANDLE JSR, RTS, JMP, +FA60: C9 60 387 CMP #$60 ; JMP (), RTI SPECIAL +FA62: F0 45 388 BEQ XRTS +FA64: C9 4C 389 CMP #$4C +FA66: F0 5C 390 BEQ XJMP +FA68: C9 6C 391 CMP #$6C +FA6A: F0 59 392 BEQ XJMPAT +FA6C: C9 40 393 CMP #$40 +FA6E: F0 35 394 BEQ XRTI +FA70: 29 1F 395 AND #$1F +FA72: 49 14 396 EOR #$14 +FA74: C9 04 397 CMP #$04 ;COPY USER INST TO XEQ AREA +FA76: F0 02 398 BEQ XQ2 ; WITH TRAILING NOPS +FA78: B1 3A 399 XQ1 LDA (PCL),Y ;CHANGE REL BRANCH +FA7A: 99 3C 00 400 XQ2 STA XQT,Y ; DISP TO 4 FOR +FA7D: 88 401 DEY ; JMP TO BRANCH OR +FA7E: 10 F8 402 BPL XQ1 ; NBRANCH FROM XEQ. +FA80: 20 3F FF 403 JSR RESTORE ;RESTORE USER REG CONTENTS. +FA83: 4C 3C 00 404 JMP XQT ;XEQ USER OP FROM RAM +FA86: 85 45 405 IRQ STA ACC ; (RETURN TO NBRANCH) +FA88: 68 406 PLA +FA89: 48 407 PHA ;**IRQ HANDLER +FA8A: 0A 408 ASL +FA8B: 0A 409 ASL +FA8C: 0A 410 ASL +FA8D: 30 03 411 BMI BREAK ;TEST FOR BREAK +FA8F: 6C FE 03 412 JMP (IRQLOC) ;USER ROUTINE VECTOR IN RAM +FA92: 28 413 BREAK PLP +FA93: 20 4C FF 414 JSR SAV1 ;SAVE REG'S ON BREAK +FA96: 68 415 PLA ; INCLUDING PC +FA97: 85 3A 416 STA PCL +FA99: 68 417 PLA +FA9A: 85 3B 418 STA PCH +FA9C: 20 82 F8 419 XBRK JSR INSDS1 ;PRINT USER PC. +FA9F: 20 DA FA 420 JSR RGDSP1 ; AND REG'S +FAA2: 4C 65 FF 421 JMP MON ;GO TO MONITOR +FAA5: 18 422 XRTI CLC +FAA6: 68 423 PLA ;SIMULATE RTI BY EXPECTING +FAA7: 85 48 424 STA STATUS ; STATUS FROM STACK, THEN RTS +FAA9: 68 425 XRTS PLA ;RTS SIMULATION +FAAA: 85 3A 426 STA PCL ; EXTRACT PC FROM STACK +FAAC: 68 427 PLA ; AND UPDATE PC BY 1 (LEN=0) +FAAD: 85 3B 428 PCINC2 STA PCH +FAAF: A5 2F 429 PCINC3 LDA LENGTH ;UPDATE PC BY LEN +FAB1: 20 56 F9 430 JSR PCADJ3 +FAB4: 84 3B 431 STY PCH +FAB6: 18 432 CLC +FAB7: 90 14 433 BCC NEWPCL +FAB9: 18 434 XJSR CLC +FABA: 20 54 F9 435 JSR PCADJ2 ;UPDATE PC AND PUSH +FABD: AA 436 TAX ; ONTO STACH FOR +FABE: 98 437 TYA ; JSR SIMULATE +FABF: 48 438 PHA +FAC0: 8A 439 TXA +FAC1: 48 440 PHA +FAC2: A0 02 441 LDY #$02 +FAC4: 18 442 XJMP CLC +FAC5: B1 3A 443 XJMPAT LDA (PCL),Y +FAC7: AA 444 TAX ;LOAD PC FOR JMP, +FAC8: 88 445 DEY ; (JMP) SIMULATE. +FAC9: B1 3A 446 LDA (PCL),Y +FACB: 86 3B 447 STX PCH +FACD: 85 3A 448 NEWPCL STA PCL +FACF: B0 F3 449 BCS XJMP +FAD1: A5 2D 450 RTNJMP LDA RTNH +FAD3: 48 451 PHA +FAD4: A5 2C 452 LDA RTNL +FAD6: 48 453 PHA +FAD7: 20 8E FD 454 REGDSP JSR CROUT ;DISPLAY USER REG +FADA: A9 45 455 RGDSP1 LDA #ACC ; CONTENTS WITH +FADC: 85 40 456 STA A3L ; LABELS +FADE: A9 00 457 LDA #ACC/256 +FAE0: 85 41 458 STA A3H +FAE2: A2 FB 459 LDX #$FB +FAE4: A9 A0 460 RDSP1 LDA #$A0 +FAE6: 20 ED FD 461 JSR COUT +FAE9: BD 1E FA 462 LDA RTBL-$FB,X +FAEC: 20 ED FD 463 JSR COUT +FAEF: A9 BD 464 LDA #$BD +FAF1: 20 ED FD 465 JSR COUT +FAF4: B5 4A 466 LDA ACC+5,X +FAF6: 20 DA FD 467 JSR PRBYTE +FAF9: E8 468 INX +FAFA: 30 E8 469 BMI RDSP1 +FAFC: 60 470 RTS +FAFD: 18 471 BRANCH CLC ;BRANCH TAKEN, +FAFE: A0 01 472 LDY #$01 ; ADD LEN+2 TO PC +FB00: B1 3A 473 LDA (PCL),Y +FB02: 20 56 F9 474 JSR PCADJ3 +FB05: 85 3A 475 STA PCL +FB07: 98 476 TYA +FB08: 38 477 SEC +FB09: B0 A2 478 BCS PCINC2 +FB0B: 20 4A FF 479 NBRNCH JSR SAVE ;NORMAL RETURN AFTER +FB0E: 38 480 SEC ; XEQ USER OF +FB0F: B0 9E 481 BCS PCINC3 ;GO UPDATE PC +FB11: EA 482 INITBL NOP +FB12: EA 483 NOP ;DUMMY FILL FOR +FB13: 4C 0B FB 484 JMP NBRNCH ; XEQ AREA +FB16: 4C FD FA 485 JMP BRANCH +FB19: C1 486 RTBL DFB $C1 +FB1A: D8 487 DFB $D8 +FB1B: D9 488 DFB $D9 +FB1C: D0 489 DFB $D0 +FB1D: D3 490 DFB $D3 +FB1E: AD 70 C0 491 PREAD LDA PTRIG ;TRIGGER PADDLES +FB21: A0 00 492 LDY #$00 ;INIT COUNT +FB23: EA 493 NOP ;COMPENSATE FOR 1ST COUNT +FB24: EA 494 NOP +FB25: BD 64 C0 495 PREAD2 LDA PADDL0,X ;COUNT Y-REG EVERY +FB28: 10 04 496 BPL RTS2D ; 12 USEC +FB2A: C8 497 INY +FB2B: D0 F8 498 BNE PREAD2 ; EXIT AT 255 MAX +FB2D: 88 499 DEY +FB2E: 60 500 RTS2D RTS +FB2F: A9 00 501 INIT LDA #$00 ;CLR STATUS FOR DEBUG +FB31: 85 48 502 STA STATUS ; SOFTWARE +FB33: AD 56 C0 503 LDA LORES +FB36: AD 54 C0 504 LDA LOWSCR ;INIT VIDEO MODE +FB39: AD 51 C0 505 SETTXT LDA TXTSET ;SET FOR TEXT MODE +FB3C: A9 00 506 LDA #$00 ; FULL SCREEN WINDOW +FB3E: F0 0B 507 BEQ SETWND +FB40: AD 50 C0 508 SETGR LDA TXTCLR ;SET FOR GRAPHICS MODE +FB43: AD 53 C0 509 LDA MIXSET ; LOWER 4 LINES AS +FB46: 20 36 F8 510 JSR CLRTOP ; TEXT WINDOW +FB49: A9 14 511 LDA #$14 +FB4B: 85 22 512 SETWND STA WNDTOP ;SET FOR 40 COL WINDOW +FB4D: A9 00 513 LDA #$00 ; TOP IN A-REG, +FB4F: 85 20 514 STA WNDLFT ; BTTM AT LINE 24 +FB51: A9 28 515 LDA #$28 +FB53: 85 21 516 STA WNDWDTH +FB55: A9 18 517 LDA #$18 +FB57: 85 23 518 STA WNDBTM ; VTAB TO ROW 23 +FB59: A9 17 519 LDA #$17 +FB5B: 85 25 520 TABV STA CV ;VTABS TO ROW IN A-REG +FB5D: 4C 22 FC 521 JMP VTAB +FB60: 20 A4 FB 522 MULPM JSR MD1 ;ABS VAL OF AC AUX +FB63: A0 10 523 MUL LDY #$10 ;INDEX FOR 16 BITS +FB65: A5 50 524 MUL2 LDA ACL ;ACX * AUX + XTND +FB67: 4A 525 LSR ; TO AC, XTND +FB68: 90 0C 526 BCC MUL4 ;IF NO CARRY, +FB6A: 18 527 CLC ; NO PARTIAL PROD. +FB6B: A2 FE 528 LDX #$FE +FB6D: B5 54 529 MUL3 LDA XTNDL+2,X ;ADD MPLCND (AUX) +FB6F: 75 56 530 ADC AUXL+2,X ; TO PARTIAL PROD +FB71: 95 54 531 STA XTNDL+2,X ; (XTND) +FB73: E8 532 INX +FB74: D0 F7 533 BNE MUL3 +FB76: A2 03 534 MUL4 LDX #$03 +FB78: 76 535 MUL5 DFB $76 +FB79: 50 536 DFB $50 +FB7A: CA 537 DEX +FB7B: 10 FB 538 BPL MUL5 +FB7D: 88 539 DEY +FB7E: D0 E5 540 BNE MUL2 +FB80: 60 541 RTS +FB81: 20 A4 FB 542 DIVPM JSR MD1 ;ABS VAL OF AC, AUX. +FB84: A0 10 543 DIV LDY #$10 ;INDEX FOR 16 BITS +FB86: 06 50 544 DIV2 ASL ACL +FB88: 26 51 545 ROL ACH +FB8A: 26 52 546 ROL XTNDL ;XTND/AUX +FB8C: 26 53 547 ROL XTNDH ; TO AC. +FB8E: 38 548 SEC +FB8F: A5 52 549 LDA XTNDL +FB91: E5 54 550 SBC AUXL ;MOD TO XTND. +FB93: AA 551 TAX +FB94: A5 53 552 LDA XTNDH +FB96: E5 55 553 SBC AUXH +FB98: 90 06 554 BCC DIV3 +FB9A: 86 52 555 STX XTNDL +FB9C: 85 53 556 STA XTNDH +FB9E: E6 50 557 INC ACL +FBA0: 88 558 DIV3 DEY +FBA1: D0 E3 559 BNE DIV2 +FBA3: 60 560 RTS +FBA4: A0 00 561 MD1 LDY #$00 ;ABS VAL OF AC, AUX +FBA6: 84 2F 562 STY SIGN ; WITH RESULT SIGN +FBA8: A2 54 563 LDX #AUXL ; IN LSB OF SIGN. +FBAA: 20 AF FB 564 JSR MD3 +FBAD: A2 50 565 LDX #ACL +FBAF: B5 01 566 MD3 LDA LOC1,X ;X SPECIFIES AC OR AUX +FBB1: 10 0D 567 BPL MDRTS +FBB3: 38 568 SEC +FBB4: 98 569 TYA +FBB5: F5 00 570 SBC LOC0,X ;COMPL SPECIFIED REG +FBB7: 95 00 571 STA LOC0,X ; IF NEG. +FBB9: 98 572 TYA +FBBA: F5 01 573 SBC LOC1,X +FBBC: 95 01 574 STA LOC1,X +FBBE: E6 2F 575 INC SIGN +FBC0: 60 576 MDRTS RTS +FBC1: 48 577 BASCALC PHA ;CALC BASE ADR IN BASL,H +FBC2: 4A 578 LSR ; FOR GIVEN LINE NO +FBC3: 29 03 579 AND #$03 ; 0<=LINE NO.<=$17 +FBC5: 09 04 580 ORA #$04 ;ARG=000ABCDE, GENERATE +FBC7: 85 29 581 STA BASH ; BASH=000001CD +FBC9: 68 582 PLA ; AND +FBCA: 29 18 583 AND #$18 ; BASL=EABAB000 +FBCC: 90 02 584 BCC BSCLC2 +FBCE: 69 7F 585 ADC #$7F +FBD0: 85 28 586 BSCLC2 STA BASL +FBD2: 0A 587 ASL +FBD3: 0A 588 ASL +FBD4: 05 28 589 ORA BASL +FBD6: 85 28 590 STA BASL +FBD8: 60 591 RTS +FBD9: C9 87 592 BELL1 CMP #$87 ;BELL CHAR? (CNTRL-G) +FBDB: D0 12 593 BNE RTS2B ; NO, RETURN +FBDD: A9 40 594 LDA #$40 ;DELAY .01 SECONDS +FBDF: 20 A8 FC 595 JSR WAIT +FBE2: A0 C0 596 LDY #$C0 +FBE4: A9 0C 597 BELL2 LDA #$0C ;TOGGLE SPEAKER AT +FBE6: 20 A8 FC 598 JSR WAIT ; 1 KHZ FOR .1 SEC. +FBE9: AD 30 C0 599 LDA SPKR +FBEC: 88 600 DEY +FBED: D0 F5 601 BNE BELL2 +FBEF: 60 602 RTS2B RTS +FBF0: A4 24 603 STOADV LDY CH ;CURSOR H INDEX TO Y-REG +FBF2: 91 28 604 STA (BASL),Y ;STORE CHAR IN LINE +FBF4: E6 24 605 ADVANCE INC CH ;INCREMENT CURSOR H INDEX +FBF6: A5 24 606 LDA CH ; (MOVE RIGHT) +FBF8: C5 21 607 CMP WNDWDTH ;BEYOND WINDOW WIDTH? +FBFA: B0 66 608 BCS CR ; YES CR TO NEXT LINE +FBFC: 60 609 RTS3 RTS ; NO,RETURN +FBFD: C9 A0 610 VIDOUT CMP #$A0 ;CONTROL CHAR? +FBFF: B0 EF 611 BCS STOADV ; NO,OUTPUT IT. +FC01: A8 612 TAY ;INVERSE VIDEO? +FC02: 10 EC 613 BPL STOADV ; YES, OUTPUT IT. +FC04: C9 8D 614 CMP #$8D ;CR? +FC06: F0 5A 615 BEQ CR ; YES. +FC08: C9 8A 616 CMP #$8A ;LINE FEED? +FC0A: F0 5A 617 BEQ LF ; IF SO, DO IT. +FC0C: C9 88 618 CMP #$88 ;BACK SPACE? (CNTRL-H) +FC0E: D0 C9 619 BNE BELL1 ; NO, CHECK FOR BELL. +FC10: C6 24 620 BS DEC CH ;DECREMENT CURSOR H INDEX +FC12: 10 E8 621 BPL RTS3 ;IF POS, OK. ELSE MOVE UP +FC14: A5 21 622 LDA WNDWDTH ;SET CH TO WNDWDTH-1 +FC16: 85 24 623 STA CH +FC18: C6 24 624 DEC CH ;(RIGHTMOST SCREEN POS) +FC1A: A5 22 625 UP LDA WNDTOP ;CURSOR V INDEX +FC1C: C5 25 626 CMP CV +FC1E: B0 0B 627 BCS RTS4 ;IF TOP LINE THEN RETURN +FC20: C6 25 628 DEC CV ;DEC CURSOR V-INDEX +FC22: A5 25 629 VTAB LDA CV ;GET CURSOR V-INDEX +FC24: 20 C1 FB 630 VTABZ JSR BASCALC ;GENERATE BASE ADR +FC27: 65 20 631 ADC WNDLFT ;ADD WINDOW LEFT INDEX +FC29: 85 28 632 STA BASL ;TO BASL +FC2B: 60 633 RTS4 RTS +FC2C: 49 C0 634 ESC1 EOR #$C0 ;ESC? +FC2E: F0 28 635 BEQ HOME ; IF SO, DO HOME AND CLEAR +FC30: 69 FD 636 ADC #$FD ;ESC-A OR B CHECK +FC32: 90 C0 637 BCC ADVANCE ; A, ADVANCE +FC34: F0 DA 638 BEQ BS ; B, BACKSPACE +FC36: 69 FD 639 ADC #$FD ;ESC-C OR D CHECK +FC38: 90 2C 640 BCC LF ; C, DOWN +FC3A: F0 DE 641 BEQ UP ; D, GO UP +FC3C: 69 FD 642 ADC #$FD ;ESC-E OR F CHECK +FC3E: 90 5C 643 BCC CLREOL ; E, CLEAR TO END OF LINE +FC40: D0 E9 644 BNE RTS4 ; NOT F, RETURN +FC42: A4 24 645 CLREOP LDY CH ;CURSOR H TO Y INDEX +FC44: A5 25 646 LDA CV ;CURSOR V TO A-REGISTER +FC46: 48 647 CLEOP1 PHA ;SAVE CURRENT LINE ON STK +FC47: 20 24 FC 648 JSR VTABZ ;CALC BASE ADDRESS +FC4A: 20 9E FC 649 JSR CLEOLZ ;CLEAR TO EOL, SET CARRY +FC4D: A0 00 650 LDY #$00 ;CLEAR FROM H INDEX=0 FOR REST +FC4F: 68 651 PLA ;INCREMENT CURRENT LINE +FC50: 69 00 652 ADC #$00 ;(CARRY IS SET) +FC52: C5 23 653 CMP WNDBTM ;DONE TO BOTTOM OF WINDOW? +FC54: 90 F0 654 BCC CLEOP1 ; NO, KEEP CLEARING LINES +FC56: B0 CA 655 BCS VTAB ; YES, TAB TO CURRENT LINE +FC58: A5 22 656 HOME LDA WNDTOP ;INIT CURSOR V +FC5A: 85 25 657 STA CV ; AND H-INDICES +FC5C: A0 00 658 LDY #$00 +FC5E: 84 24 659 STY CH ;THEN CLEAR TO END OF PAGE +FC60: F0 E4 660 BEQ CLEOP1 +FC62: A9 00 661 CR LDA #$00 ;CURSOR TO LEFT OF INDEX +FC64: 85 24 662 STA CH ;(RET CURSOR H=0) +FC66: E6 25 663 LF INC CV ;INCR CURSOR V(DOWN 1 LINE) +FC68: A5 25 664 LDA CV +FC6A: C5 23 665 CMP WNDBTM ;OFF SCREEN? +FC6C: 90 B6 666 BCC VTABZ ; NO, SET BASE ADDR +FC6E: C6 25 667 DEC CV ;DECR CURSOR V (BACK TO BOTTOM) +FC70: A5 22 668 SCROLL LDA WNDTOP ;START AT TOP OF SCRL WNDW +FC72: 48 669 PHA +FC73: 20 24 FC 670 JSR VTABZ ;GENERATE BASE ADR +FC76: A5 28 671 SCRL1 LDA BASL ;COPY BASL,H +FC78: 85 2A 672 STA BAS2L ; TO BAS2L,H +FC7A: A5 29 673 LDA BASH +FC7C: 85 2B 674 STA BAS2H +FC7E: A4 21 675 LDY WNDWDTH ;INIT Y TO RIGHTMOST INDEX +FC80: 88 676 DEY ; OF SCROLLING WINDOW +FC81: 68 677 PLA +FC82: 69 01 678 ADC #$01 ;INCR LINE NUMBER +FC84: C5 23 679 CMP WNDBTM ;DONE? +FC86: B0 0D 680 BCS SCRL3 ; YES, FINISH +FC88: 48 681 PHA +FC89: 20 24 FC 682 JSR VTABZ ;FORM BASL,H (BASE ADDR) +FC8C: B1 28 683 SCRL2 LDA (BASL),Y ;MOVE A CHR UP ON LINE +FC8E: 91 2A 684 STA (BAS2L),Y +FC90: 88 685 DEY ;NEXT CHAR OF LINE +FC91: 10 F9 686 BPL SCRL2 +FC93: 30 E1 687 BMI SCRL1 ;NEXT LINE (ALWAYS TAKEN) +FC95: A0 00 688 SCRL3 LDY #$00 ;CLEAR BOTTOM LINE +FC97: 20 9E FC 689 JSR CLEOLZ ;GET BASE ADDR FOR BOTTOM LINE +FC9A: B0 86 690 BCS VTAB ;CARRY IS SET +FC9C: A4 24 691 CLREOL LDY CH ;CURSOR H INDEX +FC9E: A9 A0 692 CLEOLZ LDA #$A0 +FCA0: 91 28 693 CLEOL2 STA (BASL),Y ;STORE BLANKS FROM 'HERE' +FCA2: C8 694 INY ; TO END OF LINES (WNDWDTH) +FCA3: C4 21 695 CPY WNDWDTH +FCA5: 90 F9 696 BCC CLEOL2 +FCA7: 60 697 RTS +FCA8: 38 698 WAIT SEC +FCA9: 48 699 WAIT2 PHA +FCAA: E9 01 700 WAIT3 SBC #$01 +FCAC: D0 FC 701 BNE WAIT3 ;1.0204 USEC +FCAE: 68 702 PLA ;(13+27/2*A+5/2*A*A) +FCAF: E9 01 703 SBC #$01 +FCB1: D0 F6 704 BNE WAIT2 +FCB3: 60 705 RTS +FCB4: E6 42 706 NXTA4 INC A4L ;INCR 2-BYTE A4 +FCB6: D0 02 707 BNE NXTA1 ; AND A1 +FCB8: E6 43 708 INC A4H +FCBA: A5 3C 709 NXTA1 LDA A1L ;INCR 2-BYTE A1. +FCBC: C5 3E 710 CMP A2L +FCBE: A5 3D 711 LDA A1H ; AND COMPARE TO A2 +FCC0: E5 3F 712 SBC A2H +FCC2: E6 3C 713 INC A1L ; (CARRY SET IF >=) +FCC4: D0 02 714 BNE RTS4B +FCC6: E6 3D 715 INC A1H +FCC8: 60 716 RTS4B RTS +FCC9: A0 4B 717 HEADR LDY #$4B ;WRITE A*256 'LONG 1' +FCCB: 20 DB FC 718 JSR ZERDLY ; HALF CYCLES +FCCE: D0 F9 719 BNE HEADR ; (650 USEC EACH) +FCD0: 69 FE 720 ADC #$FE +FCD2: B0 F5 721 BCS HEADR ;THEN A 'SHORT 0' +FCD4: A0 21 722 LDY #$21 ; (400 USEC) +FCD6: 20 DB FC 723 WRBIT JSR ZERDLY ;WRITE TWO HALF CYCLES +FCD9: C8 724 INY ; OF 250 USEC ('0') +FCDA: C8 725 INY ; OR 500 USEC ('0') +FCDB: 88 726 ZERDLY DEY +FCDC: D0 FD 727 BNE ZERDLY +FCDE: 90 05 728 BCC WRTAPE ;Y IS COUNT FOR +FCE0: A0 32 729 LDY #$32 ; TIMING LOOP +FCE2: 88 730 ONEDLY DEY +FCE3: D0 FD 731 BNE ONEDLY +FCE5: AC 20 C0 732 WRTAPE LDY TAPEOUT +FCE8: A0 2C 733 LDY #$2C +FCEA: CA 734 DEX +FCEB: 60 735 RTS +FCEC: A2 08 736 RDBYTE LDX #$08 ;8 BITS TO READ +FCEE: 48 737 RDBYT2 PHA ;READ TWO TRANSITIONS +FCEF: 20 FA FC 738 JSR RD2BIT ; (FIND EDGE) +FCF2: 68 739 PLA +FCF3: 2A 740 ROL ;NEXT BIT +FCF4: A0 3A 741 LDY #$3A ;COUNT FOR SAMPLES +FCF6: CA 742 DEX +FCF7: D0 F5 743 BNE RDBYT2 +FCF9: 60 744 RTS +FCFA: 20 FD FC 745 RD2BIT JSR RDBIT +FCFD: 88 746 RDBIT DEY ;DECR Y UNTIL +FCFE: AD 60 C0 747 LDA TAPEIN ; TAPE TRANSITION +FD01: 45 2F 748 EOR LASTIN +FD03: 10 F8 749 BPL RDBIT +FD05: 45 2F 750 EOR LASTIN +FD07: 85 2F 751 STA LASTIN +FD09: C0 80 752 CPY #$80 ;SET CARRY ON Y +FD0B: 60 753 RTS +FD0C: A4 24 754 RDKEY LDY CH +FD0E: B1 28 755 LDA (BASL),Y ;SET SCREEN TO FLASH +FD10: 48 756 PHA +FD11: 29 3F 757 AND #$3F +FD13: 09 40 758 ORA #$40 +FD15: 91 28 759 STA (BASL),Y +FD17: 68 760 PLA +FD18: 6C 38 00 761 JMP (KSWL) ;GO TO USER KEY-IN +FD1B: E6 4E 762 KEYIN INC RNDL +FD1D: D0 02 763 BNE KEYIN2 ;INCR RND NUMBER +FD1F: E6 4F 764 INC RNDH +FD21: 2C 00 C0 765 KEYIN2 BIT KBD ;KEY DOWN? +FD24: 10 F5 766 BPL KEYIN ; LOOP +FD26: 91 28 767 STA (BASL),Y ;REPLACE FLASHING SCREEN +FD28: AD 00 C0 768 LDA KBD ;GET KEYCODE +FD2B: 2C 10 C0 769 BIT KBDSTRB ;CLR KEY STROBE +FD2E: 60 770 RTS +FD2F: 20 0C FD 771 ESC JSR RDKEY ;GET KEYCODE +FD32: 20 2C FC 772 JSR ESC1 ; HANDLE ESC FUNC. +FD35: 20 0C FD 773 RDCHAR JSR RDKEY ;READ KEY +FD38: C9 9B 774 CMP #$9B ;ESC? +FD3A: F0 F3 775 BEQ ESC ; YES, DON'T RETURN +FD3C: 60 776 RTS +FD3D: A5 32 777 NOTCR LDA INVFLG +FD3F: 48 778 PHA +FD40: A9 FF 779 LDA #$FF +FD42: 85 32 780 STA INVFLG ;ECHO USER LINE +FD44: BD 00 02 781 LDA IN,X ; NON INVERSE +FD47: 20 ED FD 782 JSR COUT +FD4A: 68 783 PLA +FD4B: 85 32 784 STA INVFLG +FD4D: BD 00 02 785 LDA IN,X +FD50: C9 88 786 CMP #$88 ;CHECK FOR EDIT KEYS +FD52: F0 1D 787 BEQ BCKSPC ; BS, CTRL-X +FD54: C9 98 788 CMP #$98 +FD56: F0 0A 789 BEQ CANCEL +FD58: E0 F8 790 CPX #$F8 ;MARGIN? +FD5A: 90 03 791 BCC NOTCR1 +FD5C: 20 3A FF 792 JSR BELL ; YES, SOUND BELL +FD5F: E8 793 NOTCR1 INX ;ADVANCE INPUT INDEX +FD60: D0 13 794 BNE NXTCHAR +FD62: A9 DC 795 CANCEL LDA #$DC ;BACKSLASH AFTER CANCELLED LINE +FD64: 20 ED FD 796 JSR COUT +FD67: 20 8E FD 797 GETLNZ JSR CROUT ;OUTPUT CR +FD6A: A5 33 798 GETLN LDA PROMPT +FD6C: 20 ED FD 799 JSR COUT ;OUTPUT PROMPT CHAR +FD6F: A2 01 800 LDX #$01 ;INIT INPUT INDEX +FD71: 8A 801 BCKSPC TXA ; WILL BACKSPACE TO 0 +FD72: F0 F3 802 BEQ GETLNZ +FD74: CA 803 DEX +FD75: 20 35 FD 804 NXTCHAR JSR RDCHAR +FD78: C9 95 805 CMP #PICK ;USE SCREEN CHAR +FD7A: D0 02 806 BNE CAPTST ; FOR CTRL-U +FD7C: B1 28 807 LDA (BASL),Y +FD7E: C9 E0 808 CAPTST CMP #$E0 +FD80: 90 02 809 BCC ADDINP ;CONVERT TO CAPS +FD82: 29 DF 810 AND #$DF +FD84: 9D 00 02 811 ADDINP STA IN,X ;ADD TO INPUT BUF +FD87: C9 8D 812 CMP #$8D +FD89: D0 B2 813 BNE NOTCR +FD8B: 20 9C FC 814 JSR CLREOL ;CLR TO EOL IF CR +FD8E: A9 8D 815 CROUT LDA #$8D +FD90: D0 5B 816 BNE COUT +FD92: A4 3D 817 PRA1 LDY A1H ;PRINT CR,A1 IN HEX +FD94: A6 3C 818 LDX A1L +FD96: 20 8E FD 819 PRYX2 JSR CROUT +FD99: 20 40 F9 820 JSR PRNTYX +FD9C: A0 00 821 LDY #$00 +FD9E: A9 AD 822 LDA #$AD ;PRINT '-' +FDA0: 4C ED FD 823 JMP COUT +FDA3: A5 3C 824 XAM8 LDA A1L +FDA5: 09 07 825 ORA #$07 ;SET TO FINISH AT +FDA7: 85 3E 826 STA A2L ; MOD 8=7 +FDA9: A5 3D 827 LDA A1H +FDAB: 85 3F 828 STA A2H +FDAD: A5 3C 829 MODSCHK LDA A1L +FDAF: 29 07 830 AND #$07 +FDB1: D0 03 831 BNE DATAOUT +FDB3: 20 92 FD 832 XAM JSR PRA1 +FDB6: A9 A0 833 DATAOUT LDA #$A0 +FDB8: 20 ED FD 834 JSR COUT ;OUTPUT BLANK +FDBB: B1 3C 835 LDA (A1L),Y +FDBD: 20 DA FD 836 JSR PRBYTE ;OUTPUT BYTE IN HEX +FDC0: 20 BA FC 837 JSR NXTA1 +FDC3: 90 E8 838 BCC MODSCHK ;CHECK IF TIME TO, +FDC5: 60 839 RTS4C RTS ; PRINT ADDR +FDC6: 4A 840 XAMPM LSR ;DETERMINE IF MON +FDC7: 90 EA 841 BCC XAM ; MODE IS XAM +FDC9: 4A 842 LSR ; ADD, OR SUB +FDCA: 4A 843 LSR +FDCB: A5 3E 844 LDA A2L +FDCD: 90 02 845 BCC ADD +FDCF: 49 FF 846 EOR #$FF ;SUB: FORM 2'S COMPLEMENT +FDD1: 65 3C 847 ADD ADC A1L +FDD3: 48 848 PHA +FDD4: A9 BD 849 LDA #$BD +FDD6: 20 ED FD 850 JSR COUT ;PRINT '=', THEN RESULT +FDD9: 68 851 PLA +FDDA: 48 852 PRBYTE PHA ;PRINT BYTE AS 2 HEX +FDDB: 4A 853 LSR ; DIGITS, DESTROYS A-REG +FDDC: 4A 854 LSR +FDDD: 4A 855 LSR +FDDE: 4A 856 LSR +FDDF: 20 E5 FD 857 JSR PRHEXZ +FDE2: 68 858 PLA +FDE3: 29 0F 859 PRHEX AND #$0F ;PRINT HEX DIG IN A-REG +FDE5: 09 B0 860 PRHEXZ ORA #$B0 ; LSB'S +FDE7: C9 BA 861 CMP #$BA +FDE9: 90 02 862 BCC COUT +FDEB: 69 06 863 ADC #$06 +FDED: 6C 36 00 864 COUT JMP (CSWL) ;VECTOR TO USER OUTPUT ROUTINE +FDF0: C9 A0 865 COUT1 CMP #$A0 +FDF2: 90 02 866 BCC COUTZ ;DON'T OUTPUT CTRL'S INVERSE +FDF4: 25 32 867 AND INVFLG ;MASK WITH INVERSE FLAG +FDF6: 84 35 868 COUTZ STY YSAV1 ;SAV Y-REG +FDF8: 48 869 PHA ;SAV A-REG +FDF9: 20 FD FB 870 JSR VIDOUT ;OUTPUT A-REG AS ASCII +FDFC: 68 871 PLA ;RESTORE A-REG +FDFD: A4 35 872 LDY YSAV1 ; AND Y-REG +FDFF: 60 873 RTS ; THEN RETURN +FE00: C6 34 874 BL1 DEC YSAV +FE02: F0 9F 875 BEQ XAM8 +FE04: CA 876 BLANK DEX ;BLANK TO MON +FE05: D0 16 877 BNE SETMDZ ;AFTER BLANK +FE07: C9 BA 878 CMP #$BA ;DATA STORE MODE? +FE09: D0 BB 879 BNE XAMPM ; NO, XAM, ADD, OR SUB +FE0B: 85 31 880 STOR STA MODE ;KEEP IN STORE MODE +FE0D: A5 3E 881 LDA A2L +FE0F: 91 40 882 STA (A3L),Y ;STORE AS LOW BYTE AS (A3) +FE11: E6 40 883 INC A3L +FE13: D0 02 884 BNE RTS5 ;INCR A3, RETURN +FE15: E6 41 885 INC A3H +FE17: 60 886 RTS5 RTS +FE18: A4 34 887 SETMODE LDY YSAV ;SAVE CONVERTED ':', '+', +FE1A: B9 FF 01 888 LDA IN-1,Y ; '-', '.' AS MODE. +FE1D: 85 31 889 SETMDZ STA MODE +FE1F: 60 890 RTS +FE20: A2 01 891 LT LDX #$01 +FE22: B5 3E 892 LT2 LDA A2L,X ;COPY A2 (2 BYTES) TO +FE24: 95 42 893 STA A4L,X ; A4 AND A5 +FE26: 95 44 894 STA A5L,X +FE28: CA 895 DEX +FE29: 10 F7 896 BPL LT2 +FE2B: 60 897 RTS +FE2C: B1 3C 898 MOVE LDA (A1L),Y ;MOVE (A1 TO A2) TO +FE2E: 91 42 899 STA (A4L),Y ; (A4) +FE30: 20 B4 FC 900 JSR NXTA4 +FE33: 90 F7 901 BCC MOVE +FE35: 60 902 RTS +FE36: B1 3C 903 VFY LDA (A1L),Y ;VERIFY (A1 TO A2) WITH +FE38: D1 42 904 CMP (A4L),Y ; (A4) +FE3A: F0 1C 905 BEQ VFYOK +FE3C: 20 92 FD 906 JSR PRA1 +FE3F: B1 3C 907 LDA (A1L),Y +FE41: 20 DA FD 908 JSR PRBYTE +FE44: A9 A0 909 LDA #$A0 +FE46: 20 ED FD 910 JSR COUT +FE49: A9 A8 911 LDA #$A8 +FE4B: 20 ED FD 912 JSR COUT +FE4E: B1 42 913 LDA (A4L),Y +FE50: 20 DA FD 914 JSR PRBYTE +FE53: A9 A9 915 LDA #$A9 +FE55: 20 ED FD 916 JSR COUT +FE58: 20 B4 FC 917 VFYOK JSR NXTA4 +FE5B: 90 D9 918 BCC VFY +FE5D: 60 919 RTS +FE5E: 20 75 FE 920 LIST JSR A1PC ;MOVE A1 (2 BYTES) TO +FE61: A9 14 921 LDA #$14 ; PC IF SPEC'D AND +FE63: 48 922 LIST2 PHA ; DISEMBLE 20 INSTRS +FE64: 20 D0 F8 923 JSR INSTDSP +FE67: 20 53 F9 924 JSR PCADJ ;ADJUST PC EACH INSTR +FE6A: 85 3A 925 STA PCL +FE6C: 84 3B 926 STY PCH +FE6E: 68 927 PLA +FE6F: 38 928 SEC +FE70: E9 01 929 SBC #$01 ;NEXT OF 20 INSTRS +FE72: D0 EF 930 BNE LIST2 +FE74: 60 931 RTS +FE75: 8A 932 A1PC TXA ;IF USER SPEC'D ADR +FE76: F0 07 933 BEQ A1PCRTS ; COPY FROM A1 TO PC +FE78: B5 3C 934 A1PCLP LDA A1L,X +FE7A: 95 3A 935 STA PCL,X +FE7C: CA 936 DEX +FE7D: 10 F9 937 BPL A1PCLP +FE7F: 60 938 A1PCRTS RTS +FE80: A0 3F 939 SETINV LDY #$3F ;SET FOR INVERSE VID +FE82: D0 02 940 BNE SETIFLG ; VIA COUT1 +FE84: A0 FF 941 SETNORM LDY #$FF ;SET FOR NORMAL VID +FE86: 84 32 942 SETIFLG STY INVFLG +FE88: 60 943 RTS +FE89: A9 00 944 SETKBD LDA #$00 ;SIMULATE PORT #0 INPUT +FE8B: 85 3E 945 INPORT STA A2L ; SPECIFIED (KEYIN ROUTINE) +FE8D: A2 38 946 INPRT LDX #KSWL +FE8F: A0 1B 947 LDY #KEYIN +FE91: D0 08 948 BNE IOPRT +FE93: A9 00 949 SETVID LDA #$00 ;SIMULATE PORT #0 OUTPUT +FE95: 85 3E 950 OUTPORT STA A2L ; SPECIFIED (COUT1 ROUTINE) +FE97: A2 36 951 OUTPRT LDX #CSWL +FE99: A0 F0 952 LDY #COUT1 +FE9B: A5 3E 953 IOPRT LDA A2L ;SET RAM IN/OUT VECTORS +FE9D: 29 0F 954 AND #$0F +FE9F: F0 06 955 BEQ IOPRT1 +FEA1: 09 C0 956 ORA #IOADR/256 +FEA3: A0 00 957 LDY #$00 +FEA5: F0 02 958 BEQ IOPRT2 +FEA7: A9 FD 959 IOPRT1 LDA #COUT1/256 +FEA9: 94 00 960 IOPRT2 STY LOC0,X +FEAB: 95 01 961 STA LOC1,X +FEAD: 60 962 RTS +FEAE: EA 963 NOP +FEAF: EA 964 NOP +FEB0: 4C 00 E0 965 XBASIC JMP BASIC ;TO BASIC WITH SCRATCH +FEB3: 4C 03 E0 966 BASCONT JMP BASIC2 ;CONTINUE BASIC +FEB6: 20 75 FE 967 GO JSR A1PC ;ADR TO PC IF SPEC'D +FEB9: 20 3F FF 968 JSR RESTORE ;RESTORE META REGS +FEBC: 6C 3A 00 969 JMP (PCL) ;GO TO USER SUBR +FEBF: 4C D7 FA 970 REGZ JMP REGDSP ;TO REG DISPLAY +FEC2: C6 34 971 TRACE DEC YSAV +FEC4: 20 75 FE 972 STEPZ JSR A1PC ;ADR TO PC IF SPEC'D +FEC7: 4C 43 FA 973 JMP STEP ;TAKE ONE STEP +FECA: 4C F8 03 974 USR JMP USRADR ;TO USR SUBR AT USRADR +FECD: A9 40 975 WRITE LDA #$40 +FECF: 20 C9 FC 976 JSR HEADR ;WRITE 10-SEC HEADER +FED2: A0 27 977 LDY #$27 +FED4: A2 00 978 WR1 LDX #$00 +FED6: 41 3C 979 EOR (A1L,X) +FED8: 48 980 PHA +FED9: A1 3C 981 LDA (A1L,X) +FEDB: 20 ED FE 982 JSR WRBYTE +FEDE: 20 BA FC 983 JSR NXTA1 +FEE1: A0 1D 984 LDY #$1D +FEE3: 68 985 PLA +FEE4: 90 EE 986 BCC WR1 +FEE6: A0 22 987 LDY #$22 +FEE8: 20 ED FE 988 JSR WRBYTE +FEEB: F0 4D 989 BEQ BELL +FEED: A2 10 990 WRBYTE LDX #$10 +FEEF: 0A 991 WRBYT2 ASL +FEF0: 20 D6 FC 992 JSR WRBIT +FEF3: D0 FA 993 BNE WRBYT2 +FEF5: 60 994 RTS +FEF6: 20 00 FE 995 CRMON JSR BL1 ;HANDLE A CR AS BLANK +FEF9: 68 996 PLA ; THEN POP STACK +FEFA: 68 997 PLA ; AND RTN TO MON +FEFB: D0 6C 998 BNE MONZ +FEFD: 20 FA FC 999 READ JSR RD2BIT ;FIND TAPEIN EDGE +FF00: A9 16 1000 LDA #$16 +FF02: 20 C9 FC 1001 JSR HEADR ;DELAY 3.5 SECONDS +FF05: 85 2E 1002 STA CHKSUM ;INIT CHKSUM=$FF +FF07: 20 FA FC 1003 JSR RD2BIT ;FIND TAPEIN EDGE +FF0A: A0 24 1004 RD2 LDY #$24 ;LOOK FOR SYNC BIT +FF0C: 20 FD FC 1005 JSR RDBIT ; (SHORT 0) +FF0F: B0 F9 1006 BCS RD2 ; LOOP UNTIL FOUND +FF11: 20 FD FC 1007 JSR RDBIT ;SKIP SECOND SYNC H-CYCLE +FF14: A0 3B 1008 LDY #$3B ;INDEX FOR 0/1 TEST +FF16: 20 EC FC 1009 RD3 JSR RDBYTE ;READ A BYTE +FF19: 81 3C 1010 STA (A1L,X) ;STORE AT (A1) +FF1B: 45 2E 1011 EOR CHKSUM +FF1D: 85 2E 1012 STA CHKSUM ;UPDATE RUNNING CHKSUM +FF1F: 20 BA FC 1013 JSR NXTA1 ;INC A1, COMPARE TO A2 +FF22: A0 35 1014 LDY #$35 ;COMPENSATE 0/1 INDEX +FF24: 90 F0 1015 BCC RD3 ;LOOP UNTIL DONE +FF26: 20 EC FC 1016 JSR RDBYTE ;READ CHKSUM BYTE +FF29: C5 2E 1017 CMP CHKSUM +FF2B: F0 0D 1018 BEQ BELL ;GOOD, SOUND BELL AND RETURN +FF2D: A9 C5 1019 PRERR LDA #$C5 +FF2F: 20 ED FD 1020 JSR COUT ;PRINT "ERR", THEN BELL +FF32: A9 D2 1021 LDA #$D2 +FF34: 20 ED FD 1022 JSR COUT +FF37: 20 ED FD 1023 JSR COUT +FF3A: A9 87 1024 BELL LDA #$87 ;OUTPUT BELL AND RETURN +FF3C: 4C ED FD 1025 JMP COUT +FF3F: A5 48 1026 RESTORE LDA STATUS ;RESTORE 6502 REG CONTENTS +FF41: 48 1027 PHA ; USED BY DEBUG SOFTWARE +FF42: A5 45 1028 LDA ACC +FF44: A6 46 1029 RESTR1 LDX XREG +FF46: A4 47 1030 LDY YREG +FF48: 28 1031 PLP +FF49: 60 1032 RTS +FF4A: 85 45 1033 SAVE STA ACC ;SAVE 6502 REG CONTENTS +FF4C: 86 46 1034 SAV1 STX XREG +FF4E: 84 47 1035 STY YREG +FF50: 08 1036 PHP +FF51: 68 1037 PLA +FF52: 85 48 1038 STA STATUS +FF54: BA 1039 TSX +FF55: 86 49 1040 STX SPNT +FF57: D8 1041 CLD +FF58: 60 1042 RTS +FF59: 20 84 FE 1043 RESET JSR SETNORM ;SET SCREEN MODE +FF5C: 20 2F FB 1044 JSR INIT ; AND INIT KBD/SCREEN +FF5F: 20 93 FE 1045 JSR SETVID ; AS I/O DEV'S +FF62: 20 89 FE 1046 JSR SETKBD +FF65: D8 1047 MON CLD ;MUST SET HEX MODE! +FF66: 20 3A FF 1048 JSR BELL +FF69: A9 AA 1049 MONZ LDA #$AA ;'*' PROMPT FOR MON +FF6B: 85 33 1050 STA PROMPT +FF6D: 20 67 FD 1051 JSR GETLNZ ;READ A LINE +FF70: 20 C7 FF 1052 JSR ZMODE ;CLEAR MON MODE, SCAN IDX +FF73: 20 A7 FF 1053 NXTITM JSR GETNUM ;GET ITEM, NON-HEX +FF76: 84 34 1054 STY YSAV ; CHAR IN A-REG +FF78: A0 17 1055 LDY #$17 ; X-REG=0 IF NO HEX INPUT +FF7A: 88 1056 CHRSRCH DEY +FF7B: 30 E8 1057 BMI MON ;NOT FOUND, GO TO MON +FF7D: D9 CC FF 1058 CMP CHRTBL,Y ;FIND CMND CHAR IN TEL +FF80: D0 F8 1059 BNE CHRSRCH +FF82: 20 BE FF 1060 JSR TOSUB ;FOUND, CALL CORRESPONDING +FF85: A4 34 1061 LDY YSAV ; SUBROUTINE +FF87: 4C 73 FF 1062 JMP NXTITM +FF8A: A2 03 1063 DIG LDX #$03 +FF8C: 0A 1064 ASL +FF8D: 0A 1065 ASL ;GOT HEX DIG, +FF8E: 0A 1066 ASL ; SHIFT INTO A2 +FF8F: 0A 1067 ASL +FF90: 0A 1068 NXTBIT ASL +FF91: 26 3E 1069 ROL A2L +FF93: 26 3F 1070 ROL A2H +FF95: CA 1071 DEX ;LEAVE X=$FF IF DIG +FF96: 10 F8 1072 BPL NXTBIT +FF98: A5 31 1073 NXTBAS LDA MODE +FF9A: D0 06 1074 BNE NXTBS2 ;IF MODE IS ZERO +FF9C: B5 3F 1075 LDA A2H,X ; THEN COPY A2 TO +FF9E: 95 3D 1076 STA A1H,X ; A1 AND A3 +FFA0: 95 41 1077 STA A3H,X +FFA2: E8 1078 NXTBS2 INX +FFA3: F0 F3 1079 BEQ NXTBAS +FFA5: D0 06 1080 BNE NXTCHR +FFA7: A2 00 1081 GETNUM LDX #$00 ;CLEAR A2 +FFA9: 86 3E 1082 STX A2L +FFAB: 86 3F 1083 STX A2H +FFAD: B9 00 02 1084 NXTCHR LDA IN,Y ;GET CHAR +FFB0: C8 1085 INY +FFB1: 49 B0 1086 EOR #$B0 +FFB3: C9 0A 1087 CMP #$0A +FFB5: 90 D3 1088 BCC DIG ;IF HEX DIG, THEN +FFB7: 69 88 1089 ADC #$88 +FFB9: C9 FA 1090 CMP #$FA +FFBB: B0 CD 1091 BCS DIG +FFBD: 60 1092 RTS +FFBE: A9 FE 1093 TOSUB LDA #GO/256 ;PUSH HIGH-ORDER +FFC0: 48 1094 PHA ; SUBR ADR ON STK +FFC1: B9 E3 FF 1095 LDA SUBTBL,Y ;PUSH LOW-ORDER +FFC4: 48 1096 PHA ; SUBR ADR ON STK +FFC5: A5 31 1097 LDA MODE +FFC7: A0 00 1098 ZMODE LDY #$00 ;CLR MODE, OLD MODE +FFC9: 84 31 1099 STY MODE ; TO A-REG +FFCB: 60 1100 RTS ; GO TO SUBR VIA RTS +FFCC: BC 1101 CHRTBL DFB $BC ;F("CTRL-C") +FFCD: B2 1102 DFB $B2 ;F("CTRL-Y") +FFCE: BE 1103 DFB $BE ;F("CTRL-E") +FFCF: ED 1104 DFB $ED ;F("T") +FFD0: EF 1105 DFB $EF ;F("V") +FFD1: C4 1106 DFB $C4 ;F("CTRL-K") +FFD2: EC 1107 DFB $EC ;F("S") +FFD3: A9 1108 DFB $A9 ;F("CTRL-P") +FFD4: BB 1109 DFB $BB ;F("CTRL-B") +FFD5: A6 1110 DFB $A6 ;F("-") +FFD6: A4 1111 DFB $A4 ;F("+") +FFD7: 06 1112 DFB $06 ;F("M") (F=EX-OR $B0+$89) +FFD8: 95 1113 DFB $95 ;F("<") +FFD9: 07 1114 DFB $07 ;F("N") +FFDA: 02 1115 DFB $02 ;F("I") +FFDB: 05 1116 DFB $05 ;F("L") +FFDC: F0 1117 DFB $F0 ;F("W") +FFDD: 00 1118 DFB $00 ;F("G") +FFDE: EB 1119 DFB $EB ;F("R") +FFDF: 93 1120 DFB $93 ;F(":") +FFE0: A7 1121 DFB $A7 ;F(".") +FFE1: C6 1122 DFB $C6 ;F("CR") +FFE2: 99 1123 DFB $99 ;F(BLANK) +FFE3: B2 1124 SUBTBL DFB BASCONT-1 +FFE4: C9 1125 DFB USR-1 +FFE5: BE 1126 DFB REGZ-1 +FFE6: C1 1127 DFB TRACE-1 +FFE7: 35 1128 DFB VFY-1 +FFE8: 8C 1129 DFB INPRT-1 +FFE9: C3 1130 DFB STEPZ-1 +FFEA: 96 1131 DFB OUTPRT-1 +FFEB: AF 1132 DFB XBASIC-1 +FFEC: 17 1133 DFB SETMODE-1 +FFED: 17 1134 DFB SETMODE-1 +FFEE: 2B 1135 DFB MOVE-1 +FFEF: 1F 1136 DFB LT-1 +FFF0: 83 1137 DFB SETNORM-1 +FFF1: 7F 1138 DFB SETINV-1 +FFF2: 5D 1139 DFB LIST-1 +FFF3: CC 1140 DFB WRITE-1 +FFF4: B5 1141 DFB GO-1 +FFF5: FC 1142 DFB READ-1 +FFF6: 17 1143 DFB SETMODE-1 +FFF7: 17 1144 DFB SETMODE-1 +FFF8: F5 1145 DFB CRMON-1 +FFF9: 03 1146 DFB BLANK-1 +FFFA: FB 1147 DFB NMI ;NMI VECTOR +FFFB: 03 1148 DFB NMI/256 +FFFC: 59 1149 DFB RESET ;RESET VECTOR +FFFD: FF 1150 DFB RESET/256 +FFFE: 86 1151 DFB IRQ ;IRQ VECTOR +FFFF: FA 1152 DFB IRQ/256 + 1153 XQTNZ EQU $3C diff --git a/source/redbook/sweet16.asm b/source/redbook/sweet16.asm new file mode 100644 index 0000000..9cbe875 --- /dev/null +++ b/source/redbook/sweet16.asm @@ -0,0 +1,241 @@ + 1 *********************** + 2 * * + 3 * APPLE-II PSEUDO * + 4 * MACHINE INTERPRETER * + 5 * * + 6 * COPYRIGHT 1977 * + 7 * APPLE COMPUTER INC * + 8 * * + 9 * ALL RIGHTS RESERVED * + 10 * S. WOZNIAK * + 11 * * + 12 *********************** + 13 ; TITLE "SWEET16 INTERPRETER" + 14 R0L EQU $0 + 15 R0H EQU $1 + 16 R14H EQU $1D + 17 R15L EQU $1E + 18 R15H EQU $1F + 19 SW16PAG EQU $F7 + 20 SAVE EQU $FF4A + 21 RESTORE EQU $FF3F + 22 ORG $F689 +F689: 20 4A FF 23 SW16 JSR SAVE ;PRESERVE 6502 REG CONTENTS +F68C: 68 24 PLA +F68D: 85 1E 25 STA R15L ;INIT SWEET16 PC +F68F: 68 26 PLA ;FROM RETURN +F690: 85 1F 27 STA R15H ; ADDRESS +F692: 20 98 F6 28 SW16B JSR SW16C ;INTERPRET AND EXECUTE +F695: 4C 92 F6 29 JMP SW16B ;ONE SWEET16 INSTR. +F698: E6 1E 30 SW16C INC R15L +F69A: D0 02 31 BNE SW16D ;INCR SWEET16 PC FOR FETCH +F69C: E6 1F 32 INC R15H +F69E: A9 F7 33 SW16D LDA #SW16PAG +F6A0: 48 34 PHA ;PUSH ON STACK FOR RTS +F6A1: A0 00 35 LDY #$0 +F6A3: B1 1E 36 LDA (R15L),Y ;FETCH INSTR +F6A5: 29 0F 37 AND #$F ;MASK REG SPECIFICATION +F6A7: 0A 38 ASL ;DOUBLE FOR TWO BYTE REGISTERS +F6A8: AA 39 TAX ;TO X REG FOR INDEXING +F6A9: 4A 40 LSR +F6AA: 51 1E 41 EOR (R15L),Y ;NOW HAVE OPCODE +F6AC: F0 0B 42 BEQ TOBR ;IF ZERO THEN NON-REG OP +F6AE: 86 1D 43 STX R14H ;INDICATE'PRIOR RESULT REG' +F6B0: 4A 44 LSR +F6B1: 4A 45 LSR ;OPCODE*2 TO LSB'S +F6B2: 4A 46 LSR +F6B3: A8 47 TAY ;TO Y REG FOR INDEXING +F6B4: B9 E1 F6 48 LDA OPTBL-2,Y ;LOW ORDER ADR BYTE +F6B7: 48 49 PHA ;ONTO STACK +F6B8: 60 50 RTS ;GOTO REG-OP ROUTINE +F6B9: E6 1E 51 TOBR INC R15L +F6BB: D0 02 52 BNE TOBR2 ;INCR PC +F6BD: E6 1F 53 INC R15H +F6BF: BD E4 F6 54 TOBR2 LDA BRTBL,X ;LOW ORDER ADR BYTE +F6C2: 48 55 PHA ;ONTO STACK FOR NON-REG OP +F6C3: A5 1D 56 LDA R14H ;'PRIOR RESULT REG' INDEX +F6C5: 4A 57 LSR ;PREPARE CARRY FOR BC, BNC. +F6C6: 60 58 RTS ;GOTO NON-REG OP ROUTINE +F6C7: 68 59 RTNZ PLA ;POP RETURN ADDRESS +F6C8: 68 60 PLA +F6C9: 20 3F FF 61 JSR RESTORE ;RESTORE 6502 REG CONTENTS +F6CC: 6C 1E 00 62 JMP (R15L) ;RETURN TO 6502 CODE VIA PC +F6CF: B1 1E 63 SETZ LDA (R15L),Y ;HIGH-ORDER BYTE OF CONSTANT +F6D1: 95 01 64 STA R0H,X +F6D3: 88 65 DEY +F6D4: B1 1E 66 LDA (R15L),Y ;LOW-ORDER BYTE OF CONSTANT +F6D6: 95 00 67 STA R0L,X +F6D8: 98 68 TYA ;Y-REG CONTAINS 1 +F6D9: 38 69 SEC +F6DA: 65 1E 70 ADC R15L ;ADD 2 TO PC +F6DC: 85 1E 71 STA R15L +F6DE: 90 02 72 BCC SET2 +F6E0: E6 1F 73 INC R15H +F6E2: 60 74 SET2 RTS +F6E3: 02 75 OPTBL DFB SET-1 ;1X +F6E4: F9 76 BRTBL DFB RTN-1 ;0 +F6E5: 04 77 DFB LD-1 ;2X +F6E6: 9D 78 DFB BR-1 ;1 +F6E7: 0D 79 DFB ST-1 ;3X +F6E8: 9E 80 DFB BNC-1 ;2 +F6E9: 25 81 DFB LDAT-1 ;4X +F6EA: AF 82 DFB BC-1 ;3 +F6EB: 16 83 DFB STAT-1 ;5X +F6EC: B2 84 DFB BP-1 ;4 +F6ED: 47 85 DFB LDDAT-1 ;6X +F6EE: B9 86 DFB BM-1 ;5 +F6EF: 51 87 DFB STDAT-1 ;7X +F6F0: C0 88 DFB BZ-1 ;6 +F6F1: 2F 89 DFB POP-1 ;8X +F6F2: C9 90 DFB BNZ-1 ;7 +F6F3: 5B 91 DFB STPAT-1 ;9X +F6F4: D2 92 DFB BM1-1 ;8 +F6F5: 85 93 DFB ADD-1 ;AX +F6F6: DD 94 DFB BNM1-1 ;9 +F6F7: 6E 95 DFB SUB-1 ;BX +F6F8: 05 96 DFB BK-1 ;A +F6F9: 33 97 DFB POPD-1 ;CX +F6FA: E8 98 DFB RS-1 ;B +F6FB: 70 99 DFB CPR-1 ;DX +F6FC: 93 100 DFB BS-1 ;C +F6FD: 1E 101 DFB INR-1 ;EX +F6FE: E7 102 DFB NUL-1 ;D +F6FF: 65 103 DFB DCR-1 ;FX +F700: E7 104 DFB NUL-1 ;E +F701: E7 105 DFB NUL-1 ;UNUSED +F702: E7 106 DFB NUL-1 ;F +F703: 10 CA 107 SET BPL SETZ ;ALWAYS TAKEN +F705: B5 00 108 LD LDA R0L,X + 109 BK EQU *-1 +F707: 85 00 110 STA R0L +F709: B5 01 111 LDA R0H,X ;MOVE RX TO R0 +F70B: 85 01 112 STA R0H +F70D: 60 113 RTS +F70E: A5 00 114 ST LDA R0L +F710: 95 00 115 STA R0L,X ;MOVE R0 TO RX +F712: A5 01 116 LDA R0H +F714: 95 01 117 STA R0H,X +F716: 60 118 RTS +F717: A5 00 119 STAT LDA R0L +F719: 81 00 120 STAT2 STA (R0L,X) ;STORE BYTE INDIRECT +F71B: A0 00 121 LDY #$0 +F71D: 84 1D 122 STAT3 STY R14H ;INDICATE R0 IS RESULT NEG +F71F: F6 00 123 INR INC R0L,X +F721: D0 02 124 BNE INR2 ;INCR RX +F723: F6 01 125 INC R0H,X +F725: 60 126 INR2 RTS +F726: A1 00 127 LDAT LDA (R0L,X) ;LOAD INDIRECT (RX) +F728: 85 00 128 STA R0L ;TO R0 +F72A: A0 00 129 LDY #$0 +F72C: 84 01 130 STY R0H ;ZERO HIGH-ORDER R0 BYTE +F72E: F0 ED 131 BEQ STAT3 ;ALWAYS TAKEN +F730: A0 00 132 POP LDY #$0 ;HIGH ORDER BYTE = 0 +F732: F0 06 133 BEQ POP2 ;ALWAYS TAKEN +F734: 20 66 F7 134 POPD JSR DCR ;DECR RX +F737: A1 00 135 LDA (R0L,X) ;POP HIGH ORDER BYTE @RX +F739: A8 136 TAY ;SAVE IN Y-REG +F73A: 20 66 F7 137 POP2 JSR DCR ;DECR RX +F73D: A1 00 138 LDA (R0L,X) ;LOW-ORDER BYTE +F73F: 85 00 139 STA R0L ;TO R0 +F741: 84 01 140 STY R0H +F743: A0 00 141 POP3 LDY #$0 ;INDICATE R0 AS LAST RESULT REG +F745: 84 1D 142 STY R14H +F747: 60 143 RTS +F748: 20 26 F7 144 LDDAT JSR LDAT ;LOW-ORDER BYTE TO R0, INCR RX +F74B: A1 00 145 LDA (R0L,X) ;HIGH-ORDER BYTE TO R0 +F74D: 85 01 146 STA R0H +F74F: 4C 1F F7 147 JMP INR ;INCR RX +F752: 20 17 F7 148 STDAT JSR STAT ;STORE INDIRECT LOW-ORDER +F755: A5 01 149 LDA R0H ;BYTE AND INCR RX. THEN +F757: 81 00 150 STA (R0L,X) ;STORE HIGH-ORDER BYTE. +F759: 4C 1F F7 151 JMP INR ;INCR RX AND RETURN +F75C: 20 66 F7 152 STPAT JSR DCR ;DECR RX +F75F: A5 00 153 LDA R0L +F761: 81 00 154 STA (R0L,X) ;STORE R0 LOW BYTE @RX +F763: 4C 43 F7 155 JMP POP3 ;INDICATE R0 AS LAST RSLT REG +F766: B5 00 156 DCR LDA R0L,X +F768: D0 02 157 BNE DCR2 ;DECR RX +F76A: D6 01 158 DEC R0H,X +F76C: D6 00 159 DCR2 DEC R0L,X +F76E: 60 160 RTS +F76F: A0 00 161 SUB LDY #$0 ;RESULT TO R0 +F771: 38 162 CPR SEC ;NOTE Y-REG = 13*2 FOR CPR +F772: A5 00 163 LDA R0L +F774: F5 00 164 SBC R0L,X +F776: 99 00 00 165 STA R0L,Y ;R0-RX TO RY +F779: A5 01 166 LDA R0H +F77B: F5 01 167 SBC R0H,X +F77D: 99 01 00 168 SUB2 STA R0H,Y +F780: 98 169 TYA ;LAST RESULT REG*2 +F781: 69 00 170 ADC #$0 ;CARRY TO LSB +F783: 85 1D 171 STA R14H +F785: 60 172 RTS +F786: A5 00 173 ADD LDA R0L +F788: 75 00 174 ADC R0L,X +F78A: 85 00 175 STA R0L ;R0+RX TO R0 +F78C: A5 01 176 LDA R0H +F78E: 75 01 177 ADC R0H,X +F790: A0 00 178 LDY #$0 ;R0 FOR RESULT +F792: F0 E9 179 BEQ SUB2 ;FINISH ADD +F794: A5 1E 180 BS LDA R15L ;NOTE X-REG IS 12*2! +F796: 20 19 F7 181 JSR STAT2 ;PUSH LOW PC BYTE VIA R12 +F799: A5 1F 182 LDA R15H +F79B: 20 19 F7 183 JSR STAT2 ;PUSH HIGH-ORDER PC BYTE +F79E: 18 184 BR CLC +F79F: B0 0E 185 BNC BCS BNC2 ;NO CARRY TEST +F7A1: B1 1E 186 BR1 LDA (R15L),Y ;DISPLACEMENT BYTE +F7A3: 10 01 187 BPL BR2 +F7A5: 88 188 DEY +F7A6: 65 1E 189 BR2 ADC R15L ;ADD TO PC +F7A8: 85 1E 190 STA R15L +F7AA: 98 191 TYA +F7AB: 65 1F 192 ADC R15H +F7AD: 85 1F 193 STA R15H +F7AF: 60 194 BNC2 RTS +F7B0: B0 EC 195 BC BCS BR +F7B2: 60 196 RTS +F7B3: 0A 197 BP ASL ;DOUBLE RESULT-REG INDEX +F7B4: AA 198 TAX ;TO X REG FOR INDEXING +F7B5: B5 01 199 LDA R0H,X ;TEST FOR PLUS +F7B7: 10 E8 200 BPL BR1 ;BRANCH IF SO +F7B9: 60 201 RTS +F7BA: 0A 202 BM ASL ;DOUBLE RESULT-REG INDEX +F7BB: AA 203 TAX +F7BC: B5 01 204 LDA R0H,X ;TEST FOR MINUS +F7BE: 30 E1 205 BMI BR1 +F7C0: 60 206 RTS +F7C1: 0A 207 BZ ASL ;DOUBLE RESULT-REG INDEX +F7C2: AA 208 TAX +F7C3: B5 00 209 LDA R0L,X ;TEST FOR ZERO +F7C5: 15 01 210 ORA R0H,X ;(BOTH BYTES) +F7C7: F0 D8 211 BEQ BR1 ;BRANCH IF SO +F7C9: 60 212 RTS +F7CA: 0A 213 BNZ ASL ;DOUBLE RESULT-REG INDEX +F7CB: AA 214 TAX +F7CC: B5 00 215 LDA R0L,X ;TEST FOR NON-ZERO +F7CE: 15 01 216 ORA R0H,X ;(BOTH BYTES) +F7D0: D0 CF 217 BNE BR1 ;BRANCH IF SO +F7D2: 60 218 RTS +F7D3: 0A 219 BM1 ASL ;DOUBLE RESULT-REG INDEX +F7D4: AA 220 TAX +F7D5: B5 00 221 LDA R0L,X ;CHECK BOTH BYTES +F7D7: 35 01 222 AND R0H,X ;FOR $FF (MINUS 1) +F7D9: 49 FF 223 EOR #$FF +F7DB: F0 C4 224 BEQ BR1 ;BRANCH IF SO +F7DD: 60 225 RTS +F7DE: 0A 226 BNM1 ASL ;DOUBLE RESULT-REG INDEX +F7DF: AA 227 TAX +F7E0: B5 00 228 LDA R0L,X +F7E2: 35 01 229 AND R0H,X ;CHECK BOTH BYTES FOR NO $FF +F7E4: 49 FF 230 EOR #$FF +F7E6: D0 B9 231 BNE BR1 ;BRANCH IF NOT MINUS 1 +F7E8: 60 232 NUL RTS +F7E9: A2 18 233 RS LDX #$18 ;12*2 FOR R12 AS STACK POINTER +F7EB: 20 66 F7 234 JSR DCR ;DECR STACK POINTER +F7EE: A1 00 235 LDA (R0L,X) ;POP HIGH RETURN ADDRESS TO PC +F7F0: 85 1F 236 STA R15H +F7F2: 20 66 F7 237 JSR DCR ;SAME FOR LOW-ORDER BYTE +F7F5: A1 00 238 LDA (R0L,X) +F7F7: 85 1E 239 STA R15L +F7F9: 60 240 RTS +F7FA: 4C C7 F6 241 RTN JMP RTNZ