home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
enterprs
/
c128
/
text
/
examples.arc
/
SETRAM.A
< prev
next >
Wrap
Text File
|
1989-12-01
|
12KB
|
295 lines
; setram.asm
;=================================
; Command: setram bank,address
;=================================
poker = $0016
txttab = $002d
txttop = $1210
maxm1 = $0039
maxm0 = $1212
int0e = $170e
int11 = $1711
rdmax = $1bf1
rdadr = $1bf5
rdbnk = $1bf3
rflag = $1bf0
tx = $1bfe
sw1 = $1bfc ; switch 1. n=no initialize
clr = $af81
new = $af84
hexa = $b8c2
primm = $ff7d
chrout = $ffd2
getcfg = $ff6b
star = $0b00
.wor star
* = star
jmp SetRAM
dw Date
SetRAM bit tx ; ram disk on?
bvc setram ; no. set it
bit rflag ; ok to set new one if its in the 1750
bmi setram ; otherwise error since rdoff is required to free RAM
lda rdbnk ; but only if bank 0 or 1
cmp #2
bcs setram
jsr primm
.asc 13,"RAM disk already installed!", 0
jmp ex3
setram ldx #1 ; get %1
jsr int11 ; evaluate constant
bcc gotbnk ; got bank
jsr primm
.asc 13,"Syntax: setram bank,address",13
.asc 13,"Purpose: define internal RAM disk",13, 0
jmp ex1
gotbnk cmp #0 ; high byte of bank must be zero
beq sr0 ; ok. continue
ivb jsr primm
.asc 13,"invalid bank",13, 0
jmp ex2
sr0 cpx #16 ; in 1750
bcc sr00 ; no in the 128
cpx #24 ; 1750 banks are 16,17...23
bcs ivb
jmp in1750
sr00 cpx #12 ; 128 bank must be 0-12
bcs ivb ; invalid bank
stx rdb ; save it for now
ldx #2 ; get RAM address
jsr int11
stx rda
sta rda+1
lda rdb ; now make sure its ok
asl a
tax
lda rda+1
cmp minram+1,x
bcs srok
lda rda
cmp minram,x
bcs srok
jsr primm
.asc 13,"RAM start address too low!",13
.asc "Minimum allowed is $", 0
lda rdb
asl a
tax
lda minram+1,x
ldy minram,x
srx jsr prthex
lda #13
jsr chrout
jmp ex3
srok jmp srokk
srxx jsr prthex
lda #13
jsr chrout
ldx rdbnk ; check for bank 0 or 1
cpx #4
bcs romdsk ; neither. no pointers to adjust
jsr $ff6b ; get CR
sta $ff00 ; put a zero in RAM to initialize disk
lda rdadr+1
sta poker+1
lda rdadr
sta poker
lda #0
tay
sta (poker),y
iny
sta (poker),y
sta $ff00 ; back to bank 15
cpx #0 ; was it bank 0?
bne mb1 ; no
lda maxm0 ; save top of RAM for RDOFF
sta rdmax
lda maxm0+1
sta rdmax+1
lda rdadr ; bank 0. set top of RAM for BASIC
sta maxm0
lda rdadr+1
sta maxm0+1
sec ; check if program in RAM extends into disk area
lda maxm0
sbc txttop
lda maxm0+1
sbc txttop+1
bcc romdsk ; no it doesn't
lda txttab ; it does. Gotta do a NEW
clc
adc #2
sta txttop
lda txttab+1
adc #0
sta txttop+1
lda #0
tay
sta (txttab),y
iny
sta (txttab),y
jmp romdsk
mb1 cpx #1 ; bank 1
bne romdsk ; no. do nothing
lda maxm1 ; save top of RAM 1
sta rdmax
lda maxm1+1
sta rdmax+1
lda rdadr ; else set top of RAM 1
sta maxm1
lda rdadr+1
sta maxm1+1
lda #0
jsr clr ; and CLR
romdsk jmp ex0 ; ok
srokk lda tx
ora #%01000000
sta tx
lda rdb
sta rdbnk
tax
jsr getcfg
ora #1
sta rdbnk+1
lda rflag
and #$7f
sta rflag
lda rda
sta rdadr
lda rda+1
sta rdadr+1
jsr primm
.asc 13,"RAM disk installed at $", 0
lda rdbnk
jsr hexa
lda rdadr+1
ldy rdadr
jmp srxx
prthex jsr hexa
tya
jmp hexa
minram .wor $4000
.wor $6000
.wor $4000
.wor $4000
.wor $8000
.wor $8000
.wor $8000
.wor $8000
.wor $8000
.wor $8000
.wor $8000
.wor $8000
rdhi .wor 0
rdb .wor 0
rda .wor 0
;----------------------------------------------------
; Special case. Ram disk is in the 1750 RAM expander
;----------------------------------------------------
in1750 stx rdb ; save RAM start bank (+16)
ldx #2 ; get # of banks to use
jsr int11
cmp #0 ; high byte must be zero
beq i79 ; ok
tmb jsr primm
.asc 13,"RAM expander isn't that big!",13, 0
jmp ex3
i79 cpx #9 ; 8 banks max
bcs tmb
cpx #0
bne i799
ldx #1
i799 stx rdb+1
clc
lda rdb ; high=low+# of banks
and #$0f
sta rda+1
adc rdb+1
sta rdhi+1
cmp #9
bcs tmb
sec
sbc #1
ora #$30
sta ms2+4
lda rda+1
ora #$30
sta ms2+2
lda #0 ; low page always zero
sta rdhi
sta rda
lda #$80
ora rflag
sta rflag
i70 ldy #5
i71 lda rdhi,y
sta rdmax,y
dey
bpl i71
lda sw1 ; initialize?
cmp #"i"
bne i72 ; no
lda rda
sta reca+1
lda rda+1
sta reca+2
ldy #9
i73 lda recdat,y
sta $df01,y
dey
bpl i73
bmi i72
recdat .byt %10010000 ; move 128-rec
.wor zero ; put a zero word at RAM expander start
reca .byt 0, 0, 0 ; rec address
.wor 2 ; two bytes to move
zero .wor 0
i72 jsr primm
.asc 13,"RAM disk installed in 1750 bank", 0
lda rdb+1
cmp #1
bne ms1
lda rda+1
ora #$30
sta ms0+1
jsr primm
ms0 .asc " ",13, 0
jmp settx
ms1 jsr primm
ms2 .asc "s a-b",13, 0
settx lda tx ; flag 'RAM disk on' for shell
ora #%01000000
sta tx
ex0 lda #0
.byt $2c
ex1 lda #1
.byt $2c
ex2 lda #2
.byt $2c
ex3 lda #3
jmp int0e
.end