Example assembler source code generated by SPLash!
Note: the generation of comments in the assembler source can be turned on/off
by specifying $[NO]ASMCOMMENTS in the SPLash! source.
; Compilation data: SPLash! , INT=SPLash, DL=0, STACK=4088
; $options: noALIGN, noALIGNED32, ALLOCQ, noALLOWBYTES, ASMCOPYRIGHT,
; noBIGDIRECT, noBIGPROGRAM, CC, CCINTRIN, noCHECKSTACK, CLEANFOR, COERCE,
; noCOMBEFORE, noDIRECT, noFASTMOVE, noIMPORTDB, noINNERLIST, noMAPBYTE,
; noMILLIMOVE, noMILLISCAN, NATIVEONLY, noNEGADDR, NEGX, noNEWDLDB,
; NMPCAL, OPTMOVE, PPLONGPTRS, noPRIVILEGED, noQUICK, REGVARS,
; noSAMESIZEWARN, noSPLASHEXT, noSPLASHINTRIN, SPLASHG, noSTMT, SYSINTR,
; TRACEPCAL, noUPPERCASE, noVARIABLEINTRIN, noVIRTUAL, noVIRTUALGLOBAL
.SPACE $TEXT$
.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
.SUBSPA $CODE$
.VERSION "SPLash! 96H 4.13"
.VERSION "Copyright (c) 1987 Allegro Consultants, Inc."
.VERSION "FAC.SOURCE.SIELER"
.VERSION "Compiled on WED, DEC 4, 1996, 2:27 PM "
;----------------------------------------------------
; procedure REPORT, node # 1312, seq # 8
; option splash;
EN_report
; primary entry point for proc...
report
.PROC
.ENTRY
.EXPORT report,ENTRY
STW 2,-20 (0,30) ;Save RP in NM stack
OR 30,0,1 ;Remember SP (call it PSP) in R1 (for now)
LDO 144 (30),30 ;Build NM stack frame
STW 1,-4 (0,30) ;Save PSP in new marker
STW 11,0 (0,1) ;Save old R11 (procPSP)
OR 1,0,11 ;Setup procPSP
STHS,MB 7,2 (0,6) ;stack mrkr Q-3 = X-reg
STHS,MB 0,2 (0,6) ; Q-2 = dummy := 0
LDO 1 (0),1 ; Q-1 = Status; seg=1
DEP 9,21,6,1 ; mitroc
STHS,MB 1,2 (0,6)
SUB 6,5,1 ; Q-0 = DeltaQ := (R6-R5)/2
LDO 2 (1),1
EXTRU 1,30,15,1
STHS,MB 1,2 (0,6)
OR 6,0,5 ;set Q:=S
LDO 400 (30),30 ;allocate stack-area for pcals
STW 11,-4 (0,30) ;Save PSP
; 1472 Loc=$00000048 / 9 assign
LDH 20 (0,4),20 ; value @ BUF' (ind)
ADD 20,4,20 ;16byte->32
LDSID (0,20),21
STW 21,12 (0,4) ;assign to @ FVP
STW 20,16 (0,4)
; 1632 Loc=$0000005c / 9 assign
LDW 12 (0,4),22 ; value moveexp bytes dest @ FVP (ind) load hi-3
LDW 16 (0,4),19 ;load low-32 bits
MTSP 22, 2
LDO 9 (0),21 ;push move length
LDO 9 (0),22 ;Setup move length
LDIL L%L$C26,23
LDO R%L$C26 (23),23
LDBS,MA 1 (0,23),20 ;get source byte
ADDIB,<> -1,22,.-4 ;dec move count
STBS,MA 20,1 (2,19) ;save it
STH 21,8 (0,4) ;assign to LEN
; 1792 Loc=$00000088 / 10 assign
LDH 8 (0,4),22 ; value LEN
; pcal ASCII
; do parm # 1 Parm_1
LDH 10 (0,4),19 ;RSLT
; do parm # 2 Parm_2
LDO 10 (0),20
; do parm # 3 Parm_3
LDH 8 (0,4),7 ;LEN
EXTRS 7,31,16,7 ; Make signed
LDH 20 (0,4),21 ;@ BUF' (ind)
ADD 7,21,21 ;add x
ADD 21,4,21 ;16byte->32
; pop parms into registers...
OR 21,0,24 ;4 bytes
EXTRS 20,31,16,25 ;2 bytes, signed make signed
EXTRU 19,31,16,26 ;2 bytes
STHS,MB 22,2 (0,6)
.IMPORT ASCII,CODE
BL,N ASCII,2
NOP
EXTRS 28,31,16,28 ;make signed
OR 28,0,19
STHS,MB 19,2 (0,6)
BL,N CCODE,2
NOP
SUBI,OD 0,28,8 ;convert cc: 0 1 2
LDO 2 (8),8 ;convert cc: 2 -1 0
.IMPORT CCODE, CODE
LDHS,MA -2 (0,6),20
EXTRS 20,31,16,20 ;make signed
LDHS,MA -2 (0,6),21
EXTRS 21,31,16,21 ;make signed
ADD 21,20,21
STH 21,8 (0,4) ;assign to LEN
; 2144 Loc=$000000f4 / 10 pcal
; pcal PRINT
; do parm # 1 Parm_1
LDH 0 (0,4),22 ;@ BUF (ind)
SH1ADD 22,4,22 ;16word->32
LDSID (0,22),19 ;convert 32->64 bit addr
; do parm # 2 Parm_2
LDH 8 (0,4),20 ;negate LEN
EXTRS 20,31,16,20 ;make signed
SUB 0,20,20
; do parm # 3 Parm_3
LDO 0 (0),21
; pop parms into registers...
EXTRS 21,31,16,23 ;2 bytes, signed make signed
EXTRS 20,31,16,24 ;2 bytes, signed make signed
OR 22,0,26 ;8 bytes, low-32 bits
OR 19,0,25 ; high-32 bits
.IMPORT PRINT,CODE
BL,N PRINT,2
NOP
BL,N CCODE,2
NOP
SUBI,OD 0,28,8 ;convert cc: 0 1 2
LDO 2 (8),8 ;convert cc: 2 -1 0
L$1344
LDO 0 (0),10 ;calc #halfs to delete
; proc exit code...
EX_report
L$1314
LDW 0 (0,11),1 ;Fetch prior procPSP into R1
OR 11,0,30 ;SP := PSP
OR 1,0,11 ;Restore procPSP
LDW -20 (0,30),2 ;Get RP from NM stack frame
_proc_exit ;common SPLash! exit code
OR 5,0,6 ;set S:=Q
LDHS,MA -2 (0,6),1 ;get delta-Q
LDHS,MA -2 (0,6),20 ;get status
ADDI -2,6,6 ;pop & drop Q-3
SH1ADD 1,0,1 ;convert delta-Q to bytes
SUB 5,1,5 ;reset Q
EXTRU,= 20,23,2,8 ;build CC
LDO -3 (8),8
LDO 1 (8),8
LDHS,MA -2 (0,6),7 ;get X-reg
SUB 6,10,6 ;delete parms
BV 0(2) ;return
EXTRS 7,31,16,7 ;make signed
.CALLINFO CALLER,SAVE_RP,SAVE_SP,FRAME=496
.EXIT ; proc
.PROCEND
; ------------ end proc
;----------------------------------------------------
; procedure FACT, node # 2336, seq # 11
; option splash;
; return address from stack building in reg 10
; subroutine SUB, node # 2752
fact$2$sub
.PROC
.ENTRY
.EXPORT fact$2$sub,ENTRY
L$2752
STW 2,-20 (0,30) ;Save RP in NM stack
OR 30,0,1 ;Remember SP (call it PSP) in R1 (for now)
LDO 544 (30),30 ;Build NM stack frame
STW 1,-4 (0,30) ;Save PSP in new marker
STHS,MB 0,2 (0,6) ; dummy return addr
; Optimization flags := allocq, cleanfor, negx, optmove
; 2880 Loc=$00000014 / 13 begin
; 2912 Loc=$00000014 / 13 assign
LDH 20 (0,4),22 ; value moveexp bytes dest @ BUF' (ind)
ADD 22,4,22 ;16byte->32
LDO 78 (0),19
STBS,MA 19,1 (0,22)
LDO 32 (0),19
STBS,MA 19,1 (0,22)
LDO 61 (0),19
STBS,MA 19,1 (0,22)
LDO 32 (0),19
STBS,MA 19,1 (0,22)
LDO 4 (0),20 ;push move length
STH 20,8 (0,4) ;assign to LEN
; 3072 Loc=$00000044 / 14 assign
LDH 8 (0,4),21 ; value LEN
; pcal ASCII
; do parm # 1 Parm_1
LDH -8 (0,5),19 ;N
; do parm # 2 Parm_2
LDO 10 (0),20
; do parm # 3 Parm_3
LDH 8 (0,4),7 ;LEN
EXTRS 7,31,16,7 ; Make signed
LDH 20 (0,4),22 ;@ BUF' (ind)
ADD 7,22,22 ;add x
ADD 22,4,22 ;16byte->32
; pop parms into registers...
OR 22,0,24 ;4 bytes
EXTRS 20,31,16,25 ;2 bytes, signed make signed
EXTRU 19,31,16,26 ;2 bytes
STHS,MB 21,2 (0,6)
.IMPORT ASCII,CODE
BL,N ASCII,2
NOP
EXTRS 28,31,16,28 ;make signed
OR 28,0,22
STHS,MB 22,2 (0,6)
BL,N CCODE,2
NOP
SUBI,OD 0,28,8 ;convert cc: 0 1 2
LDO 2 (8),8 ;convert cc: 2 -1 0
LDHS,MA -2 (0,6),19
EXTRS 19,31,16,19 ;make signed
LDHS,MA -2 (0,6),20
EXTRS 20,31,16,20 ;make signed
ADD 20,19,20
STH 20,8 (0,4) ;assign to LEN
; 3424 Loc=$000000b0 / 15 pcal
; pcal PRINT
; do parm # 1 Parm_1
LDH 0 (0,4),21 ;@ BUF (ind)
SH1ADD 21,4,21 ;16word->32
LDSID (0,21),22 ;convert 32->64 bit addr
; do parm # 2 Parm_2
LDH 8 (0,4),19 ;negate LEN
EXTRS 19,31,16,19 ;make signed
SUB 0,19,19
; do parm # 3 Parm_3
LDO 0 (0),20
; pop parms into registers...
EXTRS 20,31,16,23 ;2 bytes, signed make signed
EXTRS 19,31,16,24 ;2 bytes, signed make signed
OR 21,0,26 ;8 bytes, low-32 bits
OR 22,0,25 ; high-32 bits
.IMPORT PRINT,CODE
BL,N PRINT,2
NOP
BL,N CCODE,2
NOP
SUBI,OD 0,28,8 ;convert cc: 0 1 2
LDO 2 (8),8 ;convert cc: 2 -1 0
;end
L$2784 ;end of subr
LDO 0 (0),10 ;# parm halfs to del
L$2754
EX_fact$2$sub
LDW -4 (0,30),30 ;Restore saved SP
LDW -20 (0,30),2 ;Restore saved RP
ADDI -2,6,6 ;delete return info
BV 0(2) ;return from subr
SUB 6,10,6 ;calc desired new S
.CALLINFO CALLER,SAVE_RP,SAVE_SP,FRAME=496
.EXIT ; subr
.PROCEND
;------------- end sub
EN_fact
STW 2,-20 (0,30) ;Save RP in NM stack
OR 30,0,1 ;Remember SP (call it PSP) in R1 (for now)
LDO 144 (30),30 ;Build NM stack frame
STW 1,-4 (0,30) ;Save PSP in new marker
STW 11,0 (0,1) ;Save old R11 (procPSP)
OR 1,0,11 ;Setup procPSP
STHS,MB 7,2 (0,6) ;stack mrkr Q-3 = X-reg
STHS,MB 0,2 (0,6) ; Q-2 = dummy := 0
LDO 1 (0),1 ; Q-1 = Status; seg=1
DEP 9,21,6,1 ; mitroc
STHS,MB 1,2 (0,6)
SUB 6,5,1 ; Q-0 = DeltaQ := (R6-R5)/2
LDO 2 (1),1
EXTRU 1,30,15,1
STHS,MB 1,2 (0,6)
OR 6,0,5 ;set Q:=S
; formal parameters:
;N Q -4
; Procedure variables...
STW 13,68 (0,11) ;Save old register for register var
;DUMMYREG reg + 13
LDO 400 (30),30 ;allocate stack-area for pcals
STW 11,-4 (0,30) ;Save PSP
BV 0(10) ;Return from building locals
NOP
; primary entry point for proc...
fact
.PROC
.ENTRY
.EXPORT fact,ENTRY
BL,N EN_fact,10 ;branch to init
NOP
; 3648 Loc=$00000008 / 15 scal
; scal fact$2$sub
BL,N fact$2$sub,2
NOP
; 3712 Loc=$00000010 / 15 lbl
;jump over entry point init...
B,N L$8192064
NOP
; proc entry point:
fac2
.ENTRY
.EXPORT fac2,ENTRY
BL,N EN_fact,10 ;branch to init
NOP
L$8192064
; 3744 Loc=$00000008 / 15 if
LDH -8 (0,5),21 ;if/then/else N
EXTRU,OD 21,31,1,0 ;l16 ( )
B,N L$8192097
; 3936 Loc=$00000014 / 16 assign;then
LDH -8 (0,5),22 ; value N
STHS,MB 22,2 (0,6) ;if
LDH -8 (0,5),19 ;N
LDO 1 (0),20
EXTRS 19,31,16,19 ;make signed
COMB,>=,N 20,19,L$4352
STHS,MB 0,2 (0,6) ;then
; pcal fac2
; do parm # 1 N
LDH -8 (0,5),20 ;N
EXTRS 20,31,16,20 ;make signed
LDO -1 (20),20
STHS,MB 20,2 (0,6)
BL,N fac2,2
NOP
B,N L$8192128
L$4352 ;else
LDO 1 (0),21
STHS,MB 21,2 (0,6)
L$8192128
LDHS,MA -2 (0,6),22
EXTRS 22,31,16,22 ;make signed
LDHS,MA -2 (0,6),19
EXTRS 19,31,16,19 ;make signed
OR 22,0,25
.IMPORT $$mulI,MILLICODE
BL $$mulI,31
OR 19,0,26
OR 29,0,19
STH 19,10 (0,4) ;assign to RSLT
B,N L$8192096
L$8192097 ;else
; 4384 Loc=$0000007c / 17 assign
LDH -8 (0,5),20 ; value N
STHS,MB 20,2 (0,6) ;if
LDH -8 (0,5),21 ;N
LDO 1 (0),19
EXTRS 21,31,16,21 ;make signed
COMB,>=,N 19,21,L$4800
STHS,MB 0,2 (0,6) ;then
; pcal fact
; do parm # 1 N
LDH -8 (0,5),22 ;N
EXTRS 22,31,16,22 ;make signed
LDO -1 (22),22
STHS,MB 22,2 (0,6)
BL,N fact,2
NOP
B,N L$8192160
L$4800 ;else
LDO 1 (0),19
STHS,MB 19,2 (0,6)
L$8192160
LDHS,MA -2 (0,6),20
EXTRS 20,31,16,20 ;make signed
LDHS,MA -2 (0,6),21
EXTRS 21,31,16,21 ;make signed
OR 20,0,25
.IMPORT $$mulI,MILLICODE
BL $$mulI,31
OR 21,0,26
OR 29,0,21
STH 21,10 (0,4) ;assign to RSLT
L$8192096
; 4832 Loc=$000000e0 / 17 pcal
; pcal report
BL,N report,2
NOP
; 4896 Loc=$000000e8 / 17 assign
LDH 10 (0,4),22 ; value RSLT
STH 22,-10 (0,5) ;assign to FACT
L$2368
LDO 2 (0),10 ;calc #halfs to delete
; proc exit code...
EX_fact
L$2338
LDW 68 (0,11),13 ;Restore register var
LDW 0 (0,11),1 ;Fetch prior procPSP into R1
OR 11,0,30 ;SP := PSP
OR 1,0,11 ;Restore procPSP
LDW -20 (0,30),2 ;Get RP from NM stack frame
B,N _proc_exit
.CALLINFO CALLER,SAVE_RP,SAVE_SP,FRAME=496
.EXIT ; proc
.PROCEND
; ------------ end proc
;****************************************************
; Outer block stack building code
_start_entry
.EXPORT _start_entry,ENTRY
_ob_init_
; X = gr7 CC = gr8 CY = gr9 S = gr6
;DB = gr4 DP = gr27 ret = gr11
ADDIL L%_db_area-$global$, 27
LDO R%_db_area-$global$(1), 4
ADDIL L%_q_init-$global$, 27
LDO R%_q_init-$global$(1), 5
LDO 8 (0),9 ;Initialize miTroc
OR 30,0,11 ;Set R11 to SP, use as return/fp area
; Virtual arrays & pointers...
; FVP, @64, pointer
BL U_INIT_TRAPS, 2
NOP
.IMPORT GETINFO,CODE
OR 5,0,26 ;Addr of info string
LDO -52 (30),25 ;Addr of info length
LDO -56 (30),24 ;Addr of parm
LDO 400 (0),20 ;(Max info len)
STH 20,-52 (0,30)
BL,N GETINFO,2
NOP
LDH -52 (0,30),20 ;Load length of returned string
SUB 5,4,21 ;Calc Db address of info
ADD 20,5,5 ;Add to q register
LDO 1 (5),5 ;round q to nearest word
DEP 0,31,1,5
STHS,MA 20,2 (0,5) ;Q-6: INFO LEN
STHS,MA 21,2 (0,5) ;Q-5 INFO address
LDH -56 (0,30),20 ;Load the parm value
STHS,MA 20,2 (0,5) ;Q-4: PARM
STHS,MA 0,2 (0,5) ;build initial Q marker... X-reg
ZDEPI -1,17,1,20 ; P-relative
STHS,MA 20,2 (0,5)
LDIL 24,20 ; status register
LDO 15 (20),20
STHS,MA 20,2 (0,5)
LDO 4 (0),20 ; delta-Q = 4
STH 20,0 (0,5)
LDO 408 (30),30 ;allocate stack for NM proc call...
DEP 0,31,3,30 ;align 8
STW 0,-4 (0,30) ;Set PSP to 0 (for stack trace)
BV 0(7) ;return to OB
OR 5,0,6 ;S = gr6
; **************************************************
; Outer Block ... primary entry point
_start
.EXPORT _start,sec_prog
PROGRAM
.PROC
.CALLINFO CALLER,SAVE_RP,SAVE_SP
.ENTRY
.EXPORT PROGRAM,pri_prog
STW 2,-20 (0,30)
STW 0,-4 (0,30) ;Set PSP to 0 (for stack trace)
BL,N _ob_init_,7
NOP
; 5024 Loc=$00000010 / 18 assign
STHS,MB 0,2 (0,6) ; value
; pcal fact
; do parm # 1 N
LDO 6 (0),19
STHS,MB 19,2 (0,6)
BL,N fact,2
NOP
LDHS,MA -2 (0,6),20 ;assign to RSLT
STH 20,10 (0,4)
; 5184 Loc=$0000002c / 18 pcal
; pcal report
BL,N report,2
NOP
.IMPORT U_INIT_TRAPS, CODE
.IMPORT U_nonlocal_escape, CODE
.IMPORT U_get_escapecode, CODE
.IMPORT U_set_escapecode, CODE
L$2
EX_PROGRAM
.IMPORT TERMINATE,CODE
BL,N TERMINATE,2
NOP
.EXIT ; program
.PROCEND
;****************************************************
; End of Outer Block
;****************************************************
.SPACE $TEXT$
.SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
L$PREL_
.SPACE $PRIVATE$
.SUBSPA $GLOBAL$,QUAD=1,ALIGN=8,ACCESS=31
.IMPORT $global$, DATA
.SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
.ALIGN 8
_dl_register
.word -10 ; initial DL register value
.word 0 ;DL= (halfs)
.ALIGN 8
_dl_area
.ALIGN 8
_db_area ; (DB area)
.EXPORT _db_area, DATA
; Global variables...
.HALF 11 ;BUF DB + 0 @
.HALF 0 ;I DB + 1 *2= 2
.HALF 0 ;J DB + 2 *2= 4
.HALF 0 ;K DB + 3 *2= 6
.HALF 0 ;LEN DB + 4 *2= 8
.HALF 0 ;RSLT DB + 5 *2= 10
.HALF 0, 0 ;FVP DB + 6
.HALF 0, 0
.HALF 22 ;BUF' DB + 10 @'
; Indirect arrays...
.BLOCKZ 80 ;BUF ( 11) -> DB + 0 ar
.SPACE $TEXT$
.SUBSPA $LIT$
.ALIGN 8
L$C26
.STRING "Result = "
.SPACE $TEXT$
.SUBSPA $LIT$
.ALIGN 8
L_2528 ;FOO' -> =PB + 0 ar'
.STRING "this is a test"
.ALIGN 8
.SPACE $PRIVATE$
.SUBSPA $DATA$
_q_init .BLOCKZ 65434
.END