view 3rdparty/utils/sleuth3/cssxrefs3.asm @ 3222:c086a5d69b78

Corrected ,pc should have been ,pcr in KRNP3.asm
author David Ladd <drencor-xeen@users.sourceforge.net>
date Wed, 20 Dec 2017 23:28:18 -0600
parents afd0f7d9b514
children
line wrap: on
line source

**
**********************************
**                              **
**  CSC OS/9 Asmb X-ref c1982   **
**                              **
** Computer Systems Consultants **
** E. M. (Bud) Pass, Ph.D.      **
** 1454 Latta Lane NW           **
** Conyers, GA 30207            **
**                              **
**********************************
**
 nam CSC OS/9 Assembler X-ref
**
vn equ $04 version number
os9lno equ $02 os9 level number ($01=1.1 or $02=1.2/2.x)
coco equ $00 ($00 for coco, $01 for other)

 use defsfile

**
 mod endmod,namemd,Prgrm+Objct,ReEnt+vn,start,endmem header
**
namemd fcs "XRef3"
**
 fcc "CSC OS/9 Asmb X-ref c1982"
 fcb $0d
 fcc "All Rights Reserved by"
 fcb $0d
 fcc "E. M. (Bud) Pass, Ph.D."
 fcb $0d
 fcc "Computer Systems Consultants, Inc."
 fcb $0d
 fcc "1454 Latta Lane, Conyers, GA 30207"
 fcb $0d
 fcc "Telephone Number 404-483-1717/4570"
 fcb $0d
 fcc "Updates for OS9 level 2 by Gene Heskett"
 fcb $0d
 fcc "291 Garton Avenue, Weston, WV 26452"
 fcb $0d
 fcc "Telephone Number 304-269-4295/623-5555"
 fcb $0d
**
iobfc equ 0 function code
iobba equ 1 buffer address
iobbl equ 3 buffer length
iobfd equ 5 file descriptor
iobca equ 7 next char address
iobcc equ 9 char counter
iobfn equ 16 file name
ioblen equ 64 length of i/o block
fnmlen equ ioblen-iobfn length of file name
buflen equ 256 length of i/o buffer
read equ 1 read block raw
rdln equ 2 read block edited
write equ 3 write block raw
wrln equ 4 write block edited
*
ht equ $09 ascii ht
cr equ $0d ascii cr
eot equ $04 ascii eot
tabsiz equ $6000 default table size was $4000 by GH
maxnam equ $1E max name length <=31
dwidth equ $50 default output width
clrscr equ $0c clear screen, was $1A,$00,$00 by GH
**
 org $0000
**
temps equ . start of work areas
phase rmb 1 phase number
count rmb 1 character count
maxcnt rmb 1 max char count
size rmb 1 table entry size
platen rmb 1 output max width
column rmb 1 current output column
outswt rmb 1 std/err output
loops rmb 1 loop count
digit rmb 1 current digit
chart rmb 1 last char scanned
items rmb 1 items scanned on curr line
colcnt rmb 1 displacement of curr char
colstr rmb 1 location of first byte of word
explib rmb 1 expand lib/use switch
debugr rmb 1 debugging switch
paraln rmb 2 parameter line pointer
alimit rmb 2 ending table address
iobc rmb 2 current iob pointer
iobf rmb 2 first iob pointer
iobl rmb 2 last iob pointer
iobuf rmb 2 current buffer pointer
star rmb 2 start pointer
endr rmb 2 end pointer
buff rmb 2 buffer pointer
tab1 rmb 2 temp pointer 1
tab2 rmb 2 temp pointer 2
lines rmb 2 line number pointer
linno rmb 2 line counter
baddr rmb 2 temp
raddr rmb 2 temp
**
 rmb (((.+$003f)/64)*64)-. adjust to 64 bytes
