[net.micro.6809] OS/9 "modem" pgm w/directions & assembly routines.

doug@odin.UUCP (11/02/83)

PROCEDURE Terminal
REM ************************************************************
REM ***                                                      ***
REM ***                                                      ***
REM *** TERMINAL enables communication between two CPUs.     ***
REM *** co-operating program not required on 2ed machine     ***
REM ***                                                      ***
REM *** Copyright (C) 1983 The JBM Group Inc.                ***
REM ***                                                      ***
REM *** This software is made freely available to the OS9    ***
REM *** community, for private noncommercial use only, with  ***
REM *** inclusion of the above copyright notice.  Distribu-  ***
REM *** tion in this mode does not transfer copyright or     ***
REM *** title to any other person or group.  The JBM Group   ***
REM *** does not undertake to support this software, nor     ***
REM *** does it warrant this software, as distributed or in  ***
REM *** modified form, for any purpose whatsoever.  Use of   ***
REM *** this software is understood to release The JBM Group ***
REM *** Inc. from all claims for liability resulting from or ***
REM *** associated with its use.                             ***
REM ***                                                      ***
REM ***                                                      ***
REM ************************************************************
REM ************************************************************
REM ***                                                      ***
REM *** INSTALLING TERMINAL:                                 ***
REM *** - X1 is a sample device descriptor for a com. port   ***
REM *** - Do not run a "tsmon" on the com. port              ***
REM *** - Options J & K require dma capability disks         ***
REM ***                                                      ***
REM *** USING TERMINAL:                                      ***
REM *** - Most of the commands "toggle" beteen states        ***
REM *** - Option A controls special  character processing    ***
REM *** - The pause interval is useful for systems not       ***
REM ***   using x-on/x-off protocals.                        ***
REM *** - Option B sets full-duplex/half-duplex.             ***
REM *** - The name of the printer path is /p1 (see line 1300)***
REM *** - Option D receives data from systems which only     ***
REM ***   append <CR> to lines instead of <CR><LF>           ***
REM *** - Terminal does not send <EOF> to the receiving      ***
REM ***   system. You must enter it yourself.                ***
REM ***                                                      ***
REM *** BUGS:                                                ***
REM *** - During extended file transfers, terminal "pops out ***
REM ***   of gear" and the menu re-appears.                  ***
REM ***   Just enter the P option to continue with no        ***
REM ***   loss of data!                                      ***
REM *** - The <DEL> character is not passed to the target    ***
REM ***                                                      ***
REM *** REFERENCES:                                          ***
REM *** OCT 1983 issue of FORUM68                            ***
REM ***                                                      ***
100 
REM *** dim program varibles ***
DIM cntrl:STRING[2]
DIM comi,como,char,opt,La120,file,sfile,lfile,zero:BYTE
TYPE commun_def=record:BYTE
DIM commun:commun_def
DIM COMMANDS(32),device,sendfile:STRING[32]
DIM Cntrl_byte(16):BYTE
DIM maxsize,sleepytime,sleepyctr,sleepsignal,E:INTEGER
DIM array(32767):BYTE
DIM filename:STRING[29]
DIM address(3):INTEGER
DIM i1:INTEGER

