home *** CD-ROM | disk | FTP | other *** search
- ; getram.asm
- ;=====================================================
- ; CS-DOS Command: getram [d:]filename
- ;=====================================================
- ; 29Jul89 - Changed input buffer from $1a00 to BSS seg
- ; (CS-DOS now uses $1a00)
-
- zrda = $0063 ;Zero Page REU regigister image used by Shell
- status = $0090 ;KERNEL I/O Status byte
- int04 = $1704 ;Fetch 1st char from parameter .x
- int0c = $170c ;Fetch DS into .a
- int0e = $170e ;Program terminate
- int21 = $1721 ;Function interrupt. Function depends on .y
- int3f = $173f ;Open file %x for Burst Read. (SEC=Error)
- primm = $ff7d ;KERNEL Print Immediate Utility
- getcfg = $ff6b ;Convert standard bank to MMU CR
- rdadr = $1bf5 ;start address of RAM disk or Page if in 1750
- rdbnk = $1bf3 ;bank/CR for ramdisk
- rdmax = $1bf1 ;ramdisk high address
- rflag = $1bf0 ;bit 7 flags 1750 RAM disk
- tx = $1bfe ;bit 6 flag RAM disk on/off
- sw1 = $1bfc ;Command line switch 1
-
- star = $0b00
- .wor star
- * = star
-
- jmp getram
- dw Date
-
- getram ldx #1 ;check for filename
- jsr int04
- bcc gr00 ;ok. something's there
- jsr primm ;Else no parameters. Display Syntax
- .asc 13,"Syntax: getram[/a] [d:]filename",13
- .asc 13,"Purpose: load previously saved commands",13, 0
- ex1 lda #1
- jmp int0e
-
- gr00 bit tx ;first check if RAM disk is active
- bvs gr0 ;ok. load it
- jsr primm
- .asc 13,"RAM disk is not enabled."
- .asc " Aborted.",13, 0
- ex3 lda #3 ;Soft error
- .byt $2c
- ex4 lda #4 ;Hard error
- jmp int0e
-
- gr0 jsr ginit ;open file for read & setup stash subroutine
- bcc gr000 ;open went OK
- gex4 jsr primm
- .byt 13,"Disk error or file not found",13, 0
- jmp ex3
-
- gr000 jsr gnext ;ignore load address (skip two bytes)
- jsr gnext
- gr01 jsr gnext ;get byte
- jsr stash ;stash it
- bcs ovrflw ;overflow. File too big unless this is the last byte
- lda status ;EOF?
- beq gr01 ;no. get more
- and #64
- bne ex0 ;ok. normal exit
- jsr int0c ;Else error. Return DS as errorlevel
- jmp int0e
-
- ovrflw lda status ;went past end of RAM disk
- cmp #64 ;ok if it was the last byte
- beq ex0 ;it was. Normal Exit
- jsr primm
- .asc 13,"File too large. RAMdisk is invalid",0
- jmp ex4
-
- ex0 bit rflag ;in 1750?
- bpl eexx00 ;no. just quit
- lda rda ;else flush buffer before quiting
- sta xlen
- lda #0
- sta xlen+1
- sta rda
- jsr flsh
- eexx00 lda #0 ;quit with errorlevel zero
- jmp int0e
-
- ;-------------------------------------------------------------
- ;Subroutine: get byte from disk & abort if a disk error occurs
- ;-------------------------------------------------------------
-
- gnext jsr $1779 ;chrin if slow device, or get Burst byte if fast
- bcs gbad ;error. abort
- rts ;else OK
-
- gbad pla ;Not really nessessary, but what the heck
- pla
- jsr primm
- .asc 13,"Disk error?",0
- jmp ex4
-
- ;--------------------------------------------------------
- ; Setup stash subroutine. Then go open the disk file (%1)
- ;--------------------------------------------------------
-
- ginit lda rdbnk ;RAM disk bank
- bit rflag ;in 1750?
- bmi in1750 ;yes
- tax ;in 128, get CR
- jsr getcfg
- ora #1 ;no I/O
- sta rdbnk+1 ;save CR for stash
- lda rdadr ;and setup poke
- sta pkr+1
- lda rdadr+1
- sta pkr+2
- jmp chkapn ;check for append
-
- in1750 lda rdadr ;setup REU for transfer
- sta rda+1
- lda rdadr+1
- sta rda+2
- lda #0
- sta rda
- chkapn lda sw1 ;/a ?
- cmp #"a"
- bne chkapx ;No
- ldy #8 ;We're appending, so get end of RAM disk
- jsr int21
- bcs corrup ;error. RAM disk must be corrupt
- ldy #2
- chap0 lda zrda,y ;Copy Shell's REU register image to GETRAM's
- sta rda,y
- dey
- bpl chap0
- chkapx ldx #1 ;finally, open %1 for Burst Read
- jmp int3f
-
- corrup jsr primm
- .asc 13,"RAM disk is corrupt, can't append",13, 0
- jmp ex4
-
- ;----------------------------------
- ;Subroutine: stash byte in RAM disk
- ;----------------------------------
-
- stash bit rflag ;in 1750?
- bmi st1750 ;yes
- ldx $ff00 ;else just stash to one of the 128's banks
- pha
- lda rdbnk+1
- sta $ff00
- pla
- pkr sta $ffff
- stx $ff00
- inc pkr+1
- bne f0
- inc pkr+2
- f0 lda pkr+2 ;test for overflow
- cmp rdmax+1
- bne fx
- lda pkr+1
- cmp rdmax
- bne fx ;SEC. last byte
- rts
-
- fx clc ;ok
- rts
-
- st1750 ldy rda ;RAMdisk is in the 1750, store in buffer for now
- sta buf,y
- inc rda ;buffer full?
- bne fx ;no, just return
- flsh ldy #9 ;Else flush buffer to REU
- lda $d030 ;slow
- pha
- and #%11111110
- sta $d030
- lda $df00 ;Clear flags
- fl lda rec,y ;make the transfer
- sta $df01,y
- dey
- bpl fl
- wfl bit $df00 ;Wait for Xfer to complete
- bvc wfl
- pla ;Restore clock
- sta $d030
- clc ;And bump REU addr
- lda rda
- adc xlen
- sta rda
- lda rda+1
- adc xlen+1
- sta rda+1
- bcc flok
- inc rda+2
- lda rda+2
- cmp rdmax+1
- flok rts
-
- ;Image of REU registers
-
- rec .byt %10010000 ;128->rec
- .wor buf
- rda .byt 0, 0, 0
- xlen .wor 256, 0
-
- buf *=*+256 ;temp storage for input
-
- .end
-