50000 ; PROGRAM NAME IS 'DISKPRIM' 19 JUN 87
50010 ;
50020 PRINT " THIS PROGRAM IS NOT INTENDED TO BE RUN !":PRINT
50030 PRINT " IT CONTAINS 5 SECTIONS WHICH CAN BE MERGED INTO OTHER PROGRAMS"
50040 END
50050 ;
50060 ; LINES 50120-50410 LOAD UTILITY CODE AND SET VARIABLES
50070 ; LINES 50420-50630 READ TOS SECTORS
50080 ; LINES 50640-50850 WRITE TOS SECTORS
50090 ; LINES 50860-51070 READ DBASIC SECTORS
50100 ; LINES 51080-51290 WRITE DBASIC SECTORS
50110 ;
50120 ; ********* LOAD THE UTILITY CODE & SET VARIABLES *********
50130 ;
50140  "LOADCODE"
50150 HIMEM $040000:; WE CAN USE $40000 TO TOP OF MEM FOR SECTOR STORAGE
50160 DIM CODE[300],ADR$4:; SAVES 2400 BYTES FOR THE CODE
50170 TXLOC CODE[],ADR:; ADDRESS = START OF THE CODE AREA
50180 BLOAD DPRIMO,ADR:; LOADS THE UTILITY CODE
50190 ASSIGN ADR0=$1030 C000 0000 0000
50200 ;
50210 ; ** CALL LOCATIONS **
50220 ;
50230 INITDBASIC=ADR:; CALL INITDBASIC DETERMINES THE TYPE OF DBASIC DISK
50240 RDDBASIC=ADR+4:; CALL RDDBASIC READS DBASIC SECTORS
50250 WRDBASIC=ADR+8:; CALL WRDBASIC WRITES DBASIC SECTORS
50260 INITTOS=ADR+12:; CALL INITTOS DETERMINES THE TYPE OF TOS DISK
50270 RDTOS=ADR+16:; CALL RDTOS READS TOS SECTORS
50280 WRTOS=ADR+20:; CALL WRTOS WRITES TOS SECTORS
50290 ;
50300 ; ** LOCATIONS TO SET UP BEFORE A CALL **
50310 ;
50320 BUFFER=ADR+24:; (LONG WORD VALUE) ADDRESS WHERE DATA TRANSFER IS TO OCCUR
50330 SECTOR=ADR+28:; (WORD VALUE) ABSOLUTE SECTOR# TO START READING/WRITING
50340 COUNT=ADR+30:; (WORD VALUE) # OF SECTORS TO READ/WRITE (0 IS NOT LEGAL)
50350 DRIVE=ADR+32:; (BYTE VALUE) NUMBER OF DRIVE TO SELECT
50360 ;
50370 ; ** LOCATION TO PEEK AT BUT DON'T TOUCH **
50380 ;
50390 SIDES=ADR+34:; (WORD VALUE) # OF SIDES OF THE DISK LAST INIT'ED
50400 RETURN
50410 ;
50420 ; ********* READ TOS SECTORS *********
50430 ;
50440 ;
50450 ; "INPUT PARAMETERS:    VARIABLE NAME      DESCRIPTION
50460 ; "                     DATABFR            MEMORY ADDRESS TO READ TO
50470 ; "                     SECTOR%            STARTING ABSOLUTE SECTOR #
50480 ; "                     CNT%               # OF SECTORS TO READ
50490 ; "                     DR%                # OF DRIVE TO READ TO
50500 ; "                     NEW%               IF 1 THEN INIT DISK ELSE NOT
50510 ;
50520  "READTOS"
50530 TEMP=ADR0+DATABFR:PEEK $0011C6,ADR$
50540 POKE BUFFER,ADR$
50550 POKEW SECTOR,SECTOR%
50560 POKEW COUNT,CNT%
50570 PEEK DRIVE,PREV_DR%
50580 POKE DRIVE,DR%
50590 IF PREV_DR%<>DR% THEN CALL INITTOS
50600 IF NEW%=1 THEN CALL INITTOS
50610 CALL RDTOS
50620 RETURN
50630 ;
50640 ; ********* WRITE TOS SECTORS *********
50650 ;
50660 ;
50670 ; "INPUT PARAMETERS:    VARIABLE NAME      DESCRIPTION
50680 ; "                     DATABFR            MEMORY ADDRESS TO WRITE FROM
50690 ; "                     SECTOR%            STARTING ABSOLUTE SECTOR #
50700 ; "                     CNT%               # OF SECTORS TO WRITE
50710 ; "                     DR%                # OF DRIVE TO WRITE TO
50720 ; "                     NEW%               IF 1 THEN INIT DISK ELSE NOT
50730 ;
50740  "WRITETOS"
50750 TEMP=ADR0+DATABFR:PEEK $0011C6,ADR$
50760 POKE BUFFER,ADR$
50770 POKEW SECTOR,SECTOR%
50780 POKEW COUNT,CNT%
50790 PEEK DRIVE,PREV_DR%
50800 POKE DRIVE,DR%
50810 IF PREV_DR%<>DR% THEN CALL INITTOS
50820 IF NEW%=1 THEN CALL INITTOS
50830 CALL WRTOS
50840 RETURN
50850 ;
50860 ; ********* READ DBASIC SECTORS *********
50870 ;
50880 ;
50890 ; "INPUT PARAMETERS:    VARIABLE NAME      DESCRIPTION
50900 ; "                     DATABFR            MEMORY ADDRESS TO READ TO
50910 ; "                     SECTOR%            STARTING ABSOLUTE SECTOR #
50920 ; "                     CNT%               # OF SECTORS TO READ
50930 ; "                     DR%                # OF DRIVE TO READ TO
50940 ; "                     NEW%               IF 1 THEN INIT DISK ELSE NOT
50950 ;
50960  "READDBASIC"
50970 TEMP=ADR0+DATABFR:PEEK $0011C6,ADR$
50980 POKE BUFFER,ADR$
50990 POKEW SECTOR,SECTOR%
51000 POKEW COUNT,CNT%
51010 PEEK DRIVE,PREV_DR%
51020 POKE DRIVE,DR%
51030 IF PREV_DR%<>DR% THEN CALL INITDBASIC
51040 IF NEW%=1 THEN CALL INITDBASIC
51050 CALL RDDBASIC
51060 RETURN
51070 ;
51080 ; ********* WRITE DBASIC SECTORS *********
51090 ;
51100 ;
51110 ; "INPUT PARAMETERS:    VARIABLE NAME      DESCRIPTION
51120 ; "                     DATABFR            MEMORY ADDRESS TO WRITE FROM
51130 ; "                     SECTOR%            STARTING ABSOLUTE SECTOR #
51140 ; "                     CNT%               # OF SECTORS TO WRITE
51150 ; "                     DR%                # OF DRIVE TO WRITE TO
51160 ; "                     NEW%               IF 1 THEN INIT DISK ELSE NOT
51170 ;
51180  "WRITEDBASIC"
51190 TEMP=ADR0+DATABFR:PEEK $0011C6,ADR$
51200 POKE BUFFER,ADR$
51210 POKEW SECTOR,SECTOR%
51220 POKEW COUNT,CNT%
51230 PEEK DRIVE,PREV_DR%
51240 POKE DRIVE,DR%
51250 IF PREV_DR%<>DR% THEN CALL INITDBASIC
51260 IF NEW%=1 THEN CALL INITDBASIC
51270 CALL WRDBASIC
51280 RETURN
51290 ;

