PAGE SBTTL "--- GRIP OPERATING SYSTEM: ATARI ---" GAME EQU 3*18+1 ; 1ST G-CODE BLOCK (55; TRACK 3, SECTOR 1) IMAGE EQU 14*18+1 ; 1ST I-FILE BLOCK (253; TRACK 14, SECTOR 1) BUFTOP EQU BUFFER+$80 ; TOP HALF OF [BUFFER] ;-------------------------------------------------- ; FETCH VIRTUAL PAGE [DBLOCK] AND PUT AT RAM PAGES ; [DBUFF],[DBUFF]+1. ; ON EXIT POINT [DBLOCK] AT NEXT V-PAGE AND POINT ; [DBUFF] TO NEXT RAM PAGE ;-------------------------------------------------- ; ---------------- ; GET A DISK BLOCK ; ---------------- GETDSK: LDX #0 STX DBTOP ; CLEAR MSB OF BLOCK INDEX INX ; = 1 STX DUNIT ; ALWAYS USE DRIVE #1 STX DCNT ; COUNTER FOR LOOP TO GET (2) 256 BYTE PAGES LDA #$52 ; SIO "READ" COMMAND STA DCOMND ; CALC WHICH DISK SECTORS TO GET LDA DBLOCK ; GET THE VIRTUAL PAGE INDEX CMP ISTART ; IT IS BELOW THE IMAGE FILE? BCC GETGAM ; IF SO, IT'S IN THE GAME FILE ; GET BLOCK [A] FROM THE IMAGE FILE SBC ISTART ; ZERO-ALIGN THE BLOCK INDEX ASL A ; * 2 FOR ATARI 128-BYTE SECTORS ROL DBTOP ; BUILD MSB ; ENTRY POINT FOR VERIFY GETIMG: ASL A ; * 2 AGAIN FOR 512 BYTE PAGES ROL DBTOP CLC ADC #LOW IMAGE ; ADD THE PHYSICAL I-FILE OFFSET TAX ; SAVE LSB HERE LDA DBTOP ; DO MSB ADC #HIGH IMAGE JMP DODSK ; GET BLOCK [A] FROM THE GAME FILE GETGAM: ASL A ; * 2 FOR 128-BYTE SECTORS ROL DBTOP ; ENTRY POINT FOR VERIFY GETGME: ASL A ; * 2 AGAIN FOR 512 BYTE PAGES CLC ADC #LOW GAME ; ADD THE PHYSICAL G-FILE OFFSET TAX ; SAVE LSB HERE LDA DBTOP ; TAKE CARE OF MSB ADC #HIGH GAME ; VALIDATE SECTOR ADDRESS IN [X/A] (LSB/MSB) ; MUST BE NO HIGHER THAN 717 ($02CD) DODSK: CMP #$02 ; MSB OUT OF RANGE? BCC ROK ; OK IF MSB < 2 BEQ T717 ; CHECK LSB IF MSB = 2 ; *** ERROR #10: DISK ADDRESS RANGE *** RANGE: LDA #10 JMP GERROR T717: CPX #$CE ; MSB WAS 2; IS LSB > $CD? BCS RANGE ; RANGE ERROR IF SO ROK: STX SECTOR+LO STA SECTOR+HI DSKLP1: LDA SECTOR+LO STA DAUX1 ; LSB OF SECTOR ADDRESS LDA SECTOR+HI STA DAUX2 ; MSB OF SECTOR ADDRESS LDA #LOW BUFFER STA DBUFLO LDA #HIGH BUFFER STA DBUFHI ; FETCH DISK BLOCK INTO [BUFFER] JSR DSKINV ; GET 1ST HALF OF BLOCK LDA DSTATS ; IF STATUS IS NEGATIVE, BMI DERR ; SOMETHING WENT WRONG LDA #LOW BUFTOP ; POINT TO STA DBUFLO ; TOP HALF-PAGE LDA #HIGH BUFTOP ; OF [BUFFER] STA DBUFHI INC SECTOR+LO ; ALSO POINT BNE DODSK1 ; TO THE INC SECTOR+HI ; NEXT SECTOR DODSK1: LDA SECTOR+LO STA DAUX1 LDA SECTOR+HI STA DAUX2 JSR DSKINV ; GET 2ND HALF OF BLOCK LDA DSTATS ; ERROR IF BMI DERR ; [DSTATS] RETURNED NEGATIVE ; MOVE [BUFFER] TO PAGE [DBUFF] LDY #0 STY DBUFF+LO ; MAKE SURE LSB IS ZEROED! MOVEB: LDA BUFFER,Y STA (DBUFF),Y INY BNE MOVEB INC DBUFF+HI ; POINT TO NEXT RAM PAGE DEC DCNT BMI DSKP1 INC SECTOR+LO BNE DSKP0 INC SECTOR+HI DSKP0: JMP DSKLP1 DSKP1: INC DBLOCK ; POINT TO NEXT VIRTUAL PAGE RTS ; *** ERROR #11: DISK ACCESS *** DERR: LDA #11 JMP GERROR END