mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2024-12-12 01:30:00 +00:00
4554eaf2ae
- added cycle and byte count comments - additionally added status flag clobbering comments - wrote beginning of final documentation form in markdown for disk 1: REQUIRED - consolidated macros and subroutines on disk 1 - created alias macros for 65C02, 8080, and Z80 architectures - entirely rewrote and expanded documentation for disk 1 - rewrote disk 1 demo file to use fewer bytes by using comments instead of _PRN statements - implemented a software architeture that will span across all libraries in the collection - added .ASM extension to text sources to help with file attribution on contemporary systems - slightly modified the naming convention for EXEC files - fixed minor errors
7.8 KiB
7.8 KiB
Disk 1 Macros: The Required Library
Disk 1: REQUIRED contains three main macro files, unlike most disks which only contain a single macro file. They are as follows:
- MAC.REQUIRED.ASM
- Contains all of the Macros required by the rest of the library collection. This must always be included in the main program. This also contains emulation macros for a select number of 65C02 instructions, if limited to a 6502 instruction set.
- MAC.ALIAS.8080.ASM
- These are aliases for some instructions in the 8080 instruction set. Note that these may not work exactly like the 8080 versions, and are considered works-in-progress.
- MAC.ALIAS.Z80.ASM
- These are aliases for some instructions in the Z80 instruction set. Like with the previous alias file, these are works-in-progress.
Be sure to consult the detailed reference for Disk 1: The Required Library for further explanation of how the macros work, their source code, and an explanation of the source code of any subroutines the macros may rely upon.
MAC.REQUIRED.ASM
MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES |
---|---|---|---|---|---|---|
_AXLIT |
none | ]1 = memory address | Determine if address sent is direct or indirect and parse accordingly in registers. .A = address low byte .X = address high byte |
NZ | 8 | 6 |
_AXSTR |
_AXLIT |
]1 = memory address | Determine if literal string or address is sent and parse accordingly. .A = address low byte .X = address high byte |
NZ | 11 | 9+ |
_ISLIT |
none | ]1 = memory address | Determine if address sent is direct or indirect and parse accordingly onto the stack .A = address low byte .X = address high byte |
NZ | 14 | 8 |
_ISSTR |
_ISLIT |
]1 = memory address | Determine if parameter is a literal string or address and parse address accordingly to the stack. .A = address low byte .X = address high byte |
NZ | 13 or 8 | 10+ or 6 |
_MLIT |
none | ]1 = memory address ]2 = destination ZP address |
Determine if address sent is direct or indirect and parse accordingly to zero page .A = address low byte .X = address high byte |
NZ | 16 | 12 |
_MSTR |
_ISLIT |
]1 = memory address ]2 = destination ZP address |
Determine if parameter passed is a literal string and parse address accordingly to the zero page .A address low byte .X = address high byte |
NZ | 15 or 8 | 14+ or 6 |
_PRN |
__P |
]1 = string to print | Print a literal string to the screen. | NZCV | 161+ | 9+ |
_WAIT |
__w |
none | Loop until a button is pressed. .A = keypress value |
NZ | 14+ | 10 |
BEEP |
none | ]1 = length of beep | Make beeping sound | NZC | 108+ | 15 |
BCCL |
none | ]1 = address to jump to if true | Long Branch if Carry is Clear | none | 7 | 8 |
BCSL |
none | ]1 = address to jump to if true | Long Branch if Carry is Set | none | 7 | 8 |
BEQL |
none | ]1 = address to jump to if true | Long Branch if Equal | none | 7 | 8 |
BMIL |
none | ]1 = address to jump to if true | Long Branch if Negative | none | 7 | 8 |
BNEL |
none | ]1 = address to jump to if true | Loong Branch if Not Equal | none | 7 | 8 |
BPLL |
none | ]1 = address to jump to if true | Long Branch if Positive | none | 7 | 8 |
BVCL |
none | ]1 = address to jump to if true | Long Branch if Overflow Clear | none | 7 | 8 |
BVSL |
none | ]1 = address to jump to if true | Long Branch if Overflow Set | none | 7 | 8 |
CBRA |
none | ]1 = address to jump to if true | Long Branch Always (65C02 emulation) | none | 4 | 4 |
CPHX |
none | none | .X pushed to stack (65C02 Emulation) | NZ | 11 | 6 |
CPHY |
none | none | .Y pushed to stack (65C02 Emulation) | NZ | 12 | 6 |
CPLX |
none | none | top of stack in .X (65C02 Emulation) | NZ | 11 | 6 |
CPLY |
none | none | top of stack in .Y (65C02 Emulation) | NZ | 11 | 7 |
CTXY |
none | none | .X copied to .Y (65C02 Emulation) | NZ | 10 | 6 |
CTYX |
none | none | .Y copied to .X (65C02 Emulation) | NZ | 10 | 6 |
CLRHI |
none | none | high nibble of .A cleared | NZC | 10 | 6 |
DELAY |
DELAYMS |
]1 = number of milliseconds (0..255) | Delay for a given number of milliseconds (byte) | NZC | 58+ | 10 |
DUMP |
_AXLIT ;__DUMP |
]1 = memory address ]2 = number of bytes to dump |
Dump a region of memory to the screen .A = number of bytes displayed |
NZCV | 811+ | 16 |
ERRH |
_AXLIT ;__ERRH |
]1 = memory address | sets handle for Applesoft Error Handling | NZC | 73 | 7 |
GBIT |
none | ]1 = byte to check ]2 = bit mask |
Get bit from .A at specified location in byte. .A = 0 or 1 |
NZ | 14 | 15 |
GRET |
_AXLIT ;__GETRET |
]1 = destination address | Get RETURN value and copy it to specified address. .A = return value length |
NZC | 43+ | 27 |
PEEK |
_AXLIT |
]1 = address to peek | Load an address value into .A. .A holds address value |
NZC | 28 | 18 |
POKE |
_AXLIT |
]1 = poke value ]2 = address to poke |
load a value into given address. | NZC | 32 | 20 |
MFILL |
_MLIT MEMFILL |
]1 = starting address ]2 = length ]3 = fill value |
Fill a block of memory with a single value. | none | NZ | 110+ |
MOVB |
_MLIT MEMMOVE |
]1 = source address ]2 = destination address ]3 = length in bytes |
Move a block of memory at one address to another address. | NZCV | 267+ | 48 |
MSWAP |
_MLIT MEMSWAP |
]1 = first address ]2 = second address ]3 = length in bytes |
Swap the values held in two different locks of memory. | NZC | 98+ | 36 |
MAC.ALIAS.8080.ASM
MACRO | DEPENDENCIES | PARAMETERS | ACTION | CYCLES | BYTE |
---|---|---|---|---|---|
CALL |
none | label to JSR to |
mimics JSR instruction |
6 | 3 |
RET |
none | none | mimics RTS instruction |
6 | 1 |
JA |
none | label to JMP to |
JMP if .A > CMP |
14 | 9 |
JAE |
none | label to JMP to |
JMP if .A >= CMP |
8 | 4 |
JB |
none | label to JMP to |
JMP if .A < CMP |
8 | 4 |
JBE |
none | label to JMP to |
JMP if .A <= CMP |
1 | 6 |
JC |
none | label to JMP to |
JMP if .C = 1 |
8 | 4 |
JE |
none | label to JMP to |
JMP if EQUAL |
8 | 4 |
JG |
none | label to JMP to |
JA |
11 | 9 |
JGE |
none | label to JMP to |
JAE |
8 | 4 |
JL |
none | label to JMP to |
JB |
8 | 4 |
JLE |
none | label to JMP to |
JBE |
11 | 6 |
JNC |
none | label to JMP to |
JMP if .C = 0 |
8 | 4 |
JNE |
none | label to JMP to |
JMP if NOT EQUAL |
8 | 4 |
JZ |
none | label to JMP to |
JMP if .Z = 1 |
8 | 4 |
JNZ |
none | label to JMP to |
JMP if .Z = 0 |
8 | 4 |
JS |
none | label to JMP to |
JMP if SIGNED |
8 | 4 |
JNS |
none | label to JMP to |
JMP if NOT SIGNED |
8 | 4 |
JO |
none | label to JMP to |
JMP if OVERFLOW = 1 |
8 | 4 |
JNO |
none | label to JMP to |
JMP if OVERFLOW = 0 |
8 | 4 |
ANC |
none | ]1 = first addend ]2 = second addend |
Add No Carry (ADD in 8080) | 12 | 8 |
SNC |
none | ]1 = Minuend ]2 = Subtrahend |
Subtract No Carry (SUB in 8080) | 12 | 8 |
PUSHA |
none | none | Push All Registers | 30 | 14 |
PULLA |
none | none | Pull All Registers | 19 | 24 |
POPA |
none | none | PULLA |
19 | 24 |
MAC.ALIAS.Z80.ASM
MACRO | DEPENDENCIES | PARAMETERS | ACTION | CYCLES | BYTE |
---|---|---|---|---|---|
CALL |
none | label to JSR to |
JSR equivalent |
6 | 3 |
CPL |
none | none | Invert bits in .A | 2 | 2 |
JP |
none | label to JMP to |
JMP equivalent |
5 | 1 |
LD |
none | ???? | move value from source to destination (non-operational) | ? | ? |
POP |
none | none | PLA equivalent |
4 | 1 |
RET |
none | none | RTS equivalent |
6 | 1 |
SCF |
none | none | SEC equivalent |
2 | 1 |