**
inarea rmb 64 input scan area
tiblok rmb ioblen std input iob
toblok rmb ioblen std output iob
teblok rmb ioblen err output iob
iob00 rmb ioblen input iob
iob01 rmb ioblen lib/use 01 iob
iob02 rmb ioblen lib/use 02 iob
iob03 rmb ioblen lib/use 03 iob
iob04 rmb ioblen lib/use 04 iob
iob05 rmb ioblen lib/use 05 iob
iob06 rmb ioblen lib/use 06 iob
iob07 rmb ioblen lib/use 07 iob
iob08 rmb ioblen lib/use 08 iob
iob09 rmb ioblen lib/use 09 iob
iob0a rmb ioblen lib/use 0a iob
iob0b rmb ioblen lib/use 0b iob
iob0c rmb ioblen lib/use 0c iob
**
tibuff rmb buflen std input buffer
tobuff rmb buflen std output buffer
tebuff rmb buflen err output buffer
iobf00 rmb buflen input buffer
iobf01 rmb buflen lib/use 01 buffer
iobf02 rmb buflen lib/use 02 buffer
iobf03 rmb buflen lib/use 03 buffer
iobf04 rmb buflen lib/use 04 buffer
iobf05 rmb buflen lib/use 05 buffer
iobf06 rmb buflen lib/use 06 buffer
iobf07 rmb buflen lib/use 07 buffer
iobf08 rmb buflen lib/use 08 buffer
iobf09 rmb buflen lib/use 09 buffer
iobf0a rmb buflen lib/use 0a buffer
iobf0b rmb buflen lib/use 0b buffer
iobf0c rmb buflen lib/use 0c buffer
**
buffer rmb (tabsiz+$0100) buffer area
**
endmem equ .
**
start equ * starting addr
**
 pshs x
 leax temps,u init
 ldy #(buffer+tabsiz-temps)
clear clr ,x+
 leay -$01,y
 bne clear
 puls x
 stx paraln,u parameter line pointer
 leax -$0100,s table limit
 stx alimit,u
 lda #dwidth default console width
 suba #$08
 sta platen,u
 ldx #$ff7f put end on table
 stx buffer,u
 leax buffer+8,u
 stx endr,u
 lda #read set up iob's
 sta tiblok+iobfc,u
 lda #wrln
 sta teblok+iobfc,u
 sta toblok+iobfc,u
 lda #write
 sta iob00+iobfc,u
 ldd #$0002
 std teblok+iobfd,u
 ldd #$0001
 std toblok+iobfd,u
 ldd #buflen
 std tiblok+iobbl,u
 std teblok+iobbl,u
 std teblok+iobcc,u
 std toblok+iobbl,u
 std toblok+iobcc,u
 std iob00+iobbl,u
 std iob00+iobcc,u
 leax iob00+iobfn,u
 ldd #$7872 xref.temp
 std ,x++
 ldd #$6566
 std ,x++
 ldd #$2e74
 std ,x++
 ldd #$656d
 std ,x++
 ldd #$7000
 std ,x++
 leax tibuff,u
 stx tiblok+iobba,u
 stx tiblok+iobca,u
 leax tebuff,u
 stx teblok+iobba,u
 stx teblok+iobca,u
 leax tobuff,u
 stx toblok+iobba,u
 stx toblok+iobca,u
 leax iobf00,u
 stx iob00+iobba,u
 stx iob00+iobca,u
 stx iobuf,u point to first buffer
 lda #$01
 sta outswt,u force to crt
 leax iob00,u point to first iob
 stx iobc,u
 stx iobf,u
 leax iob0c,u point to last iob
 stx iobl,u
 leax tiblok,u
 lbsr gnc try to get a char
 lbcs headin
 lbvs headin
 pshs a
 leax iob00+iobfn,u open output temp
 ldd #(WRITE.*256)+(READ.+WRITE.)
 os9 I$Create
 lbcs headin
 clrb
 exg a,b
 std iob00+iobfd,u
 puls a
putget leax iob00,u copy std input
 lbsr pnc
 bcc putoko
 lda #$02 error
 ldy #errorl
 leax errorz,pcr
 os9 I$WritLn
 lbra headin
putoko leax tiblok,u
 lbsr gnc
 bcs geterr
 bvc putget
 bra clstmp
geterr lda #$02 error
 ldy #errirl
 leax errirz,pcr
 os9 I$WritLn
 lbra killer
clstmp leax iob00,u
 lbsr fob
 Lbcs headin
 ldd iob00+iobfd,u
 tfr b,a
 os9 I$Close
 lbcs headin
 leax iob00+iobfn,u open input temp
 ldd #(READ.*256)
 os9 I$Open
 bcs headin was lbcs by GH
 clrb
 exg a,b
 std iob00+iobfd,u
 lda #read
 sta iob00+iobfc,u
 leax iobf00,u
 stx iob00+iobba,u
 stx iob00+iobca,u
 ldd #buflen
 std iob00+iobbl,u
 ldd #$0000
 std iob00+iobcc,u
 ldx paraln,u look for + parameter