REM *** initialize program varibles ***
FOR i1=1 TO 16
Cntrl_byte(i1)=$00
NEXT i1
address(1)=$00
address(2)=$00
address(3)=$7FFF \REM *** size of buffer array ***
Cntrl_byte(4)=$FF
zero=0
sleepytime=0
sleepyctr=0
(* sleepsignal = characters to process before sleep
sleepsignal=32

200 
REM *** set up program default values ***
COMMANDS(1)="Control Enabled" \COMMANDS($11)="Control Disabled"
COMMANDS(2)="Host Echo" \COMMANDS($12)="Local Echo"
COMMANDS(3)="Printer Off" \COMMANDS($13)="Printer On"
COMMANDS(4)="Auto LF On" \COMMANDS($14)="Auto LF Off"
COMMANDS(5)="Print Buffer" \COMMANDS($15)=""
COMMANDS(6)="Reset Buffer" \COMMANDS($16)=""
COMMANDS(7)="Save Buffer" \COMMANDS($17)=""
COMMANDS(8)="Load File" \COMMANDS($18)=""
COMMANDS(9)="Transmit Buffer" \COMMANDS($19)=""
COMMANDS($0A)="Rx File" \COMMANDS($1A)=""
COMMANDS($0B)="Tx File" \COMMANDS($1B)=""
COMMANDS($0C)="Open Buffer" \COMMANDS($1C)="Close Buffer"
COMMANDS($0D)="Buffer Status" \COMMANDS($1D)=""
COMMANDS($0E)="System Command" \COMMANDS($1E)=""
COMMANDS($0F)="Return to OS9" \COMMANDS($1F)=""
COMMANDS($10)="Terminal Mode" \COMMANDS($20)=""
PRINT "Terminal - Copyright (C) 1983 The JBM Group Inc."
300 
ON ERROR 
REM open *** program paths ***
INPUT "device to communicate to ",device
ON ERROR GOTO 4400
OPEN #comi,device:READ
OPEN #como,device:WRITE
ON ERROR 
opt=1
400 
REM *** SET UP menu ***
PRINT 
PRINT 
FOR x=1 TO 16
IF Cntrl_byte(x)=0 THEN 
PRINT CHR$(64+x),COMMANDS(x)
ELSE 
PRINT CHR$(64+x),COMMANDS($10+x)
ENDIF 
NEXT x
PRINT 
PRINT 
PRINT "Input Option  "; 
GET #0,opt
PRINT 
PRINT 
IF opt>=65 AND opt<=80 THEN 
opt=opt-64
GOTO 500
ENDIF 
IF opt>=97 AND opt<=112 THEN 
opt=opt-96
GOTO 500
ENDIF 
GOTO 400
500 
REM *** flip byte status ***
IF Cntrl_byte(opt)=$00 THEN 
Cntrl_byte(opt)=$FF
ELSE 
Cntrl_byte(opt)=$00
ENDIF 
REM *** operate on instructions ***
ON INT(opt) GOSUB 1200,510,1300,510,1400,1500,1600,2000,2200,2300
,2700,3400,3500,3600,3700,3800
GOTO 400
510 
RETURN 
600 
REM *** get a char from keyboard ***
RUN inbyt(zero,char)
char=LAND(char,$7F)
IF char<>$7F AND char<>18 THEN 
PUT #como,char
IF sleepytime<>0 THEN 
GOSUB 4260
ENDIF 
ENDIF 
RETURN 
700 
REM *** get a char from comdevice ***
RUN inbyt(comi,char)
char=LAND(char,$7F)
IF char<>$7F THEN 
IF char=$0A THEN 
IF Cntrl_byte(4)=$00 THEN 
PRINT CHR$($0A); 
ENDIF 
ELSE 
PRINT CHR$(char); 
ENDIF 
IF sleepytime<>0 THEN 
GOSUB 4260
ENDIF 
ENDIF 
RETURN 
800 
REM *** turn local echo off ***
cntrl=CHR$(4)+CHR$(0)
RUN tcx(cntrl)
RETURN 
900 
REM *** turn local echo echo on
cntrl=CHR$(4)+CHR$(1)
RUN tcx(cntrl)
RETURN 
1000 
REM *** communicate with device until control 'r' from kb ***
GOSUB 800
1100 
GOSUB 600
IF char=18 THEN 
GOSUB 900
END 
ENDIF 
GOSUB 700
GOTO 1100
1200 
REM *** local terminal control status ***
IF Cntrl_byte(1)=$00 THEN 
REM *** restore controls
cntrl=CHR$($0C)+CHR$($1A)
RUN tcx(cntrl)
cntrl=CHR$($0D)+CHR$($04)
RUN tcx(cntrl)
cntrl=CH$($0E)+CHR$($01)
RUN tcx(cntrl)
cntrl=CHR$($10)+CHR$($03)
RUN tcx(cntrl)
cntrl=CHR$($11)+CHR$($0B)
RUN tcx(cntrl)
ELSE 
REM *** disable controls ***
cntrl=CHR$($0C)+CHR$(0)
RUN tcx(cntrl)
cntrl=CHR$($0D)+CHR$(0)
RUN tcx(cntrl)
cntrl=CHR$($0E)+CHR$($00)
RUN tcx(cntrl)
cntrl=CHR$($10)+CHR$(0)
RUN tcx(cntrl)
cntrl=CHR$($11)+CHR$(0)
RUN tcx(cntrl)
ENDIF 
RETURN 
1300 
REM *** print channel control ***
IF Cntrl_byte(3)=0 THEN 
REM *** close path ***
PRINT 
PRINT "Closing Printer Port"
PRINT 
CLOSE #La120
ELSE 
REM *** open path ***
PRINT 
PRINT "Opening Printer Port"
PRINT 
OPEN #La120,"/P1"
ENDIF 
RETURN 
1400 
REM *** print buffer routine ***
REM *** if print port open to print as well else just to terminal ***
FOR x=address(1) TO address(2)
PUT #0,array(x+1)
IF array(x+1)=$0D THEN 
PRINT #0,CHR$($0A); 
ENDIF 
IF Cntrl_byte(3)<>0 THEN 
PUT #La120,array(x+1)
IF array(x+1)=$0D THEN 
PRINT #La120,CHR$($0A); 
ENDIF 
ENDIF 
NEXT x

Cntrl_byte(5)=$00

RETURN 
1500 
REM *** reset buffer pointers ***
Cntrl_byte(opt)=0
address(1)=$00
address(2)=$00
RETURN 
1600 
REM *** save buffer to file ***
PRINT 
PRINT "input/path/filename - "; 
INPUT filename
ON ERROR GOTO 1800
CREATE #file,filename
1700 
ON ERROR 
FOR x=address(1) TO address(2)
PUT #file,array(x+1)
NEXT x
CLOSE #file
Cntrl_byte(7)=0
RETURN 
1800 
PRINT 
E:=ERR
GOSUB 4500
PRINT "a) input another filename"
PRINT 
PRINT "b) overwrite filename"
PRINT 
PRINT "return to menu"
ON ERROR 
PRINT 
PRINT 
PRINT "option - "; 
GET #0,opt
PRINT 
PRINT 
IF opt>=65 AND opt<=67 THEN 
opt=opt-64
GOTO 1900
ENDIF 
IF opt>=97 AND opt<=99 THEN 
opt=opt-96
GOTO 1900
ENDIF 
GOTO 1800
1900 
IF option=1 THEN 
GOTO 1600
ENDIF 
IF option=2 THEN 
OPEN #file,filename
GOTO 1700
ENDIF 
IF opt=3 THEN 
Cntrl_byte(7)=0
GOTO 400
ENDIF 
PRINT 
2000 
REM *** load file into buffer ***

INPUT "Input /path/filename ",COMMANDS($18)

ON ERROR GOTO 4300
PRINT 
PRINT "loading "; COMMANDS($18)
OPEN #lfile,COMMANDS($18):READ

REM *** SET UP ADDRESSES ***

address(1)=0
address(2)=0

REM *** REM UNTIL EOF ***

2100 
GET #lfile,array(address(2)+1)
address(2)=address(2)+1
IF address(2)=address(3) THEN 
CLOSE #lfile
PRINT "file to big for buffer"+CHR$(7)
PRINT 
GOTO 400
ENDIF 
GOTO 2100
Cntrl_byte(8)=0

RETURN 
2200 
REM *** transmit contents of buffer ***
GOSUB 4250
ON ERROR GOTO 2210
FOR x=address(1) TO address(2)
PUT #como,array(x+1)
GOSUB 600
IF char=18 THEN 
GOTO 2205
ENDIF 
GOSUB 700
GOSUB 4200
GOSUB 700
GOSUB 4200
IF sleepytime<>0 THEN 
GOSUB 4260
ENDIF 
NEXT x
2205 
GOSUB 700
IF char<>$7F THEN 
GOTO 2205
ENDIF 
Cntrl_byte(opt)=$00
sleepytime=0
RETURN 
2210 
E:=ERR
ON ERROR 
GOSUB 4500
RETURN 
2300 
REM *** recieve data direct to a file ***
IF Cntrl_byte($0A)<>0 THEN 
REM *** create a file for input ***
2400 
PRINT "Input /path/filename - "; 
INPUT filename
COMMANDS($1A)="Rx "+filename
ON ERROR GOTO 2500
CREATE #file,filename
ON ERROR 

RETURN 
2500 
PRINT 
E:=ERR
GOSUB 4500
PRINT 
PRINT "a) input another filename"
PRINT 
PRINT "b) overwrite filename"
PRINT 
PRINT "c) return to menu"
ON ERROR 
PRINT 
PRINT 
PRINT "option - "; 
GET #0,opt
PRINT 
PRINT 
IF opt>=65 AND opt<=67 THEN 
opt=opt-64
GOTO 2600
ENDIF 
IF opt>=97 AND opt<=99 THEN 
opt=opt-96
GOTO 2600
ENDIF 
2600 
IF opt=1 THEN 
filename=""
GOTO 2400
ENDIF 
IF opt=2 THEN 
OPEN #file,filename
RETURN 
ENDIF 
IF opt=3 THEN 
Cntrl_byte($0A)=0
GOTO 400
ENDIF 
GOTO 2500
ELSE 
PRINT 
PRINT "Closing "+filename
PRINT 
CLOSE #file
ENDIF 
RETURN 
2700 
REM *** transmit a file directly ***
PRINT "input/path/filename - "; 
INPUT sendfile
ON ERROR GOTO 3000
OPEN #sfile,sendfile:READ
ON ERROR 
GOSUB 4250
REM *** send file  ***
PRINT 
PRINT "transmitting "; sendfile
PRINT 
PRINT "to abort type CNTRL 'r' "
PRINT 
ON ERROR GOTO 3200
2800 
GET #sfile,char
PUT #como,char
GOSUB 600
IF char=18 THEN 
GOTO 2900
ENDIF 
GOSUB 700
GOSUB 4200
GOSUB 700
GOSUB 4200
IF sleepytime<>0 THEN 
GOSUB 4260
ENDIF 
GOTO 2800
2900 
Cntrl_byte($0B)=0
CLOSE #sfile
2910 
GOSUB 700
IF char<>$7F THEN 
GOTO 2910
ENDIF 
sleepytime=0
RETURN 
3000 
E:=ERR
PRINT 
GOSUB 4500
PRINT 
PRINT "a) input another filename"
PRINT 
PRINT "b) return to menu"
3100 
PRINT 
PRINT "option - "; 
GET #0,opt
PRINT 
IF opt>=65 AND opt<=66 THEN 
opt=opt-64
GOTO 3300
ENDIF 
IF opt>=97 AND opt<=98 THEN 
opt=opt-96
GOTO 3300
ENDIF 
GOTO 3100
3200 
REM *** error encountered ***
E:=ERR
ON ERROR 
IF E<>211 THEN 
GOSUB 4500
GOTO 2900
ELSE 
GOTO 2900
ENDIF 
3300 
IF opt=1 THEN filename=""
GOTO 2700
ENDIF 
IF opt=2 THEN 
Cntrl_byte($0B)=0
GOTO 400
ENDIF 
GOTO 3100
3400 
REM *** open buffer ***
REM *** no operation except to toggle status bit ***
REM return
3500 
REM *** print buffer status ***
PRINT "No of Characters stored = "; address(2)
PRINT "Amount of storage left  = "; address(3)-address(2)
Cntrl_byte($0D)=0
RETURN 
3600 
REM *** pass a command to the host operating system ***
Cntrl_byte(opt)=0
IF Cntrl_byte(1)<>0 THEN 
cntrl=CHR$($0C)+CHR$($1A)
RUN tcx(cntrl)
ENDIF 
PRINT "Type EOF chr to exit"
SHELL ""
IF Cntrl_byte(1)<>0 THEN 
cntrl=CHR$($0C)+CHR$($00)
RUN tcx(cntrl)
ENDIF 
RETURN 
3700 
REM *** return to OS9 ***
Cntrl_byte(opt)=0
REM *** check control status if disabled enable it ***
IF Cntrl_byte(1)<>0 THEN 
Cntrl_byte(1)=$00
GOSUB 1200
ENDIF 
REM *** check print port status if open close it ***
IF Cntrl_byte(3)<>0 THEN 
Cntrl_byte(3)=0
GOSUB 1300
ENDIF 


REM *** check status of file if open close it ***
IF Cntrl_byte($0A)<>0 THEN 
Cntrl_byte($0A)=0
GOSUB 2300
ENDIF 
CLOSE #comi
CLOSE #como
END 
RETURN 
3800 
REM *** enter terminal mode ***
Cntrl_byte(opt)=0
REM *** Get pause ***
GOSUB 4250
REM *** check to see if local echo ***
REM *** if not disable echo ***
IF Cntrl_byte(2)=$00 THEN 
GOSUB 800
ENDIF 

REM *** start communication ***
3900 
(* see if character from keyboard 
GOSUB 600
(* see if character is terminantion character 
IF char=18 THEN 
(* terminate communitations
sleepytime=0
GOTO 4000
ENDIF 
IF Cntrl_byte(2)<>$00 THEN 
(* local echo
GOSUB 4100
ENDIF 
(* get char from communication device 
GOSUB 700
(* do with character what one will
GOSUB 4100
IF sleepytime<>0 THEN 
GOSUB 4260
ENDIF 
GOTO 3900
4000 
REM *** if local echo disbled enable it ***
IF Cntrl_byte(2)=$00 THEN 
GOSUB 900
ENDIF 
RETURN 
4100 
REM *** check to see if char should goto array ***
IF Cntrl_byte($0C)<>0 THEN 
IF char>20 AND char<$7F THEN 
array(address(2)+1)=char
address(2)=address(2)+1
ELSE 
IF char=$0D THEN 
array(address(2)+1)=char
address(2)=address(2)+1
ENDIF 
ENDIF 
ENDIF 
REM *** CHECK TO SEE IF CHARACTER SOULD GOT TO DISK ***
IF Cntrl_byte($0A)=$FF THEN 
IF char<$7F THEN 
IF char<>$0A THEN 
PUT #file,char
ENDIF 
ENDIF 
ENDIF 
4200 
REM *** check for valid print ***
IF Cntrl_byte(3)<>$00 AND char<$7F THEN 
IF char=$0A THEN 
IF Cntrl_byte(4)=$00 THEN 
PRINT #La120,CHR$($0A); 
ENDIF 
ELSE 
PRINT #La120,CHR$(char); 
ENDIF 
ENDIF 
RETURN 
4250 
REM *** get time to sleep between transmissions to target ***
INPUT "pause - ",sleepytime
sleepyctr=0
RETURN 
4260 
REM *** increment character counter; if counter equals 16, ***
REM *** sleep sleepytime ticks and zero counter before continuing ***
sleepyctr=sleepyctr+1
IF sleepyctr=sleepsignal THEN 
SHELL "SLEEP "+STR$(sleepytime)
sleepyctr=0
ENDIF 
RETURN 
4300 
REM *** error routine ***

REM *** ERROR CATCHING FOR NON OS9 READ ***

E:=ERR
IF E=211 THEN 

REM *** end of file on valid file ***

address(2)=address(2)-1
CLOSE #lfile
GOTO 400
ENDIF 
PRINT 
GOSUB 4500
PRINT 
Cntrl_byte(8)=$00
GOTO 400
4400 
REM *** open channel error ***
E=ERR
PRINT 
GOSUB 4500
PRINT 
GOTO 300
4500 
REM *** ERROR HANDLER PRINTER ***

PRINT CHR$(7); 
ON E-213 GOTO 4700,4800,4900,4600,5000,4600,4600,5100
4600 
PRINT "* * Error no. "; E; " * *"
RETURN 
4700 
PRINT "* * File not accessible * *"
RETURN 
4800 
PRINT "* * Bad pathlist * *"
RETURN 
4900 
PRINT "* * File not found * *"
RETURN 
5000 
PRINT " * * File already exists * * "
RETURN 
5100 
PRINT "* * Module or path not found * * "
RETURN 
**********************************************************************
**********************************************************************
* ASSEMBLY SUBROUTINES
*
*
*
*
* Tcx
*
* Subroutine to reset an option in the SCF options table
*
* This routine is intended for use with Terminal.  It does
* no error checking and can be extremely dangerous for
* casual use.
*
TcxTyp set SBRTN+OBJCT
TcxRev set REENT+1
       mod TcxEnd,TcxNam,TcxTyp,TcxRev,TcxEnt,TcxMem
       nam Tcx
       ttl Copyright (C) 83/08/19 The JBM Group Inc.
       ifp1
       use /H0/Defs/DefsFile
       endc
TcxNam fcs /Tcx/
       fcb $01 Edition number
       fcs /(C)1983 JBM Inc/
       org $00
TcxMem equ .
TcxEnt tfr s,u Save stack pointer position
       leas -$20,s Reserve 32. bytes for SCF options
       clra Path 0
       clrb Get options
       tfr s,x Buffer address
       OS9 I$GetStt Get current options
       ldy 4,u Address of passed argument
       lda ,y+ Index to option
       ldb ,y New value of option
       stb a,x Write new value in option table
       clra Path 0
       clrb Set options
       OS9 I$SetStt Set new options
       tfr u,s Restore stack pointer
       rts Back to Basic09
       emod
TcxEnd equ *
       end

********************************************************************
********************************************************************
*
*
*
* X1
*
* Device descriptor for use with TERMINAL - based on the
* JBM Group's hardware configuration
*
* Copyright (C) 1983 The JBM Group Inc.  This software
* is made freely available to the OS9 users community
* for private, noncommercial use only with inclusion
* of the above copyright notice.  Distribution
* in this mode does not transfer copyright or title
* to the software to any other person or group.  The
* JBM Group does not undertake to support this software,
* nor does it warrant this software, as distributed or
* in modified form, for any purpose whatsoever.  Use
* of this software is understood to release The JBM
* Group Inc. from all claims for liability resulting
* from or associated with its use.
*
* In other words, you're on your own.

       nam X1
       ttl Copyright (C) 1983 The JBM Group Inc.

       ifp1
       use /H0/Defs/DefsFile
       endc

IOPTyp set DEVIC+OBJCT
IOPRev set REENT+1

       mod IOPEnd,IOPNam,IOPTyp,IOPRev,IOPMgr,IOPDrv

IOMode fcb Updat. Enable read/write
IOPor1 fcb $0F High byte of port address
IOPor2 fdb $E070 Low bytes of port address
IOOpts fcb IOPNam-*-1 Option byte count

* Option section, as defined on p. 7-4
* of the OS9 System Programmer's Manual
* copyright (C) 1980, 1982 Microware
* Systems Corporation, Revision F-1
* (January 1983)
*
IODTyp fcb DT.SCF Device type: SCF
IO.Upc fcb $00 Upper/lower case
IO.Bso fcb $00 Backspace
IO.Dlo fcb $00 Delete: Backspace over line
IO.Eko fcb $00 Auto echo on
IO.Alf fcb $00 Auto line feed on
IO.Nul fcb $00 End-of-line null count
IO.Pau fcb $00 End-of-page pause off
IO.Pag fcb $00 Lines per page
IO.Bsp fcb $00 Backspace character (none)
IO.Del fcb $00 Delete line character (none)
IO.Eor fcb $0D End-of-record character
IO.Eof fcb $00 End-of-file character (none)
IO.Rpr fcb $00 Reprint line character (none)
IO.Dup fcb $00 Duplicate last line character (none)
IO.Psc fcb $00 Pause character (none)
IO.Int fcb $00 Keyboard interrupt character (none)
IO.Qut fcb $00 Keyboard quit character (none)
IO.Bse fcb $00 Backspace echo character
IO.Ovf fcb $00 Line overflow signal (none)

* Value here is for the MC6551 chip
*
IO.Par fcb $0B No parity, no interrupts

* MC6551 control register values:
*
*     $1E   1 stop, 8 data, int clk 9600 Baud
*     $1C   1 stop, 8 data, int clk 4800 Baud
*     $1A   1 stop, 8 data, int clk 2400 Baud
*     $08   1 stop, 8 data, int clk 1200 Baud
*     $06   1 stop, 8 data, int clk  300 Baud
*
IO.Bau fcb $08

IO.D2p fcb $00 Offset to echo device (none)
IO.Xon fcb $11 Value of XON character
IO.Xof fcb $13 Value of XOFF character

* Each GIMIX I/O processor board has three "ports",
* numbered 0, 1, and 2.  Value here points to the
* "port" this descriptor is for.
*
IO.Who fcb $01 Use "port" 1

IOPNam fcs /Com1/ Device name
IOPMgr fcs /IOPMan/ File manager name
IOPDrv fcs /IOP/ Device driver name

       emod

IOPEnd equ *
       end

*******************************************************************
*******************************************************************
* Inbyt
*
* Read a single character, ignoring "read error" - typically
* line noise
*
* If no character is ready on the specified device, $FF - the
* Basic09 terminator - is returned
*
* This routine is intended for use with Terminal.  It does no
* error checking and can be extremely dangerous for casual
* use.
*
InbTyp set SBRTN+OBJCT
InbRev set REENT+1
       mod InbEnd,InbNam,InbTyp,InbRev,InbEnt,InbMem
       nam Inbyt
       ttl Copyright (C) 83/08/19 The JBM Group Inc.
       ifp1
       use /H0/Defs/DefsFile
       endc
InbNam fcs /Inbyt/
       fcb $01 Edition number
       fcs /(C)1983 JBM Inc/
       org $00
InbMem equ .
InbEnt tfr s,u Save stack pointer position
       ldx 8,u Address of one-byte buffer
       lda [4,u] Path number
       ldb #1 Option code for device-ready check
InbChk pshs a,b Save path, option code
       OS9 I$GetStt Do the device-ready check
       bcc InbGch Ready - get the character
       cmpb #E$NotRdy Not-ready or error?
       beq Inb$FF Not ready - return
InbCh1 cmpb #E$Read Read error?
       bne InbAbo If anything else, abort
       puls a,b Restore registers
       bra InbChk Try again
Inb$FF clra Clear the A register
       coma Complement it (now contains $FF)
       sta ,x Stuff it into the buffer
       bra InbRtn
InbGch ldy #1 Read one byte
       OS9 I$Read Do it
       bcs InbCh1 Check out any errors
InbRtn tfr u,s Restore stack pointer
       clrb No error
       rts
InbAbo orcc #$01 Set the C bit
       OS9 F$Exit Abort
       emod
InbEnd equ *
       end