
PROGRAM LISTING: 89-09a/RAMDISK.SRC
ATARI Macro Assembler Ver: 2.0A, RAMDISK.SRC
******* SmartRAM 2.5
******* by Tim Patrick, the Happy Hacker
;
******* (c)1989 Antic Publishing, Inc.
;
******* RAMDISK DRIVE NUMBER
= 0008 RAMDRV = 8 ;DOS 2.5=D8:
;
******* ZERO PAGE
= 0014 RTCLOK = $14
= 0021 ICDNOZ = $21
= 0032 BUFRLO = $32
= 0033 BUFRHI = $33
= 0034 BFENLO = $34
= 0035 BFENHI = $35
;
******* OTHER RAM
= 03FA GINTLK = $3FA ;CARTRIDGE?
= 03F8 BASICF = $3F8 ;ROM BASIC?
= 02E0 RUNAD = $2E0
= 02E2 INITAD = $2E2
= 02EA DVSTAT = $2EA
= 070A DRVBYT = $70A ;DRIVE MASK
= 070C SASA = $70C ;END FMS CODE
= 07E0 DINT = $7E0 ;FMS INIT
= 4000 TSTLC = $4000
= 7400 VTOCP1 = $7400 ;RD1050 VTOC1
= 4000 VTOCP2 = $4000 ;RD1050 VTOC2
= 009B CR = $9B
= 001C UP = $1C
= 007D CLR = 125
= 00FD BELL = 253
= 001D DOWN = $1D
= 001E LEFT = $1E
= 001F RIGHT = $1F
= 1481 GETBANK = $1481 ;DOS ROUTINES
= 12CB SETBANK = $12CB
= 07DF FASTRAM = $07DF ;SYNC W'VBI
= 14C4 RAM_OUT = $14C4 ;RAMDISK EXIT
= 0043 ZBUFP = $43
= 0042 CRITIC = $42
= 0B87 FIX_1 = $B87
= 105D S_FIX = $105D
= 0780 DVLOC_1 = $780 ;BSIO
= 0B89 DVLOC_2 = $B89 ;FORMAT
= 105F DVLOC_3 = $105F ;STATUS
= 0004 READ = 4
= 0008 WRITE = 8
= 0003 OPEN = 3
= 000C CLOSE = 12
= 0007 GET = 7
= 000B PUT = 11
= 153F MEMDUP = $153F ;MEM.SAV/DUP
= 008B NAK_ERR = 139
= 183A M_ADDR = $183A
= 1863 T_ADDR = M_ADDR+MEMEND-MEMFIX
;
******* OS ROM VECTORS
= E453 DSKINV = $E453
= E456 CIOV = $E456
= E459 SIOV = $E459
;
******* CHIP REGISTERS
= D301 PORTB = $D301
= D40E NMIEN = $D40E
;
******* DCB/IOCB
= 0300 DDEVIC = $300
= 0301 DUNIT = $301
= 0302 DCOMND = $302
= 0303 DSTATS = $303
= 0304 DBUFLO = $304
= 0305 DBUFHI = $305
= 030A DAUX1 = $30A
= 030B DAUX2 = $30B
;
= 0342 ICCOM = $342
= 0344 ICBAL = $344
= 0345 ICBAH = $345
= 0348 ICBLL = $348
= 0349 ICBLH = $349
= 034A ICAX1 = $34A
= 034B ICAX2 = $34B
;
******* MACROS
SKW MACRO ;SKIP WORD
DB $FC ;BRANCH +2
ENDM
SKB MACRO ;SKIP BYTE
DB $F4 ;BRANCH +1
ENDM
;
******* INSTALLATION ROUTINE
;
0000 = 3000 ORG $3000
;
******* 256K EXTENDED MEMORY TEST
;
3000 AD01D3 INSTAL LDA PORTB
3003 09FC ORA #$FC ;SET ALL BITS
3005 48 PHA ;(SAVE IT)
3006 AA TAX ;NORMAL IN X
3007 ACAD33 LDY BIT_X ;XE BANK IN Y
300A 20EC32 JSR MEMTST ;TEST IT
300D 1002 ^3011 BPL TEST6
;
300F 68 PLA ;NO EXTRA RAM
3010 60 RTS ;BYE!
;
3011 AE9C33 TEST6 LDX BIT_6 ;ANY AT 6?
3014 20EC32 JSR MEMTST
3017 8DB133 STA EXTRA ;192K FLAG(0)
;
301A AEA033 TEST5 LDX BIT_5 ;HOW ABOUT 5?
301D 20EC32 JSR MEMTST
3020 3012 ^3034 BMI TEST7
;
******* NEWELL/RAMBO?
;
3022 EEB133 INC EXTRA ;BIT-6(+)?
3025 D023 ^304A BNE MEMX ;YUP, RAMBOXL
;
3027 A203 LDX #3
3029 BDA933 LPN LDA NEWELL,X ;FIX TABLE
302C 9D9C33 STA TABLE,X ;FOR NEWELL
302F CA DEX
3030 10F7 ^3029 BPL LPN
3032 3013 ^3047 BMI EXIT
;
******* TEST FOR BIT-7
;
3034 AEA533 TEST_7 LDX BIT_7
3037 20EC32 JSR MEMTST
303A 300E ^304A BMI MEMX
;
303C A203 LDX #3
303E BDA533 LP7 LDA BIT_7,X ;FIX TABLE
3041 9DA033 STA TABLE2,X ;FOR BIT-7
3044 CA DEX
3045 10F7 ^303E BPL LP7
;
******* RAM TEST EXIT
;
3047 EEB133 EXIT INC EXTRA ;256K FLAG(+)
;
304A 68 MEMX PLA ;FIX $D301
304B 8D01D3 STA PORTB
304E ADB133 LDA EXTRA ;(-) = 128K
3051 F024 ^3077 BEQ FIX_192 ;(0) = 192K
3053 1025 ^307A BPL FIX_DOS ;(+) = 256K
;
******* 130XE RAMDISK INITIALIZATION
;
3055 A0CA XE_TYPE LDY #$CA ;(DEX)
3057 8CDA30 STY V_TST1
305A EEE230 INC V_TST2+1
;
305D A003 LDY #3
305F 8CED30 STY CLEAR+1 ;ONLY 4 BANKS
3062 B9AD33 XE_FIX LDA BIT_X,Y ;FIX TABLE
3065 999C33 STA TABLE,Y ;AND MESSAGE
3068 B97330 LDA XE_MSG,Y ;FOR 130XE
306B 993333 STA MSG1+24+2,Y
306E 88 DEY
306F 10F1 ^3062 BPL XE_FIX
3071 300A ^307D BMI MERGE
;
3073 4449534B XE_MSG DB 'DISK'
;
******* PATCH DOS 2.5 FOR 192/256K
;
3077 20D632 FIX_192 JSR SIXFIX ;ONLY 192K
;
307A 203A32 FIX_DOS JSR DOSFIX ;PATCH DOS
;
******* MERGE RAMDISK WITH DOS
;
307D A908 MERGE LDA #RAMDRV ;INSTALL
307F AA TAX
3080 8D8007 STA DVLOC_1 ;DRIVE
3083 8D890B STA DVLOC_2 ;NUMBER
3086 8D5F10 STA DVLOC_3 ;(DECIMAL)
3089 18 CLC
308A 6930 ADC #'0' ;(ASCII)
308C 8D9933 STA DRIVE+1
308F 8D3133 STA MSG1+24
3092 8D7031 STA DRIVE_1+1
3095 8DD631 STA DRIVE_2+1
;
3098 A900 LDA #0
309A 38 SEC ;SET 1 BIT,
309B 2A DRVLP ROL A ;THEN SHIFT
309C CA DEX ;TO POSITION
309D D0FC ^309B BNE DRVLP
309F 0D0A07 ORA DRVBYT
30A2 8D0A07 STA DRVBYT ;ADD TO TABLE
30A5 20E007 JSR DINT
;
******* PRINT SMARTRAM MESSAGE
;
30A8 A219 LDX #LOW MSG1
30AA A033 LDY #HIGH MSG1
30AC A94F LDA #[MSGEND-MSG1]
30AE 8D4803 STA ICBLL
30B1 8E4403 STX ICBAL
30B4 8C4503 STY ICBAH
30B7 A200 LDX #0
30B9 8E4903 STX ICBLH
30BC A90B LDA #PUT
30BE 8D4203 STA ICCOM
30C1 2056E4 JSR CIOV
;
******* CHECK IF PREVIOUSLY FORMATTED
;
30C4 A202 LDX #2
30C6 AD01D3 LDA PORTB
30C9 48 PHA
30CA 09FC ORA #$FC
30CC 3D9C33 AND TABLE,X ;SELECT VTOC
30CF 8D01D3 STA PORTB ;RAMDISK BANK
;
30D2 A000 LDY #0 ;COMPARE
30D4 EC0074 V_TST0 CPX VTOCP1 ;VTOC BYTE-1
30D7 F001 ^30DA BEQ V_TST1
30D9 C8 INY
30DA E8 V_TST1 INX
30DB EC0274 CPX VTOCP1+2 ;VTOC BYTE-3
30DE F001 ^30E1 BEQ V_TST2
30E0 C8 INY
30E1 A2F2 V_TST2 LDX #$F2
30E3 EC0174 CPX VTOCP1+1 ;VTOC BYTE-2
30E6 F001 ^30E9 BEQ V_DONE
30E8 C8 INY
30E9 98 V_DONE TYA ;FORMATTED?
30EA F042 ^312E BEQ NO_FMT
;
******* CLEAR EXTRA RAM
;
30EC A207 CLEAR LDX #7 ;BANKS 0->7
30EE AD01D3 FLP1 LDA PORTB
30F1 09FC ORA #$FC
30F3 3D9C33 AND TABLE,X ;GET FIRST
30F6 8D01D3 STA PORTB
30F9 A240 LDX #$40 ;SET UP
30FB 8633 STX BUFRHI ;INDIRECT
30FD A000 LDY #0 ;ADDRESS
30FF 8432 STY BUFRLO
3101 98 TYA ;CLEAR "A"
3102 9132 FLP2 STA (BUFRLO),Y ;CLEAR A PAGE
3104 C8 INY
3105 D0FB ^3102 BNE FLP2
3107 E633 INC BUFRHI ;NEXT PAGE
3109 CA DEX
310A D0F6 ^3102 BNE FLP2
310C CEED30 DEC CLEAR+1 ;NEXT BANK
310F 10DB ^30EC BPL CLEAR
;
******* SET UP XIO TO FORMAT
;
3111 203032 XIOFMT JSR DO_CLOSE ;CHANNEL-4
3114 A9FE LDA #254 ;XIO FORMAT
3116 9D4203 STA ICCOM,X
3119 A998 LDA #LOW DRIVE
311B 9D4403 STA ICBAL,X
311E A933 LDA #HIGH DRIVE
3120 9D4503 STA ICBAH,X
3123 A900 LDA #0
3125 9D4B03 STA ICAX2,X
3128 9D4A03 STA ICAX1,X
312B 2056E4 JSR CIOV
;
312E 68 NO_FMT PLA
312F 8D01D3 STA PORTB
;
******* MOVE DUP.SYS TO D8:
;
3132 203032 JSR DO_CLOSE ;CLOSE FIRST
3135 A903 LDA #OPEN ;OPEN
3137 9D4203 STA ICCOM,X
313A A904 LDA #READ ;FOR READ
313C 9D4A03 STA ICAX1,X
313F A982 LDA #LOW FILE ;D1:DUP.SYS
3141 9D4403 STA ICBAL,X
3144 A933 LDA #HIGH FILE
3146 9D4503 STA ICBAH,X
3149 2056E4 JSR CIOV
314C 301C ^316A BMI OOPS_1 ;NO DUP(?)
;
******* READ IT IN TO BUFFER
;
314E A907 LDA #GET ;COPY FILE
3150 9D4203 STA ICCOM,X
3153 A906 LDA #LOW SIZE
3155 9D4803 STA ICBLL,X
3158 A914 LDA #HIGH SIZE
315A 9D4903 STA ICBLH,X
315D A9B3 LDA #LOW BUFFER
315F 9D4403 STA ICBAL,X ;TO BUFFER
3162 A933 LDA #HIGH BUFFER
3164 9D4503 STA ICBAH,X
3167 2056E4 JSR CIOV
316A 3022 ^318E OOPS_1 BMI OOPS_2
316C 203032 JSR DO_CLOSE
;
******* SWITCH TO D8: (#RAMDRV)
;
316F A938 DRIVE_1 LDA #8+'0' ;SET RAMDRIVE
3171 8D8333 STA FILE+1
3174 8D8E33 STA MEM_SAV+1
;
******* NOW OPEN FOR WRITE
;
3177 A903 OPEN_8 LDA #OPEN ;OPEN
3179 9D4203 STA ICCOM,X
317C A908 LDA #WRITE ;FOR WRITE
317E 9D4A03 STA ICAX1,X
3181 A982 LDA #LOW FILE ;D8:DUP.SYS
3183 9D4403 STA ICBAL,X
3186 A933 LDA #HIGH FILE
3188 9D4503 STA ICBAH,X
318B 2056E4 JSR CIOV
318E 301C ^31AC OOPS_2 BMI OOPS_3
;
******* WRITE DUP.SYS TO D8:
;
3190 A90B WRTDUP LDA #PUT ;PUT BYTES
3192 9D4203 STA ICCOM,X
3195 A906 LDA #LOW SIZE
3197 9D4803 STA ICBLL,X
319A A914 LDA #HIGH SIZE
319C 9D4903 STA ICBLH,X
319F A9B3 LDA #LOW BUFFER ;FROM BUFFER
31A1 9D4403 STA ICBAL,X
31A4 A933 LDA #HIGH BUFFER
31A6 9D4503 STA ICBAH,X
31A9 2056E4 JSR CIOV ;WRITE FILE
31AC 3064 ^3212 OOPS_3 BMI OOPS_4 ;(NEVER!)
;
******* CREATE MEM.SAV FILE
;
31AE 203032 JSR DO_CLOSE
31B1 ADFA03 LDA GINTLK
31B4 D005 ^31BB BNE MEM_FIL
31B6 ADF803 LDA BASICF
31B9 D017 ^31D2 BNE DUP_MEM
31BB A903 MEM_FIL LDA #OPEN ;OPEN
31BD 9D4203 STA ICCOM,X
31C0 A908 LDA #WRITE ;FOR WRITE
31C2 9D4A03 STA ICAX1,X
31C5 A98D LDA #LOW MEMSAV ;D8:MEM.SAV
31C7 9D4403 STA ICBAL,X
31CA A933 LDA #HIGH MEMSAV
31CC 9D4503 STA ICBAH,X
31CF 2056E4 JSR CIOV
;
******* USE D8:DUP.SYS/MEM.SAV
;
31D2 203032 DUP_MEM JSR DO_CLOSE
31D5 A938 DRIVE_2 LDA #8+'0'
31D7 8D3F15 STA MEMDUP
;
******* IF 130XE, EXIT HERE
;
31DA ADB133 LDA EXTRA
31DD 3051 ^3230 BMI DO_CLOSE
;
******* UPDATE DUP.SYS MENU
;
31DF A903 LDA #OPEN ;OPEN
31E1 9D4203 STA ICCOM,X
31E4 A90C LDA #READ+WRITE ;FOR UPDATE
31E6 9D4A03 STA ICAX1,X
31E9 A982 LDA #LOW FILE ;D8:DUP.SYS
31EB 9D4403 STA ICBAL,X
31EE A933 LDA #HIGH FILE
31F0 9D4503 STA ICBAH,X
31F3 2056E4 JSR CIOV
;
******* POINT TO DUP MENU TITLE
;
31F6 A907 LDA #GET ;GET
31F8 9D4203 STA ICCOM,X
31FB A930 LDA #LOW 48 ;48 BYTES
31FD 9D4803 STA ICBLL,X
3200 A900 LDA #HIGH 48
3202 9D4903 STA ICBLH,X
3205 A9B3 LDA #LOW BUFFER
3207 9D4403 STA ICBAL,X
320A A933 LDA #HIGH BUFFER
320C 9D4503 STA ICBAH,X
320F 2056E4 JSR CIOV
3212 301C ^3230 OOPS_4 BMI DO_CLOSE ;(HUH?)
;
******* WRITE THE NEW TEXT DATA
;
3214 A90B LDA #PUT ;NOW, PUT
3216 9D4203 STA ICCOM,X
3219 A91A LDA #LOW [FILE-DUPMOD]
321B 9D4803 STA ICBLL,X
321E A900 LDA #HIGH [FILE-DUPMOD]
3220 9D4903 STA ICBLH,X
3223 A968 LDA #LOW DUPMOD ;NEW TEXT
3225 9D4403 STA ICBAL,X
3228 A933 LDA #HIGH DUPMOD
322A 9D4503 STA ICBAH,X
322D 2056E4 JSR CIOV ;INTO MENU
;
******* BE NEAT, CLOSE IT UP.
;
3230 A240 DOCLOSE LDX #$40
3232 A90C LDA #CLOSE
3234 9D4203 STA ICCOM,X
3237 4C56E4 JMP CIOV ;BYE, BYE
;
*********************
******* *
******* SUBROUTINES *
******* *
*********************
;
******* PATCH DOS 2.5 FOR 256K
;
323A A909 DOS_FIX LDA #9
323C 8D8E14 STA $148E
323F A941 LDA #$41
3241 8D9514 STA $1495
;
3244 A00A LDY #SETEND-SETFIX-1
3246 B98E32 ST_FIX LDA SETFIX,Y
3249 99DE12 STA $12DE,Y
324C 88 DEY
324D 10F7 ^3246 BPL ST_FIX
;
324F A013 LDY #RAMEND-RAMFIX-1
3251 B99932 RM_FIX LDA RAMFIX,Y
3254 99C414 STA RAMOUT,Y
3257 88 DEY
3258 10F7 ^3251 BPL RM_FIX
;
325A A008 LDY #8
325C B99C33 T_MOVE LDA TABLE,Y
325F 996318 STA T_ADDR,Y
3262 88 DEY
3263 10F7 ^325C BPL T_MOVE
3265 A963 LDA #LOW T_ADDR
3267 8DE712 STA T_FIX+1
326A A918 LDA #HIGH T_ADDR
326C 8DE812 STA T_FIX+2
;
326F ADC317 LDA $17C3
3272 18 CLC
3273 6902 ADC #MF_2-MEMFIX
3275 8DCA17 STA $17CA
3278 A028 LDY #MEMEND-MEMFIX-1
327A B9AD32 M_MOVE LDA MEMFIX,Y
327D 993A18 STA M_ADDR,Y
3280 88 DEY
3281 10F7 ^327A BPL M_MOVE
;
******* DRIVE FORMAT TABLE FIX
;
3283 A98A LDA #$8A
3285 8D5D10 STA S_FIX
3288 A906 LDA #6 ;OFFSET-6
328A 8D870B STA FIX_1
328D 60 RTS
;
*********************
******* *
******* THE FIXES *
******* *
*********************
;
******* SET-BANK ROUTINE
;
328E = 12DE# SETFIX LOC $12DE
12DE# 2907 AND #%00000111 ;1024 = 0
12E0# A8 FINISH TAY
12E1# AD01D3 LDA PORTB
12E4# 09FC ORA #$FC ;SET ALL
12E6# 399C33 T_FIX AND TABLE,Y ;SELECT BANK
;
12E9# = 3299 ORG *O
= 3299 SETEND = *
;
******* RAMDISK I/O EXIT
;
3299 = 14C4# RAMFIX LOC RAM_OUT ;($14C4)
14C4# AD01D3 LDA PORT_B
14C7# 09FC ORA #$FC ;SET NO BANK
14C9# 8D01D3 STA PORT_B
14CC# A0C0 LDY #$C0
14CE# 8C0ED4 STY NMIEN ;RESTORE NMI
14D1# A000 LDY #0
14D3# 8442 STY CRITIC ;CLEAR CRITIC
14D5# 58 CLI ;RESTORE IRQ
14D6# C8 INY ;GOOD STATUS
14D7# 60 NEW_OUT RTS ;(+3 BYTES)
;
14D8# = 32AD ORG *O
= 32AD RAMEND = *
;
32AD FD9B MEMFIX DB BELL,CR
32AF 1C4552524F MF_2 DB UP,'ERROR WRITING MEM.SAV - Y TO RUN DOS!',CR
= 32D6 MEMEND = *
;
******* 192K RAMDISK INITIALIZATION
;
32D6 A003 SIX_FIX LDY #3
32D8 B9AD33 FIX_6 LDA BIT_X,Y ;FIX TABLE
32DB 99A033 STA TABLE2,Y ;AND MESSAGE
32DE B9E832 LDA MSG_192,Y ;FOR 192K
32E1 997533 STA DUPMOD+13,Y
32E4 88 DEY
32E5 10F1 ^32D8 BPL FIX_6
32E7 60 RTS
;
32E8 B1B9B2CB MSG_192 DC '1','9','2','K'
;
******* MEMORY TEST
;
32EC 8C01D3 MEMTST STY PORTB
32EF AD0040 LDA TSTLC ;GET BYTE
32F2 48 PHA ;AND SAVE IT
32F3 8E01D3 STX PORTB ;SWAP BANKS
32F6 CD0040 CMP TSTLC ;THEN COMPARE
32F9 D013 ^330E BNE YUP
32FB 8C01D3 STY PORTB ;INCASE DATA
32FE 49FF EOR #$FF ;IS SAME
3300 8D0040 STA TSTLC ;INVERT IT
3303 8E01D3 STX PORTB ;AND COMPARE
3306 CD0040 CMP TSTLC ;AGAIN...
3309 D003 ^330E BNE YUP
330B A2FF NOPE LDX #$FF ;FAILED FLAG
330D SKW ;(SKIP WORD)
330D +FC DB $FC ;(BRANCH +2)
330E A200 YUP LDX #0 ;PASSED FLAG
3310 8C01D3 STY PORTB
3313 68 PLA ;RESTORE BYTE
3314 8D0040 STA TSTLC
3317 8A TXA ;SET FLAG
3318 60 RTS
;
******* SMARTRAM MESSAGE
;
;SmartRAM-II DOS 2.5 D8:1050 EMULATOR
;by Tim Patrick, COPYRIGHT 1989 ANTIC
;
3319 7D1C1C MSG1 DB CLR,UP,UP
331C 536D617274 DB 'SmartRAM-II DOS 2.5 D8:1050 EMULATOR'
3340 9B DB CR
3341 6279205469 DB 'by Tim Patrick, COPYRIGHT 1989 ANTIC'
3365 1F1F1D DB RIGHT,RIGHT,DOWN
= 3368 MSGEND = *
;
******* FILENAMES AND DATA
;
3368 CDCFC4C9C6 DUPMOD DC 'M','O','D','I','F','I'
336E C5C4A0C6CF DC 'E','D',' ','F','O','R'
3374 A0B2B5B6CB DC ' ','2','5','6','K',' '
337A CDC1C3C8C9 DC 'M','A','C','H','I','N'
3380 C5A1 DC 'E','!'
3382 44313A4455 FILE DB 'D1:DUP.SYS',CR
338D 44383A4D45 MEM_SAV DB 'D8:MEM.SAV',CR
= 1406 SIZE = 5126
3398 44383A9B DRIVE DB 'D8:',$9B
;
******* MASTER BANK CONTROL TABLE
;
339C A3A7ABAF TABLE DB $A3,$A7,$AB,$AF
33A0 C3C7CBCF TABLE2 DB $C3,$C7,$CB,$CF
33A4 FF NORMAL DB $FF
= 339C BIT_6 = TABLE
= 33A0 BIT_5 = TABLE2
;
******* EXTRA RAM CONTROL BYTES
;
33A5 63676B6F BIT_7 DB $63,$67,$6B,$6F
33A9 83878B8F NEWELL DB $83,$87,$8B,$8F
33AD E3E7EBEF BIT_X DB $E3,$E7,$EB,$EF
33B1 00 EXTRA DB 0
;
******* DUP.SYS COPY BUFFER
;
= 33B3 BUFFER = *+1
33B2 END INSTAL
no ERRORs, 139 Labels, $43F2 free.
Tim Patrick * Kailua, HI 96734
Back to previous page