-TAIL=tail.hermac
+TAIL=libhermac_o.a
# Other possibilities are: tail.nascom and tail.cpm
+MACH=z80
-all: tail.cpm tail.nascom tail.hermac
+all: head_em.o libhermac_o.a libnascom_o.a libcpm_o.a
-install: $(TAIL)
- ../../install head_em.s head_em
- ../../install $(TAIL) tail_sys
+install: head_em.o $(TAIL)
+ ../../install head_em.o head_em
+ ../../install $(TAIL) tail_mon
-cmp: $(TAIL)
- -../../compare head_em.s head_em
- -../../compare $(TAIL) tail_sys
+cmp: head_em.o $(TAIL)
+ -../../compare head_em.o head_em
+ -../../compare $(TAIL) tail_mon
-tail.cpm: mon.cpm.s
+head_em.o: head_em.s
+ $(MACH) -I../../../h -c head_em.s
+
+libcpm_o.a: libcpm_s.a
+ ASAR=aal ; export ASAR; march . libcpm_o.a
+
+libnascom_o.a: libnascom_s.a
+ ASAR=aal ; export ASAR; march . libnascom_o.a
+
+libhermac_o.a: libhermac_s.a
+ ASAR=aal ; export ASAR; march . libhermac_o.a
+
+libcpm_s.a:
@echo Warning: untested, this is an example
- arch cr tail.cpm mon.cpm.s
+ arch cr libcpm_s.a mon.cpm.s
+ echo libcpm_s.a > LIST
+ arch t libcpm_s.a >> LIST
-tail.nascom: mon.s char.nas.s
- arch cr tail.nascom mon.s char.nas.s
+libnascom_s.a:
+ arch cr libnascom_s.a mon.s char.nas.s
+ echo libnascom_s.a > LIST
+ arch t libnascom_s.a >> LIST
-tail.hermac: mon.s char.her.s
- arch cr tail.hermac mon.s char.her.s
+libhermac_s.a:
+ arch cr libhermac_s.a mon.s char.her.s
+ echo libhermac_s.a > LIST
+ arch t libhermac_s.a >> LIST
opr:
make pr | opr
.define getchar, putchar
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! These getchar and putchar routines can be used for HERMAC computer
.define putchar,getchar
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! output routine in monitor for the nascom
CRT = 0x013B
! output a charcter
! entry: ascii character in a
-.text
+.sect .text
putchar:
push hl
push bc
ld a,(hl)
jr 2b
! conversion table for nascom characters
-tab: .byte 0x0D,0x00
- .byte 0x1B,0x1E
- .byte 0x08,0x1D
- .byte 0x0A,0x1F
- .byte 0x7F,0x00
+tab: .data1 0x0D,0x00
+ .data1 0x1B,0x1E
+ .data1 0x08,0x1D
+ .data1 0x0A,0x1F
+ .data1 0x7F,0x00
KBD = 0x69
get character from keyboard
.define EARRAY,ERANGE,EILLINS,EILLSIZE,ECASE,EMON,EHEAP
.define hol0,trapproc,trpim,argv,hp,.reghp,envp,begbss,ignmask
.define savebc,savede,savehl,saveix,saveaf,saveiy,ebadmon
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
EARRAY = 0
ERANGE = 1
EHEAP = 17
ebadmon=25
- .base 0x1000
-.text
+.sect .text
- ! clear .bss
+ ! clear .sect .bss
ld sp,0x7ffe !address of fbase
ld de,endbss
ld h,d
jp 0x20
-.bss
+.sect .bss
begbss:
-.data
+.sect .data
hol0:
- .word 0,0
- .word 0,0
+ .data2 0,0
+ .data2 0,0
saveaf:
- .word 0
+ .data2 0
savebc:
- .word 0
+ .data2 0
savede:
- .word 0
+ .data2 0
savehl:
- .word 0
+ .data2 0
saveix:
- .word 0
+ .data2 0
saveiy:
- .word 0
+ .data2 0
ignmask:
- .word 0
+ .data2 0
hp:
- .word 0
+ .data2 0
trapproc:
- .word 0
+ .data2 0
trpim:
- .word 0
+ .data2 0
argv:
- .word 3f
+ .data2 3f
envp:
- .word 0
+ .data2 0
3:
.asciz 'PROGRAM'
.reghp:
- .word endbss
+ .data2 endbss
.define .mon
.define uxfinish
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! monitor instruction
! a small collection of UNIX system calls implemented under CP/M
zcount=41
zsave=42
- .errnz filefcb
+ .assert [ filefcb] <> 0
0: .space maxfiles*filesize
filearea = 0b+128
sibuf:
- .word 0
+ .data2 0
.space 82
siptr: .space 2
saveargs:
.space 128
argc: .space 2
-ttymode:.byte 9,9,8,21;.short 06310+RAW*040 ! raw = 040
+ttymode:.data1 9,9,8,21;.data2 06310+RAW*040 ! raw = 040
return:
- .word 0,0
+ .data2 0,0
uxinit:
xor a
ld c,maxfiles
jp (hl)
systab:
- .word e.mon ! ux_indir
- .word ux_exit
- .word e.mon ! ux_fork
- .word ux_read
- .word ux_write
- .word ux_open
- .word ux_close
- .word e.mon ! ux_wait
- .word ux_creat
- .word e.mon ! ux_link
- .word ux_unlink
- .word e.mon ! ux_exec
- .word e.mon ! ux_chdir
- .word ux_time
- .word e.mon ! ux_mknod
- .word e.mon ! ux_chmod
- .word e.mon ! ux_chown
- .word e.mon ! ux_break
- .word e.mon ! ux_stat
- .word e.mon ! ux_seek
- .word ux_getpid
- .word e.mon ! ux_mount
- .word e.mon ! ux_umount
- .word e.mon ! ux_setuid
- .word e.mon ! ux_getuid
- .word e.mon ! ux_stime
- .word e.mon ! ux_ptrace
- .word e.mon ! ux_alarm
- .word e.mon ! ux_fstat
- .word e.mon ! ux_pause
- .word e.mon ! ux_utime
- .word e.mon ! ux_stty
- .word e.mon ! ux_gtty
- .word e.mon ! ux_access
- .word e.mon ! ux_nice
- .word ux_ftime
- .word e.mon ! ux_sync
- .word e.mon ! ux_kill
- .word unimpld
- .word unimpld
- .word unimpld
- .word e.mon ! ux_dup
- .word e.mon ! ux_pipe
- .word e.mon ! ux_times
- .word e.mon ! ux_prof
- .word e.mon ! ux_unused
- .word e.mon ! ux_setgid
- .word e.mon ! ux_getgid
- .word e.mon ! ux_sig
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld
- .word ux_ioctl
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld ! ux_exece
- .word e.mon ! ux_umask
- .word e.mon ! ux_chroot
- .word unimpld
- .word unimpld
+ .data2 e.mon ! ux_indir
+ .data2 ux_exit
+ .data2 e.mon ! ux_fork
+ .data2 ux_read
+ .data2 ux_write
+ .data2 ux_open
+ .data2 ux_close
+ .data2 e.mon ! ux_wait
+ .data2 ux_creat
+ .data2 e.mon ! ux_link
+ .data2 ux_unlink
+ .data2 e.mon ! ux_exec
+ .data2 e.mon ! ux_chdir
+ .data2 ux_time
+ .data2 e.mon ! ux_mknod
+ .data2 e.mon ! ux_chmod
+ .data2 e.mon ! ux_chown
+ .data2 e.mon ! ux_break
+ .data2 e.mon ! ux_stat
+ .data2 e.mon ! ux_seek
+ .data2 ux_getpid
+ .data2 e.mon ! ux_mount
+ .data2 e.mon ! ux_umount
+ .data2 e.mon ! ux_setuid
+ .data2 e.mon ! ux_getuid
+ .data2 e.mon ! ux_stime
+ .data2 e.mon ! ux_ptrace
+ .data2 e.mon ! ux_alarm
+ .data2 e.mon ! ux_fstat
+ .data2 e.mon ! ux_pause
+ .data2 e.mon ! ux_utime
+ .data2 e.mon ! ux_stty
+ .data2 e.mon ! ux_gtty
+ .data2 e.mon ! ux_access
+ .data2 e.mon ! ux_nice
+ .data2 ux_ftime
+ .data2 e.mon ! ux_sync
+ .data2 e.mon ! ux_kill
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 e.mon ! ux_dup
+ .data2 e.mon ! ux_pipe
+ .data2 e.mon ! ux_times
+ .data2 e.mon ! ux_prof
+ .data2 e.mon ! ux_unused
+ .data2 e.mon ! ux_setgid
+ .data2 e.mon ! ux_getgid
+ .data2 e.mon ! ux_sig
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 ux_ioctl
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld ! ux_exece
+ .data2 e.mon ! ux_umask
+ .data2 e.mon ! ux_chroot
+ .data2 unimpld
+ .data2 unimpld
emptyfile:
! searches for a free filestructure
-retarea: .word 0 ! base of buffer for result values (max 8 bytes)
- .word 0
- .word 0
- .word 0
+retarea: .data2 0 ! base of buffer for result values (max 8 bytes)
+ .data2 0
+ .data2 0
+ .data2 0
trapproc:
- .word 0
+ .data2 0
-nextp: .byte 0
+nextp: .data1 0
header:
-ntext: .word 0
-ndata: .word 0
-nproc: .word 0
-entry: .word 0
-nline: .word 0
-
-hp: .word 0
-pb: .word 0
-pd: .word 0
+ntext: .data2 0
+ndata: .data2 0
+nproc: .data2 0
+entry: .data2 0
+nline: .data2 0
+
+hp: .data2 0
+pb: .data2 0
+pd: .data2 0
.define .mon
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! Monitor call
! Expects on stack: monitor call number
.define putchr
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! output routine in monitor
CRT = 0x013B
! output a charcter
ld a,(hl)
jr 2b
! conversion table for nascom characters
-tab: .byte 0x0D,0x00
- .byte 0x1B,0x1E
- .byte 0x08,0x1D
- .byte 0x0A,0x1F
- .byte 0x7F,0x00
+tab: .data1 0x0D,0x00
+ .data1 0x1B,0x1E
+ .data1 0x08,0x1D
+ .data1 0x0A,0x1F
+ .data1 0x7F,0x00
.define putchr
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
putchr:
push hl
.define _read,_write,_ioctl,_getpid,_open,_close,_exit,_errno
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
_read:
ld (savebc),bc
push af
ret
_exit:
jp 0x38
-.data
+.sect .data
_errno:
- .word 0
+ .data2 0
! output routine in monitor
CRT = 0x013B
! output a charcter
! entry: ascii character in a
-.text
+.sect .text
!putchr:
! push hl
! push bc
! ld a,(hl)
! jr 2b
!! conversion table for nascom characters
-!tab: .byte 0x0D,0x00
-! .byte 0x1B,0x1E
-! .byte 0x08,0x1D
-! .byte 0x0A,0x1F
-! .byte 0x7F,0x00
+!tab: .data1 0x0D,0x00
+! .data1 0x1B,0x1E
+! .data1 0x08,0x1D
+! .data1 0x0A,0x1F
+! .data1 0x7F,0x00
KBD = 0x69
! get character from keyboard
-TAIL=tail.hermac
+TAIL=libhermac_o.a
# Other possibilities are: tail.nascom and tail.cpm
+MACH=z80
-all: tail.cpm tail.nascom tail.hermac
+all: head_em.o libhermac_o.a libnascom_o.a libcpm_o.a
-install: $(TAIL)
- ../../install head_em.s head_em
- ../../install $(TAIL) tail_sys
+install: head_em.o $(TAIL)
+ ../../install head_em.o head_em
+ ../../install $(TAIL) tail_mon
-cmp: $(TAIL)
- -../../compare head_em.s head_em
- -../../compare $(TAIL) tail_sys
+cmp: head_em.o $(TAIL)
+ -../../compare head_em.o head_em
+ -../../compare $(TAIL) tail_mon
-tail.cpm: mon.cpm.s
+head_em.o: head_em.s
+ $(MACH) -I../../../h -c head_em.s
+
+libcpm_o.a: libcpm_s.a
+ ASAR=aal ; export ASAR; march . libcpm_o.a
+
+libnascom_o.a: libnascom_s.a
+ ASAR=aal ; export ASAR; march . libnascom_o.a
+
+libhermac_o.a: libhermac_s.a
+ ASAR=aal ; export ASAR; march . libhermac_o.a
+
+libcpm_s.a:
@echo Warning: untested, this is an example
- arch cr tail.cpm mon.cpm.s
+ arch cr libcpm_s.a mon.cpm.s
+ echo libcpm_s.a > LIST
+ arch t libcpm_s.a >> LIST
-tail.nascom: mon.s char.nas.s
- arch cr tail.nascom mon.s char.nas.s
+libnascom_s.a:
+ arch cr libnascom_s.a mon.s char.nas.s
+ echo libnascom_s.a > LIST
+ arch t libnascom_s.a >> LIST
-tail.hermac: mon.s char.her.s
- arch cr tail.hermac mon.s char.her.s
+libhermac_s.a:
+ arch cr libhermac_s.a mon.s char.her.s
+ echo libhermac_s.a > LIST
+ arch t libhermac_s.a >> LIST
opr:
make pr | opr
.define getchar, putchar
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! These getchar and putchar routines can be used for HERMAC computer
.define putchar,getchar
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! output routine in monitor for the nascom
CRT = 0x013B
! output a charcter
! entry: ascii character in a
-.text
+.sect .text
putchar:
push hl
push bc
ld a,(hl)
jr 2b
! conversion table for nascom characters
-tab: .byte 0x0D,0x00
- .byte 0x1B,0x1E
- .byte 0x08,0x1D
- .byte 0x0A,0x1F
- .byte 0x7F,0x00
+tab: .data1 0x0D,0x00
+ .data1 0x1B,0x1E
+ .data1 0x08,0x1D
+ .data1 0x0A,0x1F
+ .data1 0x7F,0x00
KBD = 0x69
get character from keyboard
.define EARRAY,ERANGE,EILLINS,EILLSIZE,ECASE,EMON,EHEAP
.define hol0,trapproc,trpim,argv,hp,.reghp,envp,begbss,ignmask
.define savebc,savede,savehl,saveix,saveaf,saveiy,ebadmon
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
EARRAY = 0
ERANGE = 1
EHEAP = 17
ebadmon=25
- .base 0x1000
-.text
+.sect .text
- ! clear .bss
+ ! clear .sect .bss
ld sp,0x7ffe !address of fbase
ld de,endbss
ld h,d
jp 0x20
-.bss
+.sect .bss
begbss:
-.data
+.sect .data
hol0:
- .word 0,0
- .word 0,0
+ .data2 0,0
+ .data2 0,0
saveaf:
- .word 0
+ .data2 0
savebc:
- .word 0
+ .data2 0
savede:
- .word 0
+ .data2 0
savehl:
- .word 0
+ .data2 0
saveix:
- .word 0
+ .data2 0
saveiy:
- .word 0
+ .data2 0
ignmask:
- .word 0
+ .data2 0
hp:
- .word 0
+ .data2 0
trapproc:
- .word 0
+ .data2 0
trpim:
- .word 0
+ .data2 0
argv:
- .word 3f
+ .data2 3f
envp:
- .word 0
+ .data2 0
3:
.asciz 'PROGRAM'
.reghp:
- .word endbss
+ .data2 endbss
.define .mon
.define uxfinish
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! monitor instruction
! a small collection of UNIX system calls implemented under CP/M
zcount=41
zsave=42
- .errnz filefcb
+ .assert [ filefcb] <> 0
0: .space maxfiles*filesize
filearea = 0b+128
sibuf:
- .word 0
+ .data2 0
.space 82
siptr: .space 2
saveargs:
.space 128
argc: .space 2
-ttymode:.byte 9,9,8,21;.short 06310+RAW*040 ! raw = 040
+ttymode:.data1 9,9,8,21;.data2 06310+RAW*040 ! raw = 040
return:
- .word 0,0
+ .data2 0,0
uxinit:
xor a
ld c,maxfiles
jp (hl)
systab:
- .word e.mon ! ux_indir
- .word ux_exit
- .word e.mon ! ux_fork
- .word ux_read
- .word ux_write
- .word ux_open
- .word ux_close
- .word e.mon ! ux_wait
- .word ux_creat
- .word e.mon ! ux_link
- .word ux_unlink
- .word e.mon ! ux_exec
- .word e.mon ! ux_chdir
- .word ux_time
- .word e.mon ! ux_mknod
- .word e.mon ! ux_chmod
- .word e.mon ! ux_chown
- .word e.mon ! ux_break
- .word e.mon ! ux_stat
- .word e.mon ! ux_seek
- .word ux_getpid
- .word e.mon ! ux_mount
- .word e.mon ! ux_umount
- .word e.mon ! ux_setuid
- .word e.mon ! ux_getuid
- .word e.mon ! ux_stime
- .word e.mon ! ux_ptrace
- .word e.mon ! ux_alarm
- .word e.mon ! ux_fstat
- .word e.mon ! ux_pause
- .word e.mon ! ux_utime
- .word e.mon ! ux_stty
- .word e.mon ! ux_gtty
- .word e.mon ! ux_access
- .word e.mon ! ux_nice
- .word ux_ftime
- .word e.mon ! ux_sync
- .word e.mon ! ux_kill
- .word unimpld
- .word unimpld
- .word unimpld
- .word e.mon ! ux_dup
- .word e.mon ! ux_pipe
- .word e.mon ! ux_times
- .word e.mon ! ux_prof
- .word e.mon ! ux_unused
- .word e.mon ! ux_setgid
- .word e.mon ! ux_getgid
- .word e.mon ! ux_sig
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld
- .word ux_ioctl
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld
- .word unimpld ! ux_exece
- .word e.mon ! ux_umask
- .word e.mon ! ux_chroot
- .word unimpld
- .word unimpld
+ .data2 e.mon ! ux_indir
+ .data2 ux_exit
+ .data2 e.mon ! ux_fork
+ .data2 ux_read
+ .data2 ux_write
+ .data2 ux_open
+ .data2 ux_close
+ .data2 e.mon ! ux_wait
+ .data2 ux_creat
+ .data2 e.mon ! ux_link
+ .data2 ux_unlink
+ .data2 e.mon ! ux_exec
+ .data2 e.mon ! ux_chdir
+ .data2 ux_time
+ .data2 e.mon ! ux_mknod
+ .data2 e.mon ! ux_chmod
+ .data2 e.mon ! ux_chown
+ .data2 e.mon ! ux_break
+ .data2 e.mon ! ux_stat
+ .data2 e.mon ! ux_seek
+ .data2 ux_getpid
+ .data2 e.mon ! ux_mount
+ .data2 e.mon ! ux_umount
+ .data2 e.mon ! ux_setuid
+ .data2 e.mon ! ux_getuid
+ .data2 e.mon ! ux_stime
+ .data2 e.mon ! ux_ptrace
+ .data2 e.mon ! ux_alarm
+ .data2 e.mon ! ux_fstat
+ .data2 e.mon ! ux_pause
+ .data2 e.mon ! ux_utime
+ .data2 e.mon ! ux_stty
+ .data2 e.mon ! ux_gtty
+ .data2 e.mon ! ux_access
+ .data2 e.mon ! ux_nice
+ .data2 ux_ftime
+ .data2 e.mon ! ux_sync
+ .data2 e.mon ! ux_kill
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 e.mon ! ux_dup
+ .data2 e.mon ! ux_pipe
+ .data2 e.mon ! ux_times
+ .data2 e.mon ! ux_prof
+ .data2 e.mon ! ux_unused
+ .data2 e.mon ! ux_setgid
+ .data2 e.mon ! ux_getgid
+ .data2 e.mon ! ux_sig
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 ux_ioctl
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld
+ .data2 unimpld ! ux_exece
+ .data2 e.mon ! ux_umask
+ .data2 e.mon ! ux_chroot
+ .data2 unimpld
+ .data2 unimpld
emptyfile:
! searches for a free filestructure
-retarea: .word 0 ! base of buffer for result values (max 8 bytes)
- .word 0
- .word 0
- .word 0
+retarea: .data2 0 ! base of buffer for result values (max 8 bytes)
+ .data2 0
+ .data2 0
+ .data2 0
trapproc:
- .word 0
+ .data2 0
-nextp: .byte 0
+nextp: .data1 0
header:
-ntext: .word 0
-ndata: .word 0
-nproc: .word 0
-entry: .word 0
-nline: .word 0
-
-hp: .word 0
-pb: .word 0
-pd: .word 0
+ntext: .data2 0
+ndata: .data2 0
+nproc: .data2 0
+entry: .data2 0
+nline: .data2 0
+
+hp: .data2 0
+pb: .data2 0
+pd: .data2 0
.define .mon
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! Monitor call
! Expects on stack: monitor call number
.define putchr
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
! output routine in monitor
CRT = 0x013B
! output a charcter
ld a,(hl)
jr 2b
! conversion table for nascom characters
-tab: .byte 0x0D,0x00
- .byte 0x1B,0x1E
- .byte 0x08,0x1D
- .byte 0x0A,0x1F
- .byte 0x7F,0x00
+tab: .data1 0x0D,0x00
+ .data1 0x1B,0x1E
+ .data1 0x08,0x1D
+ .data1 0x0A,0x1F
+ .data1 0x7F,0x00
.define putchr
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
putchr:
push hl
.define _read,_write,_ioctl,_getpid,_open,_close,_exit,_errno
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .text
_read:
ld (savebc),bc
push af
ret
_exit:
jp 0x38
-.data
+.sect .data
_errno:
- .word 0
+ .data2 0
! output routine in monitor
CRT = 0x013B
! output a charcter
! entry: ascii character in a
-.text
+.sect .text
!putchr:
! push hl
! push bc
! ld a,(hl)
! jr 2b
!! conversion table for nascom characters
-!tab: .byte 0x0D,0x00
-! .byte 0x1B,0x1E
-! .byte 0x08,0x1D
-! .byte 0x0A,0x1F
-! .byte 0x7F,0x00
+!tab: .data1 0x0D,0x00
+! .data1 0x1B,0x1E
+! .data1 0x08,0x1D
+! .data1 0x0A,0x1F
+! .data1 0x7F,0x00
KBD = 0x69
! get character from keyboard