home *** CD-ROM | disk | FTP | other *** search
- ******************************************************************************************
- *FILE I/O FOR FANTASM *
- *010694 *
- ******************************************************************************************
- GETRESOURCE: EQU $A9A0
-
- ********************SECTION 15****************************************************
- **READ_TEFILE CALLS ALL THE NECESSARY ROUTINES TO GET A FILE IN TE
- **NEEDS A0=FILENAME
- ** D0=VOLPTR
- READ_TEFILE: BSR OPEN_F SET UP PB AND OPEN FILE
- TST.W D0
- BGE.S RTE_OPEN_OK
- MOVE.W #OPEN_GENERAL,D0
- BSR DO_ALERT
- CLR.L D0
- RTS
- RTE_OPEN_OK: MOVE.W #32000,MAX_F_SIZE(A6)
- BSR GET_SIZE_F
- TST.W D0
- BGE RTE_SIZE_OK
- CLR.L D0
- RTS
- RTE_SIZE_OK: MOVE.W D0,FILELEN SAVE LENGTH
- MOVE.L TEHND(A6),A3 TEHND IS POINTER TO POINTER
- MOVE.L (A3),D1
- ADD.L #62,D1
- MOVE.L D1,A3
- MOVE.L (A3),A0 HANDLE
- LEA PARAM_BLOCK,A4
- MOVE.L 28(A4),D0 *FILESIZE
- DC.W SETHANDLESIZE *TELL TE WE WANT THFILE SIZE BYTES
- TST.L D0
- BEQ TE_SIZE_OK
- RTS
-
- TE_SIZE_OK: MOVE.L TEHND(A6),A3
- MOVE.L (A3),A3 POINT TO TE RECORD
- LEA 62(A3),A3 POINT TO HANDLE
- MOVE.L (A3),A3
- MOVE.L (A3),LONG_VAR(A6) WHERE THE FILE IS TO GO
- BSR READ_F READ IN FILE
- BSR CLOSE_F CLOSE IT
-
- **NOW RECALL THE TEXT INTO TE
- MOVE.L TEHND(A6),A3
- MOVE.L (A3),A3 TEREC
- MOVE.W FILELEN,60(A3) SET LENGTH OF TEXT IN EDITOR RECORD
- MOVE.L TEHND(A6),-(SP)
- DC.W TECALTEXT SET EDITOR GOING
- CLR.L -(SP)
- CLR.L -(SP)
- MOVE.L TEHND(A6),-(SP)
- DC.W TESETSELECT SET SELECT INITIALLY
- BSR SETSCROLLMAX
- RTS
-
-
- FILELEN: DS.W 1
-
- ******************SECTION 16******************************************************
- **NEEDS A0=FILENAME C FORMAT
- **D0=VOLPTR
-
- SAVE_TE_FILE: MOVE.L TEHND(A6),A3
- MOVE.L (A3),A3 TEREC
- MOVE.L A3,A1
- LEA 62(A1),A1
- MOVE.L (A1),A1 TEHANDLE
- MOVE.L (A1),A1 POINT TO TEXT BUFFER
- CLR.L D1
- MOVE.W 60(A3),D1 LENGTH OF TEXT
- BSR.S WRITE_F
- RTS
-
- ********************SECTION 17********************************************************
- ******************************
- *WRITE NEED:
- *A0=FILE NAME
- *A1=BUFFER TO WRITE
- *DO=VOLPTR
- *D1=LENGTH OF BUFFER
- WRITE_F: MOVE.L A1,-(A7) *SAVE BUFFER ADDRESS FOR WRITE
- MOVE.L D1,-(A7) *SAVE SIZE
- MOVE.W D0,D7 *SAVE VOLPTR
- BSR CLEAR_PB *CLEAR PARAMETER BLOCK
- MOVEA.L A0,A3 *CONVERT FILENAME TO PASCAL
- LEA NEW_FNAME,A2 *PASCAL FILENAME BUILT HERE
- MOVE.L A3,-(A7)
- MOVE.L A2,-(A7)
- BSR CTOPSTR *CONVERT TO PASCAL STRING
- ADDQ.L #8,A7
- LEA NEW_FNAME,A3
- LEA PARAM_BLOCK,A4 *FILE PARAMETER BLOCK FOR DISK IO
- MOVE.L A3,18(A4) *FILE NAME
- MOVE.W D7,22(A4) *VOL REF
- MOVE.B #0,26(A4) *PERMISSION?????
- MOVE.B #2,27(A4) *WRITE PLEASE
- MOVE.L #0,28(A4) *USE HD BUFFER
- MOVE.L #OPEN,-(A7) *CALL OPEN
- MOVE.L A4,-(A7)
- BSR MY_PBIO
- ADDQ.L #8,A7 *RETURN CODE IN D1=0 FOUND, -43 NOT FOUND
- CMPI.W #0,D1 *FILE EXISTS?
- BEQ DO_WRITE_F *YUP SCRIBBLE TO IT.
- CMPI.W #-43,D1 *NOT FOUND?
- BEQ DO_CREATE_F *NO, SO MAKE FILE
- MOVE.W #OPEN_OTHER,D0
- BSR DO_ALERT *SOME KIND OF OPEN ERROR?
- ADDQ.L #8,A7 *A1 AND D1 IS ON STACK!
- RTS
-
- DO_CREATE_F: LEA PARAM_BLOCK,A4
- MOVE.L A3,18(A4) *FILE NAME AS APSCAL STRING
- MOVE.B #0,26(A4) *SET VERSION TO 0
- MOVE.L #CREATE,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO *CREATE FILE
- ADDQ.L #8,A7
- TST.W D1 *ERROR?
- BEQ CREATE_OK *NO
- MOVE.W #CREATE_ERROR,D0
- BSR DO_ALERT
- ADDQ.L #8,A7 *A1 D1 IS ON STACK
- RTS
-
- CREATE_OK: LEA PARAM_BLOCK,A4 *GET FILE INFO
- MOVE.L A3,18(A4)
- MOVE.B #0,26(A4)
- MOVE.L #0,28(A4) *DIR INDEX
- MOVE.L #GET_INFO,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO
- ADDQ.L #8,A7
- LEA PARAM_BLOCK,A4
- MOVE.B #'T',32(A4) *SET CREATOR TYPE
- MOVE.B #'E',33(A4)
- MOVE.B #'X',34(A4)
- MOVE.B #'T',35(A4)
- MOVE.L #SET_INFO,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO *SET INFO
- ADDQ.L #8,A7
-
- LEA PARAM_BLOCK,A4
- MOVE.L A3,18(A4) *FILE NAME TO OPEN
- MOVE.W D7,22(A4) *SET VOL REF
- MOVE.B #0,26(A4) *PERMISSION
- MOVE.B #2,27(A4) *WRITE
- MOVE.L #0,28(A4) *USE HD BUFFER
- MOVE.L #OPEN,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO *TRY TO OPEN AGAIN
- ADDQ.L #8,A7
- TST.W D1
- BEQ DO_WRITE_F *FILE NOW OPEN OK
- MOVE.W CREATE2_ERROR,D0
- BSR DO_ALERT
- ADDQ.L #8,A7 *BECAUSE A1 AND D0 IS THERE
- RTS
-
- DO_WRITE_F: MOVE.L (A7)+,D0 *GET SIZE
- MOVEA.L (A7)+,A1 *GET BUFFER ADDRESS
- LEA PARAM_BLOCK,A4
- MOVE.L A1,32(A4) *ADDRESS OF BUFFER
- MOVE.L D0,36(A4) *LENGTH OF BUFFER
- MOVE.W #1,44(A4) *
- MOVE.W #0,46(A4) *OFFSET
- MOVE.L #WRITE,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO *WRITE BUFFER
- ADDQ.L #8,A7
- LEA PARAM_BLOCK,A4
- MOVE.L 40(A4),28(A4) *STORE BYTE COUNT IN PARAM BLOCK
- MOVE.L #SET_EOF,-(A7)
- MOVE.L A4,-(A7) *SET EOF
- BSR MY_PBIO
- ADDQ.L #8,A7
- LEA PARAM_BLOCK,A4
- MOVE.L #CLOSE,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO *CLOSE FILE
- ADDQ.L #8,A7
- LEA PARAM_BLOCK,A4
- MOVE.L #0,18(A4) *FLUSH VOLUME
- MOVE.L #FLUSH,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO
- ADDQ.L #8,A7
- RTS *PHEW!!!!!!!!!!!!!!!!!!!!
-
- **READ_FILE NEEDS A0->FILENAME
- ** D0=VOLPTR
- ** LONGVAR(A6)->BUFFER ADDRESS
- READ_FILE: BSR OPEN_F
- TST.W D0
- BMI READ_FAILED
- BSR GET_SIZE_F
- TST.W D0
- BMI READ_FAILED
- BSR READ_F
- BSR CLOSE_F
- RTS
- READ_FAILED: MOVEQ #-1,D0
- RTS
-
- ************OPEN:
- **NEEDS A0=FILENAME
- ** D0=VOLPTR
- **LONGVAR(A6)=BUFFER ADDRESS TO READ
- OPEN_F: MOVE.W D0,SAVE_VOLPTR
- BSR CLEAR_PB *CLEAR PARAMETER BLOCK
- LEA PARAM_BLOCK,A4
- MOVEA.L A0,A3 *FILENAME
- LEA NEW_FNAME,A2
- MOVE.L A3,-(A7)
- MOVE.L A2,-(A7)
- BSR CTOPSTR *CONVERT TO PASCAL FORMAT I.E. BYTE COUNT,STRING
- ADDQ.L #8,SP
- LEA NEW_FNAME,A3
- MOVE.L A3,18(A4) *MOVE ADDRESS OF FILENAME TO PB
- MOVE.W SAVE_VOLPTR,22(A4) *SET VOL REF
- CLR.B 26(A4) *PERMISSION
- MOVE.B #1,27(A4) *READ STATUS
- CLR.L 28(A4) *USE VOLUME BUFFER
- MOVE.L #OPEN,-(SP)
- MOVE.L A4,-(SP)
- BSR MY_PBIO
- ADDQ.L #8,SP
- TST.W D1
- BEQ OPEN_OK
- MOVEQ #-1,D0
- RTS *NOT FOUND
- OPEN_OK: CLR.L D0
- RTS
-
- GET_SIZE_F: MOVE.L #GET_EOF,-(A7)
- LEA PARAM_BLOCK,A4
- MOVE.L A4,-(A7)
- BSR MY_PBIO *GET FILE SIZE
- ADDQ.L #8,A7
- LEA PARAM_BLOCK,A4
- MOVE.L 28(A4),D0 *SIZE IN D0
- CMP.L MAX_F_SIZE(A6),D0 *CHECK IT'L FIT
- BGT SIZE_ERROR
- RTS
- SIZE_ERROR:
- MOVE.W #SIZE_ALERT,D0
- BSR DO_ALERT
- MOVEQ #-1,D0
- RTS
-
- READ_F: LEA PARAM_BLOCK,A4
- MOVE.L LONG_VAR(A6),32(A4) *WHERE THE BUFFER IS
- MOVE.L 28(A4),36(A4) *LENGTH OF DATA
- MOVE.W #0,44(A4) *????
- MOVE.L #0,46(A4) *NO OFFSET
- MOVE.L #READ,-(A7)
- MOVE.L A4,-(A7)
- BSR MY_PBIO *READ FILE INTO BUFFER
- ADDQ.L #8,A7
- RTS
-
- CLOSE_F: MOVE.L #CLOSE,-(A7)
- LEA PARAM_BLOCK,A4
- MOVE.L A4,-(A7)
- BSR MY_PBIO
- ADDQ.L #8,A7 *CLOSE THE FILE
- RTS
-
- ******************LEVEL 3 SUBS FOLLOW*********************
- CLEAR_PB: MOVE.L A4,-(SP) SAVE A4
- LEA PARAM_BLOCK,A4
- MOVEQ #99,D0
- CPBLOOP: MOVE.B #0,(A4)+
- DBF D0,CPBLOOP
- MOVE.L (SP)+,A4
- RTS
-
- **MY PBIO EXPECTS TRAP NUMBER AND ADDRESS OF PB ON STACK
- **CALLS RELEVANT OS ROUTINE FOR FILE IO
- MY_PBIO: LINK A6,#$0000
- MOVE.W $E(A6),D0 TRAP NUMBER
- MOVEA.L $8(A6),A0 GET ADDRESS OF PB
- CMPI.W #OPEN,D0 NOT ELEGANT!
- BEQ DO_OPEN
- CMPI.W #CLOSE,D0
- BEQ DO_CLOSE
- CMPI.W #READ,D0
- BEQ.S DO_READ
- CMPI.W #GET_EOF,D0
- BEQ.S DO_GET_EOF
- CMPI.W #WRITE,D0
- BEQ.S DO_WRITE
- CMPI.W #SET_EOF,D0
- BEQ.S DO_SET_EOF
- CMPI.W #CREATE,D0
- BEQ.S DO_CREATE
- CMPI.W #GET_INFO,D0
- BEQ.S DO_GET_INFO
- CMPI.W #SET_INFO,D0
- BEQ.S DO_SET_INFO
- END: MOVE.L D0,D1
- UNLK A6
- RTS
-
- DO_READ: DC.W READ
- BRA END
- DO_GET_EOF: DC.W GET_EOF
- BRA END
- DO_WRITE: DC.W WRITE
- BRA END
- DO_SET_EOF: DC.W SET_EOF
- BRA END
- DO_CREATE: DC.W CREATE
- BRA END
- DO_GET_INFO: DC.W GET_INFO
- BRA END
- DO_SET_INFO DC.W SET_INFO
- BRA END
- DO_OPEN: DC.W OPEN
- BRA END
- DO_CLOSE: DC.W CLOSE
- BRA END
-
- *********************VARS FOLLOW*************************
- SAVE_VOLPTR: DS.W 1
- PARAM_BLOCK: DS.B 100 *100 BYTE PARAMETER BLOCK FOR FILE I/O
- NEW_FNAME: DS.B 40
- EVEN
-