mirror of
https://github.com/open-simh/simtools.git
synced 2026-01-15 08:02:48 +00:00
474 lines
7.7 KiB
Plaintext
474 lines
7.7 KiB
Plaintext
.title code
|
||
|
||
.ident /10may4/
|
||
|
||
.mcall (at)always,st.flg,xmit,zwrite
|
||
always
|
||
st.flg
|
||
|
||
.mcall (at)genedt,setnz,next,append,zap,error
|
||
|
||
.globl objchn, objlen
|
||
.globl savreg, ioftbl, buftbl, cnttbl
|
||
|
||
.globl dmprld, endp1c, endp2c, pcroll, prgttl
|
||
.globl setdsp, setimm, setrld, stcode
|
||
|
||
.globl abserr, clcloc, clcnam, clcsec
|
||
.globl codrol, endvec, mode, objsec
|
||
;.globl pass, psaflg, rolupd, secrol
|
||
.globl pass, rolupd, secrol
|
||
.globl sector, setpf0, setpf1, setsec, setxpr
|
||
.globl symbol, symrol, value
|
||
.globl edmask, ed.abs, ed.pnc
|
||
.globl dflgbm, opclas
|
||
cc.opr = 040
|
||
cc.nam = 020
|
||
cc.sec = 010
|
||
cc.val = 004
|
||
cc.dsp = 002
|
||
|
||
|
||
gsdt00= 00*400 ; object module name
|
||
gsdt01= 01*400 ; program section name
|
||
gsdt02= 02*400 ; internal symbol table
|
||
gsdt03= 03*400 ; transfer address
|
||
gsdt04= 04*400 ; symbol declaration
|
||
gsdt05= 05*400 ; local section name
|
||
gsdt06= 06*400 ; version identification
|
||
|
||
blkt01= 01 ; gsd
|
||
blkt02= 02 ; gsd end
|
||
blkt03= 03 ; text block
|
||
blkt04= 04 ; rld block
|
||
blkt05= 05 ; isd
|
||
blkt06= 06 ; module end
|
||
blkt17= 17
|
||
.sbttl expression to code-roll conversions
|
||
|
||
xitsec ;start in default psect
|
||
|
||
setimm: ;
|
||
call savreg
|
||
call setxpr
|
||
clr -(sp)
|
||
bitb #glbflg,(r3)
|
||
bne setds3
|
||
bit #relflg,(r3)
|
||
beq setdsx
|
||
cmpb (r2),clcsec
|
||
bne setds1
|
||
bis #cc.sec,(sp)
|
||
br setdsx
|
||
|
||
setdsp:
|
||
call savreg
|
||
call setxpr
|
||
mov #cc.dsp,-(sp)
|
||
bit #glbflg,(r3)
|
||
bne setds3
|
||
cmpb (r2),clcsec
|
||
beq setds2
|
||
bit #relflg,(r3)
|
||
beq setdsx
|
||
setds1: call setsec
|
||
bis #cc.sec!cc.nam,(sp)
|
||
br setdsx
|
||
|
||
setds2: clr (r3)
|
||
clr (sp)
|
||
movb <^pl rolsiz>+codrol+1,r0
|
||
;movb @(pc)+,r0
|
||
; .word <^pl rolsiz>+codrol+1
|
||
inc r0
|
||
asl r0
|
||
add clcloc,r0
|
||
sub r0,(r4)
|
||
br setdsx
|
||
|
||
setds3: bis #cc.nam,(sp)
|
||
setdsx: bit #dflgbm,opclas
|
||
beq 4$
|
||
tstb (r4)+
|
||
movb (r4),r0
|
||
beq 1$
|
||
inc r0
|
||
bne 2$
|
||
1$: bit #cc.sec,(sp)
|
||
beq 3$
|
||
2$: call abserr
|
||
3$: clrb (r4)
|
||
bis #200,(sp)
|
||
4$: movb (sp)+,(r2)
|
||
return
|
||
.globl limit
|
||
|
||
limit:
|
||
call setrld
|
||
1$: inc r3
|
||
movb #cc.opr,(r2)+
|
||
movb r3,(r2)+
|
||
movb r3,(r2)+
|
||
call dmprld
|
||
mov #symbol,r0
|
||
clr (r0)+
|
||
mov r3,(r0)+
|
||
mov #cc.nam*400,(r0)+
|
||
clr (r0)+
|
||
call stcode
|
||
cmp r3,#2
|
||
blo 1$
|
||
return
|
||
|
||
.globl ident, rad50
|
||
ident: ;"ident" directive
|
||
call rad50 ;treat as rad 50
|
||
clr rolupd ;point to start of code roll
|
||
mov #prgidn,r2 ; and to ident block
|
||
1$: next codrol ;get the next entry
|
||
mov value,(r2)+ ;stuff it
|
||
cmp r2,#prgidn+4 ;two words?
|
||
blo 1$ ; no
|
||
mov #gsdt06,(r2)+ ;yes, set gsd type
|
||
zap codrol ;clear code
|
||
return
|
||
|
||
|
||
entsec impure
|
||
prgttl: .blkw 4 ;title block
|
||
prgidn: .blkw 4 ;ident "
|
||
xitsec
|
||
.sbttl object code handlers
|
||
|
||
endp1c: ;end pass1 code init
|
||
tstb ioftbl+objchn ;any obj file?
|
||
beq 9$ ; no
|
||
call objini ;init output
|
||
mov #blkt01,@buftbl+objchn ;set block type 1
|
||
mov #prgttl,r1 ;set "from" index
|
||
call gsddmp ;output gsd block
|
||
mov #prgidn,r1 ;point to sub-ttl buffer
|
||
tst 4(r1) ;set?
|
||
beq 1$ ; no
|
||
call gsddmp ;yes, stuff it
|
||
1$: clr -(sp) ;init for sector scan
|
||
2$: mov (sp)+,rolupd ;set scan marker
|
||
next secrol ;get the next sector
|
||
beq 6$ ;branch if through
|
||
mov rolupd,-(sp) ;save marker
|
||
mov #value+2,r1
|
||
mov (r1),-(r1)
|
||
clr r5
|
||
bisb -(r1),r5
|
||
movb #gsdt05/400,(r1)
|
||
;tst psaflg ; who cares? a .csect is a
|
||
;bne 3$ ;special kind of .psect
|
||
;movb #gsdt01/400,(r1) ; so dont need this code
|
||
;bicb #^c<defflg!relflg>,-(r1) ; j reeds sept 81.
|
||
3$: clr rolupd ;set for inner scan
|
||
4$: mov #symbol,r1
|
||
call gsddmp ;output this block
|
||
5$: next symrol ;fetch the next symbol
|
||
beq 2$ ; finished with this guy
|
||
bit #glbflg,mode ;global?
|
||
beq 5$ ; no
|
||
bit #regflg,mode ;is register (prevent god's wrath)
|
||
bne 5$ ;no global registers with ==*
|
||
cmpb sector,r5 ;yes, proper sector?
|
||
bne 5$ ; no
|
||
bic #^c<defflg!200!relflg!glbflg>,mode ;clear most (leave hk up)
|
||
bis #gsdt04,mode ;set type 4
|
||
br 4$ ;output it
|
||
|
||
|
||
6$: bic #^c<relflg>,endvec+4 ;clear all but rel flag
|
||
bis #gsdt03+defflg,endvec+4
|
||
mov #endvec,r1
|
||
call gsddmp ;output end block
|
||
call objdmp ;dump it
|
||
mov #blkt02,@buftbl+objchn ;set "end of gsd"
|
||
call objdmf
|
||
mov #blkt17,@buftbl+objchn ;init for text blocks
|
||
9$:
|
||
inc pass ;set for pass 2
|
||
return
|
||
|
||
|
||
gsddmp: ;dump a gsd block
|
||
call setrld
|
||
xmit 4
|
||
jmp dmprld
|
||
endp2c:
|
||
tst objpnt ;any object output?
|
||
beq 1$ ; no
|
||
call objdmp ;yes, dump it
|
||
.if ne,mk.symbol
|
||
tst out$ym
|
||
beq 22$
|
||
.endc
|
||
32$: mov #blkt06,@buftbl+objchn ;set end
|
||
call objdmf ;dump it
|
||
.if ndf xedabs
|
||
bit #ed.abs,edmask ;abs output?
|
||
bne 1$ ; no
|
||
mov objpnt,r0
|
||
mov endvec+6,(r0)+ ;set end vector
|
||
mov r0,objpnt
|
||
call objdmp
|
||
.endc
|
||
1$: return
|
||
|
||
.if ne,mk.symbol
|
||
22$: mov #blkssym,@buftbl+objchn
|
||
clr rolupd
|
||
3$: next symrol
|
||
beq 31$
|
||
bit #glbflg,mode
|
||
bne 3$
|
||
mov #symbol,r1
|
||
call gsddmp
|
||
br 3$
|
||
|
||
31$: tst objpnt
|
||
beq 30$
|
||
call objdmp
|
||
30$:
|
||
call locdmp
|
||
mov #blksye,@buftbl+objchn
|
||
tst objpnt
|
||
beq 32$
|
||
call objdmf
|
||
br 32$
|
||
|
||
entsec impure
|
||
out$ym: .blkw 1
|
||
xitsec
|
||
|
||
blksye=21
|
||
blkssys=22
|
||
|
||
.globl out$ym
|
||
.endc
|
||
|
||
.sbttl code roll handlers
|
||
|
||
stcode: append codrol ;append to codrol
|
||
return
|
||
|
||
.globl pcrcnt
|
||
pcroll: ;
|
||
next codrol
|
||
beq 9$
|
||
call savreg
|
||
movb sector,r4
|
||
tst pass
|
||
beq 7$
|
||
inc pcrcnt
|
||
bne 1$
|
||
call setpf0
|
||
1$: call setpf1
|
||
tst objpnt
|
||
beq 7$
|
||
.if ndf xedpnc
|
||
bit #ed.pnc,edmask
|
||
bne 7$
|
||
.endc
|
||
call setrld
|
||
mov r4,-(sp)
|
||
mov #cc.sec!cc.nam!cc.opr,r4
|
||
cmpb clcsec,objsec
|
||
bne 2$
|
||
cmp clcloc,objloc
|
||
beq 3$
|
||
bic #cc.nam,r4
|
||
2$: mov #clcnam,r1
|
||
call pcrolx
|
||
clrb (r2)+
|
||
call dmprld
|
||
3$: mov (sp)+,r4
|
||
mov #symbol,r1
|
||
call pcrolx
|
||
call dmprld
|
||
7$: inc clcloc
|
||
tstb r4
|
||
bmi 8$
|
||
inc clcloc
|
||
8$: movb clcsec,objsec
|
||
mov clcloc,objloc
|
||
setnz r0
|
||
9$: return
|
||
pcrolx:
|
||
movb r4,(r2)+
|
||
bit #cc.nam,r4
|
||
beq 3$
|
||
.rept 4
|
||
movb (r1)+,(r2)+
|
||
.endm
|
||
cmp -(r1),-(r1)
|
||
3$: add #6,r1
|
||
tst (r1)
|
||
beq 4$
|
||
movb (r1)+,(r2)+
|
||
bisb #cc.val,rldtmp
|
||
tstb r4
|
||
bmi 4$
|
||
movb (r1)+,(r2)+
|
||
4$: return
|
||
|
||
entsec implin
|
||
pcrcnt: .blkw ;extension line flag
|
||
entsec imppas
|
||
.odd
|
||
objsec: .blkb 1 ;object file sector
|
||
objloc: .blkw 1 ;object file location
|
||
|
||
|
||
|
||
|
||
|
||
.if ndf xedpnc
|
||
genedt pnc,pncset ;punch control
|
||
|
||
pncset: movb #377,objsec ;force sequence break
|
||
return
|
||
.endc
|
||
objdmp: ;dump the object buffer
|
||
tst objpnt
|
||
beq objinx ;exit if not pre-set
|
||
mov buftbl+objchn,r0
|
||
tst (r0)+ ;ignore first word
|
||
cmp objpnt,r0 ;anything in rld?
|
||
blos objini ; no, just init
|
||
objdmf:
|
||
mov objpnt,@cnttbl+objchn
|
||
sub buftbl+objchn,@cnttbl+objchn ;compute byte count
|
||
zwrite obj
|
||
|
||
objini: mov buftbl+objchn,objpnt
|
||
add #2,objpnt ;reserve word for block type
|
||
objinx: return
|
||
|
||
dmprld: tst objpnt
|
||
beq setrld
|
||
mov r1,-(sp) ;save byte count
|
||
mov #rldtmp,r1
|
||
mov r2,r0
|
||
sub r1,r0
|
||
beq 9$
|
||
add objpnt,r0
|
||
sub buftbl+objchn,r0
|
||
cmp r0,#objlen ;room to store?
|
||
blos 1$ ; yes
|
||
call objdmp ;no, dump current
|
||
1$: mov objpnt,r0 ;return with pointer in r2
|
||
2$: movb (r1)+,(r0)+
|
||
cmp r1,r2
|
||
blo 2$
|
||
mov r0,objpnt
|
||
9$: mov (sp)+,r1
|
||
setrld: mov #rldtmp,r2
|
||
return
|
||
|
||
entsec impure
|
||
objpnt: .blkw
|
||
rldtmp: .blkb 100.
|
||
xitsec
|
||
|
||
|
||
xitsec
|
||
.globl sx.flg ,lsyrol
|
||
locdmp:
|
||
call savreg
|
||
mov r0,-(sp)
|
||
tst sx.flg
|
||
beq 9$
|
||
clr rolupd
|
||
1$:
|
||
next lsyrol
|
||
beq 2$
|
||
bit #glbflg,mode
|
||
bne 1$
|
||
call unlocl
|
||
mov #symbol,r1
|
||
call gsddmp
|
||
br 1$
|
||
2$:
|
||
tst objpnt
|
||
beq 9$
|
||
call objdmp
|
||
9$:
|
||
mov (sp)+,r0
|
||
return
|
||
|
||
.globl dnc ,chrpnt, getsym,..z
|
||
unlocl:
|
||
call savreg
|
||
mov r0,-(sp)
|
||
mov #work.x,r2
|
||
mov symbol+2,r1
|
||
call dnc
|
||
movb #'$,(r2)+
|
||
movb #0,(r2)+
|
||
call tor50
|
||
mov (sp)+,r0
|
||
return
|
||
entsec mixed
|
||
work.x: .blkw 5
|
||
xitsec
|
||
tor50:
|
||
call savreg
|
||
mov #work.x,r4
|
||
call 1$
|
||
mov r0,symbol
|
||
mov #3+work.x,r4
|
||
call 1$
|
||
mov r0,2+symbol
|
||
return
|
||
1$:
|
||
clr r3
|
||
tstb (r4)
|
||
beq 10$
|
||
movb (r4)+,r0
|
||
br 20$
|
||
10$: movb (r4),r0
|
||
20$: mov r0,r2
|
||
call 40$
|
||
mov r0,r3
|
||
mov r3,r1
|
||
mul #50,r1
|
||
mov r1,r3
|
||
tstb (r4)
|
||
beq 12$
|
||
movb (r4)+,r0
|
||
br 21$
|
||
12$: movb (r4),r0
|
||
21$: mov r0,r2
|
||
call 40$
|
||
add r0,r3
|
||
mov r3,r1
|
||
mul #50,r1
|
||
mov r1,r3
|
||
movb (r4),r0
|
||
mov r0,r2
|
||
call 40$
|
||
add r0,r3
|
||
mov r3,r0
|
||
return
|
||
40$:
|
||
cmpb #44,r2
|
||
bne 30$
|
||
mov #33,r0
|
||
br 9$
|
||
14$: clr r0
|
||
9$: return
|
||
30$: tstb r2
|
||
beq 14$
|
||
cmpb #40,r2
|
||
beq 14$
|
||
movb r2,r0
|
||
add #-22,r0
|
||
br 9$
|
||
.end
|
||
|
||
.end
|