mirror of
https://github.com/Pecusx/micro-sparta-dos.git
synced 2026-05-20 22:33:23 +02:00
MAC65 I/O library
This commit is contained in:
+292
@@ -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 ;;;;;;;;;;;;
|
||||
;
|
||||
@@ -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
|
||||
;
|
||||
Reference in New Issue
Block a user