*** empty log message ***
authorkeie <none@none>
Tue, 8 Jan 1985 11:48:43 +0000 (11:48 +0000)
committerkeie <none@none>
Tue, 8 Jan 1985 11:48:43 +0000 (11:48 +0000)
36 files changed:
mach/z8000/libem/aar.s [new file with mode: 0644]
mach/z8000/libem/blm.s [new file with mode: 0644]
mach/z8000/libem/cii.s [new file with mode: 0644]
mach/z8000/libem/cmi.s [new file with mode: 0644]
mach/z8000/libem/cmi4.s [new file with mode: 0644]
mach/z8000/libem/cms.s [new file with mode: 0644]
mach/z8000/libem/cmu.s [new file with mode: 0644]
mach/z8000/libem/cmu4.s [new file with mode: 0644]
mach/z8000/libem/csa.s [new file with mode: 0644]
mach/z8000/libem/csb.s [new file with mode: 0644]
mach/z8000/libem/cuu.s [new file with mode: 0644]
mach/z8000/libem/dup.s [new file with mode: 0644]
mach/z8000/libem/dvu2.s [new file with mode: 0644]
mach/z8000/libem/dvu4.s [new file with mode: 0644]
mach/z8000/libem/end.s [new file with mode: 0644]
mach/z8000/libem/exg.s [new file with mode: 0644]
mach/z8000/libem/gto.s [new file with mode: 0644]
mach/z8000/libem/head_em.s [new file with mode: 0644]
mach/z8000/libem/inn.s [new file with mode: 0644]
mach/z8000/libem/lar.s [new file with mode: 0644]
mach/z8000/libem/los2.s [new file with mode: 0644]
mach/z8000/libem/mon.s [new file with mode: 0644]
mach/z8000/libem/noop.s [new file with mode: 0644]
mach/z8000/libem/prf.s [new file with mode: 0644]
mach/z8000/libem/printf.s [new file with mode: 0755]
mach/z8000/libem/rck.s [new file with mode: 0644]
mach/z8000/libem/rmu2.s [new file with mode: 0644]
mach/z8000/libem/rmu4.s [new file with mode: 0644]
mach/z8000/libem/sar.s [new file with mode: 0644]
mach/z8000/libem/save.s [new file with mode: 0644]
mach/z8000/libem/sigtrp.s [new file with mode: 0644]
mach/z8000/libem/strhp.s [new file with mode: 0644]
mach/z8000/libem/sts2.s [new file with mode: 0644]
mach/z8000/libem/trp.s [new file with mode: 0644]
mach/z8000/libem/unknown.s [new file with mode: 0644]
mach/z8000/libem/xset.s [new file with mode: 0644]

diff --git a/mach/z8000/libem/aar.s b/mach/z8000/libem/aar.s
new file mode 100644 (file)
index 0000000..1cf4678
--- /dev/null
@@ -0,0 +1,13 @@
+.define aar
+
+!R1 contains description address
+!R3 contains element number
+!base address is on stack
+aar:
+       sub     R3, 0(R1)
+       mult    RR2, 4(R1)
+       inc     R15, $4
+       add     R3, *RR14
+       ld      *RR14, R3
+       dec     R15, $4
+       ret
diff --git a/mach/z8000/libem/blm.s b/mach/z8000/libem/blm.s
new file mode 100644 (file)
index 0000000..de643eb
--- /dev/null
@@ -0,0 +1,26 @@
+.define blm
+
+!size in R0
+blm:
+       popl    saveret, *RR14
+       ldm     savereg, R4, $10
+       ldk     R2, $0
+       ld      R4, R2
+       pop     R3, *RR14               !RR2: dst address
+       pop     R5, *RR14               !RR4: src address
+       ld      R1, R0
+       sra     R0
+       jr      EQ, 2f
+           !now avoid wrong copy in case the pieces overlap
+       cp      R5, R3
+       jr      EQ, 2f
+       jr      LT, 1f
+       ldir    *RR2, *RR4, R0
+       jr      2f
+1:     dec     R1, $2
+       add     R3, R1
+       add     R5, R1
+       lddr    *RR2, *RR4, R0
+2:     ldm     R4, savereg, $10
+       pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/cii.s b/mach/z8000/libem/cii.s
new file mode 100644 (file)
index 0000000..686f103
--- /dev/null
@@ -0,0 +1,24 @@
+.define cii
+
+cii:
+       popl    saveret, *RR14
+       pop     R2, *RR14
+       pop     R1, *RR14
+       sub     R2, R1          !expansion in bytes
+       jr      LE, 1f
+       sra     R2              !expansion in words > 0
+       jr      NC, 2f
+       pop     R1, *RR14       !expand 1 --> 2
+       extsb   R1
+       push    *RR14, R1
+       test    R2
+       jr      EQ, 4f
+2:                             !expand >= 1 word
+       ld      R1, *RR14
+       exts    RR0
+3:     push    *RR14, R0
+       djnz    R2, 3b
+       jr      4f
+1:     sub     R15, R2
+4:     pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/cmi.s b/mach/z8000/libem/cmi.s
new file mode 100644 (file)
index 0000000..5459aec
--- /dev/null
@@ -0,0 +1,14 @@
+.define cmi
+
+!size in R0
+cmi:
+       cp      R0, $2
+       jr      NE, 1f
+       popl    RR2, *RR14
+       pop     R1, *RR14
+       pop     R0, *RR14
+       sub     R0, R1
+       jp      *RR2
+1:     cp      R0, $4
+       jr      EQ, cmi4
+       jr      unknown
diff --git a/mach/z8000/libem/cmi4.s b/mach/z8000/libem/cmi4.s
new file mode 100644 (file)
index 0000000..ac3ff4e
--- /dev/null
@@ -0,0 +1,15 @@
+.define cmi4
+
+cmi4:
+       popl    saveret, *RR14
+       popl    RR0, *RR14
+       popl    RR2, *RR14
+       subl    RR2, RR0
+       ldk     R0, $0
+       ldl     RR2, saveret
+       jr      LT, 1f
+       jp      EQ, *RR2
+       inc     R0
+       jp      *RR2
+1:     dec     R0
+       jp      *RR2
diff --git a/mach/z8000/libem/cms.s b/mach/z8000/libem/cms.s
new file mode 100644 (file)
index 0000000..cfe26c4
--- /dev/null
@@ -0,0 +1,19 @@
+.define cms
+
+cms:
+       popl    saveret, *RR14
+       ldm     savereg, R4, $10
+       ldl     RR2, RR14
+       add     R3, R0
+       ldl     RR4, RR2
+       add     R5, R0
+       sra     R0
+2:     pop     R1, *RR14
+       cp      R1, *RR2
+       jr      NE, 1f
+       inc     R3, $2
+       djnz    R0, 2b
+1:     ld      R15, R5
+       ldm     R4, savereg, $10
+       pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/cmu.s b/mach/z8000/libem/cmu.s
new file mode 100644 (file)
index 0000000..c3b9613
--- /dev/null
@@ -0,0 +1,20 @@
+.define cmu
+
+!size in R0
+cmu:
+       cp      R0, $2
+       jr      NE, 1f
+       popl    RR2, *RR14
+       pop     R1, *RR14
+       pop     R0, *RR14
+       cp      R0, R1
+       ldk     R0, $0
+       jr      ULT, 2f
+       jp      EQ, *RR2
+       inc     R0
+       jp      *RR2
+2:     dec     R0
+       jp      *RR2
+1:     cp      R0, $4
+       jr      EQ, cmu4
+       jr      unknown
diff --git a/mach/z8000/libem/cmu4.s b/mach/z8000/libem/cmu4.s
new file mode 100644 (file)
index 0000000..2135b2d
--- /dev/null
@@ -0,0 +1,15 @@
+.define cmu4
+
+cmu4:
+       popl    saveret, *RR14
+       popl    RR0, *RR14
+       popl    RR2, *RR14
+       cpl     RR2, RR0
+       ldk     R0, $0
+       ldl     RR2, saveret
+       jr      ULT, 1f
+       jp      EQ, *RR2
+       inc     R0
+       jp      *RR2
+1:     dec     R0
+       jp      *RR2
diff --git a/mach/z8000/libem/csa.s b/mach/z8000/libem/csa.s
new file mode 100644 (file)
index 0000000..e4fd1b9
--- /dev/null
@@ -0,0 +1,19 @@
+.define csa
+
+!R1 contains address of jump table
+!R2 contains case index
+csa:
+       sub     R2, 2(R1)
+       jr      LT, 1f
+       cp      R2, 4(R1)
+       jr      UGT, 1f
+       sla     R2
+       add     R1, R2
+       ld      R2, 06(R1)
+       cp      R2, $0
+       jr      EQ, 2f
+       jp      0(R2)
+1:     ld      R1, 0(R1)
+       jp      NE, 0(R1)
+2:     push    *RR14, $ECASE
+       jr      fatal
diff --git a/mach/z8000/libem/csb.s b/mach/z8000/libem/csb.s
new file mode 100644 (file)
index 0000000..de145d9
--- /dev/null
@@ -0,0 +1,21 @@
+.define csb
+
+!R1 contains address of jump table
+!R2 contains case index
+csb:
+       ld      R3, 0(R1)       !default pointer
+       ld      R0, 2(R1)       !number of entries
+       test    R0
+       jr      EQ, 1f
+3:     inc     R1, $4
+       cp      R2, 0(R1)
+       jr      EQ, 2f
+       djnz    R0, 3b
+1:     ld      R1, R3          !default pointer
+       jr      4f
+2:     ld      R1, 2(R1)
+4:     test    R1
+       jr      EQ, 5f
+       jp      0(R1)
+5:     push    *RR14, $ECASE
+       jr      fatal
diff --git a/mach/z8000/libem/cuu.s b/mach/z8000/libem/cuu.s
new file mode 100644 (file)
index 0000000..7e60c5e
--- /dev/null
@@ -0,0 +1,15 @@
+.define cuu
+
+cuu:
+       popl    RR2, *RR14
+       pop     R0, *RR14
+       pop     R1, *RR14
+       sub     R0, R1          !expansion in bytes
+       jr      LE, 1f
+       sra     R0              !expansion in words
+       jp      EQ, *RR2
+2:     push    *RR14, $0
+       djnz    R0, 2b
+       jp      *RR2
+1:     sub     R15, R0
+       jp      *RR2
diff --git a/mach/z8000/libem/dup.s b/mach/z8000/libem/dup.s
new file mode 100644 (file)
index 0000000..74aa680
--- /dev/null
@@ -0,0 +1,12 @@
+.define dup
+
+dup:
+       popl    saveret, *RR14
+       dec     R15, $2
+       ldl     RR2, RR14
+       add     R3, R0
+       sra     R0
+       lddr    *RR14, *RR2, R0
+       inc     R15, $2
+       pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/dvu2.s b/mach/z8000/libem/dvu2.s
new file mode 100644 (file)
index 0000000..d140372
--- /dev/null
@@ -0,0 +1,17 @@
+.define dvu2
+
+dvu2:
+       popl    saveret, *RR14
+       pop     R2, *RR14
+       pop     R1, *RR14
+       test    R2
+       jr      MI, 1f
+       ldk     R0, $0
+       div     RR0, R2
+2:     pushl   *RR14, saveret
+       ret
+1:     cp      R2, R1
+       ldk     R1, $0
+       jr      UGT, 2b
+       inc     R1
+       jr      2b
diff --git a/mach/z8000/libem/dvu4.s b/mach/z8000/libem/dvu4.s
new file mode 100644 (file)
index 0000000..d5fc961
--- /dev/null
@@ -0,0 +1,19 @@
+.define dvu4
+
+dvu4:
+       popl    saveret, *RR14
+       ldm     savereg, R4, $10
+       popl    RR4, *RR14
+       popl    RR2, *RR14
+       testl   RR4
+       jr      MI, 1f
+       ldl     RR0, $0
+       divl    RQ0, RR4
+       jr      2f
+1:     cpl     RR4, RR2
+       ldl     RR2, $0
+       jr      UGT, 2f
+       inc     R3
+2:     ldm     R4, savereg, $10
+       pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/end.s b/mach/z8000/libem/end.s
new file mode 100644 (file)
index 0000000..858b150
--- /dev/null
@@ -0,0 +1,11 @@
+.define        endtext, enddata, endbss, _etext, _edata, _end
+
+       .text
+endtext:
+_etext:
+       .data
+enddata:
+_edata:
+       .bss
+endbss:
+_end:
diff --git a/mach/z8000/libem/exg.s b/mach/z8000/libem/exg.s
new file mode 100644 (file)
index 0000000..79061cc
--- /dev/null
@@ -0,0 +1,18 @@
+.define exg
+
+!size (bytes) in R0
+exg:
+       ldm     savereg, R4, $10
+       ldl     RR2, RR14
+       inc     R3, $2
+       ldl     RR4, RR2
+       add     R5, R0
+       sra     R0
+1:     ld      R1, *RR2
+       ex      R1, *RR4
+       ld      *RR4, R1
+       inc     R3, $2
+       inc     R5, $2
+       djnz    R0, 1b
+       ldm     R4, savereg, $10
+       ret
diff --git a/mach/z8000/libem/gto.s b/mach/z8000/libem/gto.s
new file mode 100644 (file)
index 0000000..4c78b23
--- /dev/null
@@ -0,0 +1,8 @@
+.define gto
+
+gto:
+       pop     R3, *RR14
+       ld      R13, 4(R3)
+       ld      R15, 2(R3)
+       ld      R3, 0(R3)
+       jp      0(R3)
diff --git a/mach/z8000/libem/head_em.s b/mach/z8000/libem/head_em.s
new file mode 100644 (file)
index 0000000..202fcbc
--- /dev/null
@@ -0,0 +1,57 @@
+.define  EXIT, F_DUM
+.define  ERANGE, ESET, EHEAP, EILLINS, EODDZ, ECASE, EBADMON
+.define  hol0, trppc, trpim, reghp, argv, envp
+
+EXIT   = 0
+F_DUM  = 0
+
+ERANGE  = 1
+ESET    = 2
+EHEAP   = 17
+EILLINS        = 18
+EODDZ  = 19
+ECASE   = 20
+EBADMON = 25
+
+.text
+                       !clear .bss
+       ldk     R2, $0
+       ld      R3, $endbss
+       ld      R0, R3
+       sub     R0, $begbss
+       jr      EQ, 1f
+       sra     R0
+       push    *RR2, $0
+       dec     R0
+       jr      EQ, 1f
+       ldl     RR4, RR2
+       dec     R5, $2
+       lddr    *RR4, *RR2, R0
+1:
+       ldb     RL0, $10                ! echo newline
+       sc      $4
+       ldl     RR14, $0
+       push    *RR14, envp
+       push    *RR14, argv
+       push    *RR14, $1
+       calr    _m_a_i_n
+       ldl     RR14, $0xC00017FC
+       sc      $0
+
+.bss
+begbss:
+.data
+hol0:
+       .word 0,0                       ! line no
+       .word 0,0                       ! file
+trppc:
+       .word 0
+trpim:
+       .word 0
+argv:
+envp:
+       .word 1f
+       .word 0
+1:     .asciz  "program"
+reghp:
+       .word endbss
diff --git a/mach/z8000/libem/inn.s b/mach/z8000/libem/inn.s
new file mode 100644 (file)
index 0000000..ba8ac0f
--- /dev/null
@@ -0,0 +1,23 @@
+.define inn
+
+!bitnr in R1
+!size (bytes) in R2
+inn:
+       ld      R3, R2
+       sra     R2
+       ldk     R0, $0
+       div     RR0, $020       !R0: bitnr, R1: wordnr
+       cp      R1, R2
+       jr      UGE, 1f         !R1 must be < R2
+       inc     R1, $2          !R1 contains nr of words from top stack
+       sla     R1
+       ld      R1, RR14(R1)
+       bit     R1, R0
+       jr      EQ, 1f
+       ldk     R0, $1
+       jr      2f
+1:     ldk     R0, $0
+2:     ld      R1, R3
+       popl    RR2, *RR14
+       add     R15, R1
+       jp      *RR2
diff --git a/mach/z8000/libem/lar.s b/mach/z8000/libem/lar.s
new file mode 100644 (file)
index 0000000..bf82bbb
--- /dev/null
@@ -0,0 +1,23 @@
+.define lar
+
+!R1 contains description address
+!R3 contains element number
+!base address is on stack
+lar:
+       popl    saveret, *RR14
+       sub     R3, 0(R1)
+       ld      R0, 4(R1)               !nr of bytes per element
+       mult    RR2, R0
+       add     R3, *RR14
+       add     R3, R0
+       sra     R0                      !nr of words per element
+       jr      EQ, 1f
+       dec     R3, $2
+       lddr    *RR14, *RR2, R0
+       inc     R15, $2
+       jr      2f
+1:     ldb     RL2, -1(R3)
+       ldb     RH2, $0
+       ld      *RR14, R2
+2:     ldl     RR2, saveret
+       jp      *RR2
diff --git a/mach/z8000/libem/los2.s b/mach/z8000/libem/los2.s
new file mode 100644 (file)
index 0000000..a6b9d3e
--- /dev/null
@@ -0,0 +1,20 @@
+.define los2
+
+los2:
+       popl    saveret, *RR14
+       pop     R0, *RR14               !object size
+       ldk     R2, $0
+       pop     R3, *RR14               !address of object
+       cp      R0, $1
+       jr      NE, 1f
+       ldb     RL0, *RR2
+       push    *RR14, R0
+       jr      2f
+1:     add     R3, R0
+       dec     R3, $2
+       dec     R15, $2
+       sra     R0
+       lddr    *RR14, *RR2, R0
+       inc     R15, $2
+2:     pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/mon.s b/mach/z8000/libem/mon.s
new file mode 100644 (file)
index 0000000..3d971be
--- /dev/null
@@ -0,0 +1,83 @@
+.define mon
+
+mon:
+       popl    saveret, *RR14
+       pop     R0, *RR14       ! iocode
+       cp      R0, $1          ! exit
+       jr      NE, read
+       inc     R15, $2
+       sc      $EXIT
+read:  cp      R0, $3          ! read
+       jr      NE, write
+       pop     R0, *RR14       ! dummy;  all input from stdin
+       pop     R1, *RR14       ! ptr to buffer
+       pop     R2, *RR14       ! nr of bytes to be read
+       ld      R3, R1
+       cp      R2, $0
+       jr      EQ, 6f
+1:     sc      $2              ! read character into RL0
+       cpb     RL0, $004       ! \^D
+       jr      EQ, 6f
+       cpb     RL0, $015       ! \cr
+       jr      NE, 2f
+       ldb     RL0, $012
+2:     sc      $4              ! echo
+       cpb     RL0, $010       ! \^H
+       jr      NE, 3f
+       cp      R1, R3
+       jr      EQ, 5f
+       dec     R1
+       jr      5f
+3:     cpb     RL0, $0100      ! \@
+       jr      NE, 4f
+       ld      R1, R3
+       ldb     RL0, $012
+       sc      $4
+       jr      5f
+4:     ldb     0(R1), RL0
+       inc     R1
+       cpb     RL0, $012       ! \nl
+       jr      EQ, 6f
+5:     djnz    R2, 1b
+6:     sub     R1, R3          ! nr of bytes read
+       push    *RR14, R1
+       push    *RR14, $0
+       jr      retu
+write: cp      R0, $4          ! write
+       jr      NE, open
+       pop     R0, *RR14       ! dummy;  all output to stdout
+       pop     R1, *RR14       ! ptr to buffer
+       pop     R2, *RR14       ! nr of bytes to be written
+       ld      R3, R2
+       cp      R2, $0
+       jr      EQ, 8f
+9:     ld      R0, $5000       ! counter to delay printing a little
+7:     djnz    R0, 7b
+       ldb     RL0, 0(R1)
+       sc      $4
+       inc     R1
+       djnz    R2, 9b
+8:     sub     R3, R2          ! nr of bytes written
+       push    *RR14, R3
+       push    *RR14, $0
+       jr      retu
+open:  cp      R0, $5          ! open
+       jr      close
+       jr      NE, close
+       ld      *RR14, $0
+       ld      2(R15), $0
+       jr      retu
+close: cp      R0, $6          ! close
+       jr      NE, ioctl
+       ld      *RR14, $0
+       jr      retu
+ioctl: cp      R0, $54         ! ioctl
+       jr      NE, err
+       inc     R15, $4
+       ld      *RR14, $0
+retu:  ldl     RR2, saveret
+       jp      *RR2
+err:   push    *RR14, saveret
+       push    *RR14, $EBADMON
+       calr    trp
+       ret
diff --git a/mach/z8000/libem/noop.s b/mach/z8000/libem/noop.s
new file mode 100644 (file)
index 0000000..f6c16c0
--- /dev/null
@@ -0,0 +1,9 @@
+.define noop
+
+noop:
+       push    *RR14, hol0
+       push    *RR14, $fmt
+       calr    prf
+       ret
+.data
+fmt:   .asciz  "test %d\n"
diff --git a/mach/z8000/libem/prf.s b/mach/z8000/libem/prf.s
new file mode 100644 (file)
index 0000000..9491b14
--- /dev/null
@@ -0,0 +1,36 @@
+.define prf
+
+prf:
+       ld      R0, hol0+4      !pointer to filename
+       cp      R0, $0
+       jr      EQ, 1f
+       ld      R2, R0
+       ld      R1, $40
+3:         !test filename on bad characters
+       ldb     R3, 0(R2)
+       cpb     R3, $0
+       jr      EQ, 2f
+       cpb     R3, $0177
+       jr      GE, 1f
+       cpb     R3, $040
+       jr      LT, 1f
+       inc     R2
+       djnz    R1, 3b
+       clrb    0(R2)
+2:     push    *RR14, hol0
+       ld      R1, R15
+       push    *RR14, R1
+       push    *RR14, R0
+       push    *RR14, $fmt1
+       calr    printf
+       popl    saveprf, *RR14  !return address
+       calr    printf          !because of call from 'noop'
+       pushl   *RR14, saveprf
+       ret
+1:     ld      R0, $name
+       jr      2b
+.data
+fmt1:  .asciz  "%s, sp = %x, line %d:\n"
+name:  .asciz  "_unknown file_"
+saveprf:
+       .long 0
diff --git a/mach/z8000/libem/printf.s b/mach/z8000/libem/printf.s
new file mode 100755 (executable)
index 0000000..0e511b9
--- /dev/null
@@ -0,0 +1,82 @@
+.define printf
+
+printf:
+       popl    saveret, *RR14
+       ldm     savereg, R4, $10
+       ld      R3, $buff       !R3 is pointer to a buffer, in which 
+                               !we built the string to be printed.
+       pop     R2, *RR14       !R2 is pointer to format-string
+prloop:
+       ldb     RL0, 0(R2)
+       testb   RL0
+       jr      EQ, ready
+       inc     R2
+       cpb     RL0, $045       ! '%'?
+       jr      NE, 1f
+       ldb     RL0, 0(R2)
+       inc     R2
+       cpb     RL0, $0163      ! 's'?
+       jr      EQ, 3f
+       cpb     RL0, $0170      ! 'x'?
+       ld      R4, $16         ! print number hexadecimal
+       jr      EQ, 2f
+       cpb     RL0, $0144      ! 'd'?
+       ld      R4, $10         ! print number decimal
+       jr      EQ, 2f
+       cpb     RL0, $0157      ! 'o'?
+       ld      R4, $8          ! print number octal
+       jr      EQ, 2f
+1:     ldb     0(R3), RL0
+       inc     R3
+       jr      prloop
+2:         !in case of %x, %d or %o
+       pop     R1, *RR14
+       test    R1
+       jr      PL, 4f
+       cp      R4, $10
+       jr      NE, 4f          ! print only '-' in case of %d
+       ldb     0(R3), $055     ! '-'
+       inc     R3
+       neg     R1
+4:     calr    printn
+       jr      prloop
+3:         !in case of %s
+       pop     R1, *RR14
+6:     ldb     RL0, 0(R1)
+       testb   RL0
+       jr      EQ, prloop
+       inc     R1
+       ldb     0(R3), RL0
+       inc     R3
+       jr      6b
+ready:     !now really print the string we built in the buffer
+       ldb     0(R3), RL0      !end string with '\0'
+       sub     R3, $buff-1     !R3 contains the number of characters
+       ld      R1, $buff
+7:     ldb     RL0, 0(R1)
+       inc     R1
+       sc      $4
+       djnz    R3, 7b
+       ldm     R4, savereg, $10
+       pushl   *RR14, saveret
+       ret
+
+printn:
+       ldk     R0, $0
+       div     RR0, R4         !%x, %d or %o determined by R4
+       test    R1
+       jr      EQ, 5f          !if quotient is '0' printn is ready
+       push    *RR14, R0       !push remainder onto the stack
+       calr    printn
+       pop     R0, *RR14
+5:     add     R0, $060
+       cp      R0, $071        !'9'
+       jr      LE, 8f
+       add     R0, $7
+8:     ldb     0(R3), RL0
+       inc     R3
+       ret
+
+.data
+buff:
+       .space 256
diff --git a/mach/z8000/libem/rck.s b/mach/z8000/libem/rck.s
new file mode 100644 (file)
index 0000000..cf36d8c
--- /dev/null
@@ -0,0 +1,11 @@
+.define rck
+
+rck:
+       ld      R0, RR14($4)
+       cp      R0, 0(R1)
+       jr      LT, 1f
+       cp      R0, 2(R1)
+       jr      LE, 2f
+1:     push    *RR14, $ERANGE
+       calr    trp
+2:     ret
diff --git a/mach/z8000/libem/rmu2.s b/mach/z8000/libem/rmu2.s
new file mode 100644 (file)
index 0000000..1bdcb4d
--- /dev/null
@@ -0,0 +1,17 @@
+.define rmu2
+
+rmu2:
+       popl    saveret, *RR14
+       pop     R2, *RR14
+       pop     R1, *RR14
+       test    R2
+       jr      MI, 1f
+       ldk     R0, $0
+       div     RR0, R2
+2:     pushl   *RR14, saveret
+       ret
+1:     ld      R0, R1
+       cp      R2, R1
+       jp      UGT, 2b
+       sub     R0, R2
+       jp      2b
diff --git a/mach/z8000/libem/rmu4.s b/mach/z8000/libem/rmu4.s
new file mode 100644 (file)
index 0000000..1604f73
--- /dev/null
@@ -0,0 +1,19 @@
+.define rmu4
+
+rmu4:
+       popl    saveret, *RR14
+       ldm     savereg, R4, $10
+       popl    RR4, *RR14
+       popl    RR2, *RR14
+       testl   RR4
+       jr      MI, 1f
+       ldl     RR0, $0
+       divl    RQ0, RR4
+       jr      2f
+1:     ldl     RR0, RR2
+       cpl     RR4, RR2
+       jr      UGT, 2f
+       sub     RR0, RR4
+2:     ldm     R4, savereg, $10
+       pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/sar.s b/mach/z8000/libem/sar.s
new file mode 100644 (file)
index 0000000..509003a
--- /dev/null
@@ -0,0 +1,20 @@
+.define sar
+
+!R1 contains description address
+!R3 contains element number
+!base address is on stack
+sar:
+       popl    saveret, *RR14
+       sub     R3, 0(R1)
+       ld      R0, 4(R1)               !nr of bytes per element
+       mult    RR2, R0
+       add     R3, *RR14
+       inc     R15, $2
+       sra     R0                      !nr of words per element
+       jr      EQ, 1f
+       ldir    *RR2, *RR14, R0
+       jr      2f
+1:     pop     R1, *RR14
+       ldb     *RR2, RL1
+2:     ldl     RR2, saveret
+       jp      *RR2
diff --git a/mach/z8000/libem/save.s b/mach/z8000/libem/save.s
new file mode 100644 (file)
index 0000000..ef704dd
--- /dev/null
@@ -0,0 +1,8 @@
+.define saveret
+.define savereg
+
+.data
+saveret:
+       .long 0
+savereg:
+       .space 20
diff --git a/mach/z8000/libem/sigtrp.s b/mach/z8000/libem/sigtrp.s
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/mach/z8000/libem/strhp.s b/mach/z8000/libem/strhp.s
new file mode 100644 (file)
index 0000000..a987aa3
--- /dev/null
@@ -0,0 +1,10 @@
+.define strhp
+
+strhp:
+       popl    RR2, *RR14
+       pop     R0, *RR14
+       ld      reghp, R0       !heappointer must be < stackpointer.
+       cp      R0, R15
+       jp      ULT, *RR2
+       push    *RR14, $EHEAP
+       jr      fatal
diff --git a/mach/z8000/libem/sts2.s b/mach/z8000/libem/sts2.s
new file mode 100644 (file)
index 0000000..2c404ca
--- /dev/null
@@ -0,0 +1,16 @@
+.define sts2
+
+sts2:
+       popl    saveret, *RR14
+       pop     R0, *RR14               !object size
+       ldk     R2, $0
+       pop     R3, *RR14               !address of object
+       cp      R0, $1
+       jr      NE, 1f
+       pop     R0, *RR14
+       ldb     *RR2, RL0
+       jr      2f
+1:     sra     R0
+       ldir    *RR2, *RR14, R0
+2:     pushl   *RR14, saveret
+       ret
diff --git a/mach/z8000/libem/trp.s b/mach/z8000/libem/trp.s
new file mode 100644 (file)
index 0000000..f9efd64
--- /dev/null
@@ -0,0 +1,38 @@
+.define trp, fatal
+
+fatal:
+       calr    trp
+       sc      $EXIT
+
+trp:
+       push    *RR14, R1
+       inc     R15, $2
+       popl    saveret, *RR14
+       pop     R1, *RR14       !trap number in R1
+       pushl   *RR14, saveret
+       push    *RR14, R0
+       dec     R15, $2
+       cp      R1, $16
+       jr      UGE, 1f
+       ld      R0, trpim
+       bit     R0, R1
+       jr      NE, 2f          !ignore
+1:     sub     R15, $24
+       ldm     *RR14, R2, $12
+       push    *RR14, R1
+       ld      R1, trppc
+       cp      R1, $0
+       jr      EQ, 3f
+       clr     trppc
+       call    0(R1)
+       inc     R15, $2
+       ldm     R2, *RR14, $12
+       add     R15, $24
+2:     pop     R1, *RR14
+       pop     R0, *RR14
+       ret
+3:     push    *RR14, $err
+       calr    printf
+       sc      $EXIT
+.data
+err:   .asciz  "trap error %d\n"
diff --git a/mach/z8000/libem/unknown.s b/mach/z8000/libem/unknown.s
new file mode 100644 (file)
index 0000000..e3e2e81
--- /dev/null
@@ -0,0 +1,5 @@
+.define unknown
+
+unknown:
+       push    *RR14, $EODDZ
+       jr      fatal
diff --git a/mach/z8000/libem/xset.s b/mach/z8000/libem/xset.s
new file mode 100644 (file)
index 0000000..7ed5794
--- /dev/null
@@ -0,0 +1,22 @@
+.define xset
+
+!bitnr in R1
+!size (bytes) in R0
+xset:
+       popl    saveret, *RR14
+       sra     R0
+       ld      R2, R0
+1:     push    *RR14, $0
+       djnz    R0, 1b
+       div     RR0, $020               !R0: bitnr, R1: wordnr
+       cp      R1, R2
+       jr      UGE, 2f
+       ldk     R2, $0
+       set     R2, R0
+       sla     R1
+       ld      RR14(R1), R2
+3:     pushl   *RR14, saveret
+       ret
+2:     push    *RR14, $ESET
+       calr    trp
+       jr      3b