arglop lda ,x+ check next arg
 cmpa #$20 space
 blo compro
 cmpa #$3f ?
 bne argdeb
 sta debugr,u set debugging switch
 bra arglop
argdeb cmpa #$2b +
 bne arglop
 sta explib,u set lib/use call switch
 bra arglop
compro lbsr proces process without messages
comout leax teblok,u
 lbsr fob
 leax toblok,u
 lbsr fob
 bcc killer
 lda #$02 error
 ldy #errorl
 leax errorz,pcr
 os9 I$WritLn
killer ldd iob00+iobfd,u close temp
 tfr b,a
 os9 I$Close
 leax iob00+iobfn,u delete temp
 os9 I$Delete
 ldd #$0000 exit
 os9 F$Exit
**
headin lda #clrscr clear screen
 lbsr xoute
 lbsr xcrlf print heading
 leax idlin,pcr
helpyu stx baddr,u
 lbsr xcrlf
 ldx baddr,u
 lbsr xpdat
 tst ,x
 bne helpyu
 leax beeps,pcr
 lbsr xpdat
 lbsr xcrlf
 ldd #$0000
 os9 F$Exit
**
scnlib ldb #fnmlen get lib/use file name
 stx raddr,u
 pshs b,x
scning clr ,x+ clear name area first
 decb
 bne scning
 puls b,x
scninm lbsr inchrt get a char
 cmpa #$20 chk ctrl
 blo scninx
 bne scnins chk leading space
 cmpx raddr,u
 beq scninm
 bra scnint
scnins sta ,x+
 decb
 bne scninm
scnint lbsr inchrt scan out line
 cmpa #$20
 bhs scnint
scninx clr ,x put null after input
 rts
**
librar pshs d,x check for lib/use call
 tst explib,u check switch
 bmi libout off
 beq libout
 lda count,u check for count=3
 cmpa #$03
 bne libout
 leax inarea,u check for use/lib
 ldd ,x
 anda #$5f
 andb #$5f
 cmpd #$4c49 LI
 beq libcon
 cmpd #$5553 US
 bne libout
libcon ldd $01,x
 anda #$5f
 andb #$5f
 cmpd #$4942 IB
 beq libtst
 cmpd #$5345 SE
 bne libout
libtst tst explib,u test lib/use flag
 bmi libout off
 beq libout
 bsr libdk scan for file name
libout puls d,x,pc exit
**
libdk ldx iobc,u try to process lib/use file
 cmpx iobl,u ignore lib/use nest > 12 deep
 lbhs libnx
 ldd iobc,u point to next iob
 addd #ioblen
 std baddr,u
 tfr d,x
 leax iobfn,x
 lbsr scnlib get lib/use file name
 cmpb #fnmlen
 lbeq libni exit if no name
 ldy #$0000
 ldx baddr,u
 ldd #(READ.*256)
 leax iobfn,x lib/use name
 os9 I$Open
 bcc libno
liber lda #$02 error
 ldy #errlrl
 leax errlrz,pcr
 os9 I$WritLn
 ldy #fnmlen length
 ldx baddr,u lib/use name
 leax iobfn,x
 lda #$02
 os9 I$WritLn
 ldd #$020d cr
 ldy #$0001
 pshs b
 tfr s,x
 os9 I$WritLn
 puls b
 bra libni
libno ldx baddr,u lib/use name
 leax iobfn,x
 pshs d
 lda #$02
 ldy #fnmlen length
 os9 I$WritLn
 ldd #$020d cr
 ldy #$0001
 pshs b
 tfr s,x
 os9 I$WritLn
 puls b
 puls d
 ldx baddr,u point to new iob
 stx iobc,u
 clrb
 exg a,b
 std iobfd,x
 lda #read
 sta iobfc,x
 ldy iobuf,u
 leay buflen,y
 sty iobuf,u
 sty iobba,x
 sty iobca,x
 ldd #buflen
 std iobbl,x
 ldd #$0000
 std iobcc,x
libni clr chart,u reset scanner
 clr colcnt,u
 clr items,u
