From 0310508579d5e9ebe0ab533b0faa59067bf7e9e6 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Mon, 31 Dec 2018 20:18:35 -0800 Subject: [PATCH] WIP --- chtype.s | 296 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 156 insertions(+), 140 deletions(-) diff --git a/chtype.s b/chtype.s index 77a47dd..4605a25 100644 --- a/chtype.s +++ b/chtype.s @@ -1,207 +1,223 @@ - +;;; ============================================================ ;;; +;;; CHTYPE - File type changing command for ProDOS-8 +;;; +;;; Install: +;;; -CHTYPE (from BASIC.SYSTEM prompt) +;;; Usage: +;;; CHTYPE filename,Ttype[,Aaux][,S#][,D#] +;;; +;;; * filename can be relative or absolute path +;;; * type can be BIN, SYS, TXT (etc) or $nn +;;; * optional A$1234 sets aux type info +;;; +;;; Build with: ca65 - https://cc65.github.io/doc/ca65.html +;;; +;;; ============================================================ + .org $2000 -INBUF := $200 ;GETLN input buffer. +;;; ============================================================ + +INBUF := $200 ; GETLN input buffer ;;; ============================================================ -;;; ROM routines +;;; ProDOS MLI / Global Page -WAIT := $FCA8 ;Monitor wait routine. -BELL := $FF3A ;Monitor bell routine +SET_FILE_INFO = $C3 +GET_FILE_INFO = $C4 -CROUT := $FD8E -PRBYTE := $FDDA -COUT := $FDED +DATE := $BF90 ;;; ============================================================ -;;; BASIC.SYSTEM global page +;;; BASIC.SYSTEM Global Page -EXTRNCMD := $BE06 ; External cmd JMP vector. -ERROUT := $BE09 ; Error routine vector. -ERRCODE := $BE0F ; Error code -XTRNADDR := $BE50 ; Ext cmd implementation addr. +EXTRNCMD := $BE06 ; External command jmp vector +ERROUT := $BE09 ; Error routine jmp vector +XTRNADDR := $BE50 ; Ext cmd implementation addr -XLEN := $BE52 ;Length of command string-1. -XCNUM := $BE53 ;CI cmd no. (ext cmd = 0). +XLEN := $BE52 ; Length of command string minus 1 +XCNUM := $BE53 ; Command number (ext cmd = 0). -PBITS := $BE54 ; Command parameter bits. -FBITS := $BE56 ; Found parameter bits. +PBITS := $BE54 ; Command parameter bits +FBITS := $BE56 ; Found parameter bits -VADDR := $BE58 ; Address parameter -VSLOT := $BE61 ; Slot parameter -VTYPE := $BE6A ; Type parameter -VPATH1 := $BE6C ; Pathname buffer +.enum PBitsFlags + ;; PBITS + PFIX = $80 ; Prefix needs fetching + SLOT = $40 ; No parameters to be processed + RRUN = $20 ; Command only valid during program + FNOPT = $10 ; Filename is optional + CRFLG = $08 ; CREATE allowed + T = $04 ; File type + FN2 = $02 ; Filename '2' for RENAME + FN1 = $01 ; Filename expected -GOSYSTEM := $BE70 ; Use instead of MLI + ;; PBITS+1 + AD = $08 ; Address + B = $40 ; Byte + E = $20 ; End address + L = $10 ; Length + LINE = $08 ; '@' line number + SD = $04 ; Slot and drive numbers + F = $02 ; Field + R = $01 ; Record -SSGINFO := $BEB4 ; Get/Set Info Parameter block (set size to set=7 or get=$A) -FIFNAME := $BEB5 ; Should be implcitly linked already -FIFILID := $BEB8 -FIAUXID := $BEB9 + ;; Setting SD in PBITS+1 enables desired automatic behavior: if + ;; a relative path is given, an appropriate prefix is computed, + ;; using S# and D# options if supplied. Without this, absolute + ;; paths must be used if no prefix is set. +.endenum + +VADDR := $BE58 ; Address parameter +VSLOT := $BE61 ; Slot parameter +VTYPE := $BE6A ; Type parameter +VPATH1 := $BE6C ; Pathname buffer + +GOSYSTEM := $BE70 ; Use instead of MLI + +SSGINFO := $BEB4 ; Get/Set Info Parameter block +FIFILID := $BEB8 ; (set size to set=7 or get=$A) +FIAUXID := $BEB9 +FIMDATE := $BEBE ;;; ============================================================ ;;; TODO: Relocate into ProDOS-allocated buffer -;;; -;;; Remember to save the previous command address. -;;; +;;; ============================================================ + + ;; Save previous external command address lda EXTRNCMD+1 - sta nxtcmd + sta next_command lda EXTRNCMD+2 - sta nxtcmd+1 -;;; - lda #handler ; external command JMP - sta EXTRNCMD+2 ; vector. + sta next_command+1 + + ;; Install in external command address + lda #handler + sta EXTRNCMD+2 rts -;;; + +;;; ============================================================ +;;; Command Handler +;;; ============================================================ + handler: - ldx #0 ;Check for our command. -nxtchr: lda INBUF,x ;Get first character. + ;; Check for this command, character by character. + ldx #0 +nxtchr: lda INBUF,x - and #$7F ;Convert to ASCII - - cmp #'a' ;Convert to upper-case + and #$7F ; Convert to ASCII + cmp #'a' ; Convert to upper-case bcc :+ cmp #'z'+1 bcs :+ and #$DF -: cmp cmd,x ;Does it match? - bne notours ;NO, SO CONTINUE WITH NEXT CMD. - inx ;Next character - cpx #cmdlen ;All characters yet? - bne nxtchr ;No, read next one. -;;; - lda #cmdlen-1 ;Our cmd! Put cmd length-1 - sta XLEN ; in CI global XLEN. - lda #execute ; routine - sta XTRNADDR+1 - lda #0 ;Mark the cmd number as - sta XCNUM ; zero (external). -;;; - ;; Must set at least one bit in PBITS low byte. +: cmp cmd,x + bne not_ours + inx + cpx #cmdlen + bne nxtchr - lda #%10000000 ; bit 7 = Address - sta PBITS+1 -;;; - lda #%00000101 ; bit 8 = filename req'd, bit 10 = Type + ;; A match - indicate end of command string for BI's parser. + lda #cmdlen-1 + sta XLEN + + ;; Point BI's parser at the command execution routine. + lda #execute + sta XTRNADDR+1 + + ;; Mark command as external (zero). + lda #0 + sta XCNUM + + ;; Set accepted parameter flags (Name, Type, Address) + + lda #PBitsFlags::T | PBitsFlags::FN1 ; Filename and Type sta PBITS - clc ;Everything is OK. - rts ;Return to BASIC.SYSTEM + + lda #PBitsFlags::AD | PBitsFlags::SD ; Address, Slot & Drive handling + sta PBITS+1 + + clc ; Success (so far) + rts ; Return to BASIC.SYSTEM ;;; ============================================================ -notours: - sec ;SET CARRY AND LET - jmp (nxtcmd) ; NEXT EXT CMD GO FOR IT. +not_ours: + sec ; Signal failure... + next_command := *+1 + jmp $ffff ; Execute next command in chain ;;; ============================================================ execute: - ;; Filename? + ;; Verify required arguments + lda FBITS - and #%00000001 ; Filename? + and #PBitsFlags::FN1 ; Filename? bne :+ lda #$10 ; SYNTAX ERROR sec rts : - ;; Type? +;;; -------------------------------------------------- + lda FBITS - and #%00000100 ; Type? + and #PBitsFlags::T ; Type? bne :+ lda #$B ; INVALID PARAMETER sec - rts +rts1: rts : - ;; Show Filename - lda #'P'|$80 - jsr COUT - lda #'='|$80 - jsr COUT +;;; -------------------------------------------------- - ptr := $06 - lda VPATH1 - sta ptr - lda VPATH1+1 - sta ptr+1 - - ldy #0 - lda (ptr),y - tax - iny - -: lda (ptr),y - ora #$80 - jsr COUT - iny - dex - bne :- - jsr CROUT - - ;; Show Type - lda #'T'|$80 - jsr COUT - lda #'='|$80 - jsr COUT - lda #'$'|$80 - jsr COUT - lda VTYPE - jsr PRBYTE - jsr CROUT - - ;; Addr? - lda FBITS+1 - and #%10000000 ; Addr? - beq :+ - - lda #'A'|$80 - jsr COUT - lda #'='|$80 - jsr COUT - lda #'$'|$80 - jsr COUT - lda VADDR+1 ; hi - jsr PRBYTE - lda VADDR ; lo - jsr PRBYTE - jsr CROUT -: - - ;; Get/Set File Info - - ;; GET_FILE_INFO + ;; Get the existing file info lda #$A sta SSGINFO - lda #$C4 ; GET_FILE_INFO + lda #GET_FILE_INFO jsr GOSYSTEM bcs rts1 - ;; SET_FILE_INFO +;;; -------------------------------------------------- + + ;; Set new file info lda #$7 sta SSGINFO + + ;; Apply new file type lda VTYPE sta FIFILID - ;; TODO: optional Aux Type - lda #$C3 ; SET_FILE_INFO - jsr GOSYSTEM - bcs rts1 - clc ;All done successfully. -rts1: rts ;Back to BASIC.SYSTEM. + ;; Apply optional Address argument as new aux type + lda FBITS+1 + and #%10000000 + beq :+ + lda VADDR + sta FIAUXID + lda VADDR+1 + sta FIAUXID+1 +: + + ;; Apply current date/time + ldx #3 +: lda DATE,x + sta FIMDATE,x + dex + bpl :- + + lda #SET_FILE_INFO + jmp GOSYSTEM ;;; ============================================================ ;;; Data -cmd: .byte "CHTYPE" ;Our command - cmdlen = *-cmd ;Our command length -nxtcmd: .word 0 ; STORE THE NEXT COMMAND'S - ; ADDRESS HERE. +cmd: .byte "CHTYPE" ; Command string + cmdlen = *-cmd