;***********************************************************************; ;* P c D F S : PC DISK FILING SYSTEM VOOR DE ELECTRON *; ;*---------------------------------------------------------------------*; ;* module : File bewerkingen *; ;*---------------------------------------------------------------------*; ;* filenaam : osfile.inc *; ;* auteur : Roland Leurs *; ;* The Atomic Development Studio *; ;* ontwikkeld : juli 1996 *; ;* laatste update : *; ;*---------------------------------------------------------------------*; ;* assembleren : als include opnemen in PCDFS.ASM *; ;*---------------------------------------------------------------------*; ;* oproep : - *; ;***********************************************************************; osfile jsr savepar ; berg parameters op cmp #$FF ; test op ondersteunde reason code beq osfileFF ; spring indien code niet ondersteund cmp #08 bcs osfilexit asl a ; verdubbel reason code nummer tax ; zet in index register lda osfiletab,x ; lees beginadres uit tabel sta zp ; zet in werkruimte lda osfiletab+1,x sta zp+1 jmp (zp) ; voer call uit osfilexit php ; save processor status register ldx #1 ; voor Atom-in-PC semafoor stx $CF ldx par_x ; herstel registers ldy par_y plp ; herstel processor status register rts osfiletab .dw osfile00,osfile01,osfile02,osfile03 .dw osfile04,osfile05,osfile06,osfile07 ; load file osfileFF lda #$0B ; stuur commando naar pc jsr commando jsr filenaam ; stuur filenaam naar pc jsr leesbyte ; lees status van pc cmp #0 ; test of file gevonden is beq osfileFF_hdr ; spring indien gevonden jmp msdoserror ; niet gevonden, geef error osfileFF_hdr jsr leesbyte ; lees bloklengte (16 bytes header) tax ; zet bloklengte in teller ldy #0 ; reset geheugenpointer osfileFF_hdr1 jsr leesbyte ; lees header data sta header,y ; berg header op in geheugen iny ; verhoog pointer dex ; verlaag teller cpy #16 ; 16 bytes header gelezen bne osfileFF_hdr1 ; spring indien nog bytes volgen ldy #6 ; test of load adres opgegeven is lda (parm),y bne osfileFF_ld0 ; spring indien adres niet gegeven is ldy #2 ; laadt pointer lda (parm),y ; lees lb load adres sta h_addr ; zet in header iny lda (parm),y ; lees hb load adres sta h_addr+1 ; zet in header jmp osfileFF_ld0 ; lees rest van eerste datablok osfileFF_ld jsr leesbyte ; lees bloklengte beq osfileFF_ld3 ; spring bij einde file tax ; zet aantal bytes in teller osfileFF_ld0 ldy #0 ; reset pointer osfileFF_ld1 jsr leesbyte ; lees databyte sta (h_addr),y ; zet in geheugen inc h_addr ; verhoog geheugen pointer bne osfileFF_ld2 inc h_addr+1 osfileFF_ld2 dex ; verlaag blok teller bne osfileFF_ld1 ; spring voor volgend byte jmp osfileFF_ld ; spring voor volgend blok osfileFF_ld3 lda #1 ; zet filetype osfileFF_end jmp osfilexit ; einde routine ; save file osfile00 lda #$FF ; zet data masker ivm osfile07 osfile00sv1 sta zp+5 lda #$0C ; stuur save commando naar pc jsr commando jsr filenaam ; stuur filenaam naar pc jsr leesbyte ; lees status beq osfile00sv2 ; spring indien file aangemaakt jmp msdoserror ; foutmelding osfile00sv2 ldx #15 ; laadt teller lda #0 ; laadt header data osfile00sv3 sta header,x ; zet in header dex ; verlaag teller bpl osfile00sv3 ; spring indien nog niet alles gehad lda #3 ; maak header sta work+14 jsr makeheader lda #16 ; schrijf header naar disk jsr zendbyte ; stuur bloklengte naar pc ldx #00 ; reset pointer osfile00sv4 lda header,x ; lees header data jsr zendbyte ; stuur naar pc inx ; verhoog pointer cpx #16 ; einde blok? bne osfile00sv4 ; spring indien nog bytes volgen jsr leesbyte ; lees aantal geschreven bytes cmp #16 ; dit moet 16 zijn beq osfile00sv5 ; spring indien juist jmp err_diskfull ; geef disk full foutmelding osfile00sv5 ldy #$A ; zet startadres in werkruimte lda (parm),y sta zp+2 iny lda (parm),y sta zp+3 ldy #$E ; zet eindadres in werkruimte lda (parm),y sta zp+6 iny lda (parm),y sta zp+7 osfile00sv6 lda #255 ; stuur bloklengte naar pc jsr zendbyte tax ; laadt byte teller ldy #0 ; reset pointer osfile00sv7 lda (zp+2),y ; lees data and zp+5 ; bewerk met masker jsr zendbyte ; stuur data naar pc inc zp+2 ; verhoog geheugenpointer bne osfile00sv8 inc zp+3 osfile00sv8 dex ; verlaag teller bne osfile00sv7 ; spring indien blok nog niet over is jsr leesbyte ; lees aantal geschreven bytes cmp #255 ; test of alles geschreven is beq osfile00sv9 ; ja, ga testen op laatste blok jmp err_diskfull ; niet alles geschreven, disk full osfile00sv9 sec ; zet carry lda zp+6 ; bereken eind-start adres sbc zp+2 lda zp+7 sbc zp+3 bpl osfile00sv6 ; als positief volgt er nog een blok lda #0 ; geef einde file door jsr zendbyte jmp osfilexit ; einde routine osfile01 lda #3 ; zet operatie type rewriteheader sta work+14 ldy #0 ; reset pointer lda (parm),y ; lees lb adres filenaam in accu tax ; breng naar x register iny ; verhoog pointer lda (parm),y ; lees hb adres filenaam tay ; zet in y register lda #$C0 ; file mode input/output jsr osfind_append ; open de file sta handle ; berg handle op in werkruimte jsr loadheader ; lees de header in memory jsr makeheader ; maak nieuwe header jsr saveheader ; schrijf header naar disk ldy handle jsr osfind_close ; sluit file jmp osfilexit ; einde routine osfile02 lda #1 ; zet operatie type bne rewriteheader ; voer opdracht uit osfile03 lda #2 ; zet operatie type bne rewriteheader ; voer opdracht uit osfile04 ldy #$E ; zet pointer naar attribuut ldx #$13 ; pc commando nummer lda (parm),y ; lees attribuut beq osfile04_l1 ; spring voor unlock dex ; verlaag commando nummer osfile04_l1 txa ; pc commando nummer naar accu jsr commando jsr filenaam ; stuur filenaam naar pc jsr leesbyte ; lees resultaat beq osfile05end ; bij geen fout einde via osfile05 jmp msdoserror ; wel fout, geef foutmelding osfile05 ldy #0 ; reset pointer lda (parm),y ; lees low byte adres filenaam tax ; naar x register iny ; verhoog pointer lda (parm),y ; lees high byte adres filenaam tay ; naar y register lda #$10 ; voer osfind#10 uit jsr osfind lda cfsbuffer ; lees gegevens uit DTA bne osfile05notfnd ; indien status <>0 bestaat file niet lda cfsbuffer+1 ; file bestaat wel, lees attribuut and #$10 ; test op directory bne osfile05dirfnd ; spring indien directory gevonden lda cfsbuffer+1 ; lees attribuut and #$08 ; test op volume label bne osfile05notfnd ; volume label is als niet gevonden osfile05filfnd lda #1 ; laadt return code voor file bne osfile05end osfile05dirfnd lda #2 ; laadt return code voor directory bne osfile05end osfile05notfnd lda #0 ; laadt return code voor niets gevonden osfile05end jmp osfilexit ; einde routine osfile06 jsr osfile05 ; bepaal file type (file of directory) cmp #1 beq osfile06filedel ; het betreft een file osfile06dirdel lda #$0F ; pccommando: verwijder directory jsr commando jsr filenaam1 ; stuur directory naam naar pc jsr leesbyte ; lees resultaat beq osfile06dirdel1 ; spring als directory verwijderd is jmp msdoserror ; foutmelding osfile06dirdel1 jsr leesbyte ; lees lege asciiz string jmp osfilexit ; einde routine osfile06filedel lda #$11 ; pccommando: verwijder file(s) jsr commando jsr filenaam1 ; stuur filenaam naar pc jsr leesbyte ; lees resultaat beq osfile06fildel1 ; spring als file(s) verwijderd jmp msdoserror ; foutmelding osfile06fildel1 jmp osfilexit ; einde routine osfile07 lda #$00 ; laadt masker jmp osfile00sv1 ; spring naar save routine