From c63f6d807b7cd18b4621ddb8b600c3ec0e9bf9bb Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 2 May 2024 10:47:41 +0200 Subject: [PATCH] MAC65 I/O library --- lib/iomac.asm | 292 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/sysequ.asm | 94 ++++++++++++++++ 2 files changed, 386 insertions(+) create mode 100644 lib/iomac.asm create mode 100644 lib/sysequ.asm diff --git a/lib/iomac.asm b/lib/iomac.asm new file mode 100644 index 0000000..6f0a514 --- /dev/null +++ b/lib/iomac.asm @@ -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 ;;;;;;;;;;;; +; diff --git a/lib/sysequ.asm b/lib/sysequ.asm new file mode 100644 index 0000000..bac7566 --- /dev/null +++ b/lib/sysequ.asm @@ -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 +;