[net.micro.atari] Bios calls For Modula-2

bammi@cwruecmp.UUCP (Jwahar R. Bammi) (02/10/86)

	Here are definition and implementation modules for bios calls
for use with TDI's Modula-2. I found these on CompuServe. I have
almost completed a similar interface for xbios calls, that i will post
shortly.

----
#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	bioscall.def
#	bioscall.mod
# This archive created: Mon Feb 10 03:10:05 1986
# By:	Jwahar R. Bammi ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'bioscall.def'" '(1125 characters)'
if test -f 'bioscall.def'
then
	echo shar: over-writing existing file "'bioscall.def'"
fi
sed 's/^X//' << \SHAR_EOF > 'bioscall.def'
XDEFINITION MODULE BIOScalls;
X
XFROM SYSTEM IMPORT ADDRESS , CODE , SETREG , REGISTER;
X
XEXPORT QUALIFIED getmpb, bconstat, bconin, bconout, rwabs, setexc, tickcal,
X                 getbpb, bcostat, mediach, drvmap, kbshift;
X
XPROCEDURE getmpb( pmpb : ADDRESS );  (* BIOS call #0 *)
X
XPROCEDURE bconstat ( dev : CARDINAL ) : LONGINT;  (* BIOS call #1 *)
X
XPROCEDURE bconin( dev : CARDINAL ) : LONGINT;  (* BIOS call #2 *)
X
XPROCEDURE bconout( dev : CARDINAL; ByteOut : CARDINAL );  (* BIOS call #3 *)
X
XPROCEDURE rwabs( buff : ADDRESS ; rwflag, count, recno, dev : CARDINAL )
X: LONGINT;  (* BIOS call #4 *)
X
XPROCEDURE setexc( vecnum : CARDINAL; vec : ADDRESS): ADDRESS;
X                                                          (* BIOS call #5 *)
XPROCEDURE tickcal(): LONGINT;  (* BIOS call #6 *)
X
XPROCEDURE getbpb( dev : CARDINAL ): ADDRESS;  (* BIOS call #7 *)
X
XPROCEDURE bcostat( dev : CARDINAL ): LONGINT;  (* BIOS call #8 *)
X
XPROCEDURE mediach( dev :CARDINAL ): LONGINT;  (* BIOS call #9 *)
X
XPROCEDURE drvmap(): LONGCARD;  (* BIOS call #10 *)
X
XPROCEDURE kbshift( mode : LONGINT ) : LONGINT;  (* BIOS call *11 *)
X
XEND BIOScalls.
SHAR_EOF
if test 1125 -ne "`wc -c 'bioscall.def'`"
then
	echo shar: error transmitting "'bioscall.def'" '(should have been 1125 characters)'
fi
echo shar: extracting "'bioscall.mod'" '(6054 characters)'
if test -f 'bioscall.mod'
then
	echo shar: over-writing existing file "'bioscall.mod'"
fi
sed 's/^X//' << \SHAR_EOF > 'bioscall.mod'
XIMPLEMENTATION MODULE BIOScalls;
X
XFROM SYSTEM IMPORT ADDRESS , CODE , SETREG , REGISTER;
X
X
XPROCEDURE getmpb( pmpb : ADDRESS );  (* BIOS call #0 *)
X
XBEGIN;
X
X  SETREG(7,pmpb);                (* put table address into register D7 *)
X  CODE( 2F07H );                 (* push longword D7 onto stack *)
X  CODE(3F3CH,0,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X
XEND getmpb;
X
X
XPROCEDURE bconstat ( dev : CARDINAL ) : LONGINT;  (* BIOS call #1 *)
X
XBEGIN;
X
X  CODE( 7000H );                 (* clear D0 register *)
X  SETREG(7,ADDRESS(dev));        (* put device number into register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,1,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0));   (* return status of character device *)
X
XEND bconstat;
X
X
XPROCEDURE bconin( dev : CARDINAL ) : LONGINT;  (* BIOS call #2 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  SETREG(7,ADDRESS(dev));        (* put device number into register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,2,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0));   (* return input character longword *)
X
XEND bconin;
X
X
XPROCEDURE bconout( dev : CARDINAL; ByteOut : CARDINAL );  (* BIOS call #3 *)
X
XBEGIN;
X
X  SETREG(7,ADDRESS(ByteOut));    (* put character into register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  SETREG(7,ADDRESS(dev));        (* put device number into register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,3,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X
XEND bconout;
X
X
XPROCEDURE rwabs( buff : ADDRESS ; rwflag, count, recno, dev : CARDINAL )
X: LONGINT;  (* BIOS call #4 *)
X
XBEGIN;
X
X  CODE ( 7000H );              (* clear D0 register *)
X  SETREG(7,ADDRESS(dev));      (* put mass storage device number into *)
X                                   (* register D7 *)
X  CODE( 3F07H );               (* push word D7 onto stack *)
X  SETREG(7,ADDRESS(recno));    (* put starting logical sector number into *)
X                                    (* register D7 *)
X  CODE( 3F07H );               (* push word D7 onto stack *)
X  SETREG(7,ADDRESS(count));    (* put sector count into register D7 *)
X  CODE( 3F07H );               (* push word D7 onto stack *)
X  SETREG(7,buff);              (* put buffer address into register D7 *)
X  CODE( 2F07H );               (* push longword D7 onto stack *)
X  SETREG(7,ADDRESS(rwflag));   (* put read/write flag into register D7 *)
X  CODE( 3F07H );               (* push word D7 onto stack *)
X  CODE(3F3CH,4,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0)); (* return mass storage device error *)
X                                  (* status word *)
XEND rwabs;
X
X
XPROCEDURE setexc( vecnum : CARDINAL; vec : ADDRESS): ADDRESS;
X                                                          (* BIOS call #5 *)
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  SETREG(7,vec);                 (* put vector address into register D7 *) 
X  CODE ( 2F07H );                (* push longword D7 onto stack *)
X  SETREG(7,ADDRESS(vecnum));     (* put vector number into register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,5,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN REGISTER(0);            (* return old vector address *)
X
XEND setexc;
X
X
XPROCEDURE tickcal(): LONGINT;  (* BIOS call #6 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  CODE(3F3CH,6,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0));   (* return system clock in milliseconds *)
X
XEND tickcal;
X
X
XPROCEDURE getbpb( dev : CARDINAL ): ADDRESS;  (* BIOS call #7 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  SETREG(7,ADDRESS(dev));        (* put mass storage device number into *)
X                                    (* register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,7,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN REGISTER(0);            (* return BIOS parameter block pointer *)
X
XEND getbpb;
X
X
XPROCEDURE bcostat( dev : CARDINAL ): LONGINT;  (* BIOS call #8 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  SETREG(7,ADDRESS(dev));        (* put device number into register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,8,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0));   (* return device output status word *)
X
XEND bcostat;
X
X
XPROCEDURE mediach( dev :CARDINAL ): LONGINT;  (* BIOS call #9 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  SETREG(7,ADDRESS(dev));        (* put mass storage device number into *)
X                                    (* register D7 *)
X  CODE( 3F07H );                 (* push word D7 onto stack *)
X  CODE(3F3CH,9,4E4DH);   (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0));   (* return mass storage device media *)
X                                    (* status word *)
XEND mediach;
X  
X
XPROCEDURE drvmap(): LONGCARD;  (* BIOS call #10 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  CODE(3F3CH,10,4E4DH);  (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGCARD(REGISTER(0));  (* returns longword that maps active *)
X                                    (* storage units available *)
XEND drvmap;
X
X
XPROCEDURE kbshift( mode : LONGINT ) : LONGINT;  (* BIOS call *11 *)
X
XBEGIN;
X
X  CODE ( 7000H );                (* clear D0 register *)
X  SETREG(7,ADDRESS(mode));       (* put mode into register D7 *)
X  CODE( 2F07H );                 (* push longword D7 onto stack *)
X  CODE(3F3CH,11,4E4DH);  (* push call number onto stack and call TRAP #13 *)
X  RETURN LONGINT(REGISTER(0));   (* return shift key status word *)
X
XEND kbshift;
X
X
XEND BIOScalls.
SHAR_EOF
if test 6054 -ne "`wc -c 'bioscall.mod'`"
then
	echo shar: error transmitting "'bioscall.mod'" '(should have been 6054 characters)'
fi
#	End of shell archive
exit 0
-- 
					Jwahar R. Bammi
			       Usenet:  .....!decvax!cwruecmp!bammi
			        CSnet:  bammi@case
				 Arpa:  bammi%case@csnet-relay
			   CompuServe:  71515,155