home *** CD-ROM | disk | FTP | other *** search
- ; 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
-