AppleIIAsm-Collection/source/d6_DOS/T.MAC.DOSREQ.ASM
2021-06-05 21:40:51 -04:00

416 lines
14 KiB
NASM

*
*``````````````````````````````*
* MAC.DOSREQ.ASM *
* *
* THESE MACROS ARE REQUIRED *
* FOR USING THE DOS MACROS AND *
* SUBROUTINES. GENERALLY, THIS *
* INCLUDES LOW LEVEL ROUTINES *
* AND MACRO SHORTCUTS TO SAVE *
* MEMORY DURING ASSEMBLY. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 06-MAY-2021 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
* *
* SUBROUTINE FILES USED *
* *
* *
* LIST OF MACROS *
* *
* FMFIL : FILL FILE MGR PARAMS *
* FMNAM : STRING TO PARAM AREA *
* FRWB : BYTE READ/WRITE MAC *
* FWRTB : WRITE A BYTE TO FILE *
* FRDB : READ BYTE FROM FILE *
* FRWR : RANGE READ/WRITE MAC *
* FRDR : READ RANGE FROM FILE *
* FWRTR : WRITE RANGE TO FILE *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*``````````````````````````````*
* SETRWTS *
* *
* SET THE PARAMETERS FOR RWTS. *
* *
* PARAMETERS *
* *
* ]1 = RWTS SLOT *
* ]2 = RWTS DRIVE *
* ]3 = RWTS VOLUME *
* ]4 = RWTS TRACK *
* ]5 = RWTS SECTOR *
* ]6 = RWTS BUFFER *
* ]7 = RWTS COMMAND *
* *
* CYCLES: 228+ *
* SIZE: 66 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SRWTS MAC
LDA ]1 ; {4C3B} RWTS SLOT
STA MSLOT ; {4C3B}
LDA ]2 ; {4C3B} RWTS DRIVE
STA MDRIVE ; {4C3B}
LDA ]3 ; {4C3B} RWTS VOLUME
STA MVOL ; {4C3B}
LDA ]4 ; {4C3B} RWTS TRACK
STA MTRACK ; {4C3B}
LDA ]5 ; {4C3B} RWTS SECTOR
STA MSECTOR ; {4C3B}
IF #=]6 ; IF VALUE IS A LITERAL
LDA ]6 ; {4C3B} THEN STORE LITERAL
STA MBUFFER ; {4C3B} LOW AND HIGH BYTES
LDA ]6/$100 ; {4C3B}
STA MBUFFER+1 ; {4C3B}
ELSE ; OTHERWISE,
LDA ]6 ; {4C3B} LOAD VALUE FROM ADDRESS
STA MBUFFER ; {4C3B} AND STORE IN BUFFER
LDA ]6+1 ; {4C3B} ADDRESS POINTER
STA MBUFFER+1 ; {4C3B}
FIN
LDA ]7 ; {4C3B} RWTS COMMAND
STA MCMD ; {4C3B}
JSR _SETRWTS ; {148C3B} SET THE PARAMETERS
<<<
*
*``````````````````````````````*
* GRWTS *
* *
* RUN THE RWTS ROUTINE. *
* *
* PARAMETERS *
* *
* NONE. *
* *
* CYCLES: 19+ *
* SIZE: 11 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
GRWTS MAC
JSR ]LOCRPL ; {6C3B} (GET ]LOCRPL CYCLES/SIZE)
JSR ]RWTS ; {6C3B} (GET CYCLES/SIZE)
LDA #0 ; {3C2B}
STA $48 ; {4C3B} FIX P REG FOR DOS
<<<
*
*``````````````````````````````*
* FMFIL (NATHAN RIGGS) *
* *
* FILLS THE MOST COMMON AREAS *
* IN THE FILE PARAMETERS. THIS *
* INCLUDES THE COMMAND, SLOT, *
* DISK, VOLUME AND RECORD. *
* *
* PARAMETERS *
* *
* ]1 = COMMAND *
* ]2 = SLOT *
* ]3 = DRIVE *
* ]4 = VOLUME (0 FOR ANY) *
* ]5 = RECORD NUMBER *
* *
* CYCLES: 603+ *
* SIZE: 52 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FMFIL MAC
JSR _FMGETPARM ; {26C3B} GET FILE PARAMS ADDRESS
JSR _FMBUFFSCAN ; {217C3B} SCAN FOR FREE FILE BUFF
JSR _SETPBUFFS ; {125C3B} SET PARAMETER BUFFERS
LDA ]1 ; {4C3B} COMMAND TO PARAMETERS
LDY #]P_CMD ; {3C2B} SET INDEX TO COMMAND OFFSET
JSR _FMPSET ; {36C3B} SET COMMAND
LDA ]2 ; {4C3B} SLOT TO PARAMETERS
LDY #]P_SLOT ; {3C2B} SET INDEX TO SLOT OFFSET
JSR _FMPSET ; {36C3B} SET SLOT
; VOLUME AND RECORD NUMBER
LDA ]3 ; {4C3B} DRIVE TO PARAMETERS
LDY #]P_DRV ; {3C2B} SET INDEX TO DRIVE OFFSET
JSR _FMPSET ; {36C3B} SET DRIVE
LDA ]4 ; {4C3B} VOLUME TO PARAMS, 0 FOR ANY
LDY #]P_VOL ; {3C2B} SET INDEX TO VOLUME OFFSET
JSR _FMPSET ; {36C3B} SET VOLUME
_AXLIT ]5 ; {8C6B}
LDY #]P_REC ; {3C2B} SET INDEX TO RECORD OFFSET
JSR _FMPSETA ; {52C3B} SET RECORD LOW AND HIGH
<<<
*
*``````````````````````````````*
* FMNAM (NATHAN RIGGS) *
* *
* COPY A STRING HOLDING THE *
* NAME OF A FILE BEING HANDLED *
* TO A 30-BYTE LOCATION FILLED *
* WITH SPACES, THEN COPY THAT *
* TO THE FILE PARAMETER LIST. *
* *
* PARAMETERS *
* *
* ]1 = ADDRESS OF STRING *
* *
* CYCLES: 117+ *
* SIZE: 6 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FMNAM MAC
_AXLIT ]1
JSR _NAMESTR ; {70C3B} COPY STRING TO TEMP BUFF
JSR _FN2BUFF ; {47C3B} COPY TEMP BUFF TO FNAME BUFF
<<<
*
*``````````````````````````````*
* FRWB (NATHAN RIGGS) *
* *
* EITHER READ OR WRITE A BYTE. *
* THIS USUALLY ISN'T CALLED *
* DIRECTLY, BUT THROUGH *
* ANOTHER MACRO. *
* *
* PARAMETERS *
* *
* ]1 = READ/WRITE FLAG (#3/4) *
* ]2 = COMMAND *
* ]3 = SLOT *
* ]4 = DRIVE *
* ]5 = VOLUME (0 FOR ANY) *
* ]6 = RECORD NUMBER *
* ]7 = BYTE OFFSET *
* ]8 = BYTE TO WRITE (0 READ) *
* *
* CYCLES: 779+ *
* SIZE: 342 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FRWB MAC
*
FMFIL ]2;]3;]4;]5;]6 ; {603C303B}
*
LDA ]1 ; {4C3B} READ OR WRITE FLAG
LDY #]P_RDWR ; {3C2B} INDEX TO READ/WRITE FLAG
JSR _FMPSET ; {30C3B} SET THE READ/WRITE FLAG
LDA #]SC_PRWB ; {3C2B} SET POS THEN READ OR WRITE
LDY #]P_SUBC ; {3C2B} SET INDEX TO SUBCODE OFFSET
JSR _FMPSET ; {30C3B} SET THE SUBCODE
_AXLIT ]7 ; {8C6B}
LDY #]P_BOFF ; {3C2B} INDEX TO BYTE OFFSET
JSR _FMPSETA ; {46C3B} SET TWO BYTE OFFSET VALUE
LDA ]8 ; {4C3B} BYTE TO WRITE, IF WRITING
LDY #]P_BYTE ; {3C2B} WRITE BYTE
JSR _FMPSET ; {30C3B} SET BYTE
LDX #1 ; {3C2B} DON'T CREATE NEW FILE
JSR ]FMRUN ; {6C3B} RUN FILE MANAGER
<<<
*
*``````````````````````````````*
* FWRTB (NATHAN RIGGS) *
* WRITE A BYTE TO A FILE. *
* *
* PARAMETERS *
* *
* ]1 = SLOT *
* ]2 = DRIVE *
* ]3 = VOLUME *
* ]4 = RECORD NUMBER *
* ]5 = BYTE OFFSET *
* ]6 = BYTE TO WRITE (0 READ) *
* *
* CYCLES: 665+ *
* SIZE: 312 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FWRTB MAC
*
** FWRB ARGUMENTS
**
** ]1 = READ OR WRITE CODE (3 = READ, 4 = WRITE)
** ]2 = READ OR WRITE COMMAND
** ]3 = SLOT
** ]4 = DRIVE
** ]5 = VOLUME (0 FOR ANY)
** ]6 = RECORD NUMBER
** ]7 = BYTE OFFSET
** ]8 = BYTE TO WRITE, IF WRITING
*
FRWB #4;#]FC_WRIT;]1;]2;]3;]4;]5;]6 ; {603C303B}
*
LDY #]P_RETC ; {3C2B} INDEX TO RETURN CODE OFFSET
JSR _FMPGET ; {26C3B} GET THE RETURN CODE
TAX ; {2C1B} PASS BACK IN .X
JSR _BUFFCLEAR ; {31C3B} CLEAR FILE BUFFER FOR USE
<<<
*
*``````````````````````````````*
* FRDB (NATHAN RIGGS) *
* *
* READ A BYTE FROM A FILE. *
* *
* PARAMETERS *
* *
* ]1 = SLOT *
* ]2 = DRIVE *
* ]3 = VOLUME *
* ]4 = RECORD NUMBER *
* ]5 = BYTE OFFSET *
* ]6 = BYTE TO WRITE (0 READ) *
* *
* CYCLES: 700+ *
* SIZE: 321 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FRDB MAC
*
** FWRB ARGUMENTS
**
** ]1 = READ OR WRITE CODE (3 = READ, 4 = WRITE)
** ]2 = READ OR WRITE COMMAND
** ]3 = SLOT
** ]4 = DRIVE
** ]5 = VOLUME (0 FOR ANY)
** ]6 = RECORD NUMBER
** ]7 = BYTE OFFSET
** ]8 = BYTE TO WRITE, IF WRITING
*
FRWB #3;#]FC_READ;]1;]2;]3;]4;]5;]6 ; {603C303B}
*
LDY #]P_BYTE ; {3C2B} INDEX TO BYTE TO READ
JSR _FMPGET ; {26C3B} GET BYTE IN THE PARAMETERS
STA ZPB1 ; {3C2B} HOLD IN ZERO PAGE
LDY #]P_RETC ; {3C2B} INDEX TO THE RETURN CODE OFFSET
JSR _FMPGET ; {26C3B} GET THE RETURN CODE
TAX ; {2C1B} PASS BACK IN .X
JSR _BUFFCLEAR ; {31C3B} CLEAR FILE BUFFER FOR USE
LDA ZPB1 ; {3C2B} PASS READ BYTE IN .A
<<<
*
*``````````````````````````````*
* FRWR (NATHAN RIGGS) *
* *
* READ OR WRITE A RANGE. *
* *
* PARAMETERS *
* *
* ]1 = READ/WRITE FLAG *
* ]2 = COMMAND *
* ]3 = SLOT *
* ]4 = DRIVE *
* ]5 = VOLUME *
* ]6 = RECORD NUMBER *
* ]7 = BYTE OFFSET *
* ]8 = RANGE ADDRESS *
* ]TEMP = RANGE LENGTH *
* *
* CYCLES: 846+ *
* SIZE: 356 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FRWR MAC
*
** SET THE COMMAND, SLOT, DRIVE, VOLUME AND RECORD NUMBER
*
FMFIL ]2;]3;]4;]5;]6 ; {603C303B}
*
LDA ]1 ; {4C3B} LOAD READ OR WRITE FLAG
LDY #]P_RDWR ; {3C2B} INDEX TO RD/WRT FLAG OFFSET
JSR _FMPSET ; {30C3B} SET READ OR WRITE FLAG
LDA #]SC_PRWR ; {3C2B} SUBCODE FOR POS AND READ/WRITE
LDY #]P_SUBC ; {3C2B} INDEX TO SUBCODE OFFSET
JSR _FMPSET ; {30C3B} SET SUBCODE
_AXLIT ]7 ; {8C6B}
LDY #]P_BOFF ; {3C2B} INDEX TO BYTE OFFSET
JSR _FMPSETA ; {46C3B} SET BYTE OFFSET
_AXLIT ]8 ; {8C6B}
LDY #]P_RADDR ; {3C2B} INDEX TO RANGE ADDR OFFSET
JSR _FMPSETA ; {46C3B} SET RANGE ADDRESS
LDA ]TEMP ; {4C3B} GET RANGE LENGTH
LDX ]TEMP+1 ; {4C3B} LOW BYTE AND HIGH BYTE
LDY #]P_RLEN ; {3C2B} INDEX TO RANGE LENGTH OFFSET
JSR _FMPSETA ; {46C3B} SET RANGE LENGTH
LDX #1 ; {3C2B} DON'T CREATE NEW FILE
JSR ]FMRUN ; {6C3B} RUN FILE MANAGER
<<<
*
*``````````````````````````````*
* FRDR (NATHAN RIGGS) *
* *
* READ A RANGE FROM A FILE. *
* *
* PARAMETERS *
* *
* ]1 = SLOT *
* ]2 = DRIVE *
* ]3 = VOLUME *
* ]4 = RECORD NUMBER *
* ]5 = BYTE OFFSET *
* ]6 = RANGE ADDRESS *
* ]7 = RANGE LENGTH *
* *
* CYCLES: 697+ *
* SIZE: 336 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FRDR MAC
IF #=]7 ; IF RANGE ADDR IS A LITERAL
LDA ]7/$100 ; {4C3B} THEN LOAD HIGH BYTE
STA ]TEMP+1 ; {4C3B} AND STORE
LDA ]7 ; {4C3B} AND LOAD LOW BYTE
STA ]TEMP ; {4C3B} AND STORE IN TEMP
ELSE
LDA ]7+1 ; {4C3B} LOAD HIGH BYTE
STA ]TEMP+1 ; {4C3B} STORE HIGH BYTE
LDA ]7 ; {4C3B} LOAD LOW BYTE
STA ]TEMP ; {4C3B} STORE LOW BYTE
FIN
*
FRWR #3;#]FC_READ;]1;]2;]3;]4;]5;]6 ; {603C303B}
*
LDY #]P_RETC ; {3C2B} INDEX TO RETURN CODE
JSR _FMPGET ; {26C3B} GET RETURN CODE
TAX ; {2C1B} HOLD IN .X
JSR _BUFFCLEAR ; {31C3B} CLEAR FILE BUFFER FOR USE
<<<
*
*``````````````````````````````*
* FWRTR (NATHAN RIGGS) *
* *
* WRITE A RANGE TO A FILE. *
* *
* PARAMETERS *
* *
* ]1 = SLOT *
* ]2 = DRIVE *
* ]3 = VOLUME *
* ]4 = RECORD NUMBER *
* ]5 = BYTE OFFSET *
* ]6 = RANGE ADDRESS *
* ]7 = RANGE LENGTH *
* *
* CYCLES: 940+ *
* SIZE: 389 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
FWRTR MAC
IF #=]7 ; IF RANGE LENGTH IS A LITERAL THEN
LDA ]7/$100 ; {4C3B} LOAD HIGH BYTE
STA ]TEMP+1 ; {4C3B} AND STORE IN TEMP
LDA ]7 ; {4C3B} LOAD LOW BYTE
STA ]TEMP ; {4C3B} AND STORE IN TEMP
ELSE ; OTHERWISE
LDA ]7+1 ; {4C3B} LOAD HIGH BYTE
STA ]TEMP+1 ; {4C3B} AND STORE IN TEMP
LDA ]7 ; {4C3B} LOAD LOW BYTE
STA ]TEMP ; {4C3B} AND STORE IN TEMP
FIN
*
FRWR #4;#]FC_WRIT;]1;]2;]3;]4;]5;]6 ; {846C356B}
*
LDY #]P_RETC ; {3C2B} INDEX TO RETURN CODE
JSR _FMPGET ; {26C3B} GET RETURN CODE
TAX ; {2C1B} PASS BACK IN .X
JSR _BUFFCLEAR ; {31C3B} CLEAR FILE BUFFER FOR USE
<<<