Having some trouble with fopen on cp/m target.
Posted: Fri Jun 25, 2021 12:17 am
I am working on porting my macro-32 code to run on cp/m. And I hit a wall....
here is the repo https://github.com/jayacotton/z80-macro.git
It acts like there is a limit to the number of open files. I think the open file count
is 4 and the include makes 5.
Now, fopen is in main.c and macro.c. The calls in main work just fine. The
call in macro does not work.
The file I want to open is present on the drive and its readable etc. I just don't get
what its doing....
Use the Makefile and put the MACRO.COM in your test system. (SIMH) maybe.
Then load on these files listed below (Uppercase names).
D>macro hello
process this file HELLO.MAC
Can't open the file "COMMON.MAC"
Here is the offending code snip, yes in include stdio.h above.
New = fopen (mylbuff, "r");
if (New == 0)
{
printf ("Can't open the file \"%s\"\n", mylbuff);
fprintf (listfile, "Bad include directive\n%s\n", buff);
CloseOut ();
}
I did try to hard code the file name, no joy there.
Here is code to test the program with.
D>cat hello.mac
#INCLUDE "COMMON.MAC"
#INCLUDE "WTO.MAC"
#INCLUDE "PRE.MAC"
#INCLUDE "POST.MAC"
#INCLUDE "PRESTACK.MAC"
COMMON
ORG 100H
PRE
WTO 'HELLO WORLD'
POST
PRESTACK
END
D>cat common.mac
;
; COMMON DEFINES FOR CPM
;
MACRO COMMON
COMMON
BDOS EQU 5H ; DOS ENTRY POINT
BIOS EQU 5H ; DOS ENTRY POINT
RESET EQU 0 ; JUMP HERE TO RESET
CONSI EQU 1 ; READ CONSOLE
CONSO EQU 2 ; TYPE FUNCTION
GETCOS EQU 11 ; GET CONSOLE STATUS
GETVER EQU 12 ; GET CP/M VERSION
SELDISK EQU 14 ; SELECT DISK
OPENF EQU 15 ; FILE OPEN
CLOSEF EQU 16 ; CLOSE FILE
SRCHF EQU 17 ; GET FIRST DIRECTORY ENTRY
SRCHN EQU 18 ; SEARCH NEXT DIRECTORY ENTRY
DELF EQU 19 ; DELETE FILE
READF EQU 20 ; READ SEQUENCIAL
WRITEF EQU 21 ; WRITE SEQUENCIAL
CREATF EQU 22 ; CREAT FILE
RENF EQU 23 ; RENAME FILE
GETDRIV EQU 24 ; GET A LIST OF LOG-IN DRIVES....
GETCUR EQU 25 ; GET THE CURRENT DRIVER NUMBER
SETDMA EQU 26 ; SET DISK I/O BUFFER ADDRESS
READRAN EQU 33 ; READ RANDOM RECORD
WRITRAN EQU 34 ; WRITE RANDOM RECORD
CFS EQU 35 ; COMPUTE FILE SIZE
CFGTBL EQU 69 ; RETURN THE CONFIG TABLE
;
FCB EQU 5CH ; LOCATION OF FILE CONTROL BLOCK
BUFF EQU 80H ; LOCATION OF DISK INPUT BUFFER
DEFAULT EQU BUFF
;
CR EQU 0DH
LF EQU 0AH
TYPEF EQU CONSO
PRINTF EQU 9
;
; FILE CONTROL BLOCK STUFF
;
FCBDN EQU FCB+0 ; DISK NAME
FCBFN EQU FCB+1 ; FILE NAME
FCBFT EQU FCB+9 ; FILE TYPE
FCBRL EQU FCB+12 ; CURRENT REEL NUMBER
FCBRC EQU FCB+15 ; CURRENT RECORD NUMBER MOD 128
FCBCR EQU FCB+32 ; NEXT RECORD NUMBER
FCBLN EQU FCB+33 ; FCB LENGTH
MEND
D>cat wto.mac
;
; WRITE TO OPERATOR
;
MACRO WTO
%LAB WTO %LINE
GBLB %WTO
AIF ('%LAB' EQ '')&NOLAB
%LAB EQU $
&NOLAB ANOP
PUSH H
PUSH D
PUSH B
JMP A$SYSIN
B$SYSIN DB %LINE
DB CR,LF
DB '$'
A$SYSIN EQU $
LXI D,B$SYSIN
&GEN ANOP
CALL WTO
POP B
POP D
POP H
AIF (%WTO)&DONE
%WTO SETB 1
JMP X$SYSIN
WTO EQU $
MVI C,PRINTF
CALL BDOS
RET
X$SYSIN EQU $
&DONE ANOP
MEND
D>cat post.mac
;
; COMMON POST PROCESS
;
MACRO POST
%LAB POST
AIF ('%LAB' EQ '')&NOLAB
%LAB EQU $
&NOLAB ANOP
LHLD OLDSP
SPHL
RET
MEND
D>cat prestack.mac
MACRO PRESTACK
PRESTACK
OLDSP DW 0
DS 128
NEWSP EQU $
MEND
D>cat pre.mac
;
; COMMON PREAMBLE FOR CPM
;
MACRO PRE
PRE
LXI H,0
DAD SP
SHLD OLDSP
LXI SP,NEWSP
MEND
here is the repo https://github.com/jayacotton/z80-macro.git
It acts like there is a limit to the number of open files. I think the open file count
is 4 and the include makes 5.
Now, fopen is in main.c and macro.c. The calls in main work just fine. The
call in macro does not work.
The file I want to open is present on the drive and its readable etc. I just don't get
what its doing....
Use the Makefile and put the MACRO.COM in your test system. (SIMH) maybe.
Then load on these files listed below (Uppercase names).
D>macro hello
process this file HELLO.MAC
Can't open the file "COMMON.MAC"
Here is the offending code snip, yes in include stdio.h above.
New = fopen (mylbuff, "r");
if (New == 0)
{
printf ("Can't open the file \"%s\"\n", mylbuff);
fprintf (listfile, "Bad include directive\n%s\n", buff);
CloseOut ();
}
I did try to hard code the file name, no joy there.
Here is code to test the program with.
D>cat hello.mac
#INCLUDE "COMMON.MAC"
#INCLUDE "WTO.MAC"
#INCLUDE "PRE.MAC"
#INCLUDE "POST.MAC"
#INCLUDE "PRESTACK.MAC"
COMMON
ORG 100H
PRE
WTO 'HELLO WORLD'
POST
PRESTACK
END
D>cat common.mac
;
; COMMON DEFINES FOR CPM
;
MACRO COMMON
COMMON
BDOS EQU 5H ; DOS ENTRY POINT
BIOS EQU 5H ; DOS ENTRY POINT
RESET EQU 0 ; JUMP HERE TO RESET
CONSI EQU 1 ; READ CONSOLE
CONSO EQU 2 ; TYPE FUNCTION
GETCOS EQU 11 ; GET CONSOLE STATUS
GETVER EQU 12 ; GET CP/M VERSION
SELDISK EQU 14 ; SELECT DISK
OPENF EQU 15 ; FILE OPEN
CLOSEF EQU 16 ; CLOSE FILE
SRCHF EQU 17 ; GET FIRST DIRECTORY ENTRY
SRCHN EQU 18 ; SEARCH NEXT DIRECTORY ENTRY
DELF EQU 19 ; DELETE FILE
READF EQU 20 ; READ SEQUENCIAL
WRITEF EQU 21 ; WRITE SEQUENCIAL
CREATF EQU 22 ; CREAT FILE
RENF EQU 23 ; RENAME FILE
GETDRIV EQU 24 ; GET A LIST OF LOG-IN DRIVES....
GETCUR EQU 25 ; GET THE CURRENT DRIVER NUMBER
SETDMA EQU 26 ; SET DISK I/O BUFFER ADDRESS
READRAN EQU 33 ; READ RANDOM RECORD
WRITRAN EQU 34 ; WRITE RANDOM RECORD
CFS EQU 35 ; COMPUTE FILE SIZE
CFGTBL EQU 69 ; RETURN THE CONFIG TABLE
;
FCB EQU 5CH ; LOCATION OF FILE CONTROL BLOCK
BUFF EQU 80H ; LOCATION OF DISK INPUT BUFFER
DEFAULT EQU BUFF
;
CR EQU 0DH
LF EQU 0AH
TYPEF EQU CONSO
PRINTF EQU 9
;
; FILE CONTROL BLOCK STUFF
;
FCBDN EQU FCB+0 ; DISK NAME
FCBFN EQU FCB+1 ; FILE NAME
FCBFT EQU FCB+9 ; FILE TYPE
FCBRL EQU FCB+12 ; CURRENT REEL NUMBER
FCBRC EQU FCB+15 ; CURRENT RECORD NUMBER MOD 128
FCBCR EQU FCB+32 ; NEXT RECORD NUMBER
FCBLN EQU FCB+33 ; FCB LENGTH
MEND
D>cat wto.mac
;
; WRITE TO OPERATOR
;
MACRO WTO
%LAB WTO %LINE
GBLB %WTO
AIF ('%LAB' EQ '')&NOLAB
%LAB EQU $
&NOLAB ANOP
PUSH H
PUSH D
PUSH B
JMP A$SYSIN
B$SYSIN DB %LINE
DB CR,LF
DB '$'
A$SYSIN EQU $
LXI D,B$SYSIN
&GEN ANOP
CALL WTO
POP B
POP D
POP H
AIF (%WTO)&DONE
%WTO SETB 1
JMP X$SYSIN
WTO EQU $
MVI C,PRINTF
CALL BDOS
RET
X$SYSIN EQU $
&DONE ANOP
MEND
D>cat post.mac
;
; COMMON POST PROCESS
;
MACRO POST
%LAB POST
AIF ('%LAB' EQ '')&NOLAB
%LAB EQU $
&NOLAB ANOP
LHLD OLDSP
SPHL
RET
MEND
D>cat prestack.mac
MACRO PRESTACK
PRESTACK
OLDSP DW 0
DS 128
NEWSP EQU $
MEND
D>cat pre.mac
;
; COMMON PREAMBLE FOR CPM
;
MACRO PRE
PRE
LXI H,0
DAD SP
SHLD OLDSP
LXI SP,NEWSP
MEND