New installation mechanism
This commit is contained in:
parent
5730364a30
commit
6d9cd78c4e
|
@ -1,5 +1,2 @@
|
||||||
LIST
|
LIST
|
||||||
Makefile
|
|
||||||
end.s
|
|
||||||
head_em.s
|
|
||||||
libem_s.a
|
libem_s.a
|
||||||
|
|
|
@ -18,10 +18,6 @@ mli4.s
|
||||||
mlu.s
|
mlu.s
|
||||||
mlu4.s
|
mlu4.s
|
||||||
mul4.s
|
mul4.s
|
||||||
mon.s
|
|
||||||
write.s
|
|
||||||
printstack.s
|
|
||||||
printhex.s
|
|
||||||
rmi.s
|
rmi.s
|
||||||
rmi4.s
|
rmi4.s
|
||||||
div4.s
|
div4.s
|
||||||
|
@ -52,7 +48,6 @@ testFFh.s
|
||||||
trap.s
|
trap.s
|
||||||
ldi.s
|
ldi.s
|
||||||
data.s
|
data.s
|
||||||
print.s
|
|
||||||
zri.s
|
zri.s
|
||||||
locaddr.s
|
locaddr.s
|
||||||
and.s
|
and.s
|
||||||
|
@ -76,7 +71,6 @@ lxa1.s
|
||||||
lxa2.s
|
lxa2.s
|
||||||
lxl.s
|
lxl.s
|
||||||
pro.s
|
pro.s
|
||||||
read.s
|
|
||||||
rol.s
|
rol.s
|
||||||
rol4.s
|
rol4.s
|
||||||
ror.s
|
ror.s
|
||||||
|
|
|
@ -130,10 +130,6 @@ Mtrap:
|
||||||
ldx #[EBADGTO].l
|
ldx #[EBADGTO].l
|
||||||
jsr Mprint
|
jsr Mprint
|
||||||
errorend:
|
errorend:
|
||||||
ldx STACK
|
ldx TRAPVAL
|
||||||
dex
|
jsr Push
|
||||||
dex
|
jsr __exit
|
||||||
txs
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
|
|
3
mach/6500/libmon/.distr
Normal file
3
mach/6500/libmon/.distr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
LIST
|
||||||
|
head_em.s
|
||||||
|
libmon_s.a
|
7
mach/6500/libmon/LIST
Normal file
7
mach/6500/libmon/LIST
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
libmon_s.a
|
||||||
|
print.s
|
||||||
|
printhex.s
|
||||||
|
printstack.s
|
||||||
|
mon.s
|
||||||
|
read.s
|
||||||
|
write.s
|
233
mach/6500/libmon/head_em.s
Normal file
233
mach/6500/libmon/head_em.s
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
.define WRCH, RDCH, Earray, Erange, Eset
|
||||||
|
.define Eiovfl, Eidivz, Eiund, Econv
|
||||||
|
.define Estack, Eheap, Eillins, Eoddz
|
||||||
|
.define Ecase , Ebadmon, OSBYTE, MON
|
||||||
|
.define Ebadlin, Ebadgto, BASE, NBYTES
|
||||||
|
.define hol0, IGNMASK, ADDR, PROGNAME
|
||||||
|
.define LB, LBl, SP, HP, ERRPROC, UNSIGN
|
||||||
|
.define Ytmp, EXG, ARTH, RETURN, SIGN
|
||||||
|
.define RETSIZE, TRAPVAL, STACK, BRANCH
|
||||||
|
.define start, Push, Pop, STACKTh, STACKTl
|
||||||
|
.define F_DUM
|
||||||
|
.sect .zero
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! DEFINITIONS
|
||||||
|
|
||||||
|
! The next three definitions are special for the
|
||||||
|
! BBC microcomputer
|
||||||
|
|
||||||
|
WRCH = 0x0FFEE ! This subroutine writes the character in
|
||||||
|
! register A to the screen
|
||||||
|
RDCH = 0x0FFE0 ! This subroutine returns a character in
|
||||||
|
! register A from the current input stream
|
||||||
|
OSBYTE = 0x0FFF4 ! This subroutine performs miscelaneous
|
||||||
|
! operating system calls
|
||||||
|
|
||||||
|
F_DUM = 0 ! Dummy floating point constant
|
||||||
|
|
||||||
|
! Here are the error numbers
|
||||||
|
|
||||||
|
Earray = 0
|
||||||
|
Erange = 1
|
||||||
|
Eset = 2
|
||||||
|
Eiovfl = 3
|
||||||
|
Eidivz = 6
|
||||||
|
Eiund = 8
|
||||||
|
Econv = 10
|
||||||
|
Estack = 16
|
||||||
|
Eheap = 17
|
||||||
|
Eillins = 18
|
||||||
|
Eoddz = 19
|
||||||
|
Ecase = 20
|
||||||
|
Ebadmon = 25
|
||||||
|
Ebadlin = 26
|
||||||
|
Ebadgto = 27
|
||||||
|
MON = 0x78D0
|
||||||
|
|
||||||
|
BASE = 240 ! This is the offset from the localbase
|
||||||
|
! for the second localbase
|
||||||
|
|
||||||
|
STACKTh = 0x78 ! This is the top of the stack
|
||||||
|
STACKTl = 0x0D0
|
||||||
|
|
||||||
|
! Some zeropage declarations
|
||||||
|
|
||||||
|
.sect .zero
|
||||||
|
|
||||||
|
RES: .space 76 ! special for the operating system
|
||||||
|
|
||||||
|
hol0: .space 16 ! the hol0 block
|
||||||
|
|
||||||
|
IGNMASK: .space 2 ! can hold the ingnore mask
|
||||||
|
|
||||||
|
ADDR: .space 4 ! used for indirect addressing
|
||||||
|
|
||||||
|
LB: .space 2 ! the localbase
|
||||||
|
|
||||||
|
LBl: .space 2 ! the second localbase (localbase-BASE)
|
||||||
|
|
||||||
|
SP: .space 3 ! the stackpointer (real_stack)
|
||||||
|
|
||||||
|
HP: .space 2 ! the heap pointer
|
||||||
|
|
||||||
|
BRANCH: .space 2 ! used for branch instructions
|
||||||
|
|
||||||
|
ERRPROC: .space 2 ! can hold the address of the error handler
|
||||||
|
|
||||||
|
Ytmp: .space 1 ! used for intermediate storage in Y
|
||||||
|
|
||||||
|
EXG: .space 2 ! used by the exchange subroutine Exg
|
||||||
|
|
||||||
|
ARTH: .space 16 ! used for arithmetic
|
||||||
|
|
||||||
|
NBYTES: .space 2 ! containes the number of bytes for a block move
|
||||||
|
|
||||||
|
|
||||||
|
RETURN: .space 4 ! the return area
|
||||||
|
|
||||||
|
RETSIZE: .space 1 ! the size of the object returned
|
||||||
|
|
||||||
|
SIGN: .space 1 ! the sign of the calculation
|
||||||
|
|
||||||
|
UNSIGN : .space 1 ! is it signed or unsigned arithmetic
|
||||||
|
|
||||||
|
TRAPVAL: .space 1 ! intermediate storage of the error number
|
||||||
|
|
||||||
|
STACK: .space 1 ! contains the hardware stackpointer on
|
||||||
|
! entering _m_a_i_n for a neat return
|
||||||
|
|
||||||
|
RESERVED: .space 112 ! used by the operating system
|
||||||
|
|
||||||
|
.sect .text
|
||||||
|
.base 0x0E02 ! where to start in the BBC micro
|
||||||
|
! GENERAL PURPOSE ROUTINES
|
||||||
|
|
||||||
|
start:
|
||||||
|
tsx
|
||||||
|
stx STACK ! save stackpointer for exit and error
|
||||||
|
|
||||||
|
! The following three operating system calls are only
|
||||||
|
! for the BBC microcomputer
|
||||||
|
|
||||||
|
lda #2
|
||||||
|
ldx #0
|
||||||
|
ldy #0
|
||||||
|
jsr OSBYTE ! return control to the keyboard
|
||||||
|
lda #15
|
||||||
|
ldx #0
|
||||||
|
ldy #0
|
||||||
|
jsr OSBYTE ! clear all internal buffers
|
||||||
|
lda #3
|
||||||
|
ldx #5
|
||||||
|
ldy #0
|
||||||
|
jsr OSBYTE ! output to screen and RS423
|
||||||
|
|
||||||
|
lda #STACKTl
|
||||||
|
sta LB ! set localbase (lowbyte)
|
||||||
|
sta SP+2
|
||||||
|
lda #0
|
||||||
|
sta SP ! set stackpointer (lowbyte)
|
||||||
|
sta ERRPROC ! set start address for error handler (lowbyte)
|
||||||
|
sta ERRPROC+1 ! set start address for error handler (highbyte)
|
||||||
|
sta hol0 ! set the line number (lowbyte)
|
||||||
|
sta hol0+1 ! set the line number (highbyte)
|
||||||
|
lda #STACKTh
|
||||||
|
sta SP+1 ! set the stacpointer (highbyte)
|
||||||
|
sta LB+1 ! set the localbase (highbyte)
|
||||||
|
lda #[endbss].l
|
||||||
|
sta HP ! set the heap pointer (lowbyte)
|
||||||
|
lda #[endbss].h
|
||||||
|
sta HP+1 ! set the heap pointer (highbyte)
|
||||||
|
lda #[PROGNAME].l
|
||||||
|
sta hol0+4 ! set fake programname pointer (lowbyte)
|
||||||
|
lda #[PROGNAME].h
|
||||||
|
sta hol0+5 ! set fake programname pointer (highbyte)
|
||||||
|
lda #[beginbss].l
|
||||||
|
sta ADDR ! start address of bss block (lowbyte)
|
||||||
|
lda #[beginbss].h
|
||||||
|
sta ADDR+1 ! start address of bss block (highbyte)
|
||||||
|
ldy #0
|
||||||
|
lda #0
|
||||||
|
4: ldx #[endbss].h ! clear bss block
|
||||||
|
cpx ADDR+1
|
||||||
|
bcc 1f ! end of bss block reached
|
||||||
|
bne 2f
|
||||||
|
ldx #[endbss].l
|
||||||
|
cpx ADDR
|
||||||
|
bcc 1f ! end of bss block reached
|
||||||
|
2: sta (ADDR),y
|
||||||
|
inc ADDR
|
||||||
|
bne 3f
|
||||||
|
inc ADDR+1
|
||||||
|
3: jmp 4b
|
||||||
|
1: lda #0
|
||||||
|
tax
|
||||||
|
jsr Push ! push fake envelope pointer
|
||||||
|
lda #[PROGNAME].h
|
||||||
|
ldx #[PROGNAME].l
|
||||||
|
jsr Push ! push argv[0]
|
||||||
|
lda #0
|
||||||
|
ldx #1
|
||||||
|
jsr Push ! push argc
|
||||||
|
jsr __m_a_i_n ! start the real program
|
||||||
|
|
||||||
|
lda #0x0FF
|
||||||
|
jsr WRCH ! send end of program to R423
|
||||||
|
lda #3
|
||||||
|
ldx #0
|
||||||
|
jsr OSBYTE ! send output to screen only
|
||||||
|
lda #2
|
||||||
|
ldx #1
|
||||||
|
jsr OSBYTE ! input only from R423
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
! The subroutine Push pushes the registerpair AX onto the stack.
|
||||||
|
|
||||||
|
Push:
|
||||||
|
sty Ytmp ! save Y
|
||||||
|
ldy SP+2
|
||||||
|
bne 1f ! lowbyte of stackpointer <> 0
|
||||||
|
dec SP+1 ! decrement highbyte of stackpointer
|
||||||
|
1: dey
|
||||||
|
dey ! decrement lowbyte of stackpointer
|
||||||
|
sty SP+2 ! save lowbyte of stackpointer
|
||||||
|
pha ! save A
|
||||||
|
txa
|
||||||
|
sta (SP),y ! push X onto the stack
|
||||||
|
iny
|
||||||
|
pla ! get A
|
||||||
|
sta (SP),y ! push A onto the stack
|
||||||
|
ldy Ytmp ! restore Y
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
! The subroutine Pop pops the registerpair AX from the stack.
|
||||||
|
|
||||||
|
Pop:
|
||||||
|
sty Ytmp ! save Y
|
||||||
|
ldy SP+2
|
||||||
|
lda (SP),y ! pop X from the stack
|
||||||
|
tax
|
||||||
|
iny
|
||||||
|
lda (SP),y ! pop A from the stack
|
||||||
|
iny
|
||||||
|
bne 1f ! lowbyte of stackpointer <> 0
|
||||||
|
inc SP+1 ! increment highbyte of stackpointer
|
||||||
|
1: sty SP+2 ! store lowbyte of stackpointer
|
||||||
|
pha ! save A
|
||||||
|
pla ! get A
|
||||||
|
ldy Ytmp ! restore Y
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
.sect .data
|
||||||
|
PROGNAME: ! for initialising the programname pointer
|
||||||
|
.asciz "program"
|
||||||
|
.sect .bss
|
||||||
|
beginbss:
|
40
mach/6500/libmon/mon.s
Normal file
40
mach/6500/libmon/mon.s
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
.define Mon
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! This subroutine performs some monitor calls.
|
||||||
|
! The exit call just resets the hardware_stackpointer so
|
||||||
|
! this routine will return to the operating system.
|
||||||
|
! The close call just returns a zero.
|
||||||
|
! The ioctl call just pops its arguments and returns a zero.
|
||||||
|
! The write routine is a real one.
|
||||||
|
|
||||||
|
|
||||||
|
Mon:
|
||||||
|
cpx #1
|
||||||
|
bne 1f ! exit
|
||||||
|
ldx STACK ! load stackpointer
|
||||||
|
dex
|
||||||
|
dex ! adjust stackpointer
|
||||||
|
txs ! set stackpointer
|
||||||
|
rts
|
||||||
|
1: cpx #4
|
||||||
|
bne 1f
|
||||||
|
jmp Mwrite
|
||||||
|
1: cpx #6 ! facked
|
||||||
|
bne 1f ! close
|
||||||
|
lda #0
|
||||||
|
tax ! return zero
|
||||||
|
rts
|
||||||
|
1: cpx #54
|
||||||
|
jsr Pop ! pop first argument (fildes)
|
||||||
|
jsr Pop ! pop second argument (request)
|
||||||
|
jsr Pop ! pop third argument (argp)
|
||||||
|
lda #0
|
||||||
|
tax ! return zero
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
27
mach/6500/libmon/print.s
Normal file
27
mach/6500/libmon/print.s
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
.define Mprint
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! This subroutine prints a zero terminated ascii string.
|
||||||
|
! The registerpair AX contains the start of the string.
|
||||||
|
! The subroutine WRCH is a special routine on the BBC microcomputer
|
||||||
|
! which prints the character in A to the screen.
|
||||||
|
! The subroutine WRCH is a special one provided by the BBC
|
||||||
|
! microcomputer.
|
||||||
|
|
||||||
|
|
||||||
|
Mprint:
|
||||||
|
stx ADDR ! start address of string (lowbyte)
|
||||||
|
sta ADDR+1 ! start address of string (highbyte)
|
||||||
|
ldy #0
|
||||||
|
1: lda (ADDR),y ! get ascii character
|
||||||
|
beq 2f
|
||||||
|
jsr WRCH ! put it on the screen
|
||||||
|
iny
|
||||||
|
bne 1b
|
||||||
|
2: rts
|
||||||
|
|
||||||
|
|
32
mach/6500/libmon/printhex.s
Normal file
32
mach/6500/libmon/printhex.s
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
.define Printhex
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! This subroutine print the contents of register A to the screen
|
||||||
|
! in hexadecimal form.
|
||||||
|
! The subroutine WRCH is a special one provided by the BBC
|
||||||
|
! microcomputer.
|
||||||
|
|
||||||
|
|
||||||
|
Printhex:
|
||||||
|
pha ! save A
|
||||||
|
lsr a
|
||||||
|
lsr a
|
||||||
|
lsr a
|
||||||
|
lsr a ! get four high bits
|
||||||
|
jsr 1f
|
||||||
|
pla ! restore A
|
||||||
|
and #0x0F ! get four low bits
|
||||||
|
jsr 1f
|
||||||
|
rts
|
||||||
|
1: sed ! print in hex
|
||||||
|
clc
|
||||||
|
adc #0x90
|
||||||
|
adc #0x40
|
||||||
|
cld
|
||||||
|
jmp WRCH
|
||||||
|
|
||||||
|
|
49
mach/6500/libmon/printstack.s
Normal file
49
mach/6500/libmon/printstack.s
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
.define Printstack
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! This a special subroutine which prints some things to the
|
||||||
|
! monitorscreen for debugging.
|
||||||
|
|
||||||
|
|
||||||
|
Printstack:
|
||||||
|
ldy #0
|
||||||
|
2: lda (hol0+4),y
|
||||||
|
beq 1f
|
||||||
|
jsr WRCH ! print filename
|
||||||
|
iny
|
||||||
|
jmp 2b
|
||||||
|
1: lda #32
|
||||||
|
jsr WRCH ! print a space
|
||||||
|
lda hol0+1
|
||||||
|
jsr Printhex ! print line number (highbyte)
|
||||||
|
lda hol0
|
||||||
|
jsr Printhex ! print line number (lowbyte)
|
||||||
|
lda #32
|
||||||
|
jsr WRCH ! print a space
|
||||||
|
lda SP+1
|
||||||
|
jsr Printhex ! print stackpointer (highbyte)
|
||||||
|
lda SP+2
|
||||||
|
jsr Printhex ! print stackpointer (lowbyte)
|
||||||
|
lda #32
|
||||||
|
jsr WRCH ! print a space
|
||||||
|
lda LB+1
|
||||||
|
jsr Printhex ! print real localbase (highbyte)
|
||||||
|
lda LB
|
||||||
|
jsr Printhex ! print real localbase (lowbyte)
|
||||||
|
lda #32
|
||||||
|
jsr WRCH ! print a space
|
||||||
|
lda LBl+1
|
||||||
|
jsr Printhex ! print second lowerbase (highbyte)
|
||||||
|
lda LBl
|
||||||
|
jsr Printhex ! print second lowerbase (lowbyte)
|
||||||
|
lda #10
|
||||||
|
jsr WRCH ! print a newline
|
||||||
|
lda #13
|
||||||
|
jsr WRCH ! print a carriagereturn
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
37
mach/6500/libmon/read.s
Normal file
37
mach/6500/libmon/read.s
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
.define Mread
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! This subroutine reads characters from the standard input.
|
||||||
|
! It ignores the filedes.
|
||||||
|
! It reads atmost 255 characters. So the runtime system must
|
||||||
|
! provide a way of dealing with this.
|
||||||
|
! The subroutine RDCH is a special one provided by the BBC
|
||||||
|
! microcomputer.
|
||||||
|
|
||||||
|
|
||||||
|
Mread:
|
||||||
|
jsr Pop ! ignore filedescriptor
|
||||||
|
jsr Pop ! bufptr
|
||||||
|
stx ADDR ! address of character buffer (lowbyte)
|
||||||
|
sta ADDR+1 ! address of character buffer (highbyte)
|
||||||
|
jsr Pop ! number of characters
|
||||||
|
ldy #0 ! <= 255
|
||||||
|
inx
|
||||||
|
1: jsr RDCH ! read a character from the current inputstream
|
||||||
|
bcs 8f
|
||||||
|
sta (ADDR),y
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne 1b
|
||||||
|
8: tya
|
||||||
|
tax
|
||||||
|
lda #0
|
||||||
|
jsr Push ! number of characters red.
|
||||||
|
tax ! report a succesfull read.
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
39
mach/6500/libmon/write.s
Normal file
39
mach/6500/libmon/write.s
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
.define Mwrite
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
! This subroutine performs the monitor call write.
|
||||||
|
! Writing is always done to standardoutput.
|
||||||
|
! A zero is returned on exit.
|
||||||
|
! The subroutine WRCH is a special routine of the BBC
|
||||||
|
! microcomputer.
|
||||||
|
|
||||||
|
|
||||||
|
Mwrite:
|
||||||
|
jsr Pop ! get fildes
|
||||||
|
jsr Pop ! get address of characterbuffer
|
||||||
|
stx ADDR ! bufferaddress (lowbyte)
|
||||||
|
sta ADDR+1 ! bufferaddress (highbyte)
|
||||||
|
jsr Pop ! number of characters to be writen.
|
||||||
|
ldy #0
|
||||||
|
1: lda (ADDR),y
|
||||||
|
cmp #10
|
||||||
|
bne 2f
|
||||||
|
pha
|
||||||
|
lda #13
|
||||||
|
jsr WRCH
|
||||||
|
pla
|
||||||
|
2: jsr WRCH
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne 1b
|
||||||
|
tya
|
||||||
|
tax
|
||||||
|
lda #0
|
||||||
|
jsr Push
|
||||||
|
tax
|
||||||
|
rts
|
||||||
|
|
Loading…
Reference in a new issue