libnx rts
**
inchrt pshs b,x input a char
inchru ldx iobc,u
 tst iobfc,x chk for eof
 bmi inchff
 lbsr gnc
 bcs inchen
 bvs inchef
 cmpa #$20
 bhs inchne
 cmpa #cr chk cr
 beq inchcr
 cmpa #ht chk ht
 bne inchru
 lda #$20 ht to space
 bra inchne
inchen lda #$02
 ldx iobc,u
 cmpx iobf,u
 bne inchel
 ldy #errirl
 leax errirz,pcr
 os9 I$WritLn
 bra inchef
inchel ldy #errlrl
 leax errlrz,pcr
 os9 I$WritLn
inchef ldx iobc,u close the file
 ldd iobfd,x
 tfr b,a
 os9 I$Close
 ldx iobc,u mark iob closed
 lda #$ff
 sta ,x
inchff cmpx iobf,u check for lib/use file
 beq inchfe
 pshs b
 ldd iobuf,u point to prev buffer
 subd #buflen
 std iobuf,u
 ldd iobc,u point to prev iob
 subd #ioblen
 std iobc,u
 puls b
 bra inchru back for more
inchfe lda #eot eof
inchcr clr items,u reset counters
 clr colcnt,u
 dec colcnt,u
inchne sta chart,u remember the char
 inc colcnt,u
 puls b,x,pc
**
crxref pshs a enter name and line into table
crxtab lda count,u find max count
 cmpa maxcnt,u
 bls crxmax
 sta maxcnt,u
crxmax ldb #$20 clear rest of name
 ldx star,u
crxspc stb ,x+ insert spaces
 inca
 cmpa #maxnam
 bls crxspc
 leax buffer,u point to buffer
 stx buff,u
crxnex lda ,x check next name
 sta size,u
 leay inarea,u point to name
crxcom leax $01,x check next name
 ldb ,x
 cmpb ,y+
 bne crxcrc
 deca
 bne crxcom
 lda size,u check sizes
 cmpa count,u
 beq crxaeb check equal
crxcrc tfr cc,a
 stx tab1,u
 tfr a,cc
 bmi crxagb check greater
 bra crxalb check less, was lbra by GH
crxagb ldx buff,u look at next entry
 lda size,u
 adda #$07
crxage leax a,x step to next entry
 stx buff,u
 bra crxnex
crxaeb tst phase,u check for phase 1
 beq crxalx
 lda size,u check defining line number
 ldx buff,u
 inca
crxaee leax a,x
 ldy ,x
 cmpy linno,u
 beq crxalx
crxaen stx tab1,u enter line number
 ldx $04,x
 beq crxaez
 stx tab2,u check dup
 ldy ,x
 cmpy linno,u
 beq crxalx
 bra crxaeo
crxaez ldx tab1,u link it in
crxaeo ldy lines,u
 cmpy alimit,u check for table overflow
 blo crxatb
 leax tabovf,pcr table overflow!
 ldy #tabovl
 lda #$02
 os9 I$WritLn
 lbra killer terminate
crxatb sty $02,x
 tfr y,x
 ldy linno,u
 sty ,x
 clr $02,x
 clr $03,x
 stx tab2,u
 leax $04,x
 stx lines,u
 ldx tab1,u
 ldy tab2,u
 sty $04,x
crxalx bra crxxit
crxalb tst phase,u check for phase 1
 bne crxalx
crxaly ldx endr,u make room
 tfr x,y
 lda count,u
 adda #$07
 leay a,y step over entry
 sty endr,u
 cmpy alimit,u check for table overflow
 blo crxalp
 leax tabovf,pcr table overflow!
 ldy #tabovl
 lda #$02
 os9 I$WritLn
 lbra killer terminate
crxalp lda ,-x move data
 sta ,-y
 cmpx buff,u
 bne crxalp
crxall ldb count,u insert entry
 stb ,x+
 leay inarea,u
crxali lda ,y+
 sta ,x+
 decb
 bne crxali
 ldy linno,u insert line number
 sty ,x
 clr $02,x clear pointers
 clr $03,x
 clr $04,x
 clr $05,x
crxxit puls a
 rts
**
proces clr phase,u process data
 lbsr xcrlf
 lbsr prphas print phase
 bra proacl
proagr lbsr inchrt get a char
proarg cmpa #$41 check alpha
 blo proacr
 cmpa #$5a
 bls proalp
 cmpa #$61
 blo proacr
 cmpa #$7a
 bhi proacr
 anda #$5f convert to upper case
 bra proalp
proacr cmpa #eot check eof
 beq proaq1
 cmpa #cr check cr
 bne proagr
proacl ldx linno,u incr line count
 leax $01,x
 stx linno,u
proaca lbsr inchrt check for *
 cmpa #$2a
 bne proarg
proarc lbsr inchrt get a char
proarr cmpa #eot
proaq1 beq proap1 was lbeq by GH
 cmpa #cr
 beq proacl
 bra proarc
proalp leax inarea,u
 stx star,u
 inc items,u update counters
 ldb colcnt,u
 stb colstr,u
 ldb #maxnam set max name length
 stb baddr,u
 clr count,u
proall tst baddr,u check count
 beq proanl
 ldx star,u save the char
 sta ,x+
 stx star,u
 inc count,u
 dec baddr,u
proanl lbsr inchrt get a char
 cmpa #$24 check dollar
 beq proall
 cmpa #$2e check period
 beq proall
 cmpa #$30 check numeric
 bmi proala
 cmpa #$39
 bls proall
 cmpa #$41 check capital letters
 bmi proala
 cmpa #$5a
 bls proall
 cmpa #$5f check underscore
 beq proall
 cmpa #$61 check small letters
 bmi proala
 cmpa #$7a
 bhi proala
 anda #$5f convert to upper case
 bra proall
proala ldb colstr,u check for label
 decb
 bne proali
 lbsr crxref enter name and line into table
 bra proail
proali ldb items,u check for opcode
 decb
 bne proail
 lbsr librar check for lib/use call
 lda chart,u
 bne proail
 bra proaca was lbra by GH
proail bra proarr
proap1 inc phase,u end phase 1
 lbsr prphas print phase
 ldx endr,u set line number address
 stx lines,u
 leax iob00,u reposition input file
 stx iobc,u
 ldd iob00+iobfd,u
 tfr b,a
 os9 I$Close
 leax iob00+iobfn,u open input
 ldd #(READ.*256)
 os9 I$Open
 bcs prober
 clrb
 exg a,b
 std iob00+iobfd,u
 lda #read
 sta iob00+iobfc,u
 leax iobf00,u
 stx iob00+iobba,u
 stx iob00+iobca,u
 ldd #buflen
 std iob00+iobbl,u
 ldd #$0000
 std iob00+iobcc,u
 bra probcl
prober lda #$02 error
 ldy #errirl
 leax errirz,pcr
 os9 I$WritLn
 lbra killer
probgr lbsr inchrt get a char
probrg cmpa #$41 check alpha
 blo probcr
 cmpa #$5a
 bls problp
 cmpa #$61
 blo probcr
 cmpa #$7a
 bhi probcr
 anda #$5f convert to upper case
 bra problp
probcr cmpa #eot check eof
 beq probq2
 cmpa #cr check cr
 bne probgr
probcl ldx linno,u incr line count
 leax $01,x
 stx linno,u
probca lbsr inchrt check for *
 cmpa #$2a
 bne probrg
probrc lbsr inchrt get a char
probrr cmpa #eot
probq2 beq probp2
 cmpa #cr
 beq probcl
 bra probrc
problp leax inarea,u
 stx star,u
 inc items,u update counters
 ldb colcnt,u
 stb colstr,u
 ldb #maxnam set max name length
 stb baddr,u
 clr count,u
probll tst baddr,u check count
 beq probnl
 ldx star,u save the char
 sta ,x+
 stx star,u
 inc count,u
 dec baddr,u
probnl lbsr inchrt get a char
 cmpa #$24 check dollar
 beq probll
 cmpa #$2e check period
 beq probll
 cmpa #$30 check numeric
 blo probla
 cmpa #$39
 bls probll
 cmpa #$41 check capital letters
 blo probla
 cmpa #$5a
 bls probll
 cmpa #$5f check underscore
 beq probll
 cmpa #$61 check small letters
 blo probla
 cmpa #$7a
 bhi probla
 anda #$5f convert to upper case
 bra probll
probla ldb items,u check for opcode
 decb
 bne probli
 lbsr librar check for lib/use call
 lda chart,u
 bne probli
 bra probca was lbra by GH
probli lbsr crxref enter name and line into table
probil lbra probcr
probp2 inc phase,u end phase 2
 lbsr prphas print phase
 lbsr xcrlf
 lbsr xcrlf
 lbsr xcrlf
 leax buffer,u point to buffer
 stx buff,u
proclf lbsr xcrlf do crlf
 ldx buff,u point to entry
 cmpx endr,u check for end
 beq prolix
 lda ,x get count
 bmi prolix
 sta count,u
 ldb maxcnt,u get max name length
proclp leax $01,x print name
 lda ,x
 lbsr xoute
 decb
 dec count,u
 bne proclp
procsp tstb print spaces
 beq procln
 lbsr xouts
 decb
 bne procsp
procln leax $01,x print defining line number
 ldy ,x++
 sty linno,u
 ldy ,x++ get front pointer
 sty star,u
 leax $02,x
 stx buff,u
procnx bsr prline print line number
 ldx star,u get next line number
 beq proclf
 ldy ,x
 sty linno,u
 ldx $02,x get next pointer
 stx star,u
 bra procnx
prolix lbsr xcrlf print crlf
 rts
**
prline lda column,u print line number
 cmpa platen,u check right margin
 bmi prlcok
 lbsr xcrlf print crlf
 ldb #maxnam
prlnam lbsr xouts print spaces
 decb
 bne prlnam
prlcok lbsr xouts print a space
 lda #$05 set number of scale factors
 sta loops,u
 leax scaler,pcr point to convert table
 lda #$30 set up digit
 sta digit,u
 ldd linno,u look at line number
prlcom cmpd ,x compare against scale factor
 bhs prldig
prlnxd pshs d
 lda digit,u print the digit
 bsr xoute was lbsr by GH
 lda #$30 set up digit
 sta digit,u
 puls d
 dec loops,u check for last digit
 beq prlend
 leax $02,x point to next scale factor
 bra prlcom
prldig inc digit,u incr digit count
 subd ,x decr line number
 bra prlcom
prlend rts
**
prphas inc outswt,u force to crt
 leax lphase,pcr print phase number
 bsr xpdat was lbsr by GH
 lda phase,u
 adda #$31
 bsr xoute was lbsr by GH
 bsr xcrlf was lbsr by GH
 leax teblok,u
 lbsr fob
 clr outswt,u reset outswt
 ldx #$0000 reset counters
 stx items,u
 stx linno,u
 rts
**
xinee pshs b,x input one char into a
 leax teblok,u
 lbsr fob
 leax tiblok,u
 bsr gnc was lbsr by GH
 bcc xinef
 lda #$02 error
 ldy #errirl
 leax errirz,pcr
 os9 I$WritLn
 ldd #$0000
 os9 F$Exit
xinef puls b,x,pc
xpdaa bsr xoute print to $04 from a then x
xpdat lda ,x+ print to $04 from x
 cmpa #eot
 bne xpdaa
 rts
xouts lda #$20 print 1 space
xoute pshs d,x print char in a
 leax toblok,u
 tst outswt,u
 beq xouto
 leax teblok,u
xouto lbsr pnc
 bcc xoutx
 lda #$02 error
 ldy #errorl
 leax errorz,pcr
 os9 I$WritLn
 ldd #$0000
 os9 F$Exit
xoutx inc column,u count columns
 cmpa #$0d cr
 bne xoutz
 lbsr fob
xoutz puls d,x,pc
xcrlf clr column,u clear column counter
 lda #$0d cr
 bra xoute print crlf
**
**
*
* blocked i/o routines
*
* gnc - get next char
*
* entry - x=i/o block pointer
*
* exit - cs if error, d=error
*        cc if no error
*        vs if eof
*        if cc and vc, a=char
*
* preserves all other registers
*
gnc pshs b,x,y
 ldd iobcc,x get remaining char count
 bne gnc1 if chars left
gnc0 lda iobfd+1,x a=file descriptor
 ldy iobbl,x buffer length
 ldb iobfc,x function code
 pshs x
 ldx iobba,x buffer address
 cmpb #read
 beq gncrw
 os9 I$ReadLn reload buffer edited
 bra gncrd
gncrw os9 I$Read reload buffer raw
gncrd puls x
 bcs gnc4 if error
 sty iobcc,x save char count
 beq gnc3 if eof
 ldd iobba,x reset char pointer
 std iobca,x
 ldd iobcc,x d=char count
gnc1 subd #$0001 count chars
 std iobcc,x
gnc2 ldy iobca,x get char
 lda ,y+
 sty iobca,x update char pointer
 tst debugr,u check debugging switch
 beq gnc2d
 leax teblok,u output a character
 bsr pnc
 cmpa #$0d
 bne gnc2d
 leax teblok,u
 bsr fob was lbsr by GH
gnc2d clrb cc, vc
 puls b,x,y,pc
gnc3 orcc #$02 vs for eof
 puls b,x,y,pc
gnc4 cmpb #E$EOF check error
 beq gnc3 for eof
 orcc #$01 cs
 leas $01,s remove b
 puls x,y,pc cs, d=error
*
* pnc - put next character
*
* entry - a=char,x=i/o block pointer
*
* exit - cc if no error, a=char
*        cs if error, d=error
*
pnc pshs a,b,y
 ldd iobcc,x get remaining count
 bne pnc1 if room
 lda iobfd+1,x a=file descriptor
 ldb iobfc,x function code
 ldy iobbl,x buffer length
 pshs x
 ldx iobba,x buffer address
 cmpb #write
 beq pncrw
 os9 I$WritLn dump buffer edited
 bra pncwt
pncrw os9 I$Write dump buffer raw
pncwt puls x
 bcs pnc3 if error
pnc0 ldd iobba,x update char pointer
 std iobca,x
 ldd iobbl,x d=new size
pnc1 subd #$0001 count chars
 std iobcc,x update count
 ldy iobca,x store char
 puls a
 sta ,y+
 sty iobca,x update char pointer
pnc2 puls b,y,pc
pnc3 leas 2,s remove a and b
 clra
 orcc #$01 cs, error
 puls y,pc cs, d=error
*
* fob - flush output buffer
*
* entry - x=i/o block pointer
*
* exit - cs if error
*
fob pshs d,y
 ldd iobbl,x get buffer size
 subd iobcc,x determine char count
 beq fob1 if empty
 tfr d,y set char count to write
 lda iobfd+1,x a=file descriptor
 ldb iobfc,x function code
 pshs x
 ldx iobba,x buffer address
 cmpb #write
 beq fobrw
 os9 I$WritLn dump buffer edited
 bra fobwt
fobrw os9 I$Write dump buffer raw
fobwt puls x
 bcs fob2 if error
fob0 ldd iobba,x update char pointer
 std iobca,x
fob1 ldd iobbl,x restore buffer size
 std iobcc,x reset avail counter
 clra clear errors
 puls d,y,pc return
fob2 leas 2,s remove a and b
 clra
 orcc #$01 cs, error
 puls y,pc cs, d=error
*
**
errirz fcc "error on input file"
 fcb $07,$0d
errirl equ *-errirz
errlrz fcc "error on lib/use file"
 fcb $07,$0d
errlrl equ *-errlrz
errorz fcc "error on output file"
 fcb $07,$0d
errorl equ *-errorz
**
idlin fcc "CSC OS/9 Assembler Cross-Reference v1.0"
 fcb $04
 fcc " by E. M. (Bud) Pass, Conyers, GA c1982"
 fcb $04,$04
 fcc "This program performs an assembler"
 fcb $04
 fcc " cross-reference function under OS/9."
 fcb $04,$04
 fcc "It uses standard inputs and outputs,"
 fcb $04
 fcc "so input and output may be piped or"
 fcb $04
 fcc "either may be entered directly as"
 fcb $04
 fcc "<input and >output.  LIB and USE calls"
 fcb $04
 fcc "may be expanded by entering '+'"
 fcb $04
 fcc "as an OS/9 command line parameter."
 fcb $04
 fcc "In case of table overflow, the OS/9 command"
 fcb $04
 fcc "line parameter #nnK may be used to provide"
 fcb $04
 fcc "more memory space for processing."
 fcb $07,$04,$00
lphase fcc "phase "
beeps fcb $07,$04 bell
tabovf fcc "table overflow!"
 fcb $07,$0d
tabovl equ *-tabovf
scaler fdb 10000 decimal convert table
 fdb 1000
 fdb 100
 fdb 10
 fdb 1
**
 emod
endmod equ *
**
 end