333 lines
8.6 KiB
Plaintext
333 lines
8.6 KiB
Plaintext
.define ignmask
|
|
.define itoa
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
!---------------------------------------------------------------------------
|
|
! MISCELLANEOUS
|
|
!----------------------------------------------------------------------------
|
|
ass_z: mov (sp)+,d0 ; bra 5f
|
|
ass_l: move.b (a3)+,-(sp) ; move.b (a3)+,1(sp)
|
|
move.w (sp)+,d0
|
|
5: checksize
|
|
bra e_oddz
|
|
4: move.l (sp)+,d0 ; bpl 3f
|
|
asr.l wmu,d0 ; bra 8f
|
|
2: move.w (sp)+,d0 ; bpl 3f
|
|
asr.w #1,d0 ; ext.l d0
|
|
bra 8f
|
|
|
|
asp_1W: asp_2W: asp_3W: asp_4W: asp_5W:
|
|
sub.w #176,d0
|
|
#ifndef lword
|
|
asr.l #1,d0
|
|
#endif
|
|
3: add.l d0,sp ; jmp (a4)
|
|
asp_w0: move.l d6,d0 ; move.b (a3)+,d0
|
|
5: asl.l wmu,d0 ; bra 3b
|
|
asp_lw: move.b (a3)+,-(sp) ; move.b (a3)+,1(sp)
|
|
move.w (sp)+,d0 ; ext.l d0
|
|
6: bmi 8f
|
|
asl.l wmu,d0 ; bra 3b
|
|
8: neg.l d0 ; sub.l #1,d0
|
|
1: mov und,-(sp) ; dbra d0,1b
|
|
jmp (a4)
|
|
asp_qw: move.l (sp)+,d0 ; bra 6b
|
|
|
|
!-----------------------------------------------------------------------------
|
|
bls_z: mov (sp)+,d0 ; bra 0f
|
|
bls_l: adroff ; move.w (a5),d0
|
|
0: checksize
|
|
2: move.w (sp)+,d0 ; bra 0f
|
|
4: move.l (sp)+,d0 ; bra 0f
|
|
|
|
blm_q: move.l (sp)+,d0 ; bra 0f
|
|
blm_l: adroff ; move.w (a5),d0
|
|
bra 0f
|
|
blm_s0: move.l d6,d0 ; move.b (a3)+,d0
|
|
0: move.l d0,d2 ; asr.w wmu,d2
|
|
beq 5f ; move.l a5,d1
|
|
sub.w #1,d2 ; move.l (sp)+,a0 !dest. address
|
|
move.l (sp)+,a5 ; cmp.l a0,a5
|
|
!a5 contains source address. beware of overlap of pieces
|
|
beq 3f ; bcs 2f
|
|
1: mov (a5)+,(a0)+ ; dbra d2,1b
|
|
3: move.l d1,a5
|
|
5: jmp (a4)
|
|
2: add.l d0,a5 ; add.l d0,a0
|
|
4: mov -(a5),-(a0) ; dbra d2,4b
|
|
bra 3b
|
|
|
|
!----------------------------------------------------------------------------
|
|
csa_z: mov (sp)+,d0 ; bra 0f
|
|
csa_l: adroff ; move.w (a5),d0
|
|
0: sub.l wrd,d0 ; bne e_illins
|
|
csa_1W: move.l (sp)+,a0 ; mov (sp)+,d0
|
|
add.l #4,a0 ; subt (a0),d0
|
|
blt 6f
|
|
comp word(a0),d0 ; bhi 6f
|
|
extend d0
|
|
asl.l #2,d0 ; add.l wrd,d0
|
|
move.l a0,a1 ; add.l d0,a1
|
|
move.l word(a1),d1 ; bne 5f
|
|
6: sub.l #4,a0 ; move.l (a0),d1
|
|
beq e_case
|
|
5: move.l d1,a3 ; jmp (a4)
|
|
|
|
csb_z: mov (sp)+,d0 ; bra 0f
|
|
csb_l: adroff ; move.w (a5),d0
|
|
0: comp wrd,d0 ; bne e_illins
|
|
csb_1W: move.l (sp)+,a0 ; mov (sp)+,d0
|
|
move.l a0,a3
|
|
!Use a3 as a general register
|
|
mov 4(a0),d1 ; sub.l #1,d1
|
|
blt 2f
|
|
move.l wrd,d2 ; add.l #4,d2
|
|
1: add.l d2,a0 ; comp (a0),d0
|
|
dbeq d1,1b ; bne 2f
|
|
move.l word(a0),d1 ; beq e_case
|
|
move.l d1,a3 ; jmp (a4)
|
|
2: move.l (a3),d1 ; beq e_case
|
|
move.l d1,a3 ; jmp (a4)
|
|
|
|
!-----------------------------------------------------------------------------
|
|
dch_z: move.l (sp)+,a0 ; move.l (a0),-(sp)
|
|
move.l ml,a0 ; cmp.l (sp),a0
|
|
bls e_badptr ; jmp (a4)
|
|
|
|
lpb_z: add.l #0+l0,(sp) ; jmp (a4)
|
|
|
|
!----------------------------------------------------------------------------
|
|
|
|
dup_1W: mov (sp),-(sp) ; jmp (a4)
|
|
dup_l: adroff ; move.w (a5),d0
|
|
bra 1f
|
|
dus_z: mov (sp)+,d0 ; bra 0f
|
|
dus_l: adroff ; move.w (a5),d0
|
|
0: checksize
|
|
2: move.w (sp)+,d0 ; bra 1f
|
|
4: move.l (sp)+,d0
|
|
1: ble e_oddz ; bclr #0,d0
|
|
move.l sp,a0 ; add.l d0,a0
|
|
asr.l wmu,d0 ; sub.l #1,d0
|
|
3: mov -(a0),-(sp) ; dbra d0,3b
|
|
jmp (a4)
|
|
!We do not test if d0 is a word multiple indeed .
|
|
|
|
!-----------------------------------------------------------------------------
|
|
exg_z: mov (sp)+,d0 ; bra 0f
|
|
exg_l: adroff ; move.w (a5),d0
|
|
bra 0f
|
|
exg_s0: move.l d6,d0 ; move.b (a3)+,d0
|
|
0: move.l d7,d1 ; move.l d0,a0
|
|
1: asri #1,d0 ; dbcs d1,1b
|
|
bcs e_oddz ; sub.l #1,d0
|
|
add.l a0,sp ; add.l sp,a0
|
|
2: mov -(sp),d1 ; mov -(a0),(sp)
|
|
mov d1,(a0) ; dbra d0,2b
|
|
jmp (a4)
|
|
|
|
gto_q: move.l (sp)+,a0 ; bra 3f
|
|
gto_l: move.l d6,a0 ; move.b (a3)+,-(sp)
|
|
move.b (a3)+,1(sp) ; move.w (sp)+,a0
|
|
3: add.l a6,a0 ; move.l (a0)+,a3
|
|
move.l (a0)+,sp
|
|
#if count+prof+flow
|
|
!To find the procedure descriptor of the procedure we go to ,we cannot use
|
|
!the memory place curproc . We need to find the last time this procedure
|
|
!called. In the frame of that procedure we find the pointer to the procedure
|
|
!descriptor we need.
|
|
2: move.l (a2),d0
|
|
cmp.l (a0),d0
|
|
beq 1f
|
|
move.l d0,a2
|
|
bra 2b
|
|
1: move.l 8(a2),a2 !a2 ponts at procedure descriptor.
|
|
move.l 8(a2),d0 !countptr in d0.
|
|
move.l d0,countptr !initially assume first line
|
|
sub.l 12(a2),d0
|
|
move.l d0,countfld
|
|
#endif
|
|
move.l (a0),a2
|
|
jmp (a4)
|
|
|
|
lim_z: clr.l d0; move.w ignmask, d0
|
|
mov d0,-(sp) ; jmp (a4)
|
|
sim_z: clr.l d0; mov (sp)+, d0
|
|
move.w d0,ignmask ; jmp (a4)
|
|
|
|
.sect .bss
|
|
ignmask: .space 2
|
|
.sect .text
|
|
|
|
!---------------------------------------------------------------------------
|
|
lor_s0: move.l d6,d0 ; move.b (a3)+,d0
|
|
bne 1f ; move.l a2,-(sp)
|
|
jmp (a4)
|
|
1: sub.w #1,d0 ; bne 2f
|
|
move.l sp,-(sp) ; jmp (a4)
|
|
2: sub.w #1,d0 ; bne e_illins
|
|
move.l hp,-(sp) ; jmp (a4)
|
|
|
|
str_s0: move.l d6,d0 ; move.b (a3)+,d0
|
|
bne 1f ; move.l (sp)+,a2
|
|
jmp (a4)
|
|
1: sub.w #1,d0 ; bne 2f
|
|
move.l (sp)+,sp ; claimstack
|
|
jmp (a4)
|
|
2: sub.w #1,d0 ; bne e_illins
|
|
move.l (sp)+,d1 ; cmp.l nd,d1
|
|
bcc 3f !break
|
|
cmp.l tblmax,d1 ; bcs 4f
|
|
5: move.l d1,hp ; jmp (a4)
|
|
3: move.l d1,-(sp)
|
|
move.l d1,-(sp) ; add.l #1280,(sp)
|
|
bsr _Xbreak ; testen (sp)+
|
|
4: beq 1f ; testen (sp)+ ; bsr e_heap ;
|
|
move.l (sp)+,d1 ; jmp (a4)
|
|
1: move.l (sp)+,d1 ; bra 5b
|
|
|
|
!----------------------------------------------------------------------------
|
|
rck_z: mov (sp)+,d0 ; bra 0f
|
|
rck_l: adroff ; move.w (a5),d0
|
|
0: sub.l wrd,d0 ; beq rck_1W
|
|
sub.l wrd,d0 ; bne e_oddz
|
|
move.l (sp)+,a0
|
|
mov (sp),d0 ; comp (a0),d0 ; blt 9f
|
|
add.l wrd,a0 ; bra 1f
|
|
rck_1W: move.l (sp)+,a0
|
|
mov (sp),d0 ; comp (a0),d0 ; blt 9f
|
|
1: comp word(a0),d0 ; bgt 9f
|
|
jmp (a4)
|
|
9: bra e_range
|
|
!Temp. solution until trp_z is implemented
|
|
|
|
!--------------------------------------------------------------------------
|
|
nop_z:
|
|
lblnop: lea nopln+16,a0 ; clr.l d1; mov (a6),d1
|
|
bsr itoa
|
|
lea nopln+33,a0 ; move.l sp,d1
|
|
bsr itoa
|
|
move.l #45,-(sp)
|
|
pea nopln ; mov #1,-(sp)
|
|
bsr _Xwrite
|
|
add.l wrd+4,sp
|
|
jmp (a4)
|
|
|
|
.sect .data
|
|
nopln: .asciz "line number nop sp \n"
|
|
.align 2
|
|
.sect .text
|
|
!unsigned to ascii for integers , a0 is address of first character
|
|
! d1 contains integer. Output is 11 characters of which the first is a space.
|
|
|
|
.sect .text
|
|
|
|
itoa: move.l #9,d4 ; add.l #11,a0
|
|
move.l #10,d0
|
|
0: bsr dvu4 ; add.w #48,d3
|
|
move.b d3,-(a0) ; tst.l d1
|
|
dbeq d4,0b
|
|
1: move.b #32,-(a0) ; dbra d4,1b
|
|
rts
|
|
|
|
!------------------------------------------------------------------------------
|
|
fil_q: move.l (sp)+,a0 ; bra 3f
|
|
fil_l: adroff ; move.w (a5),d0
|
|
move.l d0,a0
|
|
3: add.l a6,a0 ; cmp.l 4(a6),a0
|
|
beq 0f
|
|
#if flow+count+prof
|
|
move.l curproc,a1
|
|
move.l 8(a1),d0
|
|
sub.l 12(a1),d0
|
|
move.l d0,countfld !START COUNTPTR FOR THIS PROC
|
|
move.l a0,20(a1) !FILE POINTER IN PROC DES
|
|
#endif
|
|
move.l a0,4(a6)
|
|
0: jmp (a4)
|
|
|
|
!-----------------------------------------------------------------------------
|
|
lni_z: ad #1,(a6)
|
|
#if count+flow+prof
|
|
add.l #1,countptr
|
|
#if prof
|
|
add.l #4,profile
|
|
#endif
|
|
#endif
|
|
bra 8f
|
|
lin_l: adroff ; clr.l d0
|
|
move.w (a5),d0 ; bra 1f
|
|
lin_q: move.l (sp)+,d0 ; bra 1f
|
|
lin_s0: move.l #0,d0 ; move.b (a3)+,d0
|
|
1: comp (a6),d0 ; beq 9f
|
|
mov d0,(a6)
|
|
#if count+flow+prof
|
|
move.l countfld,d1
|
|
add.l d0,d1
|
|
move.l d1,countptr
|
|
#if prof
|
|
asl.l #2,d1
|
|
add.l ltime,d1
|
|
move.l d1,profile
|
|
#endif
|
|
#endif
|
|
8:
|
|
#if last
|
|
bsr nexttab ;
|
|
move.l 4(a6),(a1)+ !store new line
|
|
#if lword
|
|
move.l (a6),(a1) !number in buffer lasttable
|
|
#else
|
|
mov (a6),d0
|
|
extend d0
|
|
move.l d0,(a1)
|
|
#endif
|
|
#endif
|
|
#if count
|
|
move.l countptr,d1 !LINE NUMBER IN d1
|
|
asl.l #2,d1 !MULTIPLY BY 4
|
|
move.l lcount,a0
|
|
add.l d1,a0
|
|
add.l #1,(a0) !ADD 1 TO THE CORRESPONDING COUNT
|
|
#endif
|
|
#if flow
|
|
move.l countptr,d1 !LINE NUMBER IN d1
|
|
move.l #8,d0
|
|
bsr dvu4 !QUOTIENT IN d1 REST IN d3
|
|
move.l lflow,a0
|
|
add.l d1,a0
|
|
bset d3,(a0) !ATTENTION BIT 0 CORR TO LINE 0
|
|
#endif
|
|
!9: bra nop_z
|
|
9: jmp (a4)
|
|
!----------------------------------------------------------------------------
|
|
mon_z: mov (sp)+,d0 ; bmi e_badmon
|
|
cmp.l #64,d0 ; bge e_badmon
|
|
move.l a4,-(sp) ; asl.l #2,d0
|
|
add.l #syscal,d0 ; move.l d0,a0
|
|
move.l (a0),a0 ; jmp (a0)
|
|
|
|
.sect .data
|
|
syscal:
|
|
.data4 e_badmon, hlt_z, _Xfork, _Xread
|
|
.data4 _Xwrite, _Xopen, _Xclose, _Xwait
|
|
.data4 _Xcreat, _Xlink, _Xunlink, e_badmon
|
|
.data4 _Xchdir, e_badmon, _Xmknod, _Xchmod
|
|
.data4 _Xchown, _Xbreak, _Xstat, _Xlseek
|
|
.data4 _Xgetpid, _Xmount, _Xumount, _Xsetuid
|
|
.data4 _Xgetuid, _Xstime, _Xptrace, _Xalarm
|
|
.data4 _Xfstat, _Xpause, _Xutime, e_badmon
|
|
.data4 e_badmon, _Xaccess, _Xnice, _Xftime
|
|
.data4 _Xsync, _Xkill, e_badmon, e_badmon
|
|
.data4 e_badmon, _Xdup, _Xpipe, _Xtimes
|
|
.data4 _Xprofil, e_badmon, _Xsetgid, _Xgetgid
|
|
.data4 _sigtrp, e_badmon, e_badmon, _Xacct
|
|
.data4 e_badmon, e_badmon, _Xioctl, e_badmon
|
|
.data4 e_badmon, e_badmon, e_badmon, _Xexece
|
|
.data4 _Xumask, _Xchroot, e_badmon, e_badmon
|
|
|
|
.sect .text
|