home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_27_1988_Transactor_Publishing.d64
/
shellram.sda
/
NEWCC.A
< prev
next >
Wrap
Text File
|
2023-02-26
|
7KB
|
537 lines
;
; newcc.a
; - source for Power C Compiler driver
;
; Adrian Pepper, March 8, 1988
;
.ref argstk
.ref sysdev
.ref sysdrv
.ref wrkdev
.ref wrkdrv
;
.ref setlfs
.ref setnam
.ref open
.ref close
.ref chkin
.ref chkout
.ref clrchn
.ref chrin
.ref chrout
.ref readst
.ref load
.ref getin
;
;
ramdisk = 1 ;; non-zero assembles ramdisk version
;
; * = $1800 ;; use link -s $1800
;
; link -s $1800
;> newcc.o
;> usrprog.o
;> c64kernal.o
;>
;
usrprog jmp start
jmp opnsrc
start lda #1
sta pflag ; default prompt for disks
lda #'r ; default "register" vars
sta $03ff
arglp dec argstk
beq usage ; shouldn't end with an option
clc
lda argstk+2
adc #2
sta argstk+2
sta $4b
lda argstk+3
adc #0
sta argstk+3
sta $4c
t0100f ldy #1
lda ($4b),y
sta $4e
dey
lda ($4b),y
sta $4d
lda ($4d),y
cmp #'-
bne nodash
dashlp iny
lda ($4d),y
beq arglp
cmp #'p
bne t0200f
lda #0 ; don't prompt disk changes
sta pflag
jmp dashlp
t0200f cmp #'a
bne t0210f
sta $03ff
jmp dashlp
t0210f cmp #'s
bne usage
sta $03ff
jmp dashlp
;
usage ldx #<susage
ldy #>susage
outstr stx $4b
sty $4c
ldy #0
t0240b lda ($4b),y
beq t0250f
jsr chrout
iny
bne t0240b
t0250f rts
;
nodash = * ; assert argstk (count) != 0
t0300f ldy #0
ldx #2
t0310b lda ($4d),y
sta srcnam,x ;; file name including '\0' is stored
beq t0320f
iny
inx
bne t0310b
t0320f stx srclen
dey
lda ($4d),y
cmp #'c
bne t0330f
dey
lda ($4d),y
cmp #'.
beq t0340f
t0330f ldx #<sncsf
ldy #>sncsf
jmp outstr
t0340f lda wrkdrv
clc
adc #'0
sta srcnam
sta sstemp+1
sta stemp1
sta stemp2
lda sysdrv
adc #'0
sta sizero+1
sta bcmpnam
sta btrnnam
lda #2
ldx sysdev
tay
jsr setlfs
lda #cmplen
ldx #<bcmpnam
ldy #>bcmpnam
jsr setnam
lda #0
jsr load
bcc docomp
ldx #<scdnp
ldy #>scdnp
jmp outstr
docomp lda wrkdev
sta $fe
jsr $2000
lda #2
jsr close
jsr clscmd
lda $fe
beq t0400f
jsr idisks
jmp clscmd ; and return to shell
;
t0400f ldx #<sinscmp
ldy #>sinscmp
jsr prompt
jsr idisks
lda #2
ldx sysdev
tay
jsr setlfs
lda #trnlen
ldx #<btrnnam
ldy #>btrnnam
jsr setnam
lda #0
jsr load
bcc dotrans
ldx #15
jsr chkin
t0410b jsr chrin
pha
jsr chrout
pla
cmp #$0d
bne t0410b
jsr clrchn
ldx #<scdnp
ldy #>scdnp
jmp outstr
dotrans ldx #<sinsobj
ldy #>sinsobj
jsr prompt
jsr cmdout
ldx #<sstemp
ldy #>sstemp
jsr outstr
jsr rcmdchn
ldx #15
jsr chkout
ldx srclen
dex
;
; scratch old object file, if any
;
lda #'o
sta srcnam,x
lda #'s
jsr chrout
ldx #<srcnam
ldy #>srcnam
jsr outstr
lda #$0d
jsr chrout
jsr rcmdchn
lda #2
ldx wrkdev
tay
jsr setlfs
lda #t1len
ldx #<stemp1
ldy #>stemp1
jsr setnam
jsr open ; 2,work,2,stemp1
jsr rcmdchn
beq t0520f
ldx #<scnoof
ldy #>scnoof
jsr outstr
lda #2
jsr close
jmp clscmd
;
t0520f lda #3
ldx wrkdev
tay
jsr setlfs
lda #t2len
ldx #<stemp2
ldy #>stemp2
jsr setnam
jsr open ; 3,work,3,stemp2
jsr $2000
lda #3
jsr close
lda #2
jsr close
;
lda $fe ; 0 indicates okay return
beq concat
jmp scrtemp ; and return to shell
;
;
;
concat = *
.ifeq ramdisk,0
jsr cmdout
lda #'c ; concatenate temp files into new object
jsr chrout
ldx #<srcnam
ldy #>srcnam ; now source.o
jsr outstr
lda #'=
jsr chrout
ldx #0
t0610b lda stemp2,x
jsr chrout
inx
cpx #t2len-4
bne t0610b
lda #',
jsr chrout
ldx #0
t0620b lda stemp1,x
jsr chrout
inx
cpx #t1len-4
bne t0620b
lda #$0d
jsr chrout
jsr rcmdchn
ldx #15
jsr chkout
;
.else
;
ldx #<scatfil
ldy #>scatfil
jsr outstr
lda #2
ldx wrkdev
tay
jsr setlfs
ldx srclen
lda #',
sta srcnam,x
inx
lda #'w
sta srcnam,x
inx
lda #0
sta srcnam,x
txa
ldx #<srcnam
ldy #>srcnam
jsr setnam
jsr open ; 2,work,2,srcnam.o,w
jsr rcmdchn
beq t0620f
ldx #<scnoof
ldy #>scnoof
jsr outstr
jmp badcat
;
t0620f lda #t2len-4
ldx #<stemp2
ldy #>stemp2
jsr tcopy ; copies to 2, using 3
;
lda #t1len-4
ldx #<stemp1
ldy #>stemp1
jsr tcopy ; copies to 2, using 3
jmp badcat
;
tcopy = *
jsr setnam
lda #3
ldx wrkdev
tay
jsr setlfs
jsr open ; 3,work,3,xxxtempn
;
tcopylp ldx #3
jsr chkin
ldx #<buff
ldy #>buff
lda #254
jsr getblk
pha ; save readst
ldx #2
jsr chkout
tya ; transfer count
ldx #<buff
ldy #>buff
jsr putblk
pla ; get back readst
beq tcopylp
;
jsr clrchn
lda #3
jmp close ; and return
;
; getblk max (x,y)
;
; returns readst
; y is count
;
; c64 kernal is such block must be
; at least 1 char
;
getblk = *
stx $22
sty $23
sta $24
ldy #0
t0510 jsr chrin
sta ($22),y
iny
jsr readst
bne t0520
cpy $24
bne t0510
t0520 rts
;
;
putblk = *
stx $22
sty $23
sta $24
ldy #0
beq t0540
t0530 lda ($22),y
jsr chrout
iny
t0540 cpy $24
bne t0530
rts
;
badcat = *
lda #2
jsr close
.fi
;
;
jsr scrtemp
ldx argstk
dex
beq t0600f
jmp arglp
;
t0600f rts ; return to shell
;
scrtemp ldx #15
jsr chkout
ldx #<sstemp
ldy #>sstemp
jsr outstr
jsr rcmdchn
lda #15
jmp close ; and return
;
idisks jsr clscmd
ldx sysdev
cpx wrkdev
beq samedev
lda #15
tay
jsr setlfs
lda #1
ldx #<sizero
ldy #>sizero
jsr setnam
jsr open
jsr clscmd
ldx wrkdev
samedev lda #15
tay
jsr setlfs
lda #1
ldx #<sizero
ldy #>sizero
jsr setnam
jmp open ; and return
;
; open source from inside compiler
;
opnsrc lda 1
pha
ora #$07
sta 1
cli
ldx #<sinssrc
ldy #>sinssrc
jsr prompt
lda sstemp+1
sta sizero+1
lda #15
ldx wrkdev
tay
jsr setlfs
lda #3
ldx #<sizero
ldy #>sizero
jsr setnam
jsr open
lda #2
ldx wrkdev
tay
jsr setlfs
ldx #<srcnam
ldy #>srcnam
lda srclen
jsr setnam
jsr open ;; 2,work,2,srcnam
bcs t0720f
jsr rcmdchn
bne t0720f
clc
bcc t0730f
t0720f lda #2
jsr close
ldx #<ssfnf
ldy #>ssfnf
sec
t0730f sei
pla
sta 1
rts
rcmdchn ldx #15
jsr chkin
jsr chrin
cmp #'0
bne t0800f
jsr chrin
cmp #'0
t0800f php
t0810b jsr chrin
cmp #$0d
bne t0810b
jsr clrchn
plp ; follow with beq for okay
rts
;
cmdout ldx #15
jmp chkout ; and return
;
clscmd jsr clrchn
lda #15
jmp close
;
prompt lda pflag
bne t0900f
rts
t0900f jsr outstr
t0910b jsr getin
cmp #$0d
bne t0910b
rts
susage .byte "usage: cc [-pas]"
.byte " filename"
.byte $0d, $0d, $00
scdnp .byte "compiler disk not present"
.byte $0d, $0d, $00
ssfnf .byte "source file not found"
.byte $0d, $0d, $00
sinssrc .byte $0d
.byte "insert source disk"
.byte $0d, $0d, $00
sinscmp .byte $0d
.byte "insert compiler disk"
.byte $0d, $00
sinsobj .byte "insert object disk"
.byte $0d, $0d, $00
sncsf .byte "not a C source file"
.byte $0d, $0d, $00
scnoof .byte "can't open object file"
.byte $0d, $0d, $00
scatfil .byte $0d
.byte "...concatenating object file..."
.byte $0d, $00
sizero .byte "i0:"
.byte $0d, $00
sstemp .byte "s0:xxxtemp*"
.byte $0d, $00
stemp1 .byte "0:xxxtemp1,s,w"
t1len = *-stemp1
.byte $00
stemp2 .byte "0:xxxtemp2,s,w"
t2len = *-stemp2
.byte $00
bcmpnam .byte "0:compiler"
cmplen = *-bcmpnam
btrnnam .byte "0:translator"
trnlen = *-btrnnam
srclen .byte $00
srcnam .byte "0:"
.bss 22
pflag .bss 1
buff = *