MAC65 I/O library

This commit is contained in:
Pecusx
2024-05-02 10:47:41 +02:00
parent 5ca73bd1b6
commit c63f6d807b
2 changed files with 386 additions and 0 deletions
+292
View File
@@ -0,0 +1,292 @@
.TITLE "IOMAC.LIB -- FTe system I/O macros"
.PAGE " Support Macros"
.IF .NOT .DEF IOCB
.ERROR "You must include SYSEQU.M65 ahead of this!!"
.ENDIF
;
; These macros are called by the actual I/O macros
; to perform the rudimentary register load functions.
;
;
; MACRO: @CH
;
; Loads IOCB number (parameter 1) into X register.
;
; If parameter value is 0 to 7, immediate channel number
; is assumed.
;
; If parameter value is > 7 then a memory location
; is assumed to contain the channel number.
;
.MACRO @CH
.IF %1>7
LDA %1
ASL A
ASL A
ASL A
ASL A
TAX
.ELSE
LDX #%1*16
.ENDIF
.ENDM
;
;
; MACRO: @CV
;
; Loads Constant or Value into accumultor (A-register)
;
; If value of parameter 1 is 0-255, @CV
; assumes it's an (immediate) constant.
;
; Otherwise the value is assumed to
; be a memory location (non-zero page).
;
;
;
.MACRO @CV
.IF %1<256
LDA #%1
.ELSE
LDA %1
.ENDIF
.ENDM
;
;
;
;
; MACRO: @FL
;
; @FL is used to establish a filespec (file name)
;
; If a literal string is passed, @FL will
; generate the string in line, jump
; around it, and place its address
; in the IOCB pointed to by the X-register.
;
; If a non-zero page label is passed
; the MACRO assumes it to be the label
; of a valid filespec and uses it instead.
;
;
;
.MACRO @FL
.IF %1<256
JMP *+%1+4
@F .BYTE %$1,0
LDA # <@F
STA ICBADR,X
LDA # >@F
STA ICBADR+1,X
.ELSE
LDA # <%1
STA ICBADR,X
LDA # >%1
STA ICBADR+1,X
.ENDIF
.ENDM
.PAGE " XIO macro"
;
; MACRO: XIO
;
; FORM: XIO cmd,ch[,aux1,aux2][,filespec]
;
; ch is given as in the @CH macro
; cmd, aux1, aux2 are given as in the @CV macro
; filespec is given as in the @FL macro
;
; performs familiar XIO operations with/for OS/A+
;
; If aux1 is given, aux2 must also be given
; If aux1 and aux2 are omitted, they are set to zero
; If the filespec is omitted, "S:" is assumed
;
.MACRO XIO
.IF %0<2 .OR %0>5
.ERROR "XIO: wrong number of arguments"
.ELSE
@CH %2
@CV %1
STA ICCOM,X ; COMMAND
.IF %0>=4
@CV %3
STA ICAUX1,X
@CV %4
STA ICAUX2,X
.ELSE
LDA #0
STA ICAUX1,X
STA ICAUX2,X
.ENDIF
.IF %0=2 .OR %0=4
@FL "S:"
.ELSE
@@IO .= %0
@FL %$(@@IO)
.ENDIF
JSR CIO
.ENDIF
.ENDM
.PAGE " OPEN macro"
;
; MACRO: OPEN
;
; FORM: OPEN ch,aux1,aux2,filespec
;
; ch is given as in the @CH macro
; aux1 and aux2 are given as in the @CV macro
; filespec is given as in the @FL macro
;
; will attempt to open the given file name on
; the given channel, using the open "modes"
; specified by aux1 and aux2
;
.MACRO OPEN
.IF %0<>4
.ERROR "OPEN: wrong number of arguments"
.ELSE
.IF %4<256
XIO COPN,%1,%2,%3,%$4
.ELSE
XIO COPN,%1,%2,%3,%4
.ENDIF
.ENDIF
.ENDM
.PAGE " BGET and BPUT macros"
;
; MACROS: BGET and BPUT
;
; FORM: BGET ch,buf,len
; BPUT ch,buf,len
;
; ch is given as in the @CH macro
; len is ALWAYS assumed to be an immediate
; and actual value...never a memory address
; buf must be the address of an appropriate
; buffer in memory
;
; puts or gets length bytes to/from the
; specified buffer, uses binary read/write
;
;
; first: a common macro
;
.MACRO @GP
@CH %1
LDA #%4
STA ICCOM,X
LDA # <%2
STA ICBADR,X
LDA # >%2
STA ICBADR+1,X
LDA # <%3
STA ICBLEN,X
LDA # >%3
STA ICBLEN+1,X
JSR CIO
.ENDM
;
.MACRO BGET
.IF %0<>3
.ERROR "BGET: wrong number of parameters"
.ELSE
@GP %1,%2,%3,CGBINR
.ENDIF
.ENDM
;
.MACRO BPUT
.IF %0<>3
.ERROR "BPUT: wrong number of parameters"
.ELSE
@GP %1,%2,%3,CPBINR
.ENDIF
.ENDM
;
.PAGE " PRINT macro"
;
; MACRO: PRINT
;
; FORM: PRINT ch[,buffer[,length]]
;
; ch is as given in @CH macro
; if no buffer, prints just a RETURN
; if no length given, 255 assumed
;
; used to print text. To print text without RETURN,
; length must be given. See OS/A+ manual
;
; EXCEPTION: second parameter may be a literal
; string (e.g., PRINT 0,"test"), in which
; case the length (if given) is ignored.
;
.MACRO PRINT
.IF %0<1 .OR %0>3
.ERROR "PRINT: wrong number of parameters"
.ELSE
.IF %0>1
.IF %2<128
JMP *+4+%2
@IO .BYTE %$2,$9B
@GP %1,@IO,%2+1,CPTXTR
.ELSE
.IF %0=2
@GP %1,%2,255,CPTXTR
.ELSE
@GP %1,%2,%3,CPTXTR
.ENDIF
.ENDIF
.ELSE
JMP *+4
@IO .BYTE $9B
@GP %1,@IO,1,CPTXTR
.ENDIF
.ENDIF
.ENDM
;
.PAGE " INPUT macro"
;
; MACRO: INPUT
;
; FORM: INPUT ch,buf,len
;
; ch is given as in the @CH macro
; buf MUST be a proper buffer address
; len may be omitted, in which case 255 is assumed
;
; gets a line of text input to the given
; buffer, maximum of length bytes
;
.MACRO INPUT
.IF %0<2 .OR %0>3
.ERROR "INPUT: wrong number of parameters"
.ELSE
.IF %0=2
@GP %1,%2,255,CGTXTR
.ELSE
@GP %1,%2,%3,CGTXTR
.ENDIF
.ENDIF
.ENDM
.PAGE " CLOSE macro"
;
; MACRO: CLOSE
;
; FORM: CLOSE ch
;
; ch is given as in the @CH macro
;
; closes channel ch
;
.MACRO CLOSE
.IF %0<>1
.ERROR "CLOSE: wrong number of parameters"
.ELSE
@CH %1
LDA #CCLOSE
STA ICCOM,X
JSR CIO
.ENDIF
.ENDM
;
;;;;;;;;;;; END OF IOMAC.LIB ;;;;;;;;;;;;
;
+94
View File
@@ -0,0 +1,94 @@
.PAGE "FTe SYSTEM EQUATES FOR ATARI"
;
; FILE = #DN:SYSEQU.ASM
;
;
; I/O CONTROL BLOCK EQUATES
;
SAVEPC = * ; SAVE CURRENT ORG
;
*= $0340 ;START OF SYSTEM IOCBS
IOCB
;
ICHID *= *+1 ;DEVICE HANDLER IS (SET BY OS)
ICDNO *= *+1 ;DEVICE NUMBER (SET BY OS)
ICCOM *= *+1 ;I/O COMMAND
ICSTA *= *+1 ;I/O STATUS
ICBADR *= *+2 ;BUFFER ADDRESS
ICPUT *= *+2 ;DH PUT ROUTINE (ADR-1)
ICBLEN *= *+2 ;BUFFER LENGTH
ICAUX1 *= *+1 ;AUX 1
ICAUX2 *= *+1 ;AUX 2
ICAUX3 *= *+1 ;AUX 3
ICAUX4 *= *+1 ;AUX 4
ICAUX5 *= *+1 ;AUX 5
ICAUX6 *= *+1 ;AUX 6
;
IOCBLEN = *-IOCB ;LENGTH OF ONE IOCB
;
; IOCB COMMAND VALUE EQUATES
;
COPN = 3 ;OPEN
CGBINR = 7 ;GET BINARY RECORD
CGTXTR = 5 ;GET TEXT RECORD
CPBINR = 11 ;PUT BINARY RECORD
CPTXTR = 9 ;PUT TEXT RECORD
CCLOSE = 12 ;CLOSE
CSTAT = 13 ;GET STATUS
;
; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER
;
CREN = 32 ;RENAME
CERA = 33 ;ERASE
CPRO = 35 ;PROTECT
CUNP = 36 ;UNPROTECT
CPOINT = 37 ;POINT
CNOTE = 38 ;NOTE
;
; AUX1 VALUES REQD FOR OPEN
;
OPIN = 4 ;OPEN INPUT
OPOUT = 8 ;OPEN OUTPUT
OPUPD = 12 ;OPEN UPDATE
OPAPND = 9 ;OPEN APPEND
OPDIR = 6 ;OPEN DIRECTORY
;
.PAGE
;
; EXECUTE FLAG DEFINES
;
EXCYES = $80 ; EXECUTE IN PROGRESS
EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN
EXCNEW = $10 ; EXECUTE START UP MODE
EXCSUP = $20 ; COLD START EXEC FLAG
;
; MISC ADDRESS EQUATES
;
CPALOC = $0A ; POINTER TO CP/A
WARMST = $08 ; WAR, START (0=COLD)
MEMLO = $02E7 ; AVAIL MEM (LOW) PTR
MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR
APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY
INITADR = $02E2 ; ATARI LOAD/INIT ADR
GOADR = $02E0 ; ATARI LOAD/GO ADR
CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION
CIO = $E456 ;CIO ENTRY ADR
EOL = $9B ; END OF LINE CHAR
;
; CP/A FUNCTION AND VALUE DISPLACEMSNT
; (INDIRECT THROUGH CPALOC)
; IE. (CPALOC),Y
;
CPGNFN = 3 ; GET NEXT FILE NAME
CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES)
CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE)
CPEXFL = $0B ; EXECUTE FLAG
CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES)
CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES
CPFNAM = $21 ; FILENAME BUFFER
RUNLOC = $3D ; CP/A LOAD/RUN ADR
CPCMDB = $3F ; COMMAND BUFFER (60 BYTES)
CPCMDGO = $F3
;
*= SAVEPC ; RESTORE PC
;