!to "reuvos.prg" ;-------------------------------------------------- ; Virtual REU OS V1 ; ; Tiny Basic extender for the C64+REU. ; Overview : ; <-D : Detect REU (!!! REWRITES ALL BANKS !!!) ; <-S : Stash Basic RAM ($0801-$A000) ; <-F : Fetch Basic RAM ($0801-$A000) ; <-B,{bank} : switch RAM banks ; <-U,{C64-Adr.},{REU-Adr.},{bank},{bytes},{command} ; :User command ; ------------------------------------------------- ; Code : Michael Sachse (cbmhardware /PoL) ; 06.02.2005 : Init runs "Detect", counting banks fixed; ; ------------------------------------------------- ; Licence : GPL ; This program is free software; you can redistribute it and/or modify it under the terms of the ; GNU General Public License as published by the Free Software Foundation ; either version 2 of the ; License, or (at your option) any later version. ; ;-------------------------------------------------- * = $c000 ; Start Address 49152 ;-------------------------------------------------- reubase= $df00 CHRGET = $0073 TXTPTR = $7A IERROR = $0300 IMAIN = $0302 IGONE = $0308 GONE = $A7E4 CHKCOM = $AEFD FRMNUM = $AD8A GETADR = $B7F7 CHROUT = $FFD2 banks = $90 usebank = $92 banktable = $c600 get = $ffe4 ; to get pressed keys ;-------------------------------------------------- lda #03 sta 45 ; Basic low lda #08 sta 46 ; Basic high jsr $a68e ; init freebanks ldy #$00 ; delete banktable f1 lda #70 sta banktable,y iny cpy #32 bne f1 LDA #$93 JSR $FFD2 lda #1 sta $0286 ; textcolor white lda #0 sta $d020 sta $d021 ; black is beautiful ldy #$00 title lda TITLE,y ; text JSR CHROUT iny cpy #40 bne title jsr redet INIT LDX #NEWBASIC STX IGONE STY IGONE+1 RTS LDX #$83 LDY #$A4 STX IMAIN ; ($0302) STY IMAIN+1 ; ($0303) NEWBASIC JSR CHRGET ; GET CHARACTER CMP #95 ; IS IT A "<-" ? BEQ CHK ; YES, CONTINUE JMP GONE+3 ; NORMAL WORD CHK JSR CHRGET ; GET NEXT CHARACTER CMP #$44 ; "D" Detect BEQ reumain CMP #$42 ; "B" Bank,? BEQ getBank CMP #$53 ; "S" Stash ($0800-$a000) BEQ stashreu CMP #$46 ; "F" Fetch ($0800-$a000) BEQ fetchreu1 CMP #$55 ; "U" User,c64,reu,bank,bytes,command (stash,fetch,swap) BEQ userreu JMP (IERROR) ;-------------------------------------------------- redet jsr reudetect ; detect REU (Banks) rts reumain jsr reudetect ; detect REU (Banks) s JMP GONE ;-------------------------------------------------- ; Bank change <-B,{bank} ;-------------------------------------------------- getBank JSR WORK1 sta bank+1 sta usebank s6 JMP STATUS ;-------------------------------------------------- ; Stash (Basic RAM $0801-$a000) ; ; Token : <-S ; ; Asks before rewriting if bank is in use. Smart eh ? ;) ; ;-------------------------------------------------- stashreu ldx usebank lda banktable,x ; check banktable cmp #85 ; "U" Bank in use bne doit ; no, skip ldy #00 ; t1 lda bankuse,y JSR CHROUT iny cpy #20 bne t1 keyb jsr get ; get keyboard cmp #89 ; "Y" beq doit ; cmp #78 ; "N" beq exit bne keyb doit lda #01 sta c64lo+1 lda #08 sta c64hi+1 lda #$00 sta rbytes+1 lda #$a0 sta rbytesh+1 lda #236 sta config ldx usebank lda #85 sta banktable,x jsr main exit JMP GONE ;-------------------------------------------------- fetchreu1 jsr fetchreu rts ;-------------------------------------------------- ; User-Token: <-U,c64,reu,bank,bytes,command ; ; Not rookies choice ! ; ;-------------------------------------------------- userreu jsr WORK1 sta c64lo+1 stx c64hi+1 jsr WORK1 sta reulo+1 stx reuhi+1 jsr WORK1 sta bank+1 jsr WORK1 sta rbytes+1 stx rbytesh+1 jsr WORK1 sta config jsr main ex1 JMP STATUS ;-------------------------------------------------- ; Fetch (Basic RAM $0801-$a000) ; ; Token : <-F ; ; Asks before fetching if bank is empty. ; ;-------------------------------------------------- fetchreu ldx usebank lda banktable,x cmp #70 ;"F" bank free ? bne doit1 ; no skip ldy #00 t4 lda bankempty,y JSR CHROUT iny cpy #23 bne t4 keyb1 jsr get ; get keyboard cmp #89 ; "Y" beq doit1 cmp #78 ; "N" beq ex2 bne keyb1 doit1 lda #01 sta c64lo+1 lda #08 sta c64hi+1 lda #$00 sta rbytes+1 lda #$a0 sta rbytesh+1 lda #237 sta config jsr main ex2 JMP GONE ;-------------------------------------------------- ; Basic ROM patch ;-------------------------------------------------- WORK1 JSR CHRGET ; LDA #$2C ; Comma patch ldy #$00 ; Pointer CMP($7a),y ; compare BEQ WORK1 ; Comma, loop JSR $AD8A ; FRMNUM JSR $B1BF ; GET C64 Adr. LDA $65 ; low byte LDX $64 ; high byte RTS ;-------------------------------------------------- ; Detect REU 1700,1764/50 or 1/2MB ;-------------------------------------------------- reudetect lda #00 sta c64lo+1 lda #$C3 sta c64hi+1 lda #16 sta rbytes+1 lda #00 sta rbytesh+1 sta banks sta reubase cmp reubase beq noreu bne unsafe unsafe lda reubase and #16 ; check bit 4 for REU mem cmp #16 ; 16 = 256Kbx1 beq regcheck ; yes, touch registers bne l1 ; no, 1700 ? l1 lda reubase and #16 ; check bit 4 for REU mem cmp #0 beq r1700 ; reu 1700 found bne noreu ; no ram-type, no reu, no fun ... regcheck lda reubase ldx #2 loop1 txa sta $df00,x ; write to registers 2-5 inx cpx #5 bne loop1 ldx #02 loop2 txa cmp $df00,x bne noreu inx cpx #5 bne loop2 jmp rinit r1700 lda #1 sta banks lda #reutext jmp $ab1e ;------------------------------------------------- rinit ldx #00 ; 1764 wake up rinit2 lda #128 ; stash sta config lda #$12 ; write some crap in ... sta c64hi+1 stx bank+1 jsr main inx cpx #33 ; ... 33 banks into somewhere bne rinit2 jmp action noreu lda #notext jmp $ab1e ;-------------------------------------------------- ; Count banks ;-------------------------------------------------- action lda reubase ldx #$00 stx bank+1 ; reset bank counter check lda #129 ; fetch : transfer to C64 : sta config lda #$C7 ; C64 : $C700 sta c64hi+1 jsr main lda #128 ; stash sta config lda #$C3 ; write dummy bytes sta c64hi+1 jsr main jsr bankcheck ; check for existing ram banks inx cpx #33 ; try 33 stx bank+1 bne check ;-------------------------------------------------- lda #0 ; restore bordercolor sta $d020 lda banks ; banks found ? cmp #4 beq r1764 bne j1 r1764 lda #4 sta banks dec banks lda #text1764 jmp $ab1e j1 cmp #8 beq r512 bne j2 r512 dec banks lda #reut512 jmp $ab1e j2 cmp #16 beq r1024 bne j3 r1024 dec banks lda #reut1024 jmp $ab1e j3 cmp #20 beq r1764 bne j4 j4 cmp #32 beq r2048 bne j6 r2048 dec banks lda #reut2048 jmp $ab1e j6 lda #reuunk jmp $ab1e ;-------------------------------------------------- ; Bank Check ;-------------------------------------------------- bankcheck ldy #$00 l2 lda $C300,y l6 cmp $C700,y bne l4 ; bank found ? beq l3 ; no, check 16 Bytes l3 iny cpy #16 bne l2 ; loop end ldy #00 lda #00 delete sta $C700,y ; delete buffer iny cpy #16 bne delete rts l4 jmp l5 l5 inc banks ; bank found (inc), border color change and exit inc $d020 rts config !byte 252 ;-------------------------------------------------- ; Bytes and text ;-------------------------------------------------- *=$C300 !scr "---C64-RULEZ!---" ; ;-) reutext: !text "REU 1700 : 128KB DETECTED",0 text1764: !text "REU 1764 : 256KB DETECTED",0 reut512: !text "REU 1750 : 512KB DETECTED",0 reut1024: !text "REU 1024KB DETECTED",0 reut2048: !text "REU 2048KB DETECTED",0 reuunk: !text "REU PORT DETECTED - BANK ERROR",0 bankerr: !SCR "BANK ERROR" notext: !text "NO REU",0 bankuse : !SCR "REWRITE BANK [Y/N] ?" bankempty : !SCR "READ EMPTY BANK [Y/N] ?" ;-------------------------------------------------- ; REU TRANSFER ROUTINE ;-------------------------------------------------- main lda config sta reubase+1 c64lo lda #$00 sta reubase+2 c64hi lda #$C2 sta reubase+3 reulo lda #$00 sta reubase+4 reuhi lda #$00 sta reubase+5 bank lda #00 sta reubase+6 ; Bank rbytes lda #16 sta reubase+7 ; 16 Bytes rbytesh lda #$00 sta reubase+8 irq lda #$00 sta reubase+9 lda #$00 sta reubase+10 lda $1 pha lda #$30 ; RAM sei sta $1 sta $ff00 pla sta $1 cli rts ;-------------------------------------------------- ; Restore TXTPTR and back to command line ;-------------------------------------------------- STATUS END2 SEC LDA TXTPTR SBC #$01 STA TXTPTR LDA TXTPTR+1 SBC #$00 STA TXTPTR+1 JMP GONE ;-------------------------------------------------- TITLE !SCR " **** VIRTUAL REU OS V1 INSTALLED **** " flinit !BYTE 73