New installation mechanism

This commit is contained in:
ceriel 1991-08-30 15:19:38 +00:00
parent 5730364a30
commit 6d9cd78c4e
12 changed files with 470 additions and 16 deletions

View file

@ -1,5 +1,2 @@
LIST LIST
Makefile
end.s
head_em.s
libem_s.a libem_s.a

View file

@ -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

View file

@ -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
View file

@ -0,0 +1,3 @@
LIST
head_em.s
libmon_s.a

7
mach/6500/libmon/LIST Normal file
View 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
View 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
View 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
View 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

View 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

View 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
View 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
View 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