Revision 0.5.0

- massive overhaul of architecture
- first round of optimizations
- first draft of the technical manual for the entire library
- reorganization of directory structure
This commit is contained in:
nathanriggs 2019-09-27 16:57:34 -04:00
parent 34b6a34753
commit 9f35f32f67
642 changed files with 37153 additions and 141242 deletions

View File

@ -1 +0,0 @@
theme: jekyll-theme-hacker

View File

@ -1,6 +0,0 @@
# frozen_string_literal: true
source "https://rubygems.org"
gem "github-pages", group: :jekyll_plugins
# gem "rails"

View File

@ -1,248 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (4.2.10)
i18n (~> 0.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.11.1)
colorator (1.1.0)
commonmarker (0.17.13)
ruby-enum (~> 0.5)
concurrent-ruby (1.1.4)
dnsruby (1.61.2)
addressable (~> 2.5)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
ethon (0.11.0)
ffi (>= 1.3.0)
eventmachine (1.2.7-x64-mingw32)
execjs (2.7.0)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
ffi (1.10.0-x64-mingw32)
forwardable-extended (2.6.0)
gemoji (3.0.0)
github-pages (193)
activesupport (= 4.2.10)
github-pages-health-check (= 1.8.1)
jekyll (= 3.7.4)
jekyll-avatar (= 0.6.0)
jekyll-coffeescript (= 1.1.1)
jekyll-commonmark-ghpages (= 0.1.5)
jekyll-default-layout (= 0.1.4)
jekyll-feed (= 0.11.0)
jekyll-gist (= 1.5.0)
jekyll-github-metadata (= 2.9.4)
jekyll-mentions (= 1.4.1)
jekyll-optional-front-matter (= 0.3.0)
jekyll-paginate (= 1.1.0)
jekyll-readme-index (= 0.2.0)
jekyll-redirect-from (= 0.14.0)
jekyll-relative-links (= 0.5.3)
jekyll-remote-theme (= 0.3.1)
jekyll-sass-converter (= 1.5.2)
jekyll-seo-tag (= 2.5.0)
jekyll-sitemap (= 1.2.0)
jekyll-swiss (= 0.4.0)
jekyll-theme-architect (= 0.1.1)
jekyll-theme-cayman (= 0.1.1)
jekyll-theme-dinky (= 0.1.1)
jekyll-theme-hacker (= 0.1.1)
jekyll-theme-leap-day (= 0.1.1)
jekyll-theme-merlot (= 0.1.1)
jekyll-theme-midnight (= 0.1.1)
jekyll-theme-minimal (= 0.1.1)
jekyll-theme-modernist (= 0.1.1)
jekyll-theme-primer (= 0.5.3)
jekyll-theme-slate (= 0.1.1)
jekyll-theme-tactile (= 0.1.1)
jekyll-theme-time-machine (= 0.1.1)
jekyll-titles-from-headings (= 0.5.1)
jemoji (= 0.10.1)
kramdown (= 1.17.0)
liquid (= 4.0.0)
listen (= 3.1.5)
mercenary (~> 0.3)
minima (= 2.5.0)
nokogiri (>= 1.8.2, < 2.0)
rouge (= 2.2.1)
terminal-table (~> 1.4)
github-pages-health-check (1.8.1)
addressable (~> 2.3)
dnsruby (~> 1.60)
octokit (~> 4.0)
public_suffix (~> 2.0)
typhoeus (~> 1.3)
html-pipeline (2.10.0)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.7.4)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 0.7)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 2.0)
kramdown (~> 1.14)
liquid (~> 4.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
safe_yaml (~> 1.0)
jekyll-avatar (0.6.0)
jekyll (~> 3.0)
jekyll-coffeescript (1.1.1)
coffee-script (~> 2.2)
coffee-script-source (~> 1.11.1)
jekyll-commonmark (1.2.0)
commonmarker (~> 0.14)
jekyll (>= 3.0, < 4.0)
jekyll-commonmark-ghpages (0.1.5)
commonmarker (~> 0.17.6)
jekyll-commonmark (~> 1)
rouge (~> 2)
jekyll-default-layout (0.1.4)
jekyll (~> 3.0)
jekyll-feed (0.11.0)
jekyll (~> 3.3)
jekyll-gist (1.5.0)
octokit (~> 4.2)
jekyll-github-metadata (2.9.4)
jekyll (~> 3.1)
octokit (~> 4.0, != 4.4.0)
jekyll-mentions (1.4.1)
html-pipeline (~> 2.3)
jekyll (~> 3.0)
jekyll-optional-front-matter (0.3.0)
jekyll (~> 3.0)
jekyll-paginate (1.1.0)
jekyll-readme-index (0.2.0)
jekyll (~> 3.0)
jekyll-redirect-from (0.14.0)
jekyll (~> 3.3)
jekyll-relative-links (0.5.3)
jekyll (~> 3.3)
jekyll-remote-theme (0.3.1)
jekyll (~> 3.5)
rubyzip (>= 1.2.1, < 3.0)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-seo-tag (2.5.0)
jekyll (~> 3.3)
jekyll-sitemap (1.2.0)
jekyll (~> 3.3)
jekyll-swiss (0.4.0)
jekyll-theme-architect (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-cayman (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-dinky (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-hacker (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-leap-day (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-merlot (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-midnight (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-minimal (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-modernist (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-primer (0.5.3)
jekyll (~> 3.5)
jekyll-github-metadata (~> 2.9)
jekyll-seo-tag (~> 2.0)
jekyll-theme-slate (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-tactile (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-time-machine (0.1.1)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-titles-from-headings (0.5.1)
jekyll (~> 3.3)
jekyll-watch (2.1.2)
listen (~> 3.0)
jemoji (0.10.1)
gemoji (~> 3.0)
html-pipeline (~> 2.2)
jekyll (~> 3.0)
kramdown (1.17.0)
liquid (4.0.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
mini_portile2 (2.4.0)
minima (2.5.0)
jekyll (~> 3.5)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
minitest (5.11.3)
multipart-post (2.0.0)
nokogiri (1.10.0-x64-mingw32)
mini_portile2 (~> 2.4.0)
octokit (4.13.0)
sawyer (~> 0.8.0, >= 0.5.3)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (2.0.5)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
rouge (2.2.1)
ruby-enum (0.7.2)
i18n
ruby_dep (1.5.0)
rubyzip (1.2.2)
safe_yaml (1.0.4)
sass (3.7.3)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sawyer (0.8.1)
addressable (>= 2.3.5, < 2.6)
faraday (~> 0.8, < 1.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thread_safe (0.3.6)
typhoeus (1.3.1)
ethon (>= 0.9.0)
tzinfo (1.2.5)
thread_safe (~> 0.1)
unicode-display_width (1.4.1)
PLATFORMS
x64-mingw32
DEPENDENCIES
github-pages
BUNDLED WITH
2.0.1

View File

@ -1,7 +0,0 @@
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
# gem "rails"

View File

@ -1,6 +0,0 @@
- name: Home
link: /
- name: About
link: /about.html
- name: Blog
link: /blog.html

View File

@ -1,7 +0,0 @@
---
layout: default
---
<h1>{{ page.title }}</h1>
<p>{{ page.date | date_to_string }} - {{ page.author }}</p>
{{ content }}

View File

@ -1,5 +0,0 @@
---
layout: post
author: nathan
---
As you might imagine, I'm trying to figure out Jekyll. Once I do, I'll start blogging about changes to and struggles with the AppleIIAsmLib. Thanks for watching!

View File

@ -1,14 +0,0 @@
---
layout: default
title: Blog
---
<h1>Latest Posts</h1>
<ul>
{% for post in site.posts %}
<li>
<h2><a href="{{ post.url }}">{{ post.title }}</a></h2>
<p>{{ post.excerpt }}</p>
</li>
{% endfor %}
</ul>

View File

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/d1_reqcommon.dsk Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/d2_stdio.dsk Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,377 @@
*
*``````````````````````````````*
* DEMO.COMMON *
* *
* A DEMO OF THE MACROS AND *
* SUBROUTINES IN THE COMMON *
* APPLEIIASM LIBRARY. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 30-JUN-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY
TR ON
DSK DEMO.COMMON
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (HOOKS,MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.HEAD.REQUIRED
USE MIN.MAC.REQUIRED
PUT MIN.HOOKS.COMMON
USE MIN.MAC.COMMON
]HOME EQU $FC58
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
JSR ]HOME
_PRN "COMMON SUBROUTINE LIBRARY",8D
_PRN "=========================",8D8D
_PRN "THIS LIBRARY CONTAINES MACROS AND",8D
_PRN "SUBROUTINES THAT MIGHT BE COMMONLY",8D
_PRN "USED BY A BROAD RANGE OF PROGRAMS.",8D8D
_PRN "THIS DEMO WILL ALSO ILLUSTRATE THE",8D
_PRN "USE OF SOME MACROS IN THE REQUIRED",8D
_PRN "LIBRARY FOR THE FIRST TIME. WE WILL",8D
_PRN "MAKE IT CLEAR WHEN WE SWITCH LIBRARIES,",8D
_PRN "BUT FOR QUICK REFERENCE THE MACROS",8D
_PRN "IN EACH LIBRARY ARE:",8D8D
_WAIT
_PRN "REQUIRED MACROS: _ISLIT,_AXLIT,",8D
_PRN "_ISSTR,_AXSTR,GRET,SPAR,DUMP,_PRN,",8D
_PRN "_WAIT,ERRH,CLRHI",8D8D
_WAIT
_PRN "COMMON: MFILL,MMOVE,MSWAP,BEEP,DELAY,",8D
_PRN "ZSAVE,ZLOAD",8D8D
_WAIT
_PRN "LET'S START WITH THE MOST USED REQUIRED MACROS."
_WAIT
JSR ]HOME
_PRN "REQUIRED LIBRARY: MOST USED",8D
_PRN "===========================",8D8D
_PRN "BY 'MOST USED' HERE, WE MEAN MOST",8D
_PRN "USED BY THESE SHORT DEMOS. IN",8D
_PRN "REALITY, OTHER MACROS ARE PROBABLY",8D
_PRN "UTILIZED MUCH MORE OFTEN, BUT IT",8D
_PRN "HAPPENS BEHIND THE SCENES.",8D8D
_WAIT
_PRN "THE TWO MOST APPARENT MACROS ",8D
_PRN "SHOULD BE FAMILIAR IF YOU HAVE",8D
_PRN "ALREADY EXPLORED THE STDIO LIBRARY:",8D
_PRN "_PRN AND _WAIT. THESE ARE NEAR",8D
_PRN "CARBON COPIES OF THEIR EQUIVALENT",8D
_PRN "ROUTINES IN STDIO, AND ARE HERE FOR",8D
_PRN "THE MOSTLY RARE CASES WHEN SOME",8D
_PRN "MINOR INPUT AND OUTPUT ARE NECESSARY",8D
_PRN "BUT WITHOUT THE NEED FOR USING THE",8D
_PRN "STDIO LIBRARY. SINCE THESE EXIST",8D
_PRN "AS PART OF THE ERQUIRED LIBRARY, YOU",8D
_PRN "CAN USE THESE IN PLACE OF STDIO IF",8D
_PRN "YOUR PROGRAM REQUIRES NO MORE THAN THIS",8D
_PRN "BASIC FUNCTIONALITY."
_WAIT
JSR ]HOME
_PRN "THE _PRN MACRO PRINTS A STRING THAT",8D
_PRN "IS EITHER GIVEN AS A PARAMETER OR",8D
_PRN "RESIDES AT A GIVEN ADDRESS AND IS",8D
_PRN "TERMINATED BY A NULL BYTE ($00). THUS:",8D8D
_WAIT
_PRN " _PRN 'HELLO, WORLD!'",8D
_PRN " _PRN #STRING1",8D
_PRN " _PRN INDIRECT",8D8D
_WAIT
_PRN "ARE ALL VALID USES OF _PRN. THE FIRST",8D
_PRN "PRINTS THE GIVEN STRING, THE SECOND",8D
_PRN "PRINTS NULL-TERMINATED STRING AT THE",8D
_PRN "STRING1 ADDRESS, AND THE THIRD PRINTS",8D
_PRN "A NULL-TERMINATED STRING AT THE",8D
_PRN "ADDRESS POINTED TO IN THE ADDRESS HELD",8D
_PRN "IN INDIRECT.",8D8D
_WAIT
_PRN "THE WAIT MACRO DOES EXACTLY WHAT ",8D
_PRN "IT SAYS: IT WAITS FOR A KEYPRESS. THE",8D
_PRN "KEY PRESSED IS PASSED BACK IN .A"
_WAIT
JSR ]HOME
_PRN "MEMORY DUMPS",8D
_PRN "============",8D8D
_PRN "THE OTHER MACRO MOST USED IN",8D
_PRN "THESE DEMOS IS THE DUMP MACRO, WHICH",8D
_PRN "OUTPUTS THE HEX VALUES AT A GIVEN",8D
_PRN "ADDRESS RANGE. THEREFORE:",8D8D
_WAIT
_PRN " LDA #$33",8D
_PRN " STA $300",8D
_PRN " STA $301",8D
_PRN " STA $302",8D
_PRN " DUMP #$300;#10",8D8D
_PRN "WILL OUTPUT",8D8D
_WAIT
LDA #$33
STA $300
STA $301
STA $302
DUMP #$300;#10
_WAIT
JSR ]HOME
_PRN "PARAMETERS AND RETURNS",8D
_PRN "======================",8D8D
_PRN "NEARLY EVERY SUBROUTINE IN THIS",8D
_PRN "SET OF LIBRARIES UTILIZES THE",8D
_PRN "SAME MEMORY LOCATION FOR RETURNING",8D
_PRN "RESULTS, SAVE FOR THOSE THAT RETURN",8D
_PRN "NOTHING. THIS LOCATION IS REFERENCED",8D
_PRN "IN THE CODE AS THE 'RETURN' HOOK.",8D8D
_WAIT
_PRN "THE GRET MACRO CAN BE USED TO COPY",8D
_PRN "THE RETURNED DATA TO A MORE PERMANENT",8D
_PRN "LOCATION FOR RETRIEVAL LATER ON. SO:",8D8D
_PRN " GRET #$300",8D8D
_WAIT
_PRN "COPIES THE DATA FROM RETURN INTO THE",8D
_PRN "SPECIFIED LOCATION ($300). NOTE THAT",8D
_PRN "THE LENGTH OF THE RETURN VALUE IS",8D
_PRN "KNOWN VIA THE 'RETLEN' HOOK, WHICH",8D
_PRN "POINTS TO A LENGTH BYTE PRECEDING RETURN"
_WAIT
JSR ]HOME
_PRN "INTERNAL MACROS",8D
_PRN "===============",8D8D
_PRN "THE MACROS _ISLIT, _AXLIT,",8D
_PRN "_ISSTR AND _AXSTR ARE ALL MACROS USED",8D
_PRN "BY OTHER MACROS TO DETERMINE WHAT",8D
_PRN "KIND OF DATA IS BEING MASSED, THEN",8D
_PRN "TRANSLATING THAT TO A MACHINE-FRIENDLY",8D
_PRN "FORM. THESE MACROS ARE RESPONSIBLE",8D
_PRN "FOR A MACRO'S ABILITY TO ACCEPT",8D
_PRN "DIRECT OR INDIRECT ADDRESSING, AS",8D
_PRN "WELL AS LITERAL STRINGS.",8D8D
_WAIT
_PRN "THIS CAN BE EASILY SEEN IN",8D
_PRN "MANY MACROS THAT ACCEPT EITHER ",8D
_PRN "STRINGS OR ADDRESSES. FIRST, THE",8D
_PRN "PARAMETER IS PASSED TO EITHER THE",8D
_PRN "_ISSTR MACRO OR THE _AXSTR MACRO;",8D
_PRN "THESE ARE FUNCTIONALLY EQUIVALENT AND",8D
_PRN "TEST WHETHER OR NOT THE PARAMETER",8D
_PRN "IS A STRING OR ADDRESS, BUT DIFFER IN",8D
_PRN "HOW THAT DATA IS THEN PASSED TO THE",8D
_PRN "APPROPRIATE SUBROUTINE.",8D
_WAIT
JSR ]HOME
_PRN "_ISSTR PASSES DATA VIA THE STACK,",8D
_PRN "WHEREAS_AXSTR PASSES VIA .A AND .X,"8D
_PRN "WHICH HOLD THE LO AND HI BYTES OF THE",8D
_PRN "ADDRESS OF THE STRING, RESPECTIVELY.",8D
_PRN "WHICH MACRO TO USE IS PRIMARILY",8D
_PRN "DETERMINED BY THE SUBROUTINE BEING",8D
_PRN "CALLED, AS THEY EITHER USE ONE OR",8D
_PRN "THE OTHER METHODS OF PASSING",8D
_PRN "PARAMETERS. A RULE OF THUMB IS THAT",8D
_PRN "IF THERE ARE FEWER THAN 4 BYTES",8D
_PRN "TO BE PASSED, THEN PASSING IS DONE",8D
_PRN "VIA REGISTERS TO SPARE A FEW CYCLES;",8D
_PRN "OTHERWISE, THE STACK IS USED.",8D8D
_WAIT
_PRN "_ISLIT AND _AXLIT USE THE SAME LOGIC",8D
_PRN "FOR THE PASSING OF PARAMETERS, BUT ARE",8D
_PRN "USED TO DETERMINE WHETHER THE PARAMETER",8D
_PRN "BEING PASSED IS A LITERAL VALUE OR A",8D
_PRN "MEMORY LOCATION. IF THE PARAMETER IS",8D
_PRN "A LITERAL, THEN THE MACRO SENDS IT",8D
_PRN "AS A 2-BYTE ADDRESS THAT INDICATES",8D
_PRN "THE DATA IS LOCATED AT THAT ADDRESS.",8D
_PRN "IF, HOWEVER, A NON-LITERAL ADDRESS IS",8D
_PRN "PASSED, THE LIBRARY INTERPRETS THIS AS",8D
_PRN "AN INDIRECT REFERENCE, WHERE THE ",8D
_PRN "ADDRESS PASSED IS A POINTER TO THE",8D
_PRN "ACTUAL ADDRESS OF THE DATA."
_WAIT
JSR ]HOME
_PRN "THE REQUIRED LEFTOVERS",8D
_PRN "======================",8D8D
_PRN "OTHER MACROS IN THE REQUIRED LIBRARY",8D
_PRN "ARE RARELY USED OUTSIDE OF THE",8D
_PRN "LIBRARY ITSELF IN THE DEMOS, IF AT ALL.",8D
_PRN "THIS INCLUDES THE ERRH AND CLRHI MACROS.",8D8D
_WAIT
_PRN "CLRHI TAKES ONE BYTE AND CLEARS ITS",8D
_PRN "HIGH NIBBLE, AND IS USEFUL FOR THE",8D
_PRN "IMPLEMENTATION OF LOOKUP TABLES, AMONG ",8D
_PRN "OTHER USES. THE ERRH MACRO PASSES THE",8D
_PRN "PROVIDED ADDRESS TO APPLESOFT AS A HOOK",8D
_PRN "FOR ERROR-HANDLING, AND CAN BE THOUGHT",8D
_PRN "OF AS A 'ONERR GOTO ###' COMMAND FOR",8D
_PRN "ASSEMBLY. NOTE THAT THIS DOESN'T CATCH",8D
_PRN "JUST ANY ERRORS IN YOUR CODE--YOU ",8D
_PRN "STILL HAVE TO FIGURE THAT OUT YOURSELF.",8D
_PRN "THE ERROR-HANDLING IS SPECIFIC TO ",8D
_PRN "INTERFACING WITH APPLESOFT."
_WAIT
*
JSR ]HOME
_PRN "COMMON MACROS, FINALLY!",8D
_PRN "=======================",8D8D
_PRN "WE CAN NOW MOVE ON TO THE",8D
_PRN "MACROS IN THE COMMON LIBRARY. MOST",8D
_PRN "OF THESE CURRENTLY FOCUS ON MEMORY",8D
_PRN "MANAGEMENT, AND WE WILL ADDRESS THOSE",8D
_PRN "FIRST: MFILL, MMOVE, MSWAP, ZLOAD AND",8D
_PRN "ZSAVE."
_WAIT
JSR ]HOME
_PRN "MEMORY MANAGEMENT",8D
_PRN "=================",8D8D
_PRN "MFILL FILLS A RANGE OF MEMORY STARTING",8D
_PRN "AT THE GIVEN ADDRESS WITH THE GIVEN",8D
_PRN "FILL VALUE. THUS:",8D8D
_PRN " MFILL #$300;#10;#0",8D8D
_PRN "FILLS $300-$309 WITH ZEROS. WE CAN",8D
_PRN "VERIFY THIS WITH A DUMP:",8D
_WAIT
MFILL #$300;#10;#0
DUMP #$300;#10
_WAIT
JSR ]HOME
_PRN "MMOVE SUITABLY MOVES (OR COPIES) A",8D
_PRN "BLOCK OF MEMORY FROM ONE ADDRESS",8D
_PRN "RANGE TO ANOTHER. SO:",8D8D
_WAIT
_PRN " MMOVE #$300;#$320;#10",8D
_PRN " DUMP #$320;#10",8D8D
_PRN "WILL COPY THE TEN ZEROS AT $300",8D
_PRN "TO $320-$329, THEN DUMP THE RESULTS:",8D
MMOVE #$300;#$320;#10
DUMP #$320;#10
_WAIT
JSR ]HOME
_PRN "SIMILARLY, MSWAP SWAPS THE DATA IN ",8D
_PRN "THE GIVEN MEMORY RANGES. SO, TO SWAP",8D
_PRN "$300-309 WITH $310-$319, WE'D WRITE:",8D8D
_PRN " MSWAP #$300;#$310;#10",8D8D
_PRN "NOW WHEN WE DUMP $300 AGAIN, IT HAS:",8D
_WAIT
MSWAP #$300;#$310;#10
DUMP #$300;#10
DUMP #$310;#10
_WAIT
JSR ]HOME
_PRN "ZERO-PAGE BACKUPS",8D
_PRN "=================",8D8D
_PRN "THIS LIBRARY USES NEARLY EVERY",8D
_PRN "PART OF THE ZERO PAGE THAT IS",8D
_PRN "UNUSED BY DOS, APPLESOFT OR THE ",8D
_PRN "MONITOR. AT TIMES, YOU MAY WANT TO",8D
_PRN "USE THOSE LOCATIONS YOURSELF WITHOUT",8D
_PRN "THE RISK OF THE LIBRARY WRITING OVER",8D
_PRN "YOUR DATA. THAT'S WHERE ZSAVE AND",8D
_PRN "ZLOAD COME INTO PLAY.",8D8D
_WAIT
_PRN "ZSAVE BACKUPS THE ZERO-PAGE MEMORY THAT",8D
_PRN "IS UNUSED BY DOS/APPLESOFT/MONITOR,",8D
_PRN "COPYING IT TO THE SPECIFIED LOCATION. ",8D
_PRN "THEN, ZLOAD IS USED TO RESTORE THOSE",8D
_PRN "'UNUSED' BYTES TO YOUR OWN DATA AFTER A",8D
_PRN "LIBRARY ROUTINE IS CALLED.",8D
_WAIT
JSR ]HOME
_PRN "SO, WE CAN SAVE THE ZERO-PAGE AT $300",8D
_PRN "WITH THE FOLLOWING:",8D8D
_PRN " ZSAVE #$300",8D8D
_PRN "AND THEN CHANGE THE ZERO PAGE SLIGHTLY:",8D8D
_PRN " LDA #$99",8D
_PRN " STA $06",8D
_PRN " STA $07",8D
_PRN " STA $08",8D
_PRN " STA $09",8D
_PRN " STA $19",8D8D
ZSAVE #$300
LDA #$99
STA $06
STA $07
STA $08
STA $09
STA $19
_WAIT
JSR ]HOME
_PRN "NOW WE'LL DUMP THE ZERO PAGE TO",8D
_PRN "SHOW THE CHANGES:",8D
DUMP #$0;#10
DUMP #10;#10
DUMP #20;#10
_PRN " ",8D8D
_PRN "NOTE THAT ALREADY, THE $10 HAS BEEN",8D
_PRN "CHANGED BY THE LIBRARY! THUS THE",8D
_PRN "NEED FOR A BACKUP. SO, IN ORDER",8D
_PRN "TO RECOVER OUR ZERO PAGE, USE ZLOAD:",8D8D
_PRN " ZLOAD #$300",8D8D
_WAIT
_PRN "WHICH WILL THEN LEAVE US WITH:",8D
_WAIT
ZLOAD #$300
DUMP #0;#10
DUMP #10;#10
DUMP #20;#10
_WAIT
JSR ]HOME
_PRN "BEEP AND DELAY",8D
_PRN "==============",8D8D
_PRN "LASTLY, WE HAVE THE BEEP MACRO",8D
_PRN "AND THE DELAY MACRO FROM THE",8D
_PRN "COMMON LIBRARY. THESE ARE PRETTY",8D
_PRN "SELF-EXPLANATORY: 'BEEP' SENDS THE",8D
_PRN "STANDARD TONE TO THE SPEAKER FOR ",8D
_PRN "SPECIFIED NUMBER OF CYCLES, WHILE ",8D
_PRN "DELAY SUSPENDS EXECUTION FOR THE",8D
_PRN "SPECIFIED NUMBER OF MILLISECONDS. ",8D
_PRN "SO: ",8D8D
_PRN " BEEP #10",8D
_PRN " DELAY #255",8D
_PRN " BEEP #20",8D
_PRN " DELAY #255",8D
_PRN " BEEP #30",8D8D
_PRN "RESULTS IN:",8D8D
_WAIT
BEEP #10
DELAY #255
BEEP #20
DELAY #255
BEEP #30
_WAIT
JSR ]HOME
_PRN "WE'RE DONE HERE!",8D8D8D
*
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** BOTTOM INCLUDES
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINE INCLUDES
*
* COMMON LIBRARY SUBROUTINES
*
PUT MIN.SUB.DELAYMS
PUT MIN.SUB.MEMFILL
PUT MIN.SUB.MEMMOVE
PUT MIN.SUB.MEMSWAP
PUT MIN.SUB.ZMSAVE
PUT MIN.SUB.ZMLOAD

View File

@ -0,0 +1,84 @@
*
*``````````````````````````````*
* HEAD.REQUIRED *
* *
* THIS HEADER MUST BE THE *
* INCLUDED BEFORE ANY OTHER *
* CODE IN ORDER FOR THE PROPER *
* FUNCTIONING OF THE LIBRARY. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 30-JUN-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
* VARIABLE DECLARATIONS ********
*
** JUMP TABLE SETUP. THIS IS FOR LOADING
** SUBROUTINES INTO MEMORY FOR ACCESS BY
** EXTERNAL EXECUTIONS. NOTE THAT THIS
** SHOULD ALWAYS START AT SECOND BYTE OF
** CODE IN THE PROGRAM SO THAT ITS
** LOCATION IN MEMORY IS EASILY KNOWN.
*
JUMPTBL JMP MAIN_START ; ** ALWAYS ** START WITH
; JUMP TO MAIN_START
DS 32 ; 16 MORE ENTRIES
*
** 20 BYTES FOR VARIABLES
*
VARTAB DS 20
*
** 256 BYTES DEDICATED TO RETURN
** VALUES OF VARIABLE LENGTH; CAN BE
** MODIFIED TO SUIT SMALLER OR LARGER
** NEEDS.
*
RETLEN DS 1 ; RETURN VALUE BYTE LENGTH
RETURN DS 256
*
** ADDRESS STORAGE LOCATIONS FOR
** INDIRECT ADDRESSING.
*
ADDR1 EQU $06 ; AND $07
ADDR2 EQU $08 ; AND $09
ADDR3 EQU $EB ; AND $EC
ADDR4 EQU $ED ; AND $EE
*
** SCRATCHPAD ZERO PAGE LOCATIONS AND
** DEDICATED ZERO PAGE ADDRESS TO HOLD
** A RETURN ADDRESS PASSED VIA THE STACK
*
SCRATCH EQU $19
SCRATCH2 EQU $1E
RETADR EQU $FE ; AND $FF
*
** ZERO PAGE ADDRESSES DEDICATED TO PASSING
** BACK RESULTS WHEN THERE ARE MORE THAN
** THREE BYTES BEING PASSED (AXY) AND THE
** USE OF THE STACK IS IMPRACTICAL OR TOO SLOW
*
RESULT EQU $FA
RESULT2 EQU $FC
*
** WORD AND BYTE PARAMETER SPACE USED
** BY APPLEIIASM MACROS
*
WPAR1 EQU $FA
WPAR2 EQU $FC
WPAR3 EQU $FE
BPAR1 EQU $EF
BPAR2 EQU $E3
BPAR3 EQU $1E
BPAR4 EQU $19
*
** VARIOUS HOOKS USED BY ALL ROUTINES
*
REENTRY EQU $3D0
*
MAIN_START
*

View File

@ -0,0 +1,26 @@
*``````````````````````````````*
* HOOKS.COMMON *
* *
* HOOKS TO MONITOR AND TO THE *
* APPLESOFT ROUTINES THAT ARE *
* RELATED TO COMMON TASKS. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 30-JUN-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* LICENSE: APACHE 2.0 *
* OS: DOS 3.3 *
* *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PROMPT EQU $33 ; DOS PROMPT CHARACTER
COLDENT EQU $03D3 ; COLD ENTRY TO DOS
SRESET EQU $03F2 ; SOFT RESET
PRNTAX EQU $F941 ; PRINT HEX VALS OF A,X REGISTERS
BELL EQU $FBE4 ; RING MY BELL
IOSAVE EQU $FF4A ; SAVE CURRENT STATE OF REGISTERS
IOREST EQU $FF3F ; RESTORE OLD STATE OF REGISTERS
*

View File

@ -0,0 +1,284 @@
*
*``````````````````````````````*
* LIB.REQUIRED *
* *
* LIBRARY OF REQUIRED ROUTINES *
* AS PART OF THE APPLEIIASM *
* MACRO AND SUBROUTINE LIBRARY *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 30-JUN-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* LICENSE: APACHE 2.0 *
* OS: DOS 3.3 *
* *
* SUBROUTINES: *
* *
* __GETRET : GET RETURN VAL *
* __CLRHI : CLEAR HI NIBBLE *
* __DUMP : DUMP MEMORY *
* __P : PRINT *
* __W : WAIT *
* __ERRH : HANDLE ERRORS *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** LIBRARY-SPECIFIC VARIABLES
*
]RIGHT DS 1
]LEFT DS 1
]LENGTH DS 1
]A DS 1 ; REGISTER .A BACKUP
]X DS 1 ; REGISTER .X BACKUP
]Y DS 1 ; REGISTER .Y BACKUP
]C DS 1 ; CARRY FLAG BACKUP
]Z DS 1 ; ZERO FLAG BACKUP
]N DS 1 ; NEGATIVE FLAG BACKUP
]O DS 1 ; OVERFLOW FLAG BACKUP
]HEXTAB ASC "0123456789ABCDEF"
*
** LIBRARY-SPECIFIC HOOKS
*
]COUT EQU $FDF0 ; SCREEN OUTPUT ROUTINE
]KYBD EQU $C000 ; KEYBOARD INPUT
]STROBE EQU $C010 ; KEYBOARD STROBE
*
*``````````````````````````````*
* __GETRET (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = ADDRESS LOBYTE *
* .X = ADDRESS HIBYTE *
* RETURN = DATA STRING *
* RETLEN = DATA STRING LENGTH *
* *
* OUTPUT: *
* *
* COPIES CONTENT OF RETURN *
* TO SPECIFIED ADDRESS. *
* *
* .Y = RETURN LENGTH *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 32+ *
* SIZE: 18 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__GETRET
STA ADDR1 ; LOBYTE PASSED IN .A
STX ADDR1+1 ; HIBYTE PASSED IN .X
LDY #255 ; RESET COUNTER
:LP
INY ; INCREASE COUNTER
LDA RETURN,Y ; LOAD BYTE IN RETURN AT
STA (ADDR1),Y ; COUNTER OFFSET; STORE AT
CPY RETLEN ; NEW LOCATION
BNE :LP ; IF COUNTER < RETLEN, LOOP
RTS
*
*``````````````````````````````*
* __CLRHI (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = BYTE TO CLEAR HIBITS *
* *
* OUTPUT: *
* *
* CLEARS 4 HIBITS FROM BYTE *
* *
* .A = CLEARED BYTE *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^ ^ ^^ *
* *
* CYCLES: 16 *
* SIZE: 6 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__CLRHI
*
AND #$F0 ; CLEAR 4 RIGHT BITS
LSR ; MOVE BITS RIGHT
LSR ; MOVE BITS RIGHT
LSR ; MOVE BITS RIGHT
LSR ; MOVE BITS RIGHT
RTS
*
*``````````````````````````````*
* __DUMP: (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = ADDRESS LOBYTE *
* .X = ADDRESS HIBYTE *
* .Y = NUMBER OF BYTES *
* *
* OUTPUT: *
* *
* OUTPUTS DATA LOCATED AT THE *
* SPECIFIED ADDRESS IN HEX *
* FORMAT FOR SPECIFIED NUMBER *
* OF BYTES. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 184+ *
* SIZE: 114 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__DUMP
STY ]LENGTH ; LENGTH PASSED IN .Y
STA ADDR1 ; ADDRESS LOBYTE IN .A
STX ADDR1+1 ; ADDRESS HIBYTE IN .X
LDA #$8D ; LOAD CARRIAGE RETURN
JSR ]COUT ; SEND TO COUT
LDA ADDR1+1 ; GET ADDRESS HIBYTE
JSR __CLRHI ; CLEAR HIBITS
TAX ; TRANSFER T .X
LDA ]HEXTAB,X ; LOAD HEX CHAR FROM TABLE AT .X
JSR ]COUT ; SEND TO COUT
LDA ADDR1+1 ; LOAD ADDRESS HIBYTE AGAIN
AND #$0F ; CLEAR LOBITS
TAX ; TRANSER TO .X
LDA ]HEXTAB,X ; LOAD HEX CHAR FROM TABLE AT .X
JSR ]COUT ; SENT TO COUT
LDA ADDR1 ; LOAD LOBYTE
JSR __CLRHI ; CLEAR HIBITS
TAX ; TRANSFER TO .X
LDA ]HEXTAB,X ; LOAD HEXCHAR AT .X
JSR ]COUT ; SEND TO COUT
LDA ADDR1 ; LOAD LOBYTE AGAIN
AND #$0F ; CLEAR LOBITS
TAX ; TRANSFER T .X
LDA ]HEXTAB,X ; LOAD HEXCHAR AT .X
JSR ]COUT ; SEND TO COUT
LDA #":" ;
JSR ]COUT ; SEND COLON TO COUT
LDA #" "
JSR ]COUT ; SEND SPACE TO COUT
LDY #0 ; RESET COUNTER
:LP
LDA (ADDR1),Y ; LOAD BYTE FROM ADDRESS
JSR __CLRHI ; AT COUNTER OFFSET; CLEAR HIBITS
STA ]LEFT ; SAVE LEFT INDEX
LDA (ADDR1),Y ; RELOAD
AND #$0F ; CLEAR LOBITS
STA ]RIGHT ; SAVE RIGHT INDEX
LDX ]LEFT ; LOAD LEFT INDEX
LDA ]HEXTAB,X ; GET NIBBLE CHAR
JSR ]COUT ; SEND TO COUT
LDX ]RIGHT ; LOAD RIGHT INDEX
LDA ]HEXTAB,X ; GET NIBBLE CHAR
JSR ]COUT ; SEND TO COUT
LDA #160 ; LOAD SPACE
JSR ]COUT ; SEND TO COUT
INY ; INCREASE COUNTER
CPY ]LENGTH ; IF COUNTER < LENGTH
BNE :LP ; CONTINUE LOOP
RTS ; ELSE, EXIT
*
*``````````````````````````````*
* __P: (NATHAN RIGGS) *
* *
* INPUT: *
* *
* ASC STRING FOLLOWING CALL *
* TERMINATED WITH A 00 BYTE *
* *
* OUTPUT: *
* *
* CONTENTS OF STRING. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^ ^^ ^^^^ *
* *
* CYCLES: 63+ *
* SIZE: 33 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__P
PLA ; PULL RETURN LOBYTE
STA ADDR1 ; STORE TO ZERO PAGE
PLA ; PULL RETURN HIBYTE
STA ADDR1+1 ; STORE TO ZERO PAGE
LDY #1 ; SET OFFSET TO PLUS ONE
:LP LDA (ADDR1),Y ; LOAD BYTE AT OFFSET .Y
BEQ :DONE ; IF BYTE = 0, QUIT
JSR ]COUT ; OTHERWISE, PRINT BYTE
INY ; INCREASE OFFSET
BNE :LP ; IF .Y <> 0, CONTINUE LOOP
:DONE CLC ; CLEAR CARRY FLAG
TYA ; TRANSFER OFFSET TO .A
ADC ADDR1 ; ADD OFFSET TO RETURN ADDRESS
STA ADDR1 ; STORE TO RETURN ADDRESS LOBYTE
LDA ADDR1+1 ; DO THE SAME WITH THE HIBYTE
ADC #0 ; CARRY NOT RESET, SO INC HIBYTE
PHA ; IF NEEDED; THEN, PUSH HIBYTE
LDA ADDR1 ; LOAD LOBYTE
PHA ; PUSH LOBYTE
RTS ; EXIT
*
*``````````````````````````````*
* __W: (NATHAN RIGGS) *
* *
* INPUT: NONE *
* OUTPUT: .A HOLDS KEY VALUE *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^ ^ ^^ *
* *
* CYCLES: 18+ *
* SIZE: 11 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__W
:LP LDA ]KYBD ; CHECK IF KEY PRESSED
BPL :LP ; IF NOT, KEEP CHECKING
AND #$7F ; SET HI BIT
STA ]STROBE ; RESET KEYBOARD STROBE
RTS ; EXIT
*
*``````````````````````````````*
* __ERRH (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = ADDRESS LOBYTE *
* .X = ADDRESS HIBYTE *
* *
* OUTPUT: *
* *
* SETS NEW ADDRESS FOR THE *
* APPLSOFT ERROR HANDLING *
* ROUTINE. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 51 *
* SIZE: 31 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__ERRH
LDA #1 ; TRICK DOS INTO THINKING
STA $AAB6 ; IT'S IN APPLESOFT MODE
STA $75+1 ; APPLESOFT LINE NUMBER POINTER
STA $33 ; APLESOFT PROMPT CHARACTER
STA ADDR1 ; ADDRESS LOBYTE IN .A
STX ADDR1+1 ; ADDRESS HIBYTE IN .X
LDA #$FF ; TURN ON ERROR HANDLING
STA $D8 ; BYTE HERE
LDY #0 ; CLEAR OFFSET
LDA (ADDR1),Y ; LOAD ADDRESS LOBYTE
STA $9D5A ; SET AS ERROR HANDLING LO
INY ; INCREASE OFFSET
LDA (ADDR1),Y ; LOAD ADDRESS HIBYTE
STA $9D5B ; SET AS ERROR HANDLING HI
RTS ; EXIT SUBROUTINE

View File

@ -0,0 +1,193 @@
*``````````````````````````````*
* MAC.COMMON *
* *
* THIS IS A MACRO LIBRARY FOR *
* COMMON.LIB, AND CAN BE USED *
* REGARDLESS OF WHETHER A *
* SPECIFIC FUNCTION IS *
* INCLUDED AS A PUT IN THE *
* MAIN SOURCE. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 30-JUN-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
* *
* SUBROUTINE FILES NEEDED *
* *
* SUB.MEMFILL *
* SUB.MEMMOVE *
* SUB.DELAYMS *
* SUB.ZMSAVE *
* SUB.ZMLOAD *
* SUB.MEMSWAP *
* *
* LIST OF MACROS *
* *
* MFILL FILL MEMORY BLOCK *
* MMOVE MOVE MEMORY BLOCK *
* BEEP RING MY BELL *
* DELAY DELAY IN MILLISECS *
* ZSAVE SAVE FREE ZERO PAGE *
* ZLOAD LOAD SAVE ZERO PAGE *
* MSWAP SWAP MEM RANGES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*``````````````````````````````*
* MFILL *
* *
* FILL BLOCK OF MEMORY WITH *
* SPECIFIED VALUE. *
* *
* PARAMETERS *
* *
* ]1 = STARTING ADDRESS *
* ]2 = LENGTH IN BYTES *
* ]3 = FILL VALUE *
* *
* SAMPLE USAGE *
* *
* MFILL $300;#256;#0 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MFILL MAC
_MLIT ]1;WPAR1
_MLIT ]2;WPAR2
LDA ]3 ; FILL VALUE
STA BPAR1
JSR MEMFILL
<<<
*
*``````````````````````````````*
* BEEP *
* *
* RING THE STANDARD BELL. *
* *
* PARAMETERS *
* *
* ]1 = NUMBER OF RINGS *
* *
* SAMPLE USAGE *
* *
* BEEP #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
BEEP MAC
LDX ]1
]LP1
JSR BELL
DEX
CPX #0
BNE ]LP1
<<<
*
*``````````````````````````````*
* MMOVE *
* *
* MOVE A BLOCK OF MEMORY FROM *
* A SOURCE TO DESTINATION. *
* *
* PARAMETERS *
* *
* ]1 = SOURCE ADDRESS *
* ]2 = DESTINATION ADDRESS *
* ]3 = NUMBER OF BYTES *
* *
* SAMPLE USAGE *
* *
* MMOVE $6A00;$7B00;#1024 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MMOVE MAC
_MLIT ]1;WPAR1
_MLIT ]2;WPAR2
_MLIT ]3;WPAR3
JSR MEMMOVE
<<<
*
*``````````````````````````````*
* DELAY *
* *
* DELAY FOR PASSED MILLISECS *
* *
* PARAMETERS *
* *
* ]1 = NUM OF MILLISECONDS *
* *
* SAMPLE USAGE *
* *
* DELAY #250 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
DELAY MAC
LDY ]1
JSR DELAYMS
<<<
*
*``````````````````````````````*
* ZSAVE *
* *
* SAVE ZERO PAGE FREE AREAS *
* FOR LATER RESTORE. *
* *
* PARAMETERS *
* *
* ]1 = ADDRESS TO STORE AT *
* *
* SAMPLE USAGE *
* *
* ZSAVE $300 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
ZSAVE MAC
_AXLIT ]1
JSR ZMSAVE
<<<
*
*``````````````````````````````*
* ZLOAD *
* *
* RESTORE PREVIOUSLY SAVED *
* FREE ZERO PAGE VALUES. *
* *
* PARAMETERS *
* *
* ]1 = ADDR TO LOAD FROM *
* *
* SAMPLE USAGE *
* *
* ZLOAD $300 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
ZLOAD MAC
_AXLIT ]1
JSR ZMLOAD
<<<
*
*``````````````````````````````*
* MSWAP *
* *
* SWAPS THE VALUES STORED IN *
* ONE LOCATION WITH ANOTHER *
* *
* PARAMETERS *
* *
* ]1 = FIRST ADDRESS *
* ]2 = SECOND ADDRESS *
* ]3 = LENGTH IN BYTES (BYTE) *
* *
* SAMPLE USAGE *
* *
* MSWAP $300;$400;#$90 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MSWAP MAC
_MLIT ]2;WPAR2
_MLIT ]1;WPAR1
LDA ]3
STA BPAR1
JSR MEMSWAP
<<<

View File

@ -0,0 +1,341 @@
*
*``````````````````````````````*
* MAC.REQUIRED *
* *
* MACROS USED FOR CORE UTILS *
* AND LIBRARY ROUTINES. NOTE *
* THAT THE LIBRARIES DO NOT *
* USE THESE MACROS, BUT MAY *
* USE THE ROUTINES. THESE ARE *
* MERELY PROVIDED FOR THE SAKE *
* OF CONVENIENCE. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 30-JUN-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
* *
* SUBROUTINE FILES NEEDED *
* *
* LIB.REQUIRED *
* *
* MACROS INCLUDED: *
* *
* _MLIT : IS LITERAL? (ZERO) *
* _ISLIT : IS LITERAL? (STACK) *
* _AXLIT : IS LITERAL? (REGS) *
* _ISSTR : IS STRING? (STACK) *
* _AXSTR : IS STRING? (REGS) *
* GRET : GET RETURN *
* DUMP : DUMP MEMORY *
* _PRN : PRINT STRING *
* _WAIT : GET KEYPRESS *
* ERRH : SET ERROR ROUTINE *
* CLRHI : CLEAR HIGH NIBBLE *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*``````````````````````````````*
* _MLIT *
* *
* CHECKS IF PARAMETER IS A *
* LITERAL OR NOT, AND SETS THE *
* LO AND HI IN THE SPECIFIED *
* MEMORY ADDRESS. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* ]2 = ZERO PAGE ADDRESS *
* *
* SAMPLE USAGE *
* *
* _MLIT #$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_MLIT MAC
IF #=]1 ; IF ]1 IS A LITERAL
LDA ]1/$100 ; GET HI
STA ]2+1
LDA ]1 ; GET LO
STA ]2
ELSE ; ]1 IS ADDRESS
LDA ]1+1 ; SO GET HIGH VAL FROM ADDR
STA ]2+1
LDA ]1 ; THEN LO VAL
STA ]2
FIN
<<<
*
*``````````````````````````````*
* _ISLIT *
* *
* CHECKS IF THE PARAMETER IS *
* A LITERAL OR NOT, THEN *
* PUSHES THE LO AND HI AS *
* NEEDED. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* *
* SAMPLE USAGE *
* *
* _ISLIT #$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_ISLIT MAC
IF #=]1 ; IF ]1 IS A LITERAL
LDA ]1/$100 ; GET HI
PHA
LDA ]1 ; GET LO
PHA
ELSE ; ]1 IS ADDRESS
LDA ]1+1 ; SO GET HIGH VAL FROM ADDR
PHA
LDA ]1 ; THEN LO VAL
PHA
FIN
<<<
*
*``````````````````````````````*
* _AXLIT *
* *
* CHECKS IF PARAMETER IS A *
* LITERAL OR NOT, AND SETS THE *
* LO AND HI IN .A AND .X. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* *
* SAMPLE USAGE *
* *
* _AXLIT #$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_AXLIT MAC
IF #=]1 ; IF ]1 IS A LITERAL
LDX ]1/$100 ; GET HI
LDA ]1 ; GET LO
ELSE ; ]1 IS ADDRESS
LDX ]1+1 ; SO GET HIGH VAL FROM ADDR
LDA ]1 ; THEN LO VAL
FIN
<<<
*
*``````````````````````````````*
* _MSTR *
* *
* CHECKS IF PARAMETER IS A *
* STRING, AND IF SO PROVIDE IT *
* WITH AN ADDRESS. IF NOT, *
* CHECK IF IT'S A LITERAL AND *
* PASS ACCORDINGLY. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* OR STRING *
* ]2 = ZERO PAGE ADDRESS *
* *
* SAMPLE USAGE *
* *
* _ISSTR "TESTING" *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_MSTR MAC
IF "=]1 ; IF ]1 IS A STRING
JMP __STRCONT
]STRTMP STR ]1
__STRCONT
*
LDA #>]STRTMP ; GET HI
STA ]2+1
LDA #<]STRTMP ; GET LO
STA ]2
ELSE ; ]1 IS ADDRESS
_ISLIT ]1
FIN
<<<
*
*
*``````````````````````````````*
* _ISSTR *
* *
* CHECKS IF PARAMETER IS A *
* STRING, AND IF SO PROVIDE IT *
* WITH AN ADDRESS. IF NOT, *
* CHECK IF IT'S A LITERAL AND *
* PASS ACCORDINGLY. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* OR STRING *
* *
* SAMPLE USAGE *
* *
* _ISSTR "TESTING" *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_ISSTR MAC
IF "=]1 ; IF ]1 IS A STRING
JMP __STRCONT
]STRTMP STR ]1
__STRCONT
*
LDA #>]STRTMP ; GET HI
PHA
LDA #<]STRTMP ; GET LO
PHA
ELSE ; ]1 IS ADDRESS
_ISLIT ]1
FIN
<<<
*
*``````````````````````````````*
* _AXSTR *
* *
* CHECKS IF PARAMETER IS A *
* STRING, AND IF SO PROVIDES *
* AN ADDRESS FOR IT. IF NOT, *
* CHECK IF IT'S A LITERAL, AND *
* STORE THE HI A LO BYTES IN *
* .A AND .X. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* OR STRING *
* *
* SAMPLE USAGE *
* *
* _AXSTR "TESTING" *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_AXSTR MAC
IF "=]1 ; IF ]1 IS A STRING
JMP __STRCNT2
]STRTMP STR ]1
__STRCNT2
*
LDX #>]STRTMP ; GET HI
LDA #<]STRTMP ; GET LO
ELSE ; ]1 IS ADDRESS
_AXLIT ]1
FIN
<<<
*
*``````````````````````````````*
* GRET *
* *
* COPY THE VALUE IN RETURN AND *
* PLACE IT IN GIVEN ADDRESS. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* *
* SAMPLE USAGE *
* *
* GRET #$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
GRET MAC
_AXLIT ]1
JSR __GETRET
<<<
*
*``````````````````````````````*
* DUMP *
* *
* DUMP THE HEX AT A GIVEN *
* ADDRESS. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* ]2 = LENGTH IN BYTES *
* *
* SAMPLE USAGE *
* *
* DUMP #$6000;#10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
DUMP MAC
_AXLIT ]1
LDY ]2
JSR __DUMP
<<<
*
*``````````````````````````````*
* _PRN *
* *
* PRINT A STRING OR ADDRESS. *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* OR STRING *
* *
* SAMPLE USAGE *
* *
* _PRN "TESTING" *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_PRN MAC
JSR __P
ASC ]1
HEX 00
<<<
*
*``````````````````````````````*
* _WAIT *
* *
* WAIT FOR A KEYPRESS. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_WAIT MAC
JSR __W
<<<
*
*``````````````````````````````*
* ERRH *
* *
* SET THE ERROR HANDLING HOOK *
* *
* PARAMETERS *
* *
* ]1 = MEMORY ADDRESS BYTE *
* *
* SAMPLE USAGE *
* *
* ERRH #$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
ERRH MAC
_AXLIT
JSR __ERRH
<<<
*
*``````````````````````````````*
* CLRHI *
* *
* CLEAR HI NIBBLE OF A BYTE *
* *
* PARAMETERS *
* *
* ]1 = BYTE TO CLEAR *
* *
* SAMPLE USAGE *
* *
* CLRHI #$FF *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
CLRHI MAC
LDA ]1
JSR __CLRHI
<<<

View File

@ -0,0 +1,24 @@
JUMPTBL JMP MAIN_START
DS 32
VARTAB DS 20
RETLEN DS 1
RETURN DS 256
ADDR1 EQU $06
ADDR2 EQU $08
ADDR3 EQU $EB
ADDR4 EQU $ED
SCRATCH EQU $19
SCRATCH2 EQU $1E
RETADR EQU $FE
RESULT EQU $FA
RESULT2 EQU $FC
WPAR1 EQU $FA
WPAR2 EQU $FC
WPAR3 EQU $FE
BPAR1 EQU $EF
BPAR2 EQU $E3
BPAR3 EQU $1E
BPAR4 EQU $19
REENTRY EQU $3D0
MAIN_START

View File

@ -1,4 +1,4 @@
PROMPT EQU $33
PROMPT EQU $33
COLDENT EQU $03D3
SRESET EQU $03F2
PRNTAX EQU $F941

View File

@ -0,0 +1,125 @@
]RIGHT DS 1
]LEFT DS 1
]LENGTH DS 1
]A DS 1
]X DS 1
]Y DS 1
]C DS 1
]Z DS 1
]N DS 1
]O DS 1
]HEXTAB ASC "0123456789ABCDEF"
]COUT EQU $FDF0
]KYBD EQU $C000
]STROBE EQU $C010
__GETRET
STA ADDR1
STX ADDR1+1
LDY #255
:LP
INY
LDA RETURN,Y
STA (ADDR1),Y ; COUNTER OFFSET
CPY RETLEN
BNE :LP
RTS
__CLRHI
AND #$F0
LSR
LSR
LSR
LSR
RTS
__DUMP
STY ]LENGTH
STA ADDR1
STX ADDR1+1
LDA #$8D
JSR ]COUT
LDA ADDR1+1
JSR __CLRHI
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA ADDR1+1
AND #$0F
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA ADDR1
JSR __CLRHI
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA ADDR1
AND #$0F
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA #":" ;
JSR ]COUT
LDA #" "
JSR ]COUT
LDY #0
:LP
LDA (ADDR1),Y
JSR __CLRHI ; AT COUNTER OFFSET
STA ]LEFT
LDA (ADDR1),Y
AND #$0F
STA ]RIGHT
LDX ]LEFT
LDA ]HEXTAB,X
JSR ]COUT
LDX ]RIGHT
LDA ]HEXTAB,X
JSR ]COUT
LDA #160
JSR ]COUT
INY
CPY ]LENGTH
BNE :LP
RTS
__P
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #1
:LP LDA (ADDR1),Y
BEQ :DONE
JSR ]COUT
INY
BNE :LP
:DONE CLC
TYA
ADC ADDR1
STA ADDR1
LDA ADDR1+1
ADC #0
PHA ; IF NEEDED
LDA ADDR1
PHA
RTS
__W
:LP LDA ]KYBD
BPL :LP
AND #$7F
STA ]STROBE
RTS
__ERRH
LDA #1
STA $AAB6
STA $75+1
STA $33
STA ADDR1
STX ADDR1+1
LDA #$FF
STA $D8
LDY #0
LDA (ADDR1),Y
STA $9D5A
INY
LDA (ADDR1),Y
STA $9D5B
RTS

View File

@ -1,19 +1,22 @@
MFILL MAC
_ISLIT ]1
_ISLIT ]2
_MLIT ]1;WPAR1
_MLIT ]2;WPAR2
LDA ]3
PHA
STA BPAR1
JSR MEMFILL
<<<
BEEP MAC
LUP ]1
LDX ]1
]LP1
JSR BELL
--^
DEX
CPX #0
BNE ]LP1
<<<
MMOVE MAC
_ISLIT ]1
_ISLIT ]2
_ISLIT ]3
_MLIT ]1;WPAR1
_MLIT ]2;WPAR2
_MLIT ]3;WPAR3
JSR MEMMOVE
<<<
DELAY MAC
@ -21,17 +24,17 @@ DELAY MAC
JSR DELAYMS
<<<
ZSAVE MAC
_ISLIT ]1
_AXLIT ]1
JSR ZMSAVE
<<<
ZLOAD MAC
_ISLIT ]1
_AXLIT ]1
JSR ZMLOAD
<<<
MSWAP MAC
_ISLIT ]2
_ISLIT ]1
_MLIT ]2;WPAR2
_MLIT ]1;WPAR1
LDA ]3
PHA
STA BPAR1
JSR MEMSWAP
<<<

View File

@ -0,0 +1,97 @@
_MLIT MAC
IF #=]1
LDA ]1/$100
STA ]2+1
LDA ]1
STA ]2
ELSE
LDA ]1+1
STA ]2+1
LDA ]1
STA ]2
FIN
<<<
_ISLIT MAC
IF #=]1
LDA ]1/$100
PHA
LDA ]1
PHA
ELSE
LDA ]1+1
PHA
LDA ]1
PHA
FIN
<<<
_AXLIT MAC
IF #=]1
LDX ]1/$100
LDA ]1
ELSE
LDX ]1+1
LDA ]1
FIN
<<<
_MSTR MAC
IF "=]1
JMP __STRCONT
]STRTMP STR ]1
__STRCONT
LDA #>]STRTMP
STA ]2+1
LDA #<]STRTMP
STA ]2
ELSE
_ISLIT ]1
FIN
<<<
_ISSTR MAC
IF "=]1
JMP __STRCONT
]STRTMP STR ]1
__STRCONT
LDA #>]STRTMP
PHA
LDA #<]STRTMP
PHA
ELSE
_ISLIT ]1
FIN
<<<
_AXSTR MAC
IF "=]1
JMP __STRCNT2
]STRTMP STR ]1
__STRCNT2
LDX #>]STRTMP
LDA #<]STRTMP
ELSE
_AXLIT ]1
FIN
<<<
GRET MAC
_AXLIT ]1
JSR __GETRET
<<<
DUMP MAC
_AXLIT ]1
LDY ]2
JSR __DUMP
<<<
_PRN MAC
JSR __P
ASC ]1
HEX 00
<<<
_WAIT MAC
JSR __W
<<<
ERRH MAC
_AXLIT
JSR __ERRH
<<<
CLRHI MAC
LDA ]1
JSR __CLRHI
<<<

View File

@ -1,10 +1,10 @@
DELAYMS
MSCNT EQU $0CA
]MSCNT EQU $0CA
:DELAY
CPY #0
BEQ :EXIT
BEQ :EXIT
NOP
CPY #1
BNE :DELAYA
@ -12,7 +12,7 @@ MSCNT EQU $0CA
:DELAYA
DEY
:DELAY0
LDX #MSCNT
LDX #]MSCNT
:DELAY1
DEX
BNE :DELAY1
@ -21,7 +21,7 @@ MSCNT EQU $0CA
DEY
BNE :DELAY0
:LAST1
LDX #MSCNT-3
LDX #]MSCNT-3
:DELAY2
DEX
BNE :DELAY2

View File

@ -0,0 +1,26 @@
]FILL EQU BPAR1
]SIZE EQU WPAR2
]ADDR EQU WPAR1
MEMFILL
LDA ]FILL
LDX ]SIZE+1
BEQ :PARTPG
LDY #0
:FULLPG
STA (]ADDR),Y
INY
BNE :FULLPG
INC ]ADDR+1
DEX
BNE :FULLPG
:PARTPG
LDX ]SIZE
BEQ :EXIT
LDY #0
:PARTLP
STA (]ADDR),Y
INY
DEX
BNE :PARTLP
:EXIT
RTS

View File

@ -0,0 +1,83 @@
]SIZE EQU WPAR3
]ADDR1 EQU WPAR1
]ADDR2 EQU WPAR2
MEMMOVE
LDA ]ADDR2
SEC
SBC ]ADDR1
TAX
LDA ]ADDR2+1
SBC ]ADDR1+1
TAY
TXA
CMP ]SIZE
TYA
SBC ]SIZE+1
BCS :DOLEFT
JSR :MVERHT
JMP :MREXIT
:DOLEFT
JSR :MVELEFT
:EXIT
JMP :MREXIT
:MVELEFT
LDY #0
LDX ]SIZE+1
BEQ :MLPART
:MLPAGE
LDA (]ADDR1),Y
STA (]ADDR2),Y
INY
BNE :MLPAGE
INC ]ADDR1+1
INC ]ADDR2+1
DEX
BNE :MLPAGE
:MLPART
LDX ]SIZE
BEQ :MLEXIT
:MLLAST
LDA (]ADDR1),Y
STA (]ADDR2),Y
INY
DEX
BNE :MLLAST
:MLEXIT
JMP :MREXIT
:MVERHT
LDA ]SIZE+1
CLC
ADC ]ADDR1+1
STA ]ADDR1+1
LDA ]SIZE+1
CLC
ADC ]ADDR2+1
STA ]ADDR2+1
LDY ]SIZE
BEQ :MRPAGE
:MR0
DEY
LDA (]ADDR1),Y
STA (]ADDR2),Y
CPY #0
BNE :MR0
:MRPAGE
LDX ]SIZE+1
BEQ :MREXIT
:MR1
DEC ]ADDR1+1
DEC ]ADDR2+1
:MR2
DEY
LDA (]ADDR1),Y
STA (]ADDR2),Y
CPY #0
BNE :MR2
DEX
BNE :MR1
:MREXIT
RTS

View File

@ -0,0 +1,16 @@
]SIZE EQU BPAR1
]ADDR1 EQU WPAR1
]ADDR2 EQU WPAR2
MEMSWAP
LDY #255
:LP
INY
LDA (]ADDR1),Y
TAX
LDA (]ADDR2),Y
STA (]ADDR1),Y
TXA
STA (]ADDR2),Y
CPY ]SIZE
BNE :LP
RTS

View File

@ -0,0 +1,45 @@
]ADR1 EQU VARTAB
]ADR2 EQU VARTAB+2
]Z HEX 191EE3EBECED
HEX EEEFFAFBFCFDFEFF
HEX 00
ZMLOAD
STA ADDR1
STX ADDR1+1
LDY #255
LDA (ADDR1),Y
STA ]ADR1
INY
LDA (ADDR1),Y
STA ]ADR1+1
INY
LDA (ADDR1),Y
STA ]ADR2
INY
LDA (ADDR1),Y
STA ]ADR2+1
:LP
INY
LDA ]Z,Y
BEQ :EXIT
STA ADDR2
LDA #0
STA ADDR2+1
LDA (ADDR1),Y
STA (ADDR2),Y
JMP :LP
:EXIT
LDY #0
LDA (ADDR1),Y+3
STA $09
LDA (ADDR1),Y+2
STA $08
LDA (ADDR1),Y+1
TAX
LDA (ADDR1),Y
TAY
TXA
STA ADDR1+1
TYA
STA ADDR1
RTS

View File

@ -0,0 +1,46 @@
]ADR1 EQU VARTAB
]ADR2 EQU VARTAB+2
]Z HEX 191EE3BECEDEEF
HEX FAFBFCFDFEFF
HEX 00
ZMSAVE
STA ]ADR1
STX ]ADR1+1
LDA ADDR2
STA ]ADR2
LDA ADDR2+1
STA ]ADR2+1
LDA ]ADR1
STA ADDR2
LDA ]ADR1
STA ADDR2+1
LDY #0
LDA ADDR1
STA (ADDR2),Y
INY
LDA ADDR1+1
STA (ADDR2),Y
INY
LDA ]ADR2
STA (ADDR2),Y
INY
LDA ]ADR2+1
STA (ADDR2),Y
LDX #255
STY ]SIZE
LDY #0
:LP
INC ]SIZE
INX
LDA ]Z,X
BEQ :EXIT
STA ADDR1
LDA #0
STA ADDR1+1
LDA (ADDR1),Y
LDY ]SIZE
STA (ADDR2),Y
LDY #0
JMP :LP
:EXIT
RTS

View File

@ -1,47 +1,37 @@
*
*``````````````````````````````*
* DELAYMS :: DELAY X MILLISECS *
*- -*
* DELAYS FOR X NUMBER OF *
* MILLISECONDS BY LOOPING *
* THROUGH PRECISELY CALCULATED *
* NUMBER OF CYCLES. *
*- -*
* CLOBBERS: *
* DELAYMS (LEVENTHAL/SEVILLE) *
* *
* FLAGS: ????---- REG: -XY- *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDY #250 ;1/4 SEC *
* JSR DELAYMS *
*- -*
* ENTRY *
* *
* Y = NUMBER OF MILLISECONDS *
*- -*
* EXIT *
* *
* Y = COUNTER; TRASH *
* X = COUNTER; TRASH *
* A = UNCHANGED *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* SEVILLE'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* *
* INPUT: *
* *
* .Y = NUMBER OF MILLISECS *
* *
* OUTPUT: *
* *
* DELAYS FOR X NUMBER OF *
* MILLISECONDS BY LOOPING *
* THROUGH A PRECISE NUMBER *
* OF CYCLES. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 39+ *
* SIZE: 29 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
DELAYMS
*
MSCNT EQU $0CA ; 202 TIMES THROUGH DELAY1
]MSCNT EQU $0CA ; LOOP 202 TIMES THROUGH DELAY1
; SPECIFIC TO 1.23 MHZ
; SPEED OF APPLE II
:DELAY
CPY #0 ; 2 CYCLES
BEQ :EXIT ; 2C (EXIT IF DEL=0)
CPY #0 ; IF Y = 0, THEN EXIT
BEQ :EXIT
NOP ; 2 CYCLES (MAKE OVERHEAD=25C)
*
** IF DELAY IS 1MS THEN GOTO LAST1
@ -57,7 +47,7 @@ MSCNT EQU $0CA ; 202 TIMES THROUGH DELAY1
:DELAYA
DEY ; 2C (PREDEC Y)
:DELAY0
LDX #MSCNT ; 2C
LDX #]MSCNT ; 2C
:DELAY1
DEX ; 2C
BNE :DELAY1 ; 3C
@ -72,10 +62,9 @@ MSCNT EQU $0CA ; 202 TIMES THROUGH DELAY1
** AND ROUTINE OVERHEAD INTO
** ACCOUNT.
*
LDX #MSCNT-3 ; 2C
LDX #]MSCNT-3 ; 2C
:DELAY2
DEX ; 2C
BNE :DELAY2 ; 3C
:EXIT
RTS ; 6C
*

View File

@ -0,0 +1,59 @@
*
*``````````````````````````````*
* MEMFILL (LEVENTHAL/SAVILLE) *
* *
* ADAPTED FROM LEVANTHAL AND *
* SAVILLE'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* *
* INPUT: *
* *
* ]FILL IN BPAR1 *
* ]SIZE IN WPAR2 *
* ]ADDR IN WPAR3 *
* *
* OUTPUT: *
* *
* FILLS THE GIVEN MEM RANGE *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^ ^ *
* *
* CYCLES: 117+ *
* SIZE: 60 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]FILL EQU BPAR1 ; FILL VALUE
]SIZE EQU WPAR2 ; RANGE LENGTH IN BYTES
]ADDR EQU WPAR1 ; RANGE STARTING ADDRESS
*
MEMFILL
*
** FILL WHOLE PAGES FIRST
*
LDA ]FILL ; GET VAL FOR FILL
LDX ]SIZE+1 ; X=# OF PAGES TO DO
BEQ :PARTPG ; BRANCH IF HIGHBYTE OF SZ = 0
LDY #0 ; RESET INDEX
:FULLPG
STA (]ADDR),Y ; FILL CURRENT BYTE
INY ; INCREMENT INDEX
BNE :FULLPG ; BRANCH IF NOT DONE W/ PAGE
INC ]ADDR+1 ; ADVANCE TO NEXT PAGE
DEX ; DECREMENT COUNTER
BNE :FULLPG ; BRANCH IF NOT DONE W/ PAGES
*
** DO THE REMAINING PARTIAL PAGE
** REGISTER A STILL CONTAINS VALUE
*
:PARTPG
LDX ]SIZE ; GET # OF BYTES IN FINAL PAGE
BEQ :EXIT ; BRANCH IF LOW BYTE = 0
LDY #0 ; RESET INDEX
:PARTLP
STA (]ADDR),Y ; STORE VAL
INY ; INCREMENT INDEX
DEX ; DECREMENT COUNTER
BNE :PARTLP ; BRANCH IF NOT DONE
:EXIT
RTS

View File

@ -0,0 +1,139 @@
*
*``````````````````````````````*
* MEMMOVE (LEVENTHAL/SEVILLE) *
* *
* ADAPTED FROM LEVANTHAL AND *
* SEVILLE'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* *
* INPUT: *
* *
* ]SIZE AT WPAR3 *
* ]ADDR1 AT WPAR1 *
* ]ADDR2 AT WPAR2 *
* *
* OUTPUT: *
* *
* BYTES FROM SOURCE ARE *
* COPIED IN ORDER TO THE *
* DESTINATION ADDRESS FOR *
* AS LONG AS LENGTH. *
* *
* DESTROY: .AXY,MEMORY *
* CYCLES: 267+ *
* SIZE: 150 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]SIZE EQU WPAR3 ; LENGTH TO COPY (BYTES)
]ADDR1 EQU WPAR1 ; SOURCE ADDRESS
]ADDR2 EQU WPAR2 ; DESTINATION ADDRESS
*
MEMMOVE
*
** DETERMINE IF DEST AREA IS
** ABOVE SRC AREA BUT OVERLAPS
** IT. REMEMBER, OVERLAP CAN BE
** MOD 64K. OVERLAP OCCURS IF
** STARTING DEST ADDRESS MINUS
** STARTING SRC ADDRESS (MOD
** 64K) IS LESS THAN NUMBER
** OF BYTES TO MOVE.
*
LDA ]ADDR2 ; CALC DEST-SRC
SEC ; SET CARRY
SBC ]ADDR1 ; SUBTRACT SOURCE ADDRESS
TAX ; HOLD VAL IN .X
LDA ]ADDR2+1
SBC ]ADDR1+1 ; MOD 64K AUTOMATIC
; -- DISCARD CARRY
TAY ; HOLD HIBYTE IN .Y
TXA ; CMP LOBYTE WITH # TO MOVE
CMP ]SIZE
TYA
SBC ]SIZE+1 ; SUBTRACT SIZE+1 FROM HIBYTE
BCS :DOLEFT ; BRANCH IF NO OVERLAP
*
** DEST AREA IS ABOVE SRC AREA
** BUT OVERLAPS IT.
** MOVE FROM HIGHEST ADDR TO
** AVOID DESTROYING DATA
*
JSR :MVERHT
JMP :MREXIT
*
** NO PROB DOING ORDINARY MOVE
** STARTING AT LOWEST ADDR
*
:DOLEFT
JSR :MVELEFT
:EXIT
JMP :MREXIT
:MVELEFT
LDY #0 ; ZERO INDEX
LDX ]SIZE+1 ; X=# OF FULL PP TO MOVE
BEQ :MLPART ; IF X=0, DO PARTIAL PAGE
:MLPAGE
LDA (]ADDR1),Y ; LOAD BYTE FROM SOURCE
STA (]ADDR2),Y ; MOVE BYTE TO DESTINATION
INY ; NEXT BYTE
BNE :MLPAGE ; CONT UNTIL 256B MOVED
INC ]ADDR1+1 ; ADV TO NEXT SRC PAGE
INC ]ADDR2+1 ; ADV NEXT DEST PAGE
DEX ; DEC PAGE COUNT
BNE :MLPAGE ; CONT UNTIL ALL FULL
; PAGES ARE MOVED
:MLPART
LDX ]SIZE ; GET LENGTH OF LAST PAGE
BEQ :MLEXIT ; BR IF LENGTH OF LAST
; PAGE = 0
; REG Y IS 0
:MLLAST
LDA (]ADDR1),Y ; LOAD BYTE FROM SOURCE
STA (]ADDR2),Y ; MOVE BYTE TO DESTINATION
INY ; NEXT BYTE
DEX ; DEC COUNTER
BNE :MLLAST ; CONT UNTIL LAST P DONE
:MLEXIT
JMP :MREXIT
*
********************************
*
:MVERHT
*
** MOVE THE PARTIAL PAGE FIRST
*
LDA ]SIZE+1 ; GET SIZE HIBYTE
CLC ; CLEAR CARRY
ADC ]ADDR1+1 ; ADD SOURCE ADDRESS HIBYTE
STA ]ADDR1+1 ; POINT TO LAST PAGE OF SRC
LDA ]SIZE+1 ; GET SIZE HIBYTE
CLC ; CLEAR CARRY
ADC ]ADDR2+1 ; ADD DESTINATION HIBYTE
STA ]ADDR2+1 ; POINT TO LAST P OF DEST
*
** MOVE THE LAST PARTIAL PAGE FIRST
*
LDY ]SIZE ; GET LENGTH OF LAST PAGE
BEQ :MRPAGE ; IF Y=0 DO THE FULL PAGES
:MR0
DEY ; BACK UP Y TO NEXT BYTE
LDA (]ADDR1),Y ; LOAD CURRENT SOURCE BYTE
STA (]ADDR2),Y ; STORE IN CURRENT DESTINATION
CPY #0 ; BRANCH IF NOT DONE
BNE :MR0 ; WITH THE LAST PAGE
:MRPAGE
LDX ]SIZE+1 ; GET SIZE HIBYTE
BEQ :MREXIT ; BR IF HYBYTE = 0 (NO FULL P)
:MR1
DEC ]ADDR1+1 ; BACK UP TO PREV SRC PAGE
DEC ]ADDR2+1 ; AND DEST
:MR2
DEY ; BACK UP Y TO NEXT BYTE
LDA (]ADDR1),Y ; LOAD SOURCE CURRENT BYTE
STA (]ADDR2),Y ; STORE BYTE IN DESTINATION
CPY #0 ; IF NOT DONE WITH PAGE
BNE :MR2 ; THEN BRANCH OUT
DEX ; DECREASE BYTE COUNTER
BNE :MR1 ; BR IF NOT ALL PAGES MOVED
:MREXIT
RTS

View File

@ -0,0 +1,40 @@
*
*``````````````````````````````*
* MEMSWAP (NATHAN RIGGS) *
* *
* INPUT: *
* *
* ]SIZE = BPAR1 *
* ]ADDR1 = WPAR1 *
* ]ADDR2 = WPAR2 *
* *
* OUTPUT: *
* *
* SWAPS THE VALUES IN THE *
* MEMORY LOCATIONS GIVEN *
* FOR THE SPECIFIED LENGTH. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 100+ *
* SIZE: 43 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]SIZE EQU BPAR1 ; SIZE OF RANGE TO SWAP
]ADDR1 EQU WPAR1 ; SOURCE ADDRESS 1
]ADDR2 EQU WPAR2 ; SOURCE ADDRESS 2
*
MEMSWAP
LDY #255 ; RESET BYTE INDEX
:LP
INY ; INCREASE BYTE INDEX
LDA (]ADDR1),Y ; LOAD BYTE FROM FIRST ADDRESS
TAX ; TRANSFER TO .X
LDA (]ADDR2),Y ; LOAD BYTE FROM SECOND ADDRESS
STA (]ADDR1),Y ; STORE IN FIRST ADDRESS
TXA ; TRANSFER FIRST BYTE VAL TO .A
STA (]ADDR2),Y ; NOW STORE THAT IN SECOND ADDRESS
CPY ]SIZE ; IF BYTE INDEX < LENGTH,
BNE :LP ; CONTINUE LOOPING
RTS ; OTHERWISE, EXIT

View File

@ -0,0 +1,69 @@
*
*``````````````````````````````*
* ZMLOAD (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = LOBYTE OF SRC ADDR *
* .X = HIBYTE OF SRC ADDR *
* *
* OUTPUT: *
* *
* RESTORES PREVIOUSLY SAVED *
* ZERO PAGE VALUES FROM *
* HIGHER MEMORY LOCATION. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 123+ *
* SIZE: 71 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]ADR1 EQU VARTAB ; 2 BYTES
]ADR2 EQU VARTAB+2 ; 2 BYTES
]Z HEX 191EE3EBECED
HEX EEEFFAFBFCFDFEFF
HEX 00
*
ZMLOAD
*
STA ADDR1 ; BACKUP SOURCE ADDR LOBYTE
STX ADDR1+1 ; BACKUP HIBYTE
LDY #255 ; RESET INDEX
LDA (ADDR1),Y
STA ]ADR1 ; BACKUP $06
INY
LDA (ADDR1),Y ; BACKUP $07
STA ]ADR1+1
INY ; INCREASE INDEX
LDA (ADDR1),Y ; BACKUP $07
STA ]ADR2
INY
LDA (ADDR1),Y ; BACKUP $08
STA ]ADR2+1
:LP
INY
LDA ]Z,Y
BEQ :EXIT ; IF NULL, EXIT
STA ADDR2
LDA #0
STA ADDR2+1
LDA (ADDR1),Y
STA (ADDR2),Y
JMP :LP
:EXIT
LDY #0
LDA (ADDR1),Y+3 ; NOW RESTORE FIRST
STA $09 ; FOUR BYTES
LDA (ADDR1),Y+2
STA $08
LDA (ADDR1),Y+1
TAX
LDA (ADDR1),Y
TAY
TXA
STA ADDR1+1
TYA
STA ADDR1
RTS

View File

@ -0,0 +1,69 @@
*
*``````````````````````````````*
* ZMSAVE :: SAVE 0-PAGE FREE *
* *
* INPUT: *
* *
* .A = DESTINATION LOBYTE *
* .Y = DESTINATION HIBYTE *
* *
* OUTPUT: *
* *
* THE FREE AREAS OF THE *
* ZERO PAGE ARE COPIED TO *
* THE DESTINATION ADDRESS. *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^^^ *
* *
* CYCLES: 138+ *
* SIZE: 84 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]ADR1 EQU VARTAB ; 2 BYTES--DEST ADDRESS
]ADR2 EQU VARTAB+2 ; 2 BYTES--SOURCE ADDRESS
]Z HEX 191EE3BECEDEEF ; ZERO PAGE LOCATIONS
HEX FAFBFCFDFEFF ; TO BE BACKED UP
HEX 00
ZMSAVE
*
STA ]ADR1 ; BACKUP DESTINATION ADDRESS LO
STX ]ADR1+1 ; BACKUP HIBYTE
LDA ADDR2 ; BACKUP CONTENTS OF ADDR2 LOBYTE
STA ]ADR2
LDA ADDR2+1 ; BACKUP HIBYTE
STA ]ADR2+1
LDA ]ADR1 ; PUT DESTINATION ADDRESS
STA ADDR2 ; INTO ZERO-PAGE ADDR2
LDA ]ADR1 ; FOR INDIRECT ACCESS
STA ADDR2+1
LDY #0 ; CLEAR INDEX
LDA ADDR1 ; LOAD ADDR1 LOBYTE
STA (ADDR2),Y ; STORE IT IN DESTINATION
INY ; INCREASE INDEX
LDA ADDR1+1 ; GET ADDR1 HIBYTE
STA (ADDR2),Y ; STORE IN DESTINATION
INY ; INCREMENT INDEX
LDA ]ADR2 ; LOAD OLD ADDR2 LOBYTE
STA (ADDR2),Y ; COPY TO DESTINATION
INY ; INCREMENT INDEX
LDA ]ADR2+1 ; LOAD OLD ADDR2 HIBYTE
STA (ADDR2),Y ; STORE IN DESTINATION
LDX #255 ; RESET INDEX2 COUNTER
STY ]SIZE ; STORE INDEX1 IN ]SIZE
LDY #0 ; RESET Y-INDEX
:LP
INC ]SIZE ; INCREMENT SOURCE INDEX
INX ; INCREMENT TABLE INDEX
LDA ]Z,X ; GET NEXT BYTE FROM TABLE
BEQ :EXIT ; IF ZERO, QUIT
STA ADDR1 ; STORE BYTE FROM TABLE AS LOBYTE
LDA #0 ; CLEAR THE HIBYTE
STA ADDR1+1
LDA (ADDR1),Y ; INDIRECTLY LOAD ZERO-PAGE CONTENT
LDY ]SIZE ; PULL INDEX BACK INTO Y
STA (ADDR2),Y ; STORE BYTE TO DESTINATION
LDY #0 ; RESET Y
JMP :LP ; REPEAT UNTIL FINISHED
:EXIT
RTS

View File

@ -0,0 +1,111 @@
*
********************************
* *
* -< ASCII DEMO >- *
* *
* VERSION 00.03.00 *
* *
* 04-MAY-2019 *
* *
********************************
* *
* NATHAN D. RIGGS *
* NATHAN.RIGGS@OUTLOOK.COM *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP OFF
TR ON
DSK ASCIITEST.DEMO
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (HOOKS,MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.HEAD.REQUIRED
USE MIN.MAC.REQUIRED
USE MIN.MAC.STDIO
PUT MIN.HOOKS.STDIO
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
JSR ENDVARS
]Y DS 1
]SIZE DS 1
ENDVARS
JSR HOME ; CLEAR SCREEN
*
** CHARACTER SHADING TEST
*
LDA #0
STA ]Y
LP1
SCPOS #0;]Y
PRN "####@@@@****%%%%&&&&"
PRN "++++====----::::....",8D
INC ]Y
LDA ]Y
CMP #22
BEQ LP1X
JMP LP1
LP1X
WAIT
*
** GROWING CIRCLE TEST
*
LDA #1
STA ]SIZE
LP2
JSR HOME
TCIRC #19;#12;]SIZE;#"*"
LDY #0
ILP1
INY
NOP
NOP
NOP
NOP
CPY #$FF
BEQ ILP1X
JMP ILP1
ILP1X
*
TCIRC #19;#12;]SIZE;#" "
INC ]SIZE
LDA ]SIZE
CMP #10
BEQ LP2X
JMP LP2
LP2X
TCIRC #19;#12;]SIZE;#"*"
WAIT
*
EXIT
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINE INCLUDES
*
* STDIO SUBROUTINES
*
PUT MIN.SUB.XPRINT
PUT MIN.SUB.DPRINT
PUT MIN.SUB.THLINE
PUT MIN.SUB.TVLINE
PUT MIN.SUB.TRECTF
PUT MIN.SUB.TXTPUT
PUT MIN.SUB.TBLINE
PUT MIN.SUB.TCIRCLE
*

View File

@ -0,0 +1,412 @@
*
*``````````````````````````````*
* DEMO.STDIO *
* *
* A DEMO OF THE MACROS AND *
* SUBROUTINES IN THE STDIO *
* APPLEIIASM LIBRARY. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 07-JUL-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP OFF
TR ON
DSK DEMO.STDIO
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (HOOKS,MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.HEAD.REQUIRED
USE MIN.MAC.REQUIRED
USE MIN.MAC.STDIO
PUT MIN.HOOKS.STDIO
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
JSR HOME ; CLEAR SCREEN
*
PRN "STDIO DEMO",8D
PRN "----------",8D8D
PRN "WELCOME! THIS IS A DEMO FOR",8D
PRN "THE STDIO LIBRARY MACROS AND ",8D
PRN "SUBROUTINES.",8D8D
WAIT
PRN "OUR FIRST OBVIOUS MACRO USED",8D
PRN "IS PRN. THIS MACRO CAN PRINT A",8D
PRN "GIVEN STRING, OR PRINT THE STRING",8D
PRN "AT A GIVEN ADDRESS THAT IS REFERENCED",8D
PRN "EITHER DIRECTLY (#) OR INDIRECTLY.",8D
PRN "THEREFORE: ",8D8D
WAIT
PRN " PRN 'HELLO!'",8D8D
PRN "PRINTS HELLO, WHEREAS",8D8D
PRN " PRN #STRING1",8D8D
PRN "PRINTS THE STRING LOCATED AT",8D
PRN "THAT EXACT ADDRESS."
WAIT
JSR HOME
PRN "MEANWHILE,",8D8D
PRN " PRN STRING2",8D8D
PRN "PRINTS THE STRING AT THE ADDRESS PASSED",8D
PRN "VIA THAT MEMORY LOCATION.",8D8D
WAIT
PRN "IT IS IMPORTANT TO NOTE THAT",8D
PRN "WHENEVER THERE IS AN OPTION FOR",8D
PRN "EITHER A STRING OR A MEMORY ADDRESS,",8D
PRN "THIS IS HOW ALL SUBROUTINES WORK IN",8D
PRN "THIS LIBRARY. IN OTHER DEMOS, IT MAY",8D
PRN "BE ASSUMED THAT THE READER KNOWS THIS."
WAIT
JSR HOME
PRN "OUR NEXT SUBROUTINE NEEDING ",8D
PRN "OUR ATTENTION IS CALLED BY THE",8D
PRN "COL40 MACRO. THIS FORCES USING",8D
PRN "40-COLUMN MODE, AND IS ESPECIALLY",8D
PRN "NECESSARY FOR ROUTINES THAT PRINT",8D
PRN "DIRECTLY TO SCREEN MEMORY INSTEAD",8D
PRN "OF USING COUT ROUTINES. SO,"8D8D
PRN " COL40",8D8D
PRN "WILL PUT US IN 40-COLUMN MODE",8D
PRN "AFTER HITTING A KEY NOW."
WAIT
COL40
JSR HOME
PRN "YOU CAN ALSO FORCE 80-COLUMN MODE",8D
PRN "WITH THE COL80 MACRO, BUT BE",8D
PRN "AWARE THAT TRECF,TPUT,THLIN",8D
PRN "AND TVLIN WILL ONLY WORK",8D
PRN "AS INTENDED IN 40 COLUMNS.",8D8D
PRN "LET'S LOOK AT THESE MACROS NOW."
WAIT
JSR HOME
PRN "ASCII DRAWING",8D
PRN "=============",8D8D
PRN "AT TIMES, YOU MAY NEED TO ",8D
PRN "PUT A BLOCK OF TEXT THAT CONSISTS",8D
PRN "OF A SINGLE CHARACTER AS QUICKLY",8D
PRN "AS POSSIBLE. CURRENTLY, THERE ARE",8D
PRN "FOUR MACROS DEDICATED TO JUST ",8D
PRN "THAT: THLIN, TVLIN, TRECF, AND TPUT.",8D8D
WAIT
PRN "THE SIMPLEST OF THESE IS TPUT:",8D
PRN "IT OUTPUTS A SINGLE CHARACTER AT",8D
PRN "THE GIVEN XY COORDINATES. SO,",8D8D
PRN " TPUT #38;#20;#'$'",8D8D
PRN "WILL PLACE THE '$' CHARACTER",8D
PRN "AT THE X-POSITION 38 AND Y-POSITION",8D
PRN "20. LET'S TRY THAT NOW...",8D8D
WAIT
TPUT #38;#20;#"$"
PRN "SEE? RIGHT OVER HERE -->"
WAIT
JSR HOME
PRN "NOT THAT THE CURSOR'S POSITION",8D
PRN "IS NOT DISTURBED BY TPUT; THIS",8D
PRN "IS DUE TO THE FACT THAT THE ROUTINE",8D
PRN "BYPASSES COUT AND INSTEAD DIRECTLY",8D
PRN "POKES THE CHARACTER INTO SCREEN MEMORY.",8D
PRN "THIS IS PRIMARILY FOR SPEED, BUT AGAIN",8D
PRN "KEEP IN MIND THAT THIS DOES NOT WORK",8D
PRN "CORRECTLY IN 80-COLUMN MODE.",8D8D
WAIT
PRN "THLIN, TVLIN, AND TRECF OPERATE IN",8D
PRN "THE SAME WAY. LET'S LOOK AT THOSE NEXT."
TPUT #38;#12;#"K"
TPUT #38;#13;#"E"
TPUT #38;#14;#"E"
TPUT #38;#15;#"P"
TPUT #38;#17;#"G"
TPUT #38;#18;#"O"
TPUT #38;#19;#"I"
TPUT #38;#20;#"N"
TPUT #38;#21;#"G"
WAIT
JSR HOME
PRN "THLIN AND TVLIN BOTH CREATE LINES",8D
PRN "FROM A SINGLE CHARACTER, HORIZONTALLY",8D
PRN "AND VERTICALLY RESPECTIVELY. THUS",8D8D
PRN " THLIN #25;#35;#20;#'X'",8D8D
WAIT
THLIN #25;#35;#20;#"X"
PRN "CREATES A HORIZONTAL LINE FROM THE",8D
PRN "X-POSITION 25 TO 35 AT THE Y-POSITION",8D
PRN "OF 20 WITH THE CHARACTER 'X'. LIKEWISE,",8D8D
PRN " TVLIN #10;#20;#35;#'Y'",8D8D
WAIT
TVLIN #10;#20;#35;#"Y"
PRN "CREATES A VERTICAL LINE FROM Y-POSITION",8D
PRN "10 TO 20 AT THE X-POSITION 35."
WAIT
JSR HOME
PRN "NOTE THAT THE LAST POSITION GIVEN",8D
PRN "IS NOT ACTUALLY FILLED. THIS IS",8D
PRN "TO KEEP PLACEMENT MORE INTUITIVE.",8D
PRN "HOWEVER, WHEN TRYING TO ARRANGE LINES",8D
PRN "CONNECTED TOGETHER, YOU WILL HAVE TO",8D
PRN "ADJUST YOUR NUMBERS ACCORDINGLY. TO",8D
PRN "CREATE A BOX, FOR INSTANCE, YOU WOULD",8D
PRN "NEED TO WRITE:",8D8D
PRN " THLIN #25;#35;#20;#'X'",8D
PRN " TVLIN #10;#20;#34;#'X'",8D
PRN " TVLIN #10;#20;#25;#'X'",8D
PRN " THLIN #25;#35;#10;#'X'",8D8D
WAIT
THLIN #25;#35;#20;#"X"
TVLIN #10;#20;#34;#"X"
TVLIN #10;#20;#25;#"X"
THLIN #25;#35;#10;#"X"
PRN "YAY!"
*
********************************
*
WAIT
JSR HOME
PRN "THE TLINE MACRO DRAWS A LINE FROM",8D
PRN "X1,Y1 TO X2,Y2 WITH A FILL CHARACTER.",8D
PRN "USE TVLIN OR THLINE IF YOU ARE",8D
PRN "DRAWING HORIZONTAL OR VERTICAL LINES,",8D
PRN "AS THESE USE FEWER CYCLES.",8D8D
PRN " TLINE #20;#12;#30;#22;#'*'",8D
PRN " TLINE #30;#22;#10;#15;#'*'",8D
PRN " TLINE #10;#15;#30;#15;'*'",8D
PRN " TLINE #30;#15;#10;#22;#'*'",8D
PRN " TLINE #10;#22;#20;#12;#'*'",8D8D
PRN "WILL OUTPUT:"
WAIT
TLINE #20;#12;#30;#22;#"*"
TLINE #30;#22;#10;#15;#"*"
TLINE #10;#15;#30;#15;#"*"
TLINE #30;#15;#10;#22;#"*"
TLINE #10;#22;#20;#12;#"*"
WAIT
JSR HOME
PRN "YOU CAN ALSO CREATE CIRCLES WITH",8D
PRN "THE TCIRC MACRO. IN THE PARAMS,",8D
PRN "YOU SPECIFY THE X POSITION OF THE",8D
PRN "CENTER, THE Y POSITION OF IT, ",8D
PRN " THE CIRCLE'S RADIUS, AND THE ",8D
PRN "FILL CHAR OF THE CIRCLE'S OUTLINE.",8D
PRN "THUS:",8D8D
PRN "TCIRC #30;#14;#7;#'*'",8D
PRN "TCIRC #30;#14;#6;#'.'",8D
PRN "TCIRC #30;#14;#5;#'#'",8D
PRN "TCIRC #30;#14;#4;#':'",8D
PRN "TCIRC #30;#14;#3;#'@'",8D
PRN "TCIRC #30;#14;#2;#'+'",8D8D
PRN "WILL PRODUCE:"
WAIT
TCIRC #30;#14;#7;#"*"
TCIRC #30;#14;#6;#"."
TCIRC #30;#14;#5;#"#"
TCIRC #30;#14;#4;#":"
TCIRC #30;#14;#3;#"@"
TCIRC #30;#14;#2;#"+"
WAIT
JSR HOME
PRN "THE LAST OF THESE KIND OF MACROS",8D
PRN "IS TRECF, WHICH CREATES A FILLED",8D
PRN "BOX. THIS CAN BE ESPECIALLY USEFUL",8D
PRN "FOR CREATING A SEMBLANCE OF 'WINDOWS'",8D
PRN "ON THE TEXT SCREEN. SO:",8D8D
PRN " TRECF #10;#10;#20;#20;#'#'",8D8D
PRN "WILL RESULT IN:",8D8D
WAIT
TRECF #10;#10;#20;#20;#"#"
PRN "W00T!"
WAIT
JSR HOME
PRN "CURSOR POSITIONING",8D
PRN "==================",8D8D
PRN "THE REST OF THESE ROUTINES",8D
PRN "USE COUT1 FOUR CONVENIENCE AND",8D
PRN "SAVING A FEW BYTES HERE AND THERE.",8D
PRN "THIS MEANS, AMONG OTHER THINGS, THAT",8D
PRN "THE SYSTEM MONITOR KEEPS TRACK",8D
PRN "OF OUR CURSOR POSITION, AND WE CAN",8D
PRN "CALL ITS ROUTINES TO ALTER SAID",8D
PRN "POSITION. THIS IS ACHIEVED WITH THE",8D
PRN "FOLLOWING MACROS, WHICH WE WILL EXPLORE",8D
PRN "NEXT:",8D8D
PRN " SETCX SETCY",8D
PRN " SCPOS RCPOS",8D
PRN " CURF CURB",8D
PRN " CURU CURD"
WAIT
JSR HOME
PRN "SETCX AND SETCY SIMPLY SET THE X",8D
PRN "AND Y POSITIONS OF THE CURSOR,",8D
PRN "RESPECTIVELY. SO:",8D8D
PRN " SETCX #20",8D8D
WAIT
SETCX #20
PRN "SETS THE CURSOR'S",8D
PRN "X-POSITION TO 20, WHEREAS",8D8D
PRN " SETCY #20",8D8D
WAIT
SETCY #20
PRN "SET'S THE Y-POSITION TO 20."
WAIT
JSR HOME
PRN "YOU CAN SET THESE COORDINATES",8D
PRN "AT ONCE WITH THE SCPOS MACRO. SO:",8D8D
PRN " SCPOS #8;#10"
WAIT
SCPOS #8;#10
PRN "SETS THE CURSOR AT X POSITION",8D
PRN "OF 8 AND A Y POSITION OF 10.",8D8D
WAIT
PRN "YOU CAN ALSO READ THE CHARACTER",8D
PRN "AT A GIVEN POSITION WITH THE ",8D
PRN "RCPOS MACRO. THUS,",8D8D
PRN " RCPOS #8;#10 "
WAIT
PRN "RETURNS: "
RCPOS #8;#10
JSR COUT1
WAIT
JSR HOME
PRN "THE LAST OF THE CURSOR POSITIONING",8D
PRN "MACROS ARE CURF, CURB, CURD AND CURU.",8D
PRN "THESE ALL MOVE THE CURSOR RELATIVE",8D
PRN "TO ITS CURRENT POSITION. CURF MOVES",8D
PRN "IT FORWARD BY THE SPECIFIED AMOUNT,",8D
PRN "CURB MOVES BACKWARDS, CURD MOVES",8D
PRN "DOWN AND CURU MOVES UP. THUS:",8D8D
PRN " CURF #5 ",8D8D
PRN "MOVES THE CURSOR "
WAIT
CURF #5
PRN "FORWARD BY FIVE.",8D8D
PRN "THE OTHER MACROS USE THE SAME",8D
PRN "SYNTAX."
WAIT
JSR HOME
PRN "MOUSETEXT",8D
PRN "=========",8D8D
PRN "ON CAPABLE SYSTEMS, MOUSETEXT",8D
PRN "CAN BE TURNED ON WITH THE",8D
PRN "MTXT1 MACRO AND TURNED OFF WITH",8D
PRN "THE MTXT0 MACRO. SINCE THIS",8D
PRN "WON'T HAVE A DEMO OF IT HERE."
WAIT
JSR HOME
PRN "INPUT MACROS",8D
PRN "============",8D8D
PRN "CURRENTLY, THIS STDIO LIBRARY",8D
PRN "CONTAINS FIVE MACROS FOR USER",8D
PRN "INPUT. THEY ARE AS FOLLOWS:",8D8D
PRN " INP STRING INPUT",8D
PRN " GKEY CHARACTER INPUT",8D
PRN " PDL PADDLE INPUT",8D
PRN " PBX PADDLE BUTTON INPUT",8D
PRN " WAIT CHARACTER INPUT, NO MONITOR"
WAIT
JSR HOME
PRN "WE HAVE ALREADY MADE SUBSTANTIAL",8D
PRN "USE OF THE WAIT MACRO--THAT'S ",8D
PRN "WHAT IS CALLED EVERY TIME THIS",8D
PRN "DEMO PAUSES. ONCE A KEY IS PRESSED,",8D
PRN "THE ASCII CODE FOR IT IS STORED",8D
PRN "IN THE .A REGISTER. THIS MACRO",8D
PRN "ACCEPTS NO PARAMETERS.",8D8D
PRN "A SPECIAL FEATURE OF THE WAIT",8D
PRN "MACRO IS THAT IT DOES NOT USE THE",8D
PRN "TYPICAL MONITOR ROUTINES FOR INPUT,",8D
PRN "AND READS THE KEYBOARD DIRECTLY,",8D
PRN "ALLOWING US TO NOT HAVE A CURSOR ON",8D
PRN "THE SCREEN, AMONG OTHER BENEFITS.",8D
PRN "THIS IS IN CONTRAST TO GKEY, WHICH",8D
PRN "USES THE MONITOR ROUTINE TO ACHIEVE",8D
PRN "THE SAME RESULT: "
GKEY
JSR HOME
PRN "THE INP MACRO SIMILARLY USES THE",8D
PRN "MONITOR'S INPUT ROUTINE. THIS MEANS",8D
PRN "THAT IT SUFFERS THE SAME PROBLEMS",8D
PRN "AS DOES APPLESOFT BASIC'S INPUT",8D
PRN "COMMAND: COMMAS AND SPECIAL CHARACTERS",8D
PRN "COMPLICATE MATTERS. IN FUTURE PATCHES,",8D
PRN "AN ALTERNATE NON-MONITOR ROUTINE",8D
PRN "WILL BECOME AVAILABLE.",8D8D
PRN "TYPE SOMETHING AND PRESS RETURN:",8D
INP
PRN " ",8D
PRN "YOU CAN THEN PRINT THE STRING TO ",8D
PRN "SCREEN USING THE SPRN MACRO:",8D8D
PRN "YOU TYPED:"
SPRN #RETURN
WAIT
JSR HOME
PRN "PADDLE BUTTONS CAN BE READ VIA",8D
PRN "THE PBX MACRO. THE SYNAX IS AS",8D
PRN "FOLLOWS:",8D8D
PRN " PBX [BUTTON ADDRESS]",8D8D
WAIT
PRN "THE HOOKS.STDIO FILE CONTAINS THE",8D
PRN "ADDRESSES FOR THE FOR PADDLE BUTTONS,",8D
PRN "CONVENIENTLY CALLED PB0, PB1, PB2, ",8D
PRN "AND PB3. THUS:",8D8D
WAIT
PRN " PBX #PB0",8D8D
PRN "CHECKS IF PADDLE BUTTON 0 IS PRESSED,",8D
PRN "AND RETURNS 1 IN THE .A REGISTER IF SO.",8D
PRN "OTHERWISE, A ZERO IS RETURNED.",8D8D
WAIT
PRN "SINCE THIS REQUIRES SPECIAL HARDWARE,",8D
PRN "WE WON'T BE USING THE MACRO HERE. NOTE",8D
PRN "THAT ON A ][E, //C, AND ][GS, THE OPEN",8D
PRN "APPLE KEY IS MAPPED TO BUTTON ZERO."
WAIT
JSR HOME
PRN "LASTLY, THE PREAD MACRO READS THE STATE",8D
PRN "OF THE GIVEN PADDLE'S POTENTIOMETER.",8D
PRN "A VALUE OF 0-255 IS RETURNED IN THE .Y",8D
PRN "REGISTER. SO:",8D8D
WAIT
PRN " PREAD #0",8D8D
PRN "WILL READ THE STATE OF PADDLE 0, WHICH",8D
PRN "IS THE MOST COMMON TO READ. AGAIN,",8D
PRN "DUE TO A NEED FOR SPECIAL HARDWARE, WE",8D
PRN "WON'T BE ILLUSTRATING IT HERE."
WAIT
JSR HOME
PRN " ",8D
PRN "THAT'S ALL, FOLKS!",8D8D
*
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINE INCLUDES
*
* STDIO SUBROUTINES
*
PUT MIN.SUB.XPRINT
PUT MIN.SUB.DPRINT
PUT MIN.SUB.THLINE
PUT MIN.SUB.TVLINE
PUT MIN.SUB.TRECTF
PUT MIN.SUB.TXTPUT
PUT MIN.SUB.TBLINE
PUT MIN.SUB.TCIRCLE
PUT MIN.SUB.SINPUT
PUT MIN.SUB.PRNSTR
*

View File

@ -0,0 +1,67 @@
*
*``````````````````````````````*
* HOOKS.STDIO *
* *
* THESE ARE HOOKS THAT ARE *
* USED BY THE STDIO LIBRARY. *
* COMMENTED HOOKS ARE RELATED *
* BUT CURRENTLY UNUSED. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 07-JUL-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
* OUTPUT HOOKS
*
COUT1 EQU $FDF0 ; FASTER SCREEN OUTPUT
COUT EQU $FDED ; MONITOR STD OUTPUT
HOME EQU $FC58 ; CLEAR SCREEN, HOME CURSOR
VTAB EQU $FC22 ; MONITOR CURSOR POS ROUTINE
CURSH EQU $24 ; HPOS OF COUT CURSOR
CURSV EQU $25 ; VPOS OF COUT CURSOR
KEYBUFF EQU $0200 ; KEYBUFFER START
GSTROBE EQU $C040 ; GAME CONNECTOR STROBE
GBCALC EQU $F847 ; SCREEN CALCULATION
GBPSH EQU $26
*
* INPUT HOOKS
*
KYBD EQU $C000 ; LDA SINGLE KEYPRESS
STROBE EQU $C010 ; CLEAR KYBD BUFFER
GETLN EQU $FD6F ; MONITOR GET LINE OF KB INPUT
GETKEY EQU $FD0C ; MONITOR GET SINGLE KEY INPUT
*
* PADDLE HOOKS
*
PREAD EQU $FB1E ; READ STATE OF PADDLE
PB0 EQU $C061 ; PADDLE BUTTON 0
PB1 EQU $C062
PB2 EQU $C063
PB3 EQU $C060
*
** UNUSED BY LIBRARY
*
*WNDLEFT EQU $20 ; SCROLL WINDOW LEFT
*WNDWIDTH EQU $21 ; SCROLL WINDOW WIDTH
*WNDTOP EQU $22 ; SCROLL WINDOW TOP
*WNDBOT EQU $23 ; SCROLL WINDOW BOTTOM
*TEXTP1 EQU $0400 ; START OF TEXT PAGE 1
*TEXTP2 EQU $0800 ; START OF TEXT PAGE 2
*PAGE1 EQU $C054 ; SOFT SWITCH USE PAGE 1
*PAGE2 EQU $C055 ; SOFT SWITCH USE PAGE 2
*S80COL EQU $C01F ; READ ONLY; CHECK IF 80C
*TXTSET EQU $C051 ; TEXT ON SOFT SWITCH
*SETWND EQU $FB4B ; SET NORMAL WINDOW MODE
*CURADV EQU $FBF4 ; ADVANCE CURSOR RIGHT
*CURBS EQU $FC10 ; CURSOR LEFT
*CURUP EQU $FC1A ; CURSOR UP
*CR EQU $FC62 ; CARRIAGE RETURN TO SCREEN
*LF EQU $FC66 ; LINE FEED ONLY TO SCREEN
*CLEOL EQU $FC9C ; CLEAR TEXT TO END OF LINE
*OPAPP EQU $C061
*CLAPP EQU $C062

676
source/d2_stdio/T.MAC.STDIO Normal file
View File

@ -0,0 +1,676 @@
*
*``````````````````````````````*
* MAC.STDIO *
* *
* THIS IS A MACRO LIBRARY FOR *
* STANDARD INPUT AND OUTPUT. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 07-JUL-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
* *
* SUBROUTINES FILES USED: *
* *
* SUB.XPRINT *
* SUB.DPRINT *
* SUB.SINPUT *
* SUB.GPBX *
* SUB.TVLINE *
* SUB.THLINE *
* SUB.TRECTF *
* SUB.TBLINE *
* SUB.TCIRCLE *
* SUB.TXTPUT *
* SUB.PRNSTR *
* *
* LIST OF MACROS *
* *
* PRN : FLEXIBLE PRINT *
* SPRN : PRINT STRING *
* INP : STRING INPUT *
* GKEY : GET SINGLE KEY *
* SCPOS : SET CURS POS AT X,Y *
* SETCX : SET CURSOR X *
* SETCY : SET CURSOR Y *
* CURF : CURSOR FORWARD *
* CURB : CURSOR BACKWARD *
* CURU : CURSOR UP *
* CURD : CURSOR DOWN *
* RCPOS : READ CURSOR POSITION *
* PDL : READ PADDLE STATE *
* TLINE : DIAGONAL TEXT LINE *
* TCIRC : TEXT CIRCLE *
* PBX : READ PDL BTN X *
* TVLIN : TEXT VERTICAL LINE *
* THLIN : TEXT HORIZ LINE *
* TRECF : TEXT FILL RECTANGLE *
* TPUT : TEXT CHAR PLOT AT XY *
* COL40 : FORCE 40COL MODE *
* COL80 : FORCE 80COL MODE *
* DIE80 : KILL 80COL FIRMWARE *
* MTXT0 : DISABLE MOUSETEXT *
* MTXT1 : ENABLE MOUSETEXT *
* WAIT : WAIT FOR KEYPRESS *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*``````````````````````````````*
* PRN *
* *
* PRINT A LITERAL STRING OR *
* A NULL-TERMINATED STRING AT *
* A GIVEN ADDRESS. *
* *
* PARAMETERS *
* *
* ]1 = STRING OR ADDRESS *
* *
* SAMPLE USAGE: *
* *
* PRN "HELLO, WORLD!" *
* PRN #$300 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PRN MAC
IF ",]1 ; IF PARAM=STRING
JSR XPRINT ; SPECIAL PRINT
ASC ]1 ; PUT STRING HERE
HEX 00 ; STRING TERMINATE
ELSE ; ELSE, PARAM IS
; MEMORY LOCATION
_MLIT ]1 ; PARSE FOR LITERAL
JSR DPRINT ; OR INDIRECT
FIN
<<<
*
*``````````````````````````````*
* SPRN *
* *
* PRINTS THE STRING LOCATED AT *
* THE SPECIFIED ADDRESS, WHICH *
* HAS A PRECEDING LENGTH BYTE. *
* *
* PARAMETERS: *
* *
* ]1 = STRING ADDRESS *
* *
* SAMPLE USAGE *
* *
* SPRN #$300 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SPRN MAC
_AXLIT ]1
JSR PRNSTR
<<<
*
*``````````````````````````````*
* INP *
* *
* INPUTS A STRING FROM KEYBRD *
* AND STORES IT IN [RETURN] *
* *
* PARAMETERS *
* *
* NONE *
* *
* SAMPLE USAGE: *
* *
* INP *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
INP MAC
JSR SINPUT
<<<
*
*``````````````````````````````*
* GKEY *
* *
* WAITS FOR USER TO PRESS A *
* KEY, THEN STORES THAT IN .A *
* *
* PARAMETERS *
* *
* NONE *
* *
* SAMPLE USAGE: *
* *
* GKEY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
GKEY MAC
JSR GETKEY ; MONITOR GET SUBROUTINE
LDY #0
STY STROBE ; RESET KBD STROBE
<<<
*
*``````````````````````````````*
* SCPOS *
* *
* SETS THE CURSOR POSITION. *
* *
* PARAMETERS *
* *
* ]1 = X POSITION *
* ]2 = Y POSITION *
* *
* SAMPLE USAGE: *
* *
* SCPOS #10;#10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SCPOS MAC
LDX ]1
STX CURSH ; PUT X INTO HPOS
LDX ]2
STX CURSV ; PUT Y INTO VPOS
JSR VTAB ; EXECUTE VTAB MONITOR ROUTINE
<<<
*
*``````````````````````````````*
* SETCX *
* *
* SETS THE CURSOR X POSITION. *
* *
* PARAMETERS *
* *
* ]1 = X POSITION *
* *
* SAMPLE USAGE *
* *
* SETCX #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SETCX MAC
LDX ]1
STX CURSH ; SET HORIZ POS
JSR VTAB ; CALL VTAB MONITOR ROUTINE
<<<
*
*``````````````````````````````*
* SETCY *
* *
* SET THE CURSOR Y POSITION. *
* *
* PARAMETERS *
* *
* ]1 = Y POSITION *
* *
* SETCY #10 *
* *
* SAMPLE USAGE: SETCY #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SETCY MAC
LDY ]1
STY CURSV ; SET VERTICAL POS
JSR VTAB ; CALL VTAB MONITOR ROUTINE
<<<
*
*``````````````````````````````*
* CURF *
* *
* MOVE CURSOR FORWARD A NUMBER *
* OF SPACES. *
* *
* PARAMETERS *
* *
* ]1 = # OF SPACES TO MOVE *
* *
* SAMPLE USAGE *
* *
* CURF #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
CURF MAC
LDA ]1 ; GET # TO ADD TO CURRENT
CLC ; POS; CLEAR CARRY
ADC CURSH ; ADD CURSH
STA CURSH ; STORE IN CURSH
JSR VTAB ; MONITOR VTAB SUBROUTINE
<<<
*
*``````````````````````````````*
* CURB *
* *
* MOVE THE CURSOR BACKWARD BY *
* A NUMBER OF SPACES. *
* *
* PARAMETERS *
* *
* ]1 = # OF SPACES TO MOVE *
* *
* SAMPLE USAGE *
* *
* CURB #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
CURB MAC
LDA CURSH ; GET CURRENT CURSOR HORIZ
SEC ; SET CARRY
SBC ]1 ; SUBTRACT GIVEN PARAM
STA CURSH ; STORE BACK IN CURSH
JSR VTAB ; VTAB MONITOR SUBROUTINE
<<<
*
*``````````````````````````````*
* CURU *
* *
* MOVE CURSOR UP BY A NUMBER *
* OF SPACES. *
* *
* PARAMETERS *
* *
* ]1 = # OF SPACES TO GO UP *
* *
* SAMPLE USAGE *
* *
* CURU #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
CURU MAC
LDA CURSV ; GET CURRENT CURSOR VERT
SEC ; SET CARRY
SBC ]1 ; SUBTRACT GIVEN PARAM
STA CURSV ; STORE BACK IN CURSV
JSR VTAB ; VTAB MONITOR ROUTINE
<<<
*
*``````````````````````````````*
* CURD *
* *
* MOVE THE CURSOR DOWN BY A *
* NUMBER OF SPACES. *
* *
* PARAMETERS *
* *
* ]1 = # OF SPACES TO MOVE *
* *
* SAMPLE USAGE: CURD #10 *
* *
* CURD #10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
CURD MAC
LDA CURSV ; GET CURRENT VERT POS
CLC ; CLEAR CARRY
ADC ]1 ; ADD GIVEN PARAMETER
STA CURSV ; STORE BACK IN CURSV
JSR VTAB ; VTAB MONITOR SUBROUTINE
<<<
*
*``````````````````````````````*
* RCPOS *
* *
* READ THE CHARACTER AT POS *
* X,Y AND LOADS INTO ACCUM *
* *
* PARAMETERS *
* *
* ]1 = X POSITION *
* ]2 = Y POSITION *
* *
* SAMPLE USAGE *
* *
* RCPOS #3;#9 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
RCPOS MAC
LDY ]1 ; ROW
LDA ]2 ; COLUMN
JSR GBCALC ; GET ADDR FOR SCREEN POS
LDA (GBPSH),Y ; GET CHAR IN ADDRESS
<<<
*
*``````````````````````````````*
* PDL *
* *
* SIMPLY READS STATE OF PADDLE *
* NUMBER [NUM] AND STORES IT *
* IN THE Y REGISTER. *
* *
* PARAMETERS *
* *
* ]1 = PADDLE # TO READ *
* *
* SAMPLE USAGE *
* *
* PDL #0 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PDL MAC ; GET PADDLE VALUE
LDX ]1 ; READ PADDLE # ]1 (USUALLY 0)
JSR PREAD ; PADDLE READING STORED IN Y
<<<
*
*``````````````````````````````*
* PBX *
* *
* READ THE SPECIFIED PADDLE *
* BUTTON. *
* *
* PARAMETERS *
* *
* ]1 = PADDLE BUTTON TO READ *
* *
* PB0: $C061 PB1: $C062 *
* PB2: $C063 PB4: $C060 *
* *
* SAMPLE USAGE: *
* *
* PBX PB0 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PBX MAC
LDX #1
LDA ]1 ; IF BTN = PUSHED
BMI EXIT ; IF HIBYTE SET, BUTTON PUSHED
LDX #0 ; OTHERWISE, BUTTON NOT PUSHED
EXIT
<<<
*
*``````````````````````````````*
* TVLIN *
* *
* CREATE A VERTICAL LINE WITH *
* A GIVEN TEXT FILL CHARACTER *
* *
* PARAMETERS *
* *
* ]1 = START OF VERT LINE *
* ]2 = END OF VERT LINE *
* ]3 = X POSITION OF LINE *
* ]4 = FILL CHARACTER *
* *
* SAMPLE USAGE *
* *
* TVLIN #0;#10;#3;#$18 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
TVLIN MAC
LDA ]1 ; Y START
STA WPAR2
LDA ]2 ; Y END
STA WPAR2+1
LDA ]3 ; X POSITION
STA WPAR1
LDA ]4 ; CHARACTER
STA BPAR1
JSR TVLINE
<<<
*
*``````````````````````````````*
* THLIN *
* *
* CREATE A HORIZONTAL LINE *
* FROM A FILL CHARACTER. *
* *
* PARAMETERS *
* *
* ]1 = START OF HORIZ LINE *
* ]2 = END OF HORIZ LINE *
* ]3 = Y POSITION OF LINE *
* ]4 = FILL CHARACTER *
* *
* SAMPLE USAGE *
* *
* THLIN #0;#10;#12;#$18 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
THLIN MAC
LDA ]1 ; X START
STA WPAR1
LDA ]2 ; X END
STA WPAR1+1
LDA ]3 ; Y POS
STA BPAR1
LDA ]4 ; FILL CHAR
STA BPAR2
JSR THLINE
<<<
*
*``````````````````````````````*
* TRECF *
* *
* CREATE A RECTANGLE FILLED *
* WITH A GIVEN TEXT CHARACTER *
* *
* PARAMETERS *
* *
* ]1 = HORIZ START POSITION *
* ]2 = VERT START POSITION *
* ]3 = HORIZ END POSITION *
* ]4 = VERT END POSITION *
* ]5 = FILL CHARACTER *
* *
* SAMPLE USAGE *
* *
* TRECF #0;#10;#0;#10;#'X' *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
TRECF MAC
LDA ]1 ; LEFT BOUNDARY
STA WPAR1
LDA ]2 ; TOP BOUNDARY
STA WPAR2
LDA ]3 ; RIGHT BOUNDARY
STA WPAR1+1
LDA ]4 ; BOTTOM BOUNDARY
STA WPAR2+1
LDA ]5 ; FILL CHAR
STA BPAR1
JSR TRECTF
<<<
*
*``````````````````````````````*
* TPUT TEXT CHARACTER PLOT *
* *
* PLOT A SINGLE TEXT CHARACTER *
* DIRECTLY TO SCREEN MEMORY AT *
* A GIVEN X,Y POSITION. *
* *
* PARAMETERS *
* *
* ]1 = X POSITION *
* ]2 = Y POSITION *
* ]3 = CHARACTER TO PLOT *
* *
* SAMPLE USAGE *
* *
* TPUT #10;#10;#AA *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
TPUT MAC
LDX ]1 ; XPOS INTO .X
LDY ]2 ; YPOS INTO .Y
LDA ]3 ; FILL IN .A
JSR TXTPUT
<<<
*
*``````````````````````````````*
* DIE80 *
* *
* SEND CTRL-U TO COUT, FORCING *
* 40 COLUMN MODE. *
* *
* PARAMETERS *
* *
* NONE *
* *
* USAGE *
* *
* DIE80 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
DIE80 MAC
LDA #21 ; CTRL-U CHARACTER
JSR COUT ; SEND TO SCREEN
<<<
*
*``````````````````````````````*
* COL80 *
* *
* FORCE 80-COLUMN MODE. *
* *
* PARAMETERS *
* *
* NONE *
* *
* USAGE *
* *
* COL80 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
COL80 MAC
LDA #18 ; CTRL-R CHARACTER
JSR COUT ; SEND TO SCREEN
<<<
*
*``````````````````````````````*
* COL40 *
* *
* FORCE 40-COLUMN MODE *
* *
* PARAMETERS *
* *
* NONE *
* *
* USAGE *
* *
* COL40 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
COL40 MAC
LDA #17 ; CTRL-Q CHARACTER
JSR COUT ; SEND TO SCREEN
<<<
*
*``````````````````````````````*
* MTXT0 *
* *
* DISABLE MOUSETEXT, IF IT IS *
* ENABLED. *
* *
* PARAMETERS *
* *
* NONE *
* *
* USAGE *
* *
* MTXT0 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MTXT0 MAC
LDA #24 ; CTRL-X
JSR COUT ; SEND TO SCREEN
<<<
*
*``````````````````````````````*
* MTXT1 *
* *
* ENABLE MOUSETEXT IF IT IS *
* AVAILABLE. *
* *
* PARAMETERS *
* *
* NONE *
* *
* USAGE *
* *
* MTXT1 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MTXT1 MAC
LDA #27 ; CTRL-[
JSR COUT ; SEND TO SCREEN
<<<
*
*``````````````````````````````*
* WAIT *
* *
* WAIT FOR A KEYPRESS WITHOUT *
* INTERFERING WITH COUT. KEY *
* CODE IS STORED IN .A. *
* *
* PARAMETERS *
* *
* NONE *
* *
* USAGE *
* *
* WAIT *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
WAIT MAC
]WTLP LDA KYBD ; READ KEYBOARD BUFFER
BPL ]WTLP ; IF 0, KEEP LOOPING
AND #$7F ; OTHERWISE, SET HI BIT
STA STROBE ; CLEAR STROBE
<<<
*
*``````````````````````````````*
* TLINE *
* *
* USE THE BRESSENHAM LINE *
* ALGORITHM TO DRAW A LINE *
* WITH A FILL CHARACTER. *
* *
* PARAMETERS *
* *
* ]1 = X-ORIGIN *
* ]2 = Y-ORIGIN *
* ]3 = X-DESTINATION *
* ]4 = Y-DESTINATION *
* *
* USAGE *
* *
* TLINE #0;#0;#23;#39 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
TLINE MAC
LDA ]1
STA WPAR1
LDA ]2
STA WPAR1+1
LDA ]3
STA WPAR2
LDA ]4
STA WPAR2+1
LDA ]5
STA BPAR1
JSR TBLINE
<<<
*
*``````````````````````````````*
* TCIRC *
* *
* USE THE BRESSENHAM CIRCLE *
* ALGORITHM TO DRAW A CIRCLE *
* WITH A FILL CHARACTER. *
* *
* PARAMETERS *
* *
* ]1 = CENTER X-LOCATION *
* ]2 = CENTER Y-LOCATION *
* ]3 = RADIUS *
* ]4 = FILL CHARACTER *
* *
* USAGE *
* *
* TCIRC #19;#11;#10;#"*" *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
TCIRC MAC
LDA ]1
STA WPAR1
LDA ]2
STA WPAR2
LDA ]3
STA BPAR1
LDA ]4
STA BPAR2
JSR TCIRCLE
<<<

View File

@ -0,0 +1,27 @@
JUMPTBL JMP MAIN_START
DS 48
VARTAB DS 20
IFDEPTH DS 1
RETLEN DS 1
RETURN DS 256
PARLEN DS 1
PARAM DS 256
ADDR1 EQU $06
ADDR2 EQU $08
ADDR3 EQU $EB
ADDR4 EQU $ED
SCRATCH EQU $19
SCRATCH2 EQU $1E
RETADR EQU $FE
RESULT EQU $FA
RESULT2 EQU $FC
WPAR1 EQU $FA
WPAR2 EQU $FC
WPAR3 EQU $FE
BPAR1 EQU $EF
BPAR2 EQU $E3
BPAR3 EQU $1E
BPAR4 EQU $19
REENTRY EQU $3D0
MAIN_START

View File

@ -0,0 +1,19 @@
COUT1 EQU $FDF0
COUT EQU $FDED
HOME EQU $FC58
VTAB EQU $FC22
CURSH EQU $24
CURSV EQU $25
KEYBUFF EQU $0200
GSTROBE EQU $C040
GBCALC EQU $F847
GBPSH EQU $26
KYBD EQU $C000
STROBE EQU $C010
GETLN EQU $FD6F
GETKEY EQU $FD0C
PREAD EQU $FB1E
PB0 EQU $C061
PB1 EQU $C062
PB2 EQU $C063
PB3 EQU $C060

View File

@ -0,0 +1,137 @@
]RIGHT DS 1
]LEFT DS 1
]LENGTH DS 1
]A DS 1
]X DS 1
]Y DS 1
]C DS 1
]Z DS 1
]N DS 1
]O DS 1
]HEXTAB ASC "0123456789ABCDEF"
]COUT EQU $FDF0
]KYBD EQU $C000
]STROBE EQU $C010
__GETRET
STA ADDR1
STX ADDR1+1
LDY #255
:LP
INY
LDA RETURN,Y
STA (ADDR1),Y ; COUNTER OFFSET
CPY RETLEN
BNE :LP
RTS
__SETPARM
STA ADDR1
STX ADDR1+1
STY PARLEN
LDY #255
:LP
INY
LDA (ADDR1),Y
STA PARAM,Y ; OFFSET BY COUNTER
CPY PARLEN
BNE :LP
RTS
__CLRHI
AND #$F0
LSR
LSR
LSR
LSR
RTS
__DUMP
STY ]LENGTH
STA ADDR1
STX ADDR1+1
LDA #$8D
JSR ]COUT
LDA ADDR1+1
JSR __CLRHI
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA ADDR1+1
AND #$0F
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA ADDR1
JSR __CLRHI
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA ADDR1
AND #$0F
TAX
LDA ]HEXTAB,X
JSR ]COUT
LDA #":" ;
JSR ]COUT
LDA #" "
JSR ]COUT
LDY #0
:LP
LDA (ADDR1),Y
JSR __CLRHI ; AT COUNTER OFFSET
STA ]LEFT
LDA (ADDR1),Y
AND #$0F
STA ]RIGHT
LDX ]LEFT
LDA ]HEXTAB,X
JSR ]COUT
LDX ]RIGHT
LDA ]HEXTAB,X
JSR ]COUT
LDA #160
JSR ]COUT
INY
CPY ]LENGTH
BNE :LP
RTS
__P
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #1
:LP LDA (ADDR1),Y
BEQ :DONE
JSR ]COUT
INY
BNE :LP
:DONE CLC
TYA
ADC ADDR1
STA ADDR1
LDA ADDR1+1
ADC #0
PHA ; IF NEEDED
LDA ADDR1
PHA
RTS
__W
:LP LDA ]KYBD
BPL :LP
AND #$7F
STA ]STROBE
RTS
__ERRH
LDA #1
STA $AAB6
STA $75+1
STA $33
STA ADDR1
STX ADDR1+1
LDA #$FF
STA $D8
LDY #0
LDA (ADDR1),Y
STA $9D5A
INY
LDA (ADDR1),Y
STA $9D5B
RTS

View File

@ -0,0 +1,97 @@
_MLIT MAC
IF #=]1
LDA ]1/$100
STA ]2+1
LDA ]1
STA ]2
ELSE
LDA ]1+1
STA ]2+1
LDA ]1
STA ]2
FIN
<<<
_ISLIT MAC
IF #=]1
LDA ]1/$100
PHA
LDA ]1
PHA
ELSE
LDA ]1+1
PHA
LDA ]1
PHA
FIN
<<<
_AXLIT MAC
IF #=]1
LDX ]1/$100
LDA ]1
ELSE
LDX ]1+1
LDA ]1
FIN
<<<
_MSTR MAC
IF "=]1
JMP __STRCONT
]STRTMP STR ]1
__STRCONT
LDA #>]STRTMP
STA ]2+1
LDA #<]STRTMP
STA ]2
ELSE
_ISLIT ]1
FIN
<<<
_ISSTR MAC
IF "=]1
JMP __STRCONT
]STRTMP STR ]1
__STRCONT
LDA #>]STRTMP
PHA
LDA #<]STRTMP
PHA
ELSE
_ISLIT ]1
FIN
<<<
_AXSTR MAC
IF "=]1
JMP __STRCNT2
]STRTMP STR ]1
__STRCNT2
LDX #>]STRTMP
LDA #<]STRTMP
ELSE
_AXLIT ]1
FIN
<<<
GRET MAC
_AXLIT ]1
JSR __GETRET
<<<
DUMP MAC
_AXLIT ]1
LDY ]2
JSR __DUMP
<<<
_PRN MAC
JSR __P
ASC ]1
HEX 00
<<<
_WAIT MAC
JSR __W
<<<
ERRH MAC
_AXLIT
JSR __ERRH
<<<
CLRHI MAC
LDA ]1
JSR __CLRHI
<<<

View File

@ -0,0 +1,176 @@
PRN MAC
IF ",]1
JSR XPRINT ; SPECIAL PRINT
ASC ]1 ; PUT STRING HERE
HEX 00 ; STRING TERMINATE
ELSE ; ELSE, PARAM IS
; MEMORY LOCATION
_MLIT ]1
JSR DPRINT
FIN
<<<
SPRN MAC
_AXLIT ]1
JSR PRNSTR
<<<
INP MAC
JSR SINPUT
<<<
GKEY MAC
JSR GETKEY
LDY #0
STY STROBE
<<<
SCPOS MAC
LDX ]1
STX CURSH
LDX ]2
STX CURSV
JSR VTAB
<<<
SETCX MAC
LDX ]1
STX CURSH
JSR VTAB
<<<
SETCY MAC
LDY ]1
STY CURSV
JSR VTAB
<<<
CURF MAC
LDA ]1
CLC ; POS
ADC CURSH
STA CURSH
JSR VTAB
<<<
CURB MAC
LDA CURSH
SEC
SBC ]1
STA CURSH
JSR VTAB
<<<
CURU MAC
LDA CURSV
SEC
SBC ]1
STA CURSV
JSR VTAB
<<<
CURD MAC
LDA CURSV
CLC
ADC ]1
STA CURSV
JSR VTAB
<<<
RCPOS MAC
LDY ]1
LDA ]2
JSR GBCALC
LDA (GBPSH),Y
<<<
PDL MAC
LDX ]1
JSR PREAD
<<<
PBX MAC
LDX #1
LDA ]1
BMI EXIT
LDX #0
EXIT
<<<
TVLIN MAC
LDA ]1
STA WPAR2
LDA ]2
STA WPAR2+1
LDA ]3
STA WPAR1
LDA ]4
STA BPAR1
JSR TVLINE
<<<
THLIN MAC
LDA ]1
STA WPAR1
LDA ]2
STA WPAR1+1
LDA ]3
STA BPAR1
LDA ]4
STA BPAR2
JSR THLINE
<<<
TRECF MAC
LDA ]1
STA WPAR1
LDA ]2
STA WPAR2
LDA ]3
STA WPAR1+1
LDA ]4
STA WPAR2+1
LDA ]5
STA BPAR1
JSR TRECTF
<<<
TPUT MAC
LDX ]1
LDY ]2
LDA ]3
JSR TXTPUT
<<<
DIE80 MAC
LDA #21
JSR COUT
<<<
COL80 MAC
LDA #18
JSR COUT
<<<
COL40 MAC
LDA #17
JSR COUT
<<<
MTXT0 MAC
LDA #24
JSR COUT
<<<
MTXT1 MAC
LDA #27
JSR COUT
<<<
WAIT MAC
]WTLP LDA KYBD
BPL ]WTLP
AND #$7F
STA STROBE
<<<
TLINE MAC
LDA ]1
STA WPAR1
LDA ]2
STA WPAR1+1
LDA ]3
STA WPAR2
LDA ]4
STA WPAR2+1
LDA ]5
STA BPAR1
JSR TBLINE
<<<
TCIRC MAC
LDA ]1
STA WPAR1
LDA ]2
STA WPAR2
LDA ]3
STA BPAR1
LDA ]4
STA BPAR2
JSR TCIRCLE
<<<

View File

@ -0,0 +1,11 @@
]ADDR1 EQU WPAR1
DPRINT
LDY #$00
:LOOP
LDA (]ADDR1),Y
BEQ :EXIT
JSR COUT1
INY
BNE :LOOP
:EXIT
RTS

View File

@ -0,0 +1,17 @@
]STRLEN EQU VARTAB
PRNSTR
STA ADDR1
STX ADDR1+1
LDY #0
LDA (ADDR1),Y
STA ]STRLEN
:LP
INY
LDA (ADDR1),Y
JSR COUT1
CPY ]STRLEN
BNE :LP
; LOOP
LDY #0
LDA (ADDR1),Y
RTS

View File

@ -1,26 +1,26 @@
]STRLEN EQU VARTAB
SINPUT
LDX #$00
JSR GETLN
STX :STRLEN
CPX #0
BEQ :ZEXIT
:INP_CLR
LDY #0
LDA :STRLEN
STA RETLEN
STA RETURN
INC RETLEN
:LOOP
LDA KEYBUFF,Y
INY
STA RETURN,Y
CPY :STRLEN
BNE :LOOP ; LOOP
STX ]STRLEN
CPX #0
BNE :INP_CLR
STX RETLEN
STX RETURN
JMP :EXIT
:ZEXIT
LDA #0
STA RETLEN
STA RETURN
:INP_CLR
LDA ]STRLEN
STA RETURN
STA RETLEN
INC RETLEN
LDX #255
LDY #0
:LOOP
INX
INY
LDA KEYBUFF,X
STA RETURN,Y
CPX ]STRLEN
BNE :LOOP ; LOOP
:EXIT
RTS
:STRLEN DS 1

View File

@ -0,0 +1,91 @@
]X1 EQU WPAR1
]X2 EQU WPAR2
]Y1 EQU WPAR1+1
]Y2 EQU WPAR2+1
]F EQU BPAR1
]DX EQU VARTAB ; CHANGE IN X
]DY EQU VARTAB+1 ; CHANGE IN Y
]SX EQU VARTAB+2 ; X POSITION STEP
]SY EQU VARTAB+3 ; Y POSITION STEP
]ERR EQU VARTAB+4 ; SLOPE ERROR
]ERR2 EQU VARTAB+5 ; COMPARISON COPY OF ]ERR
TBLINE
LDX #$FF
LDA ]Y1
SEC
SBC ]Y2
BPL :YSTORE
LDX #1
EOR #$FF
CLC
ADC #1
:YSTORE
STA ]DY
STX ]SY
LDX #$FF
LDA ]X1
SEC
SBC ]X2
BPL :XSTORE
LDX #1
EOR #$FF
CLC
ADC #1
:XSTORE
STA ]DX
STX ]SX
CMP ]DY
BEQ :SKIP
BPL :SKIP2
:SKIP
LDA ]DY
EOR #$FF
CLC
ADC #1
:SKIP2
STA ]ERR
ASL ]DX
ASL ]DY
:LP
LDA ]Y1
LDY ]X1
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]X1
CMP ]X2
BNE :KEEPGO
LDA ]Y1
CMP ]Y2
BEQ :EXIT ; IF EQUAL, EXIT
:KEEPGO
LDA ]ERR
STA ]ERR2
CLC
ADC ]DX
BMI :SKIPX
BEQ :SKIPX
LDA ]ERR
SEC
SBC ]DY
STA ]ERR
LDA ]X1
CLC
ADC ]SX
STA ]X1
:SKIPX
LDA ]ERR2
CMP ]DY
BPL :SKIPY
LDA ]ERR
CLC
ADC ]DX
STA ]ERR
LDA ]Y1
CLC
ADC ]SY
STA ]Y1
:SKIPY
JMP :LP
:EXIT
RTS

View File

@ -0,0 +1,202 @@
]XC EQU WPAR1
]YC EQU WPAR2
]R EQU BPAR1
]F EQU BPAR2
]Y EQU VARTAB
]X EQU VARTAB+1
]DY EQU VARTAB+2
]DX EQU VARTAB+4
]ERR EQU VARTAB+6
]DIAM EQU VARTAB+8
]XT EQU VARTAB+10
]YT EQU VARTAB+12
TCIRCLE
LDA #0
STA ]Y
LDA ]R
STA ]X
STA ]ERR
ASL
STA ]DIAM
LDA ]X
EOR #$FF
CLC
ADC #1
STA ]XT
LDA ]Y
EOR #$FF
CLC
ADC #1
STA ]YT
LDA ]XC
CLC
ADC ]X
TAY
TAX
LDA ]YC
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]XT
TAX
TAY
LDA ]YC
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
TAY
TAX
LDA ]YC
CLC
ADC ]X
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
TAY
TAX
LDA ]YC
CLC
ADC ]XT
JSR GBCALC
LDA ]F
STA (GBPSH),Y
:LOOP
LDA ]Y
CMP ]X
BCC :LPCONT
JMP :EXIT
:LPCONT
:STEPY
LDA ]Y
ASL
ADC #1
STA ]DY
INC ]Y
LDA ]DY
EOR #$FF
CLC
ADC #1
ADC ]ERR
STA ]ERR
BPL :PLOT
:STEPX
LDA ]X
ASL
EOR #$FF
CLC
ADC #1
ADC #1
STA ]DX
DEC ]X
LDA ]DX
EOR #$FF
CLC
ADC #1
ADC ]ERR
STA ]ERR
:PLOT
LDA ]X
EOR #$FF
CLC
ADC #1
STA ]XT
LDA ]Y
EOR #$FF
CLC
ADC #1
STA ]YT
LDA ]XC
CLC
ADC ]X
TAY
TAX
LDA ]YC
CLC
ADC ]Y
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]XT
TAY
TAX
LDA ]YC
CLC
ADC ]Y
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]XT
TAY
TAX
LDA ]YC
CLC
ADC ]YT
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]X
TAY
TAX
LDA ]YC
CLC
ADC ]YT
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]Y
TAX
TAY
LDA ]YC
CLC
ADC ]X
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]YT
TAX
TAY
LDA ]YC
CLC
ADC ]X
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]YT
TAX
TAY
LDA ]YC
CLC
ADC ]XT
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]XC
CLC
ADC ]Y
TAY
TAX
LDA ]YC
CLC
ADC ]XT
JSR GBCALC
LDA ]F
STA (GBPSH),Y
JMP :LOOP
:EXIT
RTS

View File

@ -0,0 +1,19 @@
]X1 EQU WPAR1
]X2 EQU WPAR1+1
]Y1 EQU BPAR1
]F EQU BPAR2
THLINE
LDA ]Y1
LDY ]X1
:LOOP
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]Y1
INY
CPY ]X2
BNE :LOOP
:EXIT
RTS

View File

@ -0,0 +1,31 @@
]X1 EQU WPAR1
]X2 EQU WPAR1+1
]Y1 EQU WPAR2
]Y2 EQU WPAR2+1
]F EQU BPAR1
]XC EQU VARTAB
]YC EQU VARTAB+1
TRECTF
LDA ]X1
STA ]XC
LDA ]Y1
STA ]YC
:LP1
LDA ]YC
LDY ]XC
JSR GBCALC
LDA ]F
STA (GBPSH),Y
LDA ]YC
INY
STY ]XC
CPY ]X2
BNE :LP1
LDA ]X1
STA ]XC
INC ]YC
LDA ]YC
CMP ]Y2
BNE :LP1
:EXIT
RTS

View File

@ -0,0 +1,17 @@
]X1 EQU WPAR1
]Y1 EQU WPAR2
]Y2 EQU WPAR2+1
]F EQU BPAR1
TVLINE
LDA ]Y1
LDY ]X1
:LOOP
JSR GBCALC
LDA ]F
STA (GBPSH),Y
INC ]Y1
LDA ]Y1
CMP ]Y2
BNE :LOOP ; LOOP
:EXIT
RTS

View File

@ -0,0 +1,14 @@
]Y1 EQU VARTAB
]X1 EQU VARTAB+1
]F EQU VARTAB+3
TXTPUT
STA ]F
STY ]Y1
STX ]X1
LDA ]Y1
LDY ]X1
JSR GBCALC
LDA ]F
STA (GBPSH),Y
:EXIT
RTS

View File

@ -0,0 +1,24 @@
XPRINT
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #$01
:LOOP
LDA (ADDR1),Y
BEQ :EXIT
JSR COUT1
INY
BNE :LOOP
:EXIT
CLC
TYA
ADC ADDR1
STA ADDR1
LDA ADDR1+1
ADC #$00
PHA
LDA ADDR1
PHA
RTS

View File

@ -0,0 +1,35 @@
*
*``````````````````````````````*
* DPRINT (NATHAN RIGGS) *
* *
* PRINT A ZERO-TERMINATED *
* STRING AT A GIVEN ADDRESS. *
* *
* INPUT: *
* *
* WPAR1 = STRING ADDRESS (2B) *
* *
* OUTPUT: *
* *
* PRINT STRING TO SCREEN *
* *
* DESTROYS: AXYNVBDIZCMS *
* ^^^^ ^ ^ *
* *
* CYCLES: 61+ *
* SIZE: 27 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]ADDR1 EQU WPAR1
*
DPRINT
*
LDY #$00 ; RESET COUNTER
:LOOP
LDA (]ADDR1),Y
BEQ :EXIT ; IF CHAR = $00 THEN EXIT
JSR COUT1 ; OTHERWISE, PRINT CHAR
INY ; INCREAS COUNTER
BNE :LOOP ; IF COUNTER < 256, LOOP
:EXIT
RTS

View File

@ -0,0 +1,39 @@
*``````````````````````````````*
* PRNSTR (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = ADDRESS LOBYTE *
* .X = ADDRESS HIBYTE *
* *
* OUTPUT: *
* *
* PRINTS STRING TO SCREEN. *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^^ *
* *
* CYCLES: 28+ *
* SIZE: 22 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]STRLEN EQU VARTAB ; 1 BYTE
*
PRNSTR
*
STA ADDR1
STX ADDR1+1
*
LDY #0
LDA (ADDR1),Y ; GET STRING LENGTH
STA ]STRLEN
:LP
INY
LDA (ADDR1),Y ; GET CHARACTER
JSR COUT1 ; PRINT CHARACTER TO SCREEN
CPY ]STRLEN ; IF Y < LENGTH
BNE :LP
; LOOP; ELSE
LDY #0
LDA (ADDR1),Y
RTS

View File

@ -0,0 +1,49 @@
*
*``````````````````````````````*
* SINPUT (NATHAN RIGGS) *
* *
* INPUT *
* *
* NONE *
* *
* OUTPUT: *
* *
* .X = LENGTH OF STRING *
* RETURN = STRING TYPED *
* RETLEN = LENGTH OF STRING *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^ *
* *
* CYCLES: 60+ *
* SIZE: 45 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]STRLEN EQU VARTAB ; 1 BYTE
*
SINPUT
*
LDX #$00
JSR GETLN
STX ]STRLEN ; STORE STR LENGTH
CPX #0 ; IF LEN = 0, EXIT
BNE :INP_CLR
STX RETLEN
STX RETURN
JMP :EXIT
:INP_CLR
LDA ]STRLEN ; LENGTH OF STRING
STA RETURN ; STRING LENGTH FIRST BYTE
STA RETLEN ; PUT LENGTH + 1 HERE
INC RETLEN
LDX #255
LDY #0
:LOOP
INX
INY
LDA KEYBUFF,X ; PUT STR INTO NEW LOC
STA RETURN,Y
CPX ]STRLEN ; IF Y < STR LENGTH
BNE :LOOP ; LOOP; ELSE, EXIT
:EXIT
RTS

View File

@ -0,0 +1,142 @@
*
*``````````````````````````````*
* TBLINE (NATHAN RIGGS) *
* *
* OUTPUTS A LINE FROM COORDS *
* X1,Y1 TO X2,Y2 USING THE *
* BRESSENHAM LINE ALOGORITHM *
* *
* INPUT: *
* *
* ]X1 STORED IN WPAR1 *
* ]X2 STORED IN WPAR1+1 *
* ]Y1 STORED IN WPAR2 *
* ]Y2 STORED IN WPAR2+1 *
* ]F STORED IN BPAR1 *
* *
* OUTPUT: *
* *
* NONE *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^^ *
* *
* CYCLES: 283+ *
* SIZE: 188 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]X1 EQU WPAR1 ; PARAMETERS PASSED VIA
]X2 EQU WPAR2 ; ZERO PAGE LOCATIONS
]Y1 EQU WPAR1+1
]Y2 EQU WPAR2+1
]F EQU BPAR1
*
]DX EQU VARTAB ; CHANGE IN X; 1 BYTE
]DY EQU VARTAB+1 ; CHANGE IN Y; 1 BYTE
]SX EQU VARTAB+2 ; X POSITION STEP; 1 BYTE
]SY EQU VARTAB+3 ; Y POSITION STEP; 1 BYTE
]ERR EQU VARTAB+4 ; SLOPE ERROR; 1 BYTE
]ERR2 EQU VARTAB+5 ; COMPARISON COPY OF ]ERR; 1 BYTE
*
TBLINE
*
** FIRST CALCULATE INITIAL VALUES
*
** CHECK IF Y STEP IS POSITIVE OR NEGATIVE
*
LDX #$FF ; .X = -1
LDA ]Y1 ; GET Y1 - Y2
SEC ; RESET CARRY
SBC ]Y2
BPL :YSTORE ; IF POSITIVE, SKIP TO STORE
LDX #1 ; .X = +1
EOR #$FF ; NEG ACCUMULATOR
CLC
ADC #1
:YSTORE
STA ]DY ; STORE CHANGE IN Y
STX ]SY ; STORE + OR - Y STEPPER
*
** NOW CHECK POSITIVE OR NEGATIVE X STEP
*
LDX #$FF ; .X = -1
LDA ]X1 ; GET X1 - X2
SEC ; RESET CARRY
SBC ]X2 ; SUBTRACT X2
BPL :XSTORE ; IF POSITIVE, SKIP TO X STORE
LDX #1 ; .X = +1
EOR #$FF ; NEGATIVE ACCUMULATOR
CLC
ADC #1
:XSTORE
STA ]DX ; STORE CHANGE IN X
STX ]SX ; STORE + OR - X STEPPER
*
** IF CHANGE IN X IS GREATER THAN CHANGE IN Y,
** THEN INITIAL ERROR IS THE CHANGE IN X; ELSE,
** INITIAL ERROR IS THE CHANGE IN Y
*
CMP ]DY ; DX IS ALREADY IN .A
BEQ :SKIP ; IF EQUAL, US CHANGE IN Y
BPL :SKIP2 ; IF GREATER THAN, USE CHANGE IN X
:SKIP
LDA ]DY ; GET CHANGE IN Y
EOR #$FF ; NEGATE
CLC
ADC #1
:SKIP2
STA ]ERR ; STORE EITHER DX OR DY IN ERR
ASL ]DX ; DX = DX * 2
ASL ]DY ; DY = DY * 2
*
** NOW LOOP THROUGH EACH POINT ON LINE
*
:LP
*
** PRINT CHARACTER FIRST
*
LDA ]Y1 ; .A = Y POSITION
LDY ]X1 ; .Y = X POSITION
JSR GBCALC ; FIND SCREEN MEM LOCATION
LDA ]F ; LOAD FILL INTO .A
STA (GBPSH),Y ; PUSH TO SCREEN MEMORY
*
** NOW CHECK IF X1 = X2, Y = Y2
*
LDA ]X1 ; IF X1 != X2 THEN
CMP ]X2 ; KEEP LOOPING
BNE :KEEPGO
LDA ]Y1 ; ELSE, CHECK IF Y1 = Y2
CMP ]Y2
BEQ :EXIT ; IF EQUAL, EXIT; ELSE, LOOP
:KEEPGO
LDA ]ERR ; LOAD ERR AND BACKUP
STA ]ERR2 ; FOR LATER COMPARISON
CLC ; CLEAR CARRY
ADC ]DX ; ADD CHANGE IN X
BMI :SKIPX ; IF RESULT IS -, SKIP
BEQ :SKIPX ; TO CHANGING Y POS
LDA ]ERR ; RELOAD ERR
SEC ; SET CARRY
SBC ]DY ; SUBTRACT CHANGE IN Y
STA ]ERR ; STORE ERROR
LDA ]X1 ; LOAD CURRENT X POSITION
CLC ; CLEAR CARRY
ADC ]SX ; INCREASE OR DECREASE BY 1
STA ]X1 ; STORE NEW X POSITION
:SKIPX
LDA ]ERR2 ; LOAD EARLIER ERR
CMP ]DY ; IF ERR - CHANGE IN Y IS +
BPL :SKIPY ; SKIP CHANGING Y POS
LDA ]ERR ; RELOAD ERR
CLC ; CLEAR CARRY
ADC ]DX ; ADD CHANGE IN X
STA ]ERR ; STORE NEW ERR
LDA ]Y1 ; LOAD Y POSITION
CLC ; CLEAR CARRY
ADC ]SY ; INCREASE OR DECREASE YPOS BY 1
STA ]Y1 ; STORE NEW Y POSITION
:SKIPY
JMP :LP ; LOOP LINE DRAWING
:EXIT
RTS

View File

@ -0,0 +1,328 @@
*
*``````````````````````````````*
* TCIRCLE (NATHAN RIGGS) *
* *
* INPUT: *
* *
* WPAR1 = X CENTER POS *
* WPAR2 = Y CENTER POS *
* BPAR1 = RADIUS *
* BPAR2 = FILL CHARACTER *
* *
* OUTPUT: *
* *
* USES BRESENHAM'S CIRCLE *
* ALGORITHM TO DRAW A CIRCLE *
* TO THE 40-COLUMN TEXTMODE *
* SCREEN. *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^^ *
* *
* CYCLES: 494+ *
* SIZE: 420 BYTES *
* *
* SUBSTANTIAL DEBT IS OWED TO *
* MARC GOLOMBECK AND HIS GREAT *
* IMPLEMENTATION OF THE *
* BRESENHAM CIRCLE ALGORITHM *
* IN 6502 AND APPLESOFT, WHICH *
* IS BASED ON THE GERMAN LANG *
* VERSION OF WIKIPEDIA'S ENTRY *
* ON THE ALGORITHM THAT HAS A *
* BASIC PSEUDOCODE EXAMPLE. *
* THAT EXAMPLE, WITH CHANGES *
* VARIABLE NAMES, IS INCLUDED *
* BELOW. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]XC EQU WPAR1
]YC EQU WPAR2
]R EQU BPAR1
]F EQU BPAR2
*
]Y EQU VARTAB ; CENTER YPOS
]X EQU VARTAB+1 ; CENTER XPOS
]DY EQU VARTAB+2 ; CHANGE IN Y
]DX EQU VARTAB+4 ; CHANGE IN X
]ERR EQU VARTAB+6 ; ERROR VALUE
]DIAM EQU VARTAB+8 ; DIAMETER
]XT EQU VARTAB+10 ; INVERTED X VALUE
]YT EQU VARTAB+12 ; INVERTED Y VALUE
*
********************************
* *
* BASIC PSEUDOCODE *
* *
********************************
*
* X = R
* Y = 0
* ERROR = R
* SETPIXEL XC + X, YC + Y
* WHILE Y < X
* DY = Y * 2 + 1
* Y = Y + 1
* ERROR = ERROR - DY
* IF ERROR < 0 THEN
* DX = 1 - X * 2
* X = X - 1
* ERROR = ERROR - DX
* END IF
* SETPIXEL XC + X, YC + Y
* SETPIXEL XC - X, YC + Y
* SETPIXEL XC - X, YC - Y
* SETPIXEL XC + X, YC - Y
* SETPIXEL XC + Y, YC + X
* SETPIXEL XC - Y, YC + X
* SETPIXEL XC - Y, YC - X
* SETPIXEL XC + Y, YC - X
* WEND
*
TCIRCLE
*
** FIRST, INITIALIZE VARIABLES
*
LDA #0 ; CLEAR YPOS
STA ]Y
LDA ]R ; LOAD RADIUS
STA ]X ; X = RADIUS
STA ]ERR ; ERROR = RADIUS
ASL ; R * 2
STA ]DIAM ; STORE DIAMETER
*
** NOW DRAW FIRST PART OF CIRCLE
*
** CALCULATE -X AND -Y
*
LDA ]X ; GET XPOS
EOR #$FF ; NEGATE
CLC
ADC #1
STA ]XT ; STORE NEGATED IN XT
LDA ]Y ; GET YPOS
EOR #$FF ; NEGATE
CLC
ADC #1
STA ]YT ; STORE NEGATED IN YT
*
** PLOT XC+X,YC
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]X ; ADD CURRENT XPOS
TAY ; TRANSER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
JSR GBCALC ; GET X,Y SCREEN MEMORY POS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE IN SCREEN MEMORY
*
** PLOT XC-X,YC
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]XT ; ADD NEGATED CURRENT XPOS
TAX ; TRANSFER TO .X
TAY ; AND .Y
LDA ]YC ; LOAD CIRCLE CENTER YPOS
JSR GBCALC ; GET X,Y SCREEN MEMORY POS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE IN SCREEN MEMORY
*
** PLOT XC,YC+X
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
TAY ; TRANSFER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]X ; ADD CURRENT XPOS
JSR GBCALC ; GET X,Y SCREEN MEMORY POS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE IN SCREEN MEMORY
*
** PLOT XC,YC-X
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
TAY ; TRANSFER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]XT ; ADD NEGATED CURRENT XPOS
JSR GBCALC ; GET X,Y SCREEN MEMORY POS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE IN SCREEN MEMORY
*
** NOW LOOP UNTIL CIRCLE IS FINISHED
*
:LOOP
*
** CHECK IF CIRCLE FINISHED
*
LDA ]Y ; IF Y > X
CMP ]X
BCC :LPCONT ; CONTINUE LOOPING
JMP :EXIT ; OTHERWISE, CIRCLE DONE
:LPCONT
:STEPY ; STEP THE Y POSITION
LDA ]Y ; LOAD YPOS
ASL ; MULTIPLY BY 2
*CLC
ADC #1 ; ADD +1
STA ]DY ; STORE CHANGE OF Y
INC ]Y ; INCREASE YPOS
LDA ]DY ; NEGATE
EOR #$FF
CLC
ADC #1
ADC ]ERR ; ADD ERR
STA ]ERR ; ERR = ERR - DY
BPL :PLOT ; IF ERR IS +, SKIP TO PLOT
:STEPX
LDA ]X ; LOAD XPOS
ASL ; MULTIPLY BY 2
EOR #$FF ; NEGATE
CLC
ADC #1
ADC #1 ; (X*2) + 1
STA ]DX ; STORE CHANGE OF X
DEC ]X ; DECREASE YPOS
LDA ]DX ; NEGATE
EOR #$FF
CLC
ADC #1
ADC ]ERR ; ADD ERR
STA ]ERR ; ERR = ERR - DX
*
:PLOT
*
** NOW CALCULATE -X AND -Y
*
LDA ]X
EOR #$FF ; NEGATE
CLC
ADC #1
STA ]XT
LDA ]Y
EOR #$FF ; NEGATE
CLC
ADC #1
STA ]YT
*
** NOW PLOT CIRCLE OCTANTS
*
** PLOT XC+X,YC+Y
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]X ; ADD CURRENT XPOS
TAY ; TRANSFER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]Y ; ADD CURRENT YPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC-X,YC+Y
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]XT ; ADD NEGATED CURRENT XPOS
TAY ; TRANSFER TO .Y
TAX ; AND TO .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]Y ; ADD CURRENT YPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC-X,YC-Y
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]XT ; ADD NEGATED CURRENT XPOS
TAY ; TRANSFER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]YT ; ADD NEGATED CURRENT YPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHARACTER
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC+X,YC-Y
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]X ; ADD CURRENT XPOS
TAY ; TRANSFER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]YT ; ADD NEGATE CURRENT YPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC+Y,YC+X
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]Y ; ADD CURRENT YPOS
TAX ; TRANSFER TO .X
TAY ; AND .Y
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]X ; ADD CURRENT XPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC-Y,YC+X
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]YT ; ADD NEGATED CURRENT YPOS
TAX ; TRANSFER TO .X
TAY ; AND .Y
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]X ; ADD CURRENT XPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC-Y,YC-X
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]YT ; ADD NEGATED CURRENT YPOS
TAX ; TRANSFER TO .X
TAY ; AND .Y
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC ; CLEAR CARRY
ADC ]XT ; ADD NEGATED CURRENT XPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
*
** PLOT XC+Y,YC-X
*
LDA ]XC ; LOAD CIRCLE CENTER XPOS
CLC ; CLEAR CARRY
ADC ]Y ; ADD CURRENT YPOS
TAY ; TRANSFER TO .Y
TAX ; AND .X
LDA ]YC ; LOAD CIRCLE CENTER YPOS
CLC
ADC ]XT ; ADD NEGATED CURRENT XPOS
JSR GBCALC ; GET X,Y SCREEN ADDRESS
LDA ]F ; LOAD FILL CHAR
STA (GBPSH),Y ; STORE AT SCREEN ADDRESS
JMP :LOOP ; LOOP UNTIL FINISHED
:EXIT
RTS

View File

@ -0,0 +1,41 @@
*
*``````````````````````````````*
* THLINE (NATHAN RIGGS) *
* *
* INPUT: *
* *
* WPAR1 = X ORIGIN *
* WPAR1+1 = X DESTINATION *
* BPAR1 = Y POSITION *
* BPAR2 = FILL CHARACTER *
* *
* OUTPUT: HORIZONTAL LINE TO *
* SCREEN *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^^ ^^^ *
* *
* CYCLES: 90+ *
* SIZE: 47 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]X1 EQU WPAR1 ; 1 BYTE
]X2 EQU WPAR1+1 ; 1 BYTE
]Y1 EQU BPAR1 ; 1 BYTE
]F EQU BPAR2 ; 1 BYTE
*
THLINE
LDA ]Y1 ; LOAD ROW
LDY ]X1 ; LOAD X START POS
:LOOP
JSR GBCALC ; GOSUB GBASCALC ROUTINE,
; WHICH FINDS MEMLOC FOR
; POSITION ON SCREEN
LDA ]F
STA (GBPSH),Y ; PUSH ]F TO SCREEN MEM
LDA ]Y1
INY ; INCREASE X POS
CPY ]X2 ; IF LESS THAN X END POS
BNE :LOOP ; REPEAT UNTIL DONE
:EXIT
RTS

View File

@ -0,0 +1,57 @@
*
*``````````````````````````````*
* TRECTF (NATHAN RIGGS) *
* *
* INPUT: *
* *
* WPAR1 = X ORIGIN *
* WPAR1+1 = X DESTINATION *
* WPAR2 = Y ORIGIN *
* WPAR2+1 = Y DESTINATION *
* BPAR1 = FILL CHARACTER *
* *
* OUTPUT *
* *
* FILLED RECTANGLE TO SCREEN *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^^ *
* *
* CYCLES: 69+ *
* SIZE: 74 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]X1 EQU WPAR1 ; 1 BYTE
]X2 EQU WPAR1+1 ; 1 BYTE
]Y1 EQU WPAR2 ; 1 BYTE
]Y2 EQU WPAR2+1 ; 1 BYTE
]F EQU BPAR1 ; 1 BYTE
*
]XC EQU VARTAB ; 1 BYTE
]YC EQU VARTAB+1 ; 1 BYTE
*
TRECTF
LDA ]X1
STA ]XC
LDA ]Y1
STA ]YC
:LP1 ; PRINT HORIZONTAL LINE
LDA ]YC
LDY ]XC
JSR GBCALC ; GET SCREEN MEMORY ADDR
LDA ]F ; OF CURRENT POSITION
STA (GBPSH),Y ; PUT CHAR IN LOCATION
LDA ]YC
INY ; INCREASE XPOS
STY ]XC
CPY ]X2 ; IF XPOS < XMAX,
BNE :LP1 ; KEEP PRINTING LINE
*
LDA ]X1 ; OTHERWISE, RESET XPOS
STA ]XC
INC ]YC ; AND INCREASE YPOS
LDA ]YC
CMP ]Y2 ; IF YPOS < YMAX
BNE :LP1 ; PRINT HORIZONTAL LINE
:EXIT
RTS

View File

@ -0,0 +1,39 @@
*
*``````````````````````````````*
* TVLINE (NATHAN RIGGS) *
* *
* INPUT: *
* *
* ]X1 STORED AT WPAR1 *
* ]Y1 STORED AT WPAR2 *
* ]Y2 STORED AT WPAR2+1 *
* ]F STORED AT BPAR1 *
* *
* OUTPUT: VERT LINE TO SCREEN *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^^ *
* *
* CYCLES: 33+ *
* SIZE: 34 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]X1 EQU WPAR1 ; 1 BYTE
]Y1 EQU WPAR2 ; 1 BYTE
]Y2 EQU WPAR2+1 ; 1 BYTE
]F EQU BPAR1 ; 1 BYTE
*
TVLINE
*
LDA ]Y1
LDY ]X1
:LOOP
JSR GBCALC ; GET POS SCREEN ADDRESS
LDA ]F
STA (GBPSH),Y ; PLOT TO SCREEN MEMORY
INC ]Y1
LDA ]Y1
CMP ]Y2 ; IF Y1 < Y2
BNE :LOOP ; LOOP; ELSE, CONTINUE
:EXIT
RTS

View File

@ -0,0 +1,39 @@
*
*``````````````````````````````*
* TXTPUT (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = FILL CHAR *
* .X = X POSITION *
* .Y = Y POSITION *
* *
* OUTPUT *
* *
* CHAR TO SCREEN AT X,Y *
* *
* DESTROY: AXYNVBDIZCMS *
* ^^^^^ ^^^ *
* *
* CYCLES: 29+ *
* SIZE: 30 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]Y1 EQU VARTAB ; 1 BYTE
]X1 EQU VARTAB+1 ; 1 BYTE
]F EQU VARTAB+3 ; 1 BYTE
CYC ON
*
TXTPUT
*
STA ]F ; GET FILL CHAR
STY ]Y1 ; GET Y POS
STX ]X1 ; GET XPOS
*
LDA ]Y1
LDY ]X1
JSR GBCALC ; GET SCREEN ADDRESS
LDA ]F
STA (GBPSH),Y ; PUSH CHAR TO SCREEN ADDR
:EXIT
RTS

View File

@ -0,0 +1,44 @@
*
*``````````````````````````````*
* XPRINT (NATHAN RIGGS) *
* *
* INPUT: *
* *
* ASC AFTER SUBROUTINE CALL *
* THAT CONTAINS STRING TO PRN *
* *
* OUTPUT *
* *
* STRING TO SCREEN *
* *
* DESTROY: AXYNVBDIZCMS *
* ^ ^^^ ^^ *
* *
* CYCLES: 63+ *
* SIZE: 33 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
XPRINT
PLA ; GET CURRENT
STA ADDR1 ; EXECUTION ADDRESS
PLA
STA ADDR1+1
LDY #$01 ; POINT TO NEXT
; INSTRUCTION
:LOOP
LDA (ADDR1),Y ; GET CHARACTER
BEQ :EXIT ; IF CHAR = $00 THEN EXIT
JSR COUT1 ; OTHERWISE, PRINT CHAR
INY ; INCREASE COUNTER
BNE :LOOP ; IF COUNTER < 255, LOOP
:EXIT
CLC ; CLEAR CARRY
TYA ; MOVE .Y TO .A
ADC ADDR1 ; ADD RETURN LOBYTE
STA ADDR1 ; SAVE
LDA ADDR1+1 ; GET RETURN HIBYTE
ADC #$00 ; ADD CARRY
PHA ; PUSH TO STACK
LDA ADDR1
PHA ; PUSH TO STACK
RTS

6275
source/d3_arrays/DEMO.ARRAYS Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,461 @@
*
*``````````````````````````````*
* DEMO.ARRAYS *
* *
* A DECIDEDLY NON-EXHAUSTIVE *
* DEMO OF ARRAY FUNCTIONALITY *
* IN THE APPLEIIASM LIBRARY. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 14-JUL-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP OFF
TR ON
DSK DEMO.ARRAYS
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (HOOKS,MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.HEAD.REQUIRED
USE MIN.MAC.REQUIRED
USE MIN.MAC.ARRAYS
PUT MIN.HOOKS.ARRAYS
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]VAR1 EQU $300
]COUNT1 EQU $320
]ARRAY1 EQU $4000
]ARRAY2 EQU $5000
]HOME EQU $FC58
*
JSR ]HOME
_PRN "1D AND 2D 8BIT/16BIT ARRAYS",8D
_PRN "===========================",8D8D
_PRN "THIS MACRO LIBRARY AND VARIOUS",8D
_PRN "SUBROUTINES ARE USED FOR THE CREATION,",8D
_PRN "ACCESS AND MANAGEMENT OF ARRAYS THAT",8D
_PRN "CAN BE EITHER ONE OR TWO DIMENSIONS",8D
_PRN "AND CAN HAVE EITHER 255 ELEMENTS PER",8D
_PRN "DIMENSION IN THE CASE OF 8BIT ARRAYS OR",8D
_PRN "UP TO 65,530 ELEMENTS IN THE CASE OF",8D
_PRN "16BIT ARRAYS--AT LEAST, THEORETICALLY.",8D
_PRN "SINCE THAT WOULD TAKE UP THE ENTIRETY",8D
_PRN "OF RAM ON MOST APPLE ][ COMPUTERS,",8D
_PRN "HAVING THAT MANY ELEMENTS IS NOT LIKELY.",8D8D
_WAIT
JSR ]HOME
_PRN "AT LEAST IN THIS LIBRARY, ARRAYS",8D
_PRN "ARE FAIRLY SIMPLE DATA STRUCTURES.",8D
_PRN "EVERY ARRAY HAS A HEADER THAT SPECIFIES",8D
_PRN "THE NUMBER OF ELEMENTS PER DIMENSION",8D
_PRN "AS WELL AS THE LENGTH OF EACH ELEMENT.",8D
_PRN "THESE ARE SET WITH THE DIM MACROS AND",8D
_PRN "SUBROUTINES:",8D8D
_PRN "DIM81: INIT 1-DIMENSIONAL 8BIT ARRAY",8D
_PRN "DIM82: INIT 2-DIMENSIONAL 8BIT ARRAY",8D
_PRN "DIM161: INIT 1-DIMENSIONAL 16BIT ARRAY",8D
_PRN "DIM162: INIT 2-DIMENSIONAL 16BIT ARRAY",8D8D
_WAIT
_PRN "IF YOU NEED FEWER THAN 255 ELEMENTS",8D
_PRN "IN A DIMENSION, I HIGHLY SUGGEST",8D
_PRN "USING THE 8BIT ARRAY MACROS AND,",8D
_PRN "SUBROUTINES, AS THERE IS A SIGNIFICANT",8D
_PRN "SAVING OF BYTES AND CPU CYCLES.",8D
_WAIT
JSR ]HOME
_PRN "LIKE THE DIM MACROS, EACH ARRAY",8D
_PRN "TYPE ALSO HAS A GET AND PUT MACRO AND",8D
_PRN "SET OF SUBROUTINES DEDICATED TO IT:",8D8D
_WAIT
_PRN "GET81: RETRIEVE THE DATA IN A GIVEN",8D
_PRN " ELEMENT AND PUT IN RETURN.",8D
_PRN "GET82: RETRIEVE DATA FROM ELEMENT AT",8D
_PRN " X,Y AND PUT IN RETURN.",8D
_PRN "GET161: GET DATA FROM 16-BIT ELEMENT",8D
_PRN " AND PUT IN RETURN.",8D
_PRN "GET162: GET DATA FROM ELEMENT AT 16BIT",8D
_PRN " X,Y LOCATION AND PUT IN RETURN.",8D8D
_WAIT
_PRN "PUT81: PUT DATA FROM SOURCE LOCATION IN",8D
_PRN " AN ARRAY'S ELEMENT.",8D
_PRN "PUT82: PUT DATA FROM SOURCE ADDRESS IN",8D
_PRN " ARRAY ELEMENT AT X,Y.",8D
_PRN "PUT161: PUT DATA FROM SOURCE ADDRESS IN",8D
_PRN " 16-BIT ARRAY ELEMENT.",8D
_PRN "PUT162: PUT DATA FROM SOURCE INTO 16BIT",8D
_PRN " ARRAY ELEMENT AT X,Y.",8D8D
_WAIT
*
JSR ]HOME
_PRN "ONE-DIMENSIONAL, 8-BIT ARRAYS",8D
_PRN "=============================",8D8D
_PRN "DIM81, GET81, AND PU81 ARE USED FOR",8D
_PRN "1D ARRAYS THAT DON'T NEED MORE THAN",8D
_PRN "A SINGLE DIMENSION OF LESS THAN 255",8D
_PRN "ELEMENTS. FOR MANY USES, THIS SUFFICES;",8D
_PRN "THE FACT THAT THE APPLE ][ IS AN 8-BIT",8D
_PRN "COMPUTER ATTESTS TO THIS FACT.",8D8D
_WAIT
_PRN "HOWEVER, THERE ARE A NUMBER OF CASES ",8D
_PRN "IN WHICH 8-BIT INDEXING ISN'T ENOUGH.",8D
_PRN "AGAIN, MAKE THE CHOICE BASED ON NEED,",8D
_PRN "NOT CONVENIENCE. IF 255 ELEMENTS IS",8D
_PRN "ENOUGH TO ACCOMPLISH THE TASK, USE ",8D
_PRN "THESE MACROS AND SUBROUTINES.",8D8D
_WAIT
JSR ]HOME
_PRN "EIGHT BITS AND ONE DIMENSION: DIM",8D
_PRN "=================================",8D8D
_PRN "THE DIM81 MACRO CREATES A THREE",8D
_PRN "BYTE HEADER THAT HOLDS, IN ORDER:",8D8D
_PRN "BYTE 0: NUMBER OF ELEMENTS",8D
_PRN "BYTE 1: ELEMENT SIZE",8D8D
_PRN "THE GET81 AND PUT81 ROUTINES USE ",8D
_PRN "THIS HEADER TO KNOW HOW MUCH DATA",8D
_PRN "TO READ AND WRITE FROM AN ELEMENT.",8D
_PRN "BASIC CHECKS AGAINST THE INTENDED",8D
_PRN "NUMBER OF ELEMENTS CAN ALSO BE DONE",8D
_PRN "USING THIS HEADER.",8D8D
_WAIT
_PRN " DIM81 #ARRAY1;#10;#2;#$FF",8D8D
_PRN "CREATES AN 8BIT, 1D ARRAY AT THE",8D
_PRN "ADDRESS OF #ARRAY1 WITH TEN ELEMENTS",8D
_PRN "OF 2 BYTES EACH. ALL ELEMENTS ARE",8D
_PRN "FILLED WITH THE LAS PARAMETER, $FF."
_WAIT
JSR ]HOME
_PRN "WE CAN DUMP #ARRAY1 BEFORE AND",8D
_PRN "AFTER USING DIM81 TO SHOW THE",8D
_PRN "DIFFERENCE:",8D8D
_PRN "BEFORE:",8D8D
DUMP #]ARRAY1;#2
DUMP #]ARRAY1+2;#10
DUMP #]ARRAY1+12;#10
_PRN " ",8D8D
_WAIT
DIM81 #]ARRAY1;#10;#2;#$FF
_PRN "AFTER:",8D8D
DUMP #]ARRAY1;#2
DUMP #]ARRAY1+2;#10
DUMP #]ARRAY1+12;#10
_WAIT
JSR ]HOME
_PRN "8 BITS AND ONE DIMENSION: PUT",8D
_PRN "=============================",8D8D
_PRN "THE PUT81 MACRO PUTS THE DATA FROM",8D
_PRN "A SOURCE ADDRESS INTO AN 8BIT, 1D",8D
_PRN "ARRAY ELEMENT. THE SOURCE ADDRESS,",8D
_PRN "ARRAY ADDRESS AND THE ELEMENT NUMBER",8D
_PRN "ARE SPECIFIED AS PARAMETERS, IN",8D
_PRN "THAT ORDER. NOTE THAT THE NUMBER OF",8D
_PRN "BYTES TO COPY INTO THE ELEMENT IS",8D
_PRN "PREDETERMINED BY THE ELEMENT SIZE",8D
_PRN "SET BY DIM81 IN THE HEADER.",8D8D
_PRN "THUS:",8D8D
_WAIT
_PRN " LDA #0",8D
_PRN " STA ]VAR1",8D
_PRN " STA ]VAR1+1",8D
_PRN " PUT81 #]VAR1;#ARRAY1;#3",8D8D
_PRN "WILL PUT $0000 IN ARRAY1'S ",8D
_PRN "ELEMENT 3, WHICH IS TECHNICALLY THE",8D
_PRN "FOURTH ELEMENT DUE TO ZERO INDEXING."
LDA #0
STA ]VAR1
STA ]VAR1+1
PUT81 #]VAR1;#]ARRAY1;#3
_WAIT
JSR ]HOME
_PRN "IF WE DUMP THE ARRAY AGAIN, WE ",8D
_PRN "CAN READILY SEE THE CHANGE:",8D8D
_WAIT
DUMP #]ARRAY1;#2
DUMP #]ARRAY1+2;#10
DUMP #]ARRAY1+12;#10
_WAIT
_PRN " ",8D8D
_PRN "OF COURSE, THIS IS OF LIMITED",8D
_PRN "USE WITHOUT A FUNCTION TO EXTRACT",8D
_PRN "THE ELEMENT INA USEFUL FASHION--",8D
_PRN "RELYING ON THE DUMP MACRO ONLY GOES",8D
_PRN "SO FAR. THAT'S WHERE OUR THIRD MACRO",8D
_PRN "AND SUBROUTINE COMES IN..."
_WAIT
JSR ]HOME
_PRN "8-BIT, 1-DIMENSION ARRAYS: GET",8D
_PRN "==============================",8D8D
_PRN "THE GET81 MACRO GETS THE DATA",8D
_PRN "STORED IN AN ELEMENT AND COPIES IT",8D
_PRN "TO RETURN, STORING THE ELEMENT",8D
_PRN "LENGTH IN RETLEN. THIS ALLOWS YOU",8D
_PRN "TO USE THE ARRAY..WELL, LIKE AN",8D
_PRN "ARRAY. SO:",8D8D
_WAIT
_PRN " GET81 #ARRAY1;#3",8D8D
_PRN "RETRIEVES ELEMENT 3 OF ARRAY1 AND",8D
_PRN "STORES IT IN RETURN FOR USE BY YOUR",8D
_PRN "PROGRAM. WE CAN DUMP RETURN BEFORE",8D
_PRN "AND AFTER USING GET81 TO SHOW",8D
_PRN "THE DIFFERENCE:",8D8D
_WAIT
_PRN "BEFORE:",8D
DUMP #RETURN;RETLEN
_WAIT
_PRN " ",8D8D
_PRN "AFTER: ",8D
GET81 #]ARRAY1;#3
DUMP #RETURN;RETLEN
_WAIT
JSR ]HOME
_PRN "16-BITS AND ONE DIMENSION: DIM161",8D
_PRN "=================================",8D8D
_PRN "DIM161 WORKS IN FORM AND FUNCTION JUST",8D
_PRN "AS DIM81 DOES, EXCEPT IT ACCEPTS",8D
_PRN "A TWO-BYTE VALUE FOR THE NUMBER",8D
_PRN "OF ELEMENTS. BECAUSE OF THIS, THE ARRAY",8D
_PRN "HEADER CREATED IS THREE BYTES INSTEAD",8D
_PRN "OF THE TWO IN 8-BIT ARRAYS. SO:",8D8D
_WAIT
_PRN " DIM161 #ARRAY1;#300;#2;#$00",8D8D
_PRN "WILL INITIALIZE AN ARRAY WITH 0..300",8D
_PRN "ELEMENTS, ONE DIMENSION. AGAIN, THIS",8D
_PRN "CAN TECHNICALLY USE A BIT MORE THAN",8D
_PRN "65,000 ELEMENTS, BUT THIS IS BEYOND",8D
_PRN "IMPRACTICAL FOR THE PURPOSES OF THIS",8D
_PRN "LIBRARY, AS A CONSECUTIVE 64K OF BYTES",8D
_PRN "IS UNLIKELY IN MOST APPLE II SYSTEMS.",8D8D
_WAIT
DIM161 #]ARRAY1;#300;#2;#$00
JSR ]HOME
_PRN "16-BITS AND ONE DIMENSION: PUT",8D
_PRN "==============================",8D8D
_PRN "NOW THAT WE HAVE CREATED OUR ARRAY,",8D
_PRN "WE CAN USE PUT161 TO CHANGE THE DATA",8D
_PRN "IN EACH ELEMENT. AGAIN, THIS WORKS",8D
_PRN "EXACTLY LIKE PUT81, BUT WITH SOME",8D
_PRN "EXTRA BYTES HERE AND THERE TO ACCOUNT",8D
_PRN "FOR THE EXTRA BREADTH. LET'S FILL",8D
_PRN "EACH ELEMENT 0..300 WITH ITS OWN VALUE--",8D
_PRN "THAT IS, 0 WILL HOLD 0, 1 WILL HOLD 1,",8D
_PRN "299 WILL HOLD 2999 AND 300 WILL HOLD",8D
_PRN "300:",8D8D
_WAIT
_PRN " LDA #0",8D
_PRN " STA ]COUNT",8D
_PRN " STA ]COUNT+1",8D
_PRN " TAX",8D
_PRN " TAY",8D
_PRN "LP ",8D
_PRN " PUT161 #]COUNT'#]ARRAY1;]COUNT",8D
_PRN " LDA ]COUNT",8D
_PRN " CLC",8D
_PRN " ADC #1",8D
_PRN " STA ]COUNT",8D
_PRN " LDA ]COUNT+1",8D
_PRN " ADC #0",8D
_PRN " STA ]COUNT+1",8D
_PRN " CMP #$01",8D
_PRN " BNE LP",8D
_PRN " LDA ]COUNT",8D
_PRN " CMP #$2C",8D
_PRN " BNE LP"
_WAIT
*
LDA #0
STA ]COUNT1
STA ]COUNT1+1
TAX
TAY
LP161
PUT161 #]COUNT1;#]ARRAY1;]COUNT1
LDA ]COUNT1
DUMP #]COUNT1;#2
LDA ]COUNT1
CLC
ADC #1
STA ]COUNT1
LDA ]COUNT1+1
ADC #0
STA ]COUNT1+1
CMP #$01
BNE LP161
LDA ]COUNT1
CMP #$2D
BNE LP161
_WAIT
*
JSR ]HOME
_PRN "WE CAN NOW DUMP THE ENTIRE ARRAY",8D
_PRN "TO SEE HOW EACH ELEMENT IS STORED,"
_PRN "ALONG WITH THE THREE BYTE HEADER:",8D8D
_WAIT
DUMP #]ARRAY1;#3
_WAIT
DUMP #]ARRAY1+3;#60
_WAIT
DUMP #]ARRAY1+63;#60
_WAIT
DUMP #]ARRAY1+123;#60
_WAIT
DUMP #]ARRAY1+183;#60
_WAIT
DUMP #]ARRAY1+243;#60
_WAIT
DUMP #]ARRAY1+303;#60
_WAIT
DUMP #]ARRAY1+363;#60
_WAIT
DUMP #]ARRAY1+423;#60
_WAIT
DUMP #]ARRAY1+483;#60
_WAIT
DUMP #]ARRAY1+543;#64
_PRN " ",8D8D
_PRN "WELL THAT CERTAINLY WAS A DUMP...",8D8D
_WAIT
JSR ]HOME
_PRN "16-BITS IN ONE DIMENSION: GET",8D
_PRN "=============================",8D8D
_PRN "AND OF COURSE, WE HAVE THE SAME GET",8D
_PRN "MACRO FOR 16-BIT, 1D ARRAYS, GET162. THIS",8D
_PRN "AGAIN FUNCTIONS THE SAME AS ITS 8-BIT",8D
_PRN "COUNTERPART, EXCEPT THE INDEX IS TWO ",8D
_PRN "BYTES RATHER THAN ONE.",8D8D
_PRN " ",8D8D
_PRN "THUS:",8D8D
_WAIT
_PRN " GET161 #]ARRAY1;#270",8D8D
_PRN "RETURNS: "
GET161 #]ARRAY1;#270
DUMP #RETURN;RETLEN
_WAIT
JSR ]HOME
_PRN "8-BIT, 2D ARRAYS: FML ANOTHER DIM",8D
_PRN "=================================",8D8D
_PRN "AT THIS POINT, YOU SHOULD HAVE A",8D
_PRN "GOOD GRASP AS TO HOW ARRAYS WORK",8D
_PRN "IN THIS LIBRARY. TWO-DIMENSIONAL",8D
_PRN "ARRAYS DO NOT SIGNIFICANTLY DIFFER",8D
_PRN "FROM ONE-DIMENSIONAL ARRAYS; IT JUST",8D
_PRN "MEANS THAT AN EXTRA ELEMENT INDEX IS",8D
_PRN "NEEDED AS A PARAMETER. AS SUCH, WE CAN",8D
_PRN "MOSTLY BREEZE THROUGH THE REST OF THESE.",8D8D
_WAIT
_PRN "TO INITIALIZE A 2D, 8BIT ARRAY:",8D8D
_PRN " DIM82 #ARRAY1;#10;#10;#1;#00",8D8D
_PRN "THIS CREATES AN ARRAY OF TEN BY TEN",8D
_PRN "ELEMENTS (TOTAL OF 100 ELEMENTS) WITH ",8D
_PRN "A LENGTH OF ONE BYTE. EACH ELEMENT",8D
_PRN "IS INITIALIZED TO A VALUE OF 0."
_WAIT
DIM82 #]ARRAY1;#10;#10;#1;#0
JSR ]HOME
_PRN "NOTE THAT WE HAVE A LONGER HEADER",8D
_PRN "THANKS TO THE EXTRA ELEMENT INDEX. THE",8D
_PRN "HEADER CONTAINS THE X-DIMENSION AS ",8D
_PRN "BYTE ZERO, Y-DIMENSION AS BYTE ONE,",8D
_PRN "AND ELEMENT LENGTH AS BYTE TWO, AS SUCH:",8D8D
DUMP #]ARRAY1;#3
_WAIT
_PRN " ",8D8D
_PRN "AND THE REST OF THE ARRAY:",8D8D
DUMP #]ARRAY1+3;#10
DUMP #]ARRAY1+13;#10
DUMP #]ARRAY1+23;#10
DUMP #]ARRAY1+33;#10
DUMP #]ARRAY1+43;#10
DUMP #]ARRAY1+53;#10
DUMP #]ARRAY1+63;#10
DUMP #]ARRAY1+73;#10
DUMP #]ARRAY1+83;#10
DUMP #]ARRAY1+93;#10
_WAIT
JSR ]HOME
_PRN "8-BIT, 2-DIMENSIONAL ARRAYS: PUT, GET",8D
_PRN "=====================================",8D8D
_PRN "AND OF COURSE, JUST AS WITH 1D ARRAYS",8D
_PRN "WE CAN USE PUT82 AND GET82 TO WRITE",8D
_PRN "TO AND READ FROM THE ARRAY:",8D8D
_WAIT
_PRN " LDA #$FF",8D
_PRN " STA ]VAR1",8D
_PRN " PUT82 #]VAR1;#]ARRAY1;#4;#5",8D
_PRN " GET82 #]ARRAY1;#4;#5",8D
_PRN " DUMP #RETURN;RETLEN",8D8D
_PRN "PRODUCES:",8D8D
_WAIT
LDA #$FF
STA ]VAR1
PUT82 #]VAR1;#]ARRAY1;#4;#5
GET82 #]ARRAY1;#4;#5
DUMP #RETURN;RETLEN
_WAIT
JSR ]HOME
_PRN "16-BIT 2D ARRAYS: DIM, GET, PUT",8D
_PRN "===============================",8D8D
_PRN "AND LASTLY, WE CAN USE 16-BIT, TWO-",8D
_PRN "DIMENSIONAL ARRAYS VIA THE DIM162,",8D
_PRN "PUT162, AND GET162 MACROS:",8D8D
_PRN " DIM162 #]ARRAY1;#300;#300;#1;#$00",8D
_PRN " PUT162 #]VAR1;#]ARRAY1;#280;#280",8D
_PRN " GET162 #]ARRAY1;#280;#280",8D
_PRN " DUMP #RETURN;RETLEN",8D8D
_PRN "PRODUCES:",8D8D
_WAIT
DIM162 #]ARRAY1;#300;#2;#1;#$00
PUT162 #]VAR1;#]ARRAY1;#280;#1
GET162 #]ARRAY1;#280;#1
DUMP #RETURN;RETLEN
_WAIT
JSR ]HOME
_PRN " ",8D8D
_PRN "FIN.",8D8D8D
*
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES (ROUTINES) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINE INCLUDES
*
** 8-BIT 1-DIMENSIONAL ARRAY SUBROUTINES
*
PUT MIN.SUB.ADIM81
PUT MIN.SUB.AGET81
PUT MIN.SUB.APUT81
*
** 8-BIT 2-DIMENSIONAL ARRAY SUBROUTINES
*
PUT MIN.SUB.ADIM82
PUT MIN.SUB.AGET82
PUT MIN.SUB.APUT82
*
** 16-BIT 1-DIMENSIONAL ARRAYS
*
PUT MIN.SUB.ADIM161
PUT MIN.SUB.APUT161
PUT MIN.SUB.AGET161
*
** 16-BIT 2-DIMENSIONAL ARRAYS
*
PUT MIN.SUB.ADIM162
PUT MIN.SUB.APUT162
PUT MIN.SUB.AGET162

Some files were not shown because too many files have changed in this diff Show More