home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / text / examples.arc / GETRAM.A < prev    next >
Encoding:
Text File  |  1989-12-01  |  9.2 KB  |  209 lines

  1. ; getram.asm
  2. ;=====================================================
  3. ; CS-DOS Command: getram [d:]filename
  4. ;=====================================================
  5. ; 29Jul89 - Changed input buffer from $1a00 to BSS seg
  6. ;           (CS-DOS now uses $1a00)
  7.                                   
  8. zrda        = $0063               ;Zero Page REU regigister image used by Shell
  9. status      = $0090               ;KERNEL I/O Status byte
  10. int04       = $1704               ;Fetch 1st char from parameter .x
  11. int0c       = $170c               ;Fetch DS into .a
  12. int0e       = $170e               ;Program terminate
  13. int21       = $1721               ;Function interrupt. Function depends on .y
  14. int3f       = $173f               ;Open file %x for Burst Read. (SEC=Error)
  15. primm       = $ff7d               ;KERNEL Print Immediate Utility
  16. getcfg      = $ff6b               ;Convert standard bank to MMU CR
  17. rdadr       = $1bf5               ;start address of RAM disk or Page if in 1750
  18. rdbnk       = $1bf3               ;bank/CR for ramdisk
  19. rdmax       = $1bf1               ;ramdisk high address
  20. rflag       = $1bf0               ;bit 7 flags 1750 RAM disk
  21. tx          = $1bfe               ;bit 6 flag RAM disk on/off
  22. sw1         = $1bfc               ;Command line switch 1
  23.                                   
  24. star        = $0b00               
  25.             .wor star
  26.             * = star              
  27.  
  28.             jmp getram
  29.             dw  Date
  30.                       
  31. getram      ldx #1                ;check for filename
  32.             jsr int04             
  33.             bcc gr00              ;ok. something's there
  34.             jsr primm             ;Else no parameters. Display Syntax
  35.             .asc  13,"Syntax:  getram[/a] [d:]filename",13
  36.             .asc  13,"Purpose: load previously saved commands",13, 0
  37. ex1         lda #1                
  38.             jmp int0e             
  39.                                   
  40. gr00        bit tx                ;first check if RAM disk is active
  41.             bvs gr0               ;ok. load it
  42.             jsr primm             
  43.             .asc  13,"RAM disk is not enabled."
  44.             .asc  " Aborted.",13, 0
  45. ex3         lda #3                ;Soft error
  46.             .byt $2c
  47. ex4         lda #4                ;Hard error
  48.             jmp int0e             
  49.                                   
  50. gr0         jsr ginit             ;open file for read & setup stash subroutine
  51.             bcc gr000             ;open went OK
  52. gex4        jsr primm             
  53.             .byt  13,"Disk error or file not found",13, 0
  54.             jmp ex3               
  55.                                   
  56. gr000       jsr gnext             ;ignore load address (skip two bytes)
  57.             jsr gnext             
  58. gr01        jsr gnext             ;get byte
  59.             jsr stash             ;stash it
  60.             bcs ovrflw            ;overflow. File too big unless this is the last byte
  61.             lda status            ;EOF?
  62.             beq gr01              ;no. get more
  63.             and #64               
  64.             bne ex0               ;ok. normal exit
  65.             jsr int0c             ;Else error. Return DS as errorlevel
  66.             jmp int0e             
  67.                                   
  68. ovrflw      lda status            ;went past end of RAM disk
  69.             cmp #64               ;ok if it was the last byte
  70.             beq ex0               ;it was. Normal Exit
  71.             jsr primm             
  72.             .asc  13,"File too large. RAMdisk is invalid",0
  73.             jmp ex4               
  74.                                   
  75. ex0         bit rflag             ;in 1750?
  76.             bpl eexx00            ;no. just quit
  77.             lda rda               ;else flush buffer before quiting
  78.             sta xlen              
  79.             lda #0                
  80.             sta xlen+1            
  81.             sta rda               
  82.             jsr flsh              
  83. eexx00      lda #0                ;quit with errorlevel zero
  84.             jmp int0e             
  85.                                   
  86. ;-------------------------------------------------------------
  87. ;Subroutine: get byte from disk & abort if a disk error occurs
  88. ;-------------------------------------------------------------
  89.                                   
  90. gnext       jsr $1779             ;chrin if slow device, or get Burst byte if fast
  91.             bcs gbad              ;error. abort
  92.             rts                   ;else OK
  93.                                   
  94. gbad        pla                   ;Not really nessessary, but what the heck
  95.             pla                   
  96.             jsr primm             
  97.             .asc  13,"Disk error?",0
  98.             jmp ex4               
  99.                                   
  100. ;--------------------------------------------------------
  101. ; Setup stash subroutine. Then go open the disk file (%1)
  102. ;--------------------------------------------------------
  103.                                   
  104. ginit       lda rdbnk             ;RAM disk bank
  105.             bit rflag             ;in 1750?
  106.             bmi in1750            ;yes
  107.             tax                   ;in 128, get CR
  108.             jsr getcfg            
  109.             ora #1                ;no I/O
  110.             sta rdbnk+1           ;save CR for stash
  111.             lda rdadr             ;and setup poke
  112.             sta pkr+1             
  113.             lda rdadr+1           
  114.             sta pkr+2             
  115.             jmp chkapn            ;check for append
  116.                                   
  117. in1750      lda rdadr             ;setup REU for transfer
  118.             sta rda+1             
  119.             lda rdadr+1           
  120.             sta rda+2             
  121.             lda #0                
  122.             sta rda               
  123. chkapn      lda sw1               ;/a ?
  124.             cmp #"a"              
  125.             bne chkapx            ;No
  126.             ldy #8                ;We're appending, so get end of RAM disk
  127.             jsr int21             
  128.             bcs corrup            ;error. RAM disk must be corrupt
  129.             ldy #2                
  130. chap0       lda zrda,y            ;Copy Shell's REU register image to GETRAM's
  131.             sta rda,y             
  132.             dey                   
  133.             bpl chap0             
  134. chkapx      ldx #1                ;finally, open %1 for Burst Read
  135.             jmp int3f             
  136.                                   
  137. corrup      jsr primm             
  138.             .asc  13,"RAM disk is corrupt, can't append",13, 0
  139.             jmp ex4               
  140.                                   
  141. ;----------------------------------
  142. ;Subroutine: stash byte in RAM disk
  143. ;----------------------------------
  144.                                   
  145. stash       bit rflag             ;in 1750?
  146.             bmi st1750            ;yes
  147.             ldx $ff00             ;else just stash to one of the 128's banks
  148.             pha                   
  149.             lda rdbnk+1           
  150.             sta $ff00             
  151.             pla                   
  152. pkr         sta $ffff             
  153.             stx $ff00             
  154.             inc pkr+1             
  155.             bne f0                
  156.             inc pkr+2             
  157. f0          lda pkr+2             ;test for overflow
  158.             cmp rdmax+1           
  159.             bne fx                
  160.             lda pkr+1             
  161.             cmp rdmax             
  162.             bne fx                ;SEC. last byte
  163.             rts                   
  164.                                   
  165. fx          clc                   ;ok
  166.             rts                   
  167.                                   
  168. st1750      ldy rda               ;RAMdisk is in the 1750, store in buffer for now
  169.             sta buf,y             
  170.             inc rda               ;buffer full?
  171.             bne fx                ;no, just return
  172. flsh        ldy #9                ;Else flush buffer to REU
  173.             lda $d030             ;slow
  174.             pha                   
  175.             and #%11111110        
  176.             sta $d030             
  177.             lda $df00             ;Clear flags
  178. fl          lda rec,y             ;make the transfer
  179.             sta $df01,y           
  180.             dey                   
  181.             bpl fl                
  182. wfl         bit $df00             ;Wait for Xfer to complete
  183.             bvc wfl               
  184.             pla                   ;Restore clock
  185.             sta $d030             
  186.             clc                   ;And bump REU addr
  187.             lda rda               
  188.             adc xlen              
  189.             sta rda               
  190.             lda rda+1             
  191.             adc xlen+1            
  192.             sta rda+1             
  193.             bcc flok              
  194.             inc rda+2             
  195.             lda rda+2             
  196.             cmp rdmax+1           
  197. flok        rts                   
  198.                                   
  199. ;Image of REU registers
  200.                                   
  201. rec         .byt %10010000        ;128->rec
  202.             .wor buf
  203. rda         .byt 0, 0, 0
  204. xlen        .wor 256, 0
  205.                                   
  206. buf         *=*+256               ;temp storage for input
  207.                                   
  208.             .end                  
  209.