Store older version

This commit is contained in:
Bill Chatfield 2024-01-30 19:11:51 -05:00
parent 4b6d06677b
commit b0b2510a96
3 changed files with 505 additions and 818 deletions

89
more.bas Normal file
View File

@ -0,0 +1,89 @@
10 REM *****************************
15 REM * *
20 REM * MORE - TEXT FILE VIEWER *
30 REM * AUTHOR - BILL CHATFIELD *
35 REM * *
40 REM *****************************
44 :
45 REM TODO:
46 REM CD,PREFIX,PWD,CWD,CHDIR,FASTER OUTPUT
47 REM PREFIX IN PROMPT
48 REM DETAILED HELP FROM "?" COMMAND, FIX FIRST LINE
49 :
50 LET D$ = CHR$ (4)
55 LET BS$ = CHR$ (7)
56 LET CR$ = CHR$ (13)
57 LET PROMPT$ = "[RETURN] NEXT LINE [SPACE] NEXT PAGE [Q] QUIT"
58 LET LINE = 1
59 PRINT "ENTER A FILE NAME, * FOR CATALOG, OR JUST HIT RETURN TO ABORT
."
60 INPUT "FILE:";F$
70 IF RIGHT$ (F$,1) = "*" THEN PRINT D$;"CATALOG "; LEFT$ (F$, LEN (F
$) - 1): GOTO 60
80 IF F$ = "" THEN END
85 IF F$ = "?" THEN 59
110 ONERR GOTO 5050: REM SETUP ERROR HANDLER
125 PRINT D$;"VERIFY ";F$: REM CHECK IF FILE EXISTS, ERROR CODE 6
130 PRINT D$;"OPEN ";F$: REM WILL CREATE FILE IF IT DOES NOT EXIST.
140 PRINT D$;"READ ";F$
150 GET C$
160 PRINT C$;
165 IF C$ = CR$ THEN LINE = LINE + 1
167 IF LINE = 24 THEN INVERSE : PRINT PROMPT$;: NORMAL : PRINT D$: GOSUB
4000: GOSUB 3000: GOTO 140
170 GOTO 150: REM NEXT CHARACTER IN FILE
180 REM END OF MAIN, BUT UNREACHABLE BECAUSE OF CHARACTER LOOP
3000 REM ****************
3005 REM * *
3010 REM * ERASE PROMPT *
3015 REM * *
3020 REM ****************
3025 LET PL = LEN (PROMPT$)
3030 POKE 1403,0: REM BACKUP TO BEGINNING OF LINE
3060 PRINT SPC( PL): REM ERASE PROMPT
3070 POKE 1403,0: REM BACKUP AGAIN
3080 RETURN
4000 REM ***************
4005 REM * *
4010 REM * GET COMMAND *
4015 REM * *
4020 REM ***************
4030 GET CMD$
4040 IF CMD$ = CR$ THEN LINE = 23: GOTO 4060
4050 IF CMD$ = " " THEN LINE = 1: GOTO 4060
4055 IF CMD$ = "Q" OR CMD$ = "q" THEN PRINT D$;"CLOSE": PRINT D$: PRINT
: END
4060 RETURN
5000 REM *****************
5010 REM * *
5020 REM * ERROR HANDLER *
5030 REM * *
5040 REM *****************
5050 POKE 216,0: REM TURNS OFF 'ONERR GOTO' ERROR HANDLING
5060 LET ERRCODE = PEEK (222): REM GETS THE CODE FOR THIS ERROR
5070 PRINT D$;"CLOSE": REM CLOSES ANY OPEN FILES
5080 PRINT D$: REM TURNS OFF FILE I/O SO PRINTS GO TO SCREEN
5090 IF ERRCODE = 5 THEN 5290: REM END-OF-FILE IS NOT AN ERROR
5100 PRINT : PRINT : REM SEPARATES ERR MSG FROM ANY PREVIOUS OUTPUT
5120 REM CHECK FOR DOS/PRODOS ERRORS NOT IN APPLESOFT TABLE
5130 IF ERRCODE = 6 THEN PRINT "ERROR:FILE NOT FOUND:";F$
5140 IF ERRCODE = 11 THEN PRINT "ERROR:INVALID OPTION"
5150 IF ERRCODE = 255 THEN PRINT : PRINT : PRINT "INTERRUPTED BY CTRL-C"
5155 GOTO 5290: REM SKIP TO THE END
5160 REM COPY ERROR MESSAGE FROM APPLESOFT ERROR TABLE
5170 LET BASE = 53856: REM $D260, START OF APPLESOFT ERR TABLE
5180 LET PTR = BASE + ERRCODE: REM POINT TO 1ST BYTE OF ERR MSG
5185 PRINT "ERROR:";: REM PREFIX ALL PRINTED MESSAGES WITH THIS
5190 :
5195 REM LOOP TO PRINT CHARS OF ERR MSG FROM APPLESOFT ERROR TABLE
5200 REM WHILE (THERE ARE MORE CHARS IN MESSAGE) DO
5210 LET BYTE = PEEK (PTR): REM GETS BYTE POINTED TO BY PTR
5220 IF BYTE > = 128 THEN 5280: REM DETECTS LAST BYTE
5230 PRINT CHR$ (BYTE);: REM CNVTS ASCII BYTE TO CHAR, PRINT
5240 LET PTR = PTR + 1: REM ADVANCES POINTER TO NEXT BYTE
5250 GOTO 5210: REM LOOPS BACK TO NEXT BYTE
5260 REM END WHILE
5270 :
5280 PRINT CHR$ (BYTE - 128);: REM SETS HIGH BIT TO 0, PRINT
5290 END : REM THIS IS THE END - JIM MORRISON

425
more.c
View File

@ -1,425 +0,0 @@
********************************
* *
* MORE - UN*X MORE COMMAND *
* ASSEMBLES WITH MERLIN *
* BILL CHATFIELD *
* *
********************************
DSK MORE ;WRITE ASSEMBLED FILE TO DISK
TYP $06 ;$FF=SYSTEM, $06=BINARY
ORG $2000 ;ASSEMBLE START ADDRESS
* SYSTEM VARIABLES
IN EQU $200 ;256-CHAR INPUT BUF
* SUBROUTINES IN MONITOR ROM: $F800 - $FFFF
RDKEY EQU $FD0C ;READS A CHARACTER
GETLN EQU $FD6A ;READS A LINE, WITH PROMPT($33)
GETLN1 EQU $FD6F ;READS A LINE, NO PROMPT
CROUT EQU $FD8E
COUT EQU $FDED
PRBYTE EQU $FDDA
* PRODOS ENTRY POINT
MLI EQU $BF00
* MEMORY LOCATIONS
OURCH EQU $057B ;80-COL HORIZ CURSOR POSITION
OURCV EQU $05FB ;VERTICAL CURSOR POSITION
* PRODOS COMMAND CODES
OPENCMD EQU $C8
READCMD EQU $CA
CLOSCMD EQU $CC
* CONSTANTS
EOFERR EQU $4C ;ERROR CODE FOR END-OF-FILE
PTR EQU $06 ;ONLY FREE 0-PAGE LOCATION
MAXERCDE EQU $5A ;LARGEST ERROR CODE
CR EQU $0D ;ASCII CARRIAGE RETURN
CR_HIBIT EQU $8D ;CARRIAGE RET WITH HIGH BIT SET
BUFSIZE EQU $00FF
SCR_HGHT EQU 24 ;SCREEN HEIGHT
* DEBUGGING
TRACE EQU 0
********************************
* *
* PUSH Y ONTO THE STACK *
* DESTROYS A *
* *
********************************
PUSHY MAC
TYA
PHA
<<<
********************************
* *
* POP Y FROM THE STACK *
* DESTROYS A *
* *
********************************
POPY MAC
PLA
TAY
<<<
********************************
* *
* COPY IN BUF TO STRING *
* *
* X CONTAINS LENGTH OF "IN" *
* ]1 IS DEST STRING (LEN BYT) *
* A IS DESTROYED *
* *
********************************
CPIN MAC
PUSHY ;SAVE Y
STX ]1 ;COPY LENGTH TO FIRST BYTE OF ]1
LDY #0 ;INIT Y TO ZERO
LOOP CPY ]1 ;COMPARE Y WITH LENGTH BYTE
BEQ ENDLOOP ;DONE IF LENGTH IS REACHED
LDA IN,Y ;LOAD IN[Y] INTO ACCUMULATOR
CMP #CR ;COMPARE WITH CARRIAGE RETURN
BEQ ENDLOOP ;STOP AT CARRIAGE RETURN
INY ;DEST STR IS 1 AHEAD OF IN BUF
STA ]1,Y ;COPY CHAR TO DEST STR ]1
JMP LOOP ;LOOP TO NEXT CHAR
ENDLOOP POPY ;RESTORE Y
<<<
********************************
* *
* WRITES A LENGTH PREFIXED *
* STRING TO THE SCREEN *
* A IS DESTROYED *
* *
********************************
PUTS MAC
PUSHY
LDY #0 ;INIT LOOP INDEX
LOOP CPY ]1 ;HAS STR LENGTH BEEN REACHED
BEQ ENDLOOP ;IF SO THEN FINISH
INY ;MOVE TO INDEX OF NEXT CHAR
LDA ]1,Y ;GET THE CHAR TO BE WRITTEN
JSR COUT ;WRITE THE CHARACTER
JMP LOOP ;LOOP
ENDLOOP POPY
<<<
********************************
* *
* SET TO #1 (IMMEDIATE 1) *
* ]1 DESTINATION *
* A IS DESTROYED *
* *
********************************
SET1 MAC
LDA #1
STA ]1
<<<
SET0 MAC
LDA #0
STA ]1
<<<
SET23 MAC
LDA #23
STA ]1
<<<
********************************
* *
* MAIN PROGRAM *
* *
********************************
MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH
SET0 USRQUIT ;INITIALIZE TO "NO"
*
* GET FILE NAME
*
PUTS PROMPT
JSR GETLN1 ;LENGTH IN X, CR AT END
CPX #0 ;IS THE LENGTH ZERO?
BEQ :END ;USER JUST PRESSED RETURN
CPIN FILENAME ;COPY "IN" BUF TO FILENAME
*
* OPEN FILE
*
JSR MLI
DB OPENCMD
DA OPENPRMS
BNE :ERRFWDR
*
* COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE
*
LDA OPENFNUM
STA READFNUM
STA CLOSFNUM
*
* PRINT THE FILE
*
JSR VIEWFILE ;MUST CLOSE BEFORE ERR HANDLING
*
* CLOSE FILE
*
JSR MLI
DB CLOSCMD
DA CLOSPRMS
STA CLOSERR
*
* CHECK FOR ERRORS
*
LDA READERR ;RELOAD THE READ RESULT CODE
CMP EOFERR ;WAS IT AN EOF "ERROR"
BEQ :END ;EOF IS NOT REALLY AN ERROR
CMP #0
BNE :ERRFWDR
LDA CLOSERR
BNE :ERRFWDR
JMP :END
*
* FINISH
*
:ERRFWDR JSR ERRPROC
:END NOP
RTS
********************************
* *
* VIEW FILE SUB *
* *
********************************
VIEWFILE
DO TRACE
PUTS ENVIEW
FIN
SET1 LINENUM ;INIT LINE NUMBER
:LOOP JSR MLI ;CALL PRODOS TO READ FILE
DB READCMD ;SPECIFY PRODOS READ COMMAND
DA READPRMS ;READ PARAMETERS
STA READERR ;SAVE RESULT OF READ OPERATION
BNE :ENDLOOP ;IF ERROR THEN END SUB
JSR WRITEBUF ;WRITE TO SCREEN WHAT WAS READ
LDA #1 ;PREPARE FOR NEXT OP
CMP USRQUIT ;IF USER WANTS TO QUIT, THEN
BEQ :ENDLOOP ;EXIT THE LOOP
JMP :LOOP ;ELSE, GET THE NEXT BUFFER
:ENDLOOP NOP
RTS
********************************
* *
* WRITE BUFFER TO SCREEN *
* *
********************************
WRITEBUF
LDY #0 ;INIT CHAR COUNTER VARIABLE
:LOOP CPY READCNT ;COMPARE TO MAX CHARS
BEQ :ENDLOOP
LDA READBUF,Y ;GET CHAR FROM BUFFER
ORA #%10000000 ;TURN ON HIGH BIT FOR PRINTING
JSR COUT ;WRITE IT TO THE SCREEN
*
* CHECK END OF LINE
*
LDA READBUF,Y ;LOAD AGAIN, WITHOUT HIBIT
AND #%01111111 ;TURN OFF HIBIT, IF SET
CMP #CR ;COMPARE TO CR WITHOUT HIBIT
BNE :CONT ;IF NOT END OF LINE, NEXT CHAR
INC LINENUM ;NEXT LINE HAS BEEN REACHED
*
* CHECK AT END OF PAGE
*
LDA LINENUM
CMP #SCR_HGHT ;AT BOTTOM OF SCREEN?
BNE :CONT ;NO? THEN NEXT CHAR
JSR STATBAR ;YES? THEN SHOW THE STATUS BAR
LDA #1 ;SETUP FOR NEXT LINE
CMP USRQUIT ;DID USER ASK TO QUIT
BEQ :ENDLOOP ;YES? THEN END SUB
:CONT INY ;STATBAR HAS ADJUSTED LINENUM
JMP :LOOP
:ENDLOOP NOP
DO TRACE
PUTS EXVIEW
FIN
RTS
********************************
* *
* PRINT ASCII IN HEX *
* *
********************************
PRASCII PHA
LDA #"["
JSR COUT
PLA
JSR PRBYTE
LDA #"]"
JSR COUT
LDA #" "
JSR COUT
RTS
********************************
* *
* DO THE STATUS BAR *
* *
********************************
STATBAR
DO TRACE
PUTS ENSTATB
FIN
PUSHY
PUTS BAR
:LOOP JSR RDKEY ;GET A KEY FROM THE USER
CMP #" " ;CHECK IF SPACE ENTERED
BNE :CHKCR ;IF NOT FORWARD TO NEXT CHECK
SET1 LINENUM ;ADVANCE ONE PAGE, STORE 1
JMP :ENDLOOP ;PROCESSED SPACE SO DONE
:CHKCR CMP #CR_HIBIT ;CHECK FOR CARRIAGE RETURN
BNE :CHKQUIT
SET23 LINENUM
JMP :ENDLOOP
:CHKQUIT CMP #"Q" ;USER WANTS TO QUIT
BNE :LOOP ;NO RECOGNIZED INPUT
SET1 USRQUIT
:ENDLOOP JSR ERASEBAR
POPY
DO TRACE
PUTS EXSTATB
FIN
RTS
********************************
* *
* ERASE STATUS BAR *
* *
********************************
ERASEBAR
DO TRACE
PUTS ENERASEB
FIN
PUSHY
SET0 OURCH ;RESET CURSOR TO BEG OF LINE
LDY #0 ;INIT COUNTER FOR SPACES
:LOOP CPY BAR ;FIRST BYTE IS LENGTH
BEQ :ENDLOOP ;IF Y=LEN THEN DONE
LDA #" " ;LOAD SPACE
JSR COUT ;WRITE TO SCREEN
INY ;MAKE PROGRESS
JMP :LOOP ;LOOP TO NEXT CHAR
:ENDLOOP SET0 OURCH ;RESET CURSON TO BEG OF LINE
POPY
DO TRACE
PUTS EXERASEB
FIN
RTS
********************************
* *
* ERROR HANDLER *
* *
********************************
ERRPROC STA ERRCODE
PUTS ERRTXT
JSR PRBYTE
JSR CROUT
RTS
********************************
* *
* DATA DIVISION HAHA *
* *
********************************
PROMPT STR "FILE:"
ERRTXT STR "ERROR:"
FILENAME DS $FF
HERE STR "HERE"
HERE2 STR "HERE2"
READRET STR "READRET="
SREADCNT STR "READCNT="
ERRCODE DS 1
READERR DS 1
CLOSERR DS 1
LINENUM DS 1
BAR STR '[RET] NEXT LINE [SPC] NEXT PAGE [Q]UIT'
USRQUIT DS 1
BUFCHAR DS 1
USRCHAR DS 1
I DS 1
ENVIEW STR 'ENTERING VIEWFILE'
EXVIEW STR 'EXITING VIEWFILE'
ENSTATB STR 'ENTERING STATUSBAR'
EXSTATB STR 'EXITING STATUSBAR'
ENERASEB STR 'ENTERING ERASEBAR'
EXERASEB STR 'EXITING ERASEBAR'
* OPEN PARAMETERS
OPENPRMS DB 3
DA FILENAME
DA OPENBUF
OPENFNUM DS 1
* READ PARAMETERS
READPRMS DB 4
READFNUM DS 1
DA READBUF
REQCNT DW BUFSIZE
READCNT DS 2
* CLOSE PARAMETERS
CLOSPRMS DB 1
CLOSFNUM DS 1
* REST GOES HERE
* BUFFERS
* CONSUME ALL BYTES UP TO THE NEXT PAGE BOUNDRY
FILLER DS \,$00
* MUST START ON PAGE BOUNDRY
OPENBUF DS 1024
READBUF DS BUFSIZE
:

809
more.s
View File

@ -1,402 +1,425 @@
********************************
* *
* MORE - UN*X MORE COMMAND *
* ASSEMBLES WITH MERLIN *
* BILL CHATFIELD *
* *
********************************
DSK MORE ;WRITE ASSEMBLED FILE TO DISK
TYP $06 ;$FF=SYSTEM, $06=BINARY
ORG $2000 ;ASSEMBLE START ADDRESS
* SYSTEM VARIABLES
IN EQU $200 ;256-CHAR INPUT BUF
* SUBROUTINES IN MONITOR ROM: $F800 - $FFFF
RDKEY EQU $FD0C ;READS A CHARACTER
GETLN EQU $FD6A ;READS A LINE, WITH PROMPT($33)
GETLN1 EQU $FD6F ;READS A LINE, NO PROMPT
CROUT EQU $FD8E
COUT EQU $FDED
PRBYTE EQU $FDDA
* PRODOS ENTRY POINT
MLI EQU $BF00
* MEMORY LOCATIONS
OURCH EQU $057B ;80-COL HORIZ CURSOR POSITION
OURCV EQU $05FB ;VERTICAL CURSOR POSITION
* PRODOS COMMAND CODES
OPENCMD EQU $C8
READCMD EQU $CA
CLOSCMD EQU $CC
* CONSTANTS
EOFERR EQU $4C ;ERROR CODE FOR END-OF-FILE
PTR EQU $06 ;ONLY FREE 0-PAGE LOCATION
MAXERCDE EQU $5A ;LARGEST ERROR CODE
CR EQU $0D ;ASCII CARRIAGE RETURN
CR_HIBIT EQU $8D ;CARRIAGE RET WITH HIGH BIT SET
BUFSIZE EQU $00FF
SCR_HGHT EQU 24 ;SCREEN HEIGHT
* DEBUGGING
TRACE EQU 0
********************************
* *
* PUSH Y ONTO THE STACK *
* DESTROYS A *
* *
********************************
PUSHY MAC
TYA
PHA
<<<
********************************
* *
* POP Y FROM THE STACK *
* DESTROYS A *
* *
********************************
POPY MAC
PLA
TAY
<<<
********************************
* *
* COPY IN BUF TO STRING *
* *
* X CONTAINS LENGTH OF "IN" *
* ]1 IS DEST STRING (LEN BYT) *
* A IS DESTROYED *
* *
********************************
CPIN MAC
PUSHY ;SAVE Y
STX ]1 ;COPY LENGTH TO FIRST BYTE OF ]1
LDY #0 ;INIT Y TO ZERO
LOOP CPY ]1 ;COMPARE Y WITH LENGTH BYTE
BEQ ENDLOOP ;DONE IF LENGTH IS REACHED
LDA IN,Y ;LOAD IN[Y] INTO ACCUMULATOR
CMP #CR ;COMPARE WITH CARRIAGE RETURN
BEQ ENDLOOP ;STOP AT CARRIAGE RETURN
INY ;DEST STR IS 1 AHEAD OF IN BUF
STA ]1,Y ;COPY CHAR TO DEST STR ]1
JMP LOOP ;LOOP TO NEXT CHAR
ENDLOOP POPY ;RESTORE Y
<<<
********************************
* *
* WRITES A LENGTH PREFIXED *
* STRING TO THE SCREEN *
* A IS DESTROYED *
* *
********************************
PUTS MAC
PUSHY
LDY #0 ;INIT LOOP INDEX
LOOP CPY ]1 ;HAS STR LENGTH BEEN REACHED
BEQ ENDLOOP ;IF SO THEN FINISH
INY ;MOVE TO INDEX OF NEXT CHAR
LDA ]1,Y ;GET THE CHAR TO BE WRITTEN
JSR COUT ;WRITE THE CHARACTER
JMP LOOP ;LOOP
ENDLOOP POPY
<<<
********************************
* *
* SET TO #1 (IMMEDIATE 1) *
* ]1 DESTINATION *
* A IS DESTROYED *
* *
********************************
SET1 MAC
LDA #1
STA ]1
<<<
SET0 MAC
LDA #0
STA ]1
<<<
SET23 MAC
LDA #23
STA ]1
<<<
********************************
* *
* MAIN PROGRAM *
* *
********************************
MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH
SET0 USRQUIT ;INITIALIZE TO "NO"
*
* more - Text viewer
* GET FILE NAME
*
* BEQ - Branch if Equal
* Branches if the zero flag (Z) is set to 1. This happens if:
* - A 0 value is loaded into the accumulator via LDA
* - A CMP is done on two equal values
* - A SBC is done on two equal values?
* BCC - Branch if Carry Flag is Clear
* Equivalent to Branch if Less Than (BLT), meaning that the
* accumulator (A) is less than the parameter: A < Param
* BGE - Branch if Accum >= Param is BCS
PROMPT equ $33
BUFF equ $200
* System subroutines stored in Monitor ROM
GETLN equ $fd6a ; Reads a line of input, with prompt from $33
GETLNZ equ $fd67 ; Reads a line of input, CR first
GETLN1 equ $fd6f ; Reads a line of input, no prompt
CROUT equ $fd8e ; Outputs a carriage return
PRBYTE equ $fdda ; Outputs a byte
COUT equ $fded ; Outputs a character
* MLI stands for Machine Language Interface
* It is the ProDOS system call entry point
MLI equ $bf00
* ProDOS system call command codes
OPEN equ $c8
READ equ $ca
CLOSE equ $cc
* Constants
EOF equ $4c ; End of file
PTR equ $06
MAX_EC equ $5a ; The largest error code
CR equ $0d ; Carriage return
BUF_SIZ equ $00ff
WRITE_CHAR mac
if #=]1
lda ]1
else
lda #]1
fin
jsr COUT
eom
WRITE_BYTE mac
lda ]1
jsr PRBYTE
eom
WRITE_ASC mac
tya ; Preserve Y by transferring it to A
pha ; and pushing it onto the stack
ldy #0 ; Prepare loop index
nextch lda ]1,Y ; Load a character into A
beq finish ; Branch if lda loaded a zero value
jsr COUT ; Write the character in A
iny ; Increment Y
jmp nextch ; Go back and load the next character
finish pla ; Restore Y by pulling stack into A
tay ; and transferring it to Y
eom
WRITE_STR mac
tya ; Preserve Y
pha
lda ]1 ; Length byte
sta len
ldy #1 ; Prepare loop index
nextChar tya
cmp len ; Check if beyond end of string
bcc writeChar ; Y is Less than
beq writeChar ; or equal to len
jmp finish
writeChar lda ]1,y ; Load a character
jsr COUT
iny
jmp nextChar
len db 0
finish pla ; Restore Y
tay
eom
COPY_BYTE mac
lda ]1
sta ]2
eom
* Copies a line out of BUFF into ]1.
* Length is in X as is done by GETLN.
COPY_BUFF mac
tya ; Preserve Y register
pha ; by pushing it on the stack
txa ; Transfer X to A for compare
cmp #$ff ; Check if string is too long
bne startCopy ; If not, get started
dex ; If so, shrink to fit with length byte
startCopy stx ]1 ; Store length to target string
ldy #0 ; Initialize loop index
nextChar tya ; Move current position to A
cmp ]1 ; Compare current position with length
beq endCopyLine ; Quit if we've reached the end
lda BUFF,y ; Load current character
iny ; BUFF and ]1 are off by 1 because of len byte
sta ]1,y ; Store character into target string
jmp nextChar ; Continue with next character
endCopyLine pla ; Restore Y by pulling value from stack
tay ; and transferring to Y
eom
WRITE_BUFF mac
tya
pha
stx len
ldy #0
nextByte tya
cmp len
beq done
lda BUFF,y
jsr COUT
iny
jmp nextByte
done pla
tay
eom
* Starting at $9000 because:
* $800 overwrites Applesoft
* $803 is where Applesoft programs start
* $2000 is where the current .SYSTEM program is loaded
mainProgram
org $8000
getFileNam
WRITE_ASC prompt
COPY_BYTE #"?";PROMPT
jsr GETLN1
WRITE_ASC buffText
WRITE_BUFF
jsr CROUT
COPY_BUFF fileName
openFile jsr MLI
db OPEN
da openParams
bne openErrorHandler
readFile COPY_BYTE fileNum;readNum
readNext jsr MLI
db READ
da readParams
cmp #EOF
beq closeFile
cmp #0
bne readErrorHandler
writeScreen
ldy #0
sty lineCount
sty charCount
nextChar lda readIoBuf,y
inc charCount
ora #$80
jsr COUT
cmp $0d
bne continue
inc lineCount
continue cpy #<BUF_SIZ
beq readNext
iny
jmp nextChar
closeFile COPY_BYTE fileNum;closeNum
jsr MLI
db CLOSE
dw closeParams
bne closeErrorHandler
jmp endMain
openErrorHandler
sta errorCode
WRITE_ASC openFailureText
jmp errorHandler
readErrorHandler
sta errorCode
WRITE_ASC readFailureText
jmp errorHandler
closeErrorHandler
sta errorCode
WRITE_ASC closeFailureText
errorHandler
WRITE_STR fileName
WRITE_CHAR ":"
WRITE_CHAR " "
lda errorCode
cmp #MAX_EC ; Compare by A - MAX_EC
bcs unknownError ; Branch if A >= MAX_EC
lda errorCode ; Necessary?
clc ; Prepare for addition
adc errorCode ; Double for indexing addresses
tax
lda errorMessages,x
sta PTR
inx
lda errorMessages,x
sta PTR+1
bne writeError
lda PTR
bne writeError
unknownError
WRITE_ASC unknownErrorCodeText
WRITE_CHAR "$"
WRITE_BYTE errorCode
jsr CROUT
jmp endMain
writeError
WRITE_ASC (PTR)
WRITE_CHAR " "
WRITE_ASC errorCodeText
WRITE_CHAR "$"
WRITE_BYTE errorCode
WRITE_CHAR ")"
jsr CROUT
endMain
COPY_BYTE #"]";PROMPT ; Restore normal prompt
rts
* DAT-uh
openParams db 3 ; Parameter count
oPathPtr da fileName ; Input param - file to open
oBufPtr da openIoBuf ; Input param - I/O buffer
fileNum ds 1 ; Output param - file ref num
readParams db 4
readNum ds 1
da readIoBuf
reqCount dw BUF_SIZ
transCount ds 2
closeParams db 1 ; Parameter count
closeNum db 0 ; Input param - ref num to close
fileName ds $ff ; String starting with length byte
charCount ds 2
lineCount ds 1
len ds 1
buffText asc "BUFF=",00
prompt asc "ENTER FILE NAME: ",00
errorCode db 0
openFailureText asc "FAILED TO OPEN FILE ",00
readFailureText asc "FAILED TO READ FILE ",00
closeFailureText asc "FAILED TO CLOSE FILE ",00
errorCodeText asc "(ERROR CODE ",00
unknownErrorCodeText asc "UNKNOWN ERROR CODE: ",00
em00 asc "NO ERROR",00
em01 asc "BAD SYSTEM CALL NUMBER",00
em03 asc "NO DEVICE CONNECTED",00 ; Bug in AppleWin < 1.26.3.0
em04 asc "BAD SYSTEM CALL PARAMETER COUNT",00
em25 asc "INTERRUPT VECTOR TABLE FULL",00
em27 asc "I/O ERROR",00
em28 asc "DEVICE NOT CONNECTED",00
em2b asc "DISK WRITE PROTECTED",00
em2e asc "DISK SWITCHED WHILE FILE STILL OPEN",00
em40 asc "PATH CONTAINS ILLEGAL CHARACTERS",00
em42 asc "CANNOT EXCEED 8 OPEN FILES",00
em44 asc "PATH NOT FOUND",00
em45 asc "VOLUME DIRECTORY NOT FOUND",00
em46 asc "FILE NOT FOUND",00
em47 asc "DUPLICATE FILENAME",00
em48 asc "DISK IS FULL",00
em49 asc "CANNOT EXCEED 51 DIRECTORY ENTRIES",00
em4a asc "INCOMPATIBLE FILE FORMAT",00
em4b asc "UNSUPPORTED STORAGE TYPE",00
em4c asc "END OF FILE",00
em4d asc "FILE POSITION OUT OF RANGE",00
em4e asc "FILE ATTRIBUTE FORBIDS OPERATION",00
em50 asc "FILE IS OPEN",00
em51 asc "DIRECTORY COUNT ERROR",00
em52 asc "NOT A PRODOS DISK",00
em55 asc "VOLUME CONTROL BLOCK FULL",00
em56 asc "BAD BUFFER ADDRESS",00
em57 asc "DUPLICATE VOLUME",00
em5a asc "BIT MAP DISK ADDRESS IS IMPOSSIBLE",00
PUTS PROMPT
JSR GETLN1 ;LENGTH IN X, CR AT END
CPX #0 ;IS THE LENGTH ZERO?
BEQ :END ;USER JUST PRESSED RETURN
CPIN FILENAME ;COPY "IN" BUF TO FILENAME
*
* ERROR CODE TO MESSAGE TRANSLATION TABLE
* OPEN FILE
*
errorMessages
ec00 da em00
ec01 da em01
ec02 da $0000
ec03 da em03 ; Bug in AppleWin < 1.26.3.0
ec04 da em04
ec05 da $0000
ec06 da $0000
ec07 da $0000
ec08 da $0000
ec09 da $0000
ec0a da $0000
ec0b da $0000
ec0c da $0000
ec0d da $0000
ec0e da $0000
ec0f da $0000
ec10 da $0000
ec11 da $0000
ec12 da $0000
ec13 da $0000
ec14 da $0000
ec15 da $0000
ec16 da $0000
ec17 da $0000
ec18 da $0000
ec19 da $0000
ec1a da $0000
ec1b da $0000
ec1c da $0000
ec1d da $0000
ec1e da $0000
ec1f da $0000
ec20 da $0000
ec21 da $0000
ec22 da $0000
ec23 da $0000
ec24 da $0000
ec25 da $0000
ec26 da $0000
ec27 DA em27
ec28 DA em28
ec29 da $0000
ec2a da $0000
ec2b da $0000
ec2c da $0000
ec2d da $0000
ec2e DA em2e
ec2f da $0000
ec30 da $0000
ec31 da $0000
ec32 da $0000
ec33 da $0000
ec34 da $0000
ec35 da $0000
ec36 da $0000
ec37 da $0000
ec38 da $0000
ec39 da $0000
ec3a da $0000
ec3b da $0000
ec3c da $0000
ec3d da $0000
ec3e da $0000
ec3f da $0000
ec40 da em40
ec41 da $0000
ec42 da em42
ec43 da $0000
ec44 da em44
ec45 da em45
ec46 da em46
ec47 da em47
ec48 da em48
ec49 da em49
ec4a da em4a
ec4b da em4b
ec4c da em4c
ec4d da em4d
ec4e da em4e
ec4f da $0000
ec50 da em50
ec51 da em51
ec52 da em52
ec53 da $0000
ec54 da $0000
ec55 da em55
ec56 da em56
ec57 da em57
ec58 da $0000
ec59 da $0000
ec5a da em5a
JSR MLI
DB OPENCMD
DA OPENPRMS
BNE :ERRFWDR
*
* Consume all bytes up to next page boundary
* COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE
*
filler ds \,$00
LDA OPENFNUM
STA READFNUM
STA CLOSFNUM
*
* Must start on page boundary
* PRINT THE FILE
*
openIoBuf ds 1024
readIoBuf ds BUF_SIZ
JSR VIEWFILE ;MUST CLOSE BEFORE ERR HANDLING
*
* CLOSE FILE
*
JSR MLI
DB CLOSCMD
DA CLOSPRMS
STA CLOSERR
*
* CHECK FOR ERRORS
*
LDA READERR ;RELOAD THE READ RESULT CODE
CMP EOFERR ;WAS IT AN EOF "ERROR"
BEQ :END ;EOF IS NOT REALLY AN ERROR
CMP #0
BNE :ERRFWDR
LDA CLOSERR
BNE :ERRFWDR
JMP :END
*
* FINISH
*
:ERRFWDR JSR ERRPROC
:END NOP
RTS
********************************
* *
* VIEW FILE SUB *
* *
********************************
VIEWFILE
DO TRACE
PUTS ENVIEW
FIN
SET1 LINENUM ;INIT LINE NUMBER
:LOOP JSR MLI ;CALL PRODOS TO READ FILE
DB READCMD ;SPECIFY PRODOS READ COMMAND
DA READPRMS ;READ PARAMETERS
STA READERR ;SAVE RESULT OF READ OPERATION
BNE :ENDLOOP ;IF ERROR THEN END SUB
JSR WRITEBUF ;WRITE TO SCREEN WHAT WAS READ
LDA #1 ;PREPARE FOR NEXT OP
CMP USRQUIT ;IF USER WANTS TO QUIT, THEN
BEQ :ENDLOOP ;EXIT THE LOOP
JMP :LOOP ;ELSE, GET THE NEXT BUFFER
:ENDLOOP NOP
RTS
********************************
* *
* WRITE BUFFER TO SCREEN *
* *
********************************
WRITEBUF
LDY #0 ;INIT CHAR COUNTER VARIABLE
:LOOP CPY READCNT ;COMPARE TO MAX CHARS
BEQ :ENDLOOP
LDA READBUF,Y ;GET CHAR FROM BUFFER
ORA #%10000000 ;TURN ON HIGH BIT FOR PRINTING
JSR COUT ;WRITE IT TO THE SCREEN
*
* CHECK END OF LINE
*
LDA READBUF,Y ;LOAD AGAIN, WITHOUT HIBIT
AND #%01111111 ;TURN OFF HIBIT, IF SET
CMP #CR ;COMPARE TO CR WITHOUT HIBIT
BNE :CONT ;IF NOT END OF LINE, NEXT CHAR
INC LINENUM ;NEXT LINE HAS BEEN REACHED
*
* CHECK AT END OF PAGE
*
LDA LINENUM
CMP #SCR_HGHT ;AT BOTTOM OF SCREEN?
BNE :CONT ;NO? THEN NEXT CHAR
JSR STATBAR ;YES? THEN SHOW THE STATUS BAR
LDA #1 ;SETUP FOR NEXT LINE
CMP USRQUIT ;DID USER ASK TO QUIT
BEQ :ENDLOOP ;YES? THEN END SUB
:CONT INY ;STATBAR HAS ADJUSTED LINENUM
JMP :LOOP
:ENDLOOP NOP
DO TRACE
PUTS EXVIEW
FIN
RTS
********************************
* *
* PRINT ASCII IN HEX *
* *
********************************
PRASCII PHA
LDA #"["
JSR COUT
PLA
JSR PRBYTE
LDA #"]"
JSR COUT
LDA #" "
JSR COUT
RTS
********************************
* *
* DO THE STATUS BAR *
* *
********************************
STATBAR
DO TRACE
PUTS ENSTATB
FIN
PUSHY
PUTS BAR
:LOOP JSR RDKEY ;GET A KEY FROM THE USER
CMP #" " ;CHECK IF SPACE ENTERED
BNE :CHKCR ;IF NOT FORWARD TO NEXT CHECK
SET1 LINENUM ;ADVANCE ONE PAGE, STORE 1
JMP :ENDLOOP ;PROCESSED SPACE SO DONE
:CHKCR CMP #CR_HIBIT ;CHECK FOR CARRIAGE RETURN
BNE :CHKQUIT
SET23 LINENUM
JMP :ENDLOOP
:CHKQUIT CMP #"Q" ;USER WANTS TO QUIT
BNE :LOOP ;NO RECOGNIZED INPUT
SET1 USRQUIT
:ENDLOOP JSR ERASEBAR
POPY
DO TRACE
PUTS EXSTATB
FIN
RTS
********************************
* *
* ERASE STATUS BAR *
* *
********************************
ERASEBAR
DO TRACE
PUTS ENERASEB
FIN
PUSHY
SET0 OURCH ;RESET CURSOR TO BEG OF LINE
LDY #0 ;INIT COUNTER FOR SPACES
:LOOP CPY BAR ;FIRST BYTE IS LENGTH
BEQ :ENDLOOP ;IF Y=LEN THEN DONE
LDA #" " ;LOAD SPACE
JSR COUT ;WRITE TO SCREEN
INY ;MAKE PROGRESS
JMP :LOOP ;LOOP TO NEXT CHAR
:ENDLOOP SET0 OURCH ;RESET CURSON TO BEG OF LINE
POPY
DO TRACE
PUTS EXERASEB
FIN
RTS
********************************
* *
* ERROR HANDLER *
* *
********************************
ERRPROC STA ERRCODE
PUTS ERRTXT
JSR PRBYTE
JSR CROUT
RTS
********************************
* *
* DATA DIVISION HAHA *
* *
********************************
PROMPT STR "FILE:"
ERRTXT STR "ERROR:"
FILENAME DS $FF
HERE STR "HERE"
HERE2 STR "HERE2"
READRET STR "READRET="
SREADCNT STR "READCNT="
ERRCODE DS 1
READERR DS 1
CLOSERR DS 1
LINENUM DS 1
BAR STR '[RET] NEXT LINE [SPC] NEXT PAGE [Q]UIT'
USRQUIT DS 1
BUFCHAR DS 1
USRCHAR DS 1
I DS 1
ENVIEW STR 'ENTERING VIEWFILE'
EXVIEW STR 'EXITING VIEWFILE'
ENSTATB STR 'ENTERING STATUSBAR'
EXSTATB STR 'EXITING STATUSBAR'
ENERASEB STR 'ENTERING ERASEBAR'
EXERASEB STR 'EXITING ERASEBAR'
* OPEN PARAMETERS
OPENPRMS DB 3
DA FILENAME
DA OPENBUF
OPENFNUM DS 1
* READ PARAMETERS
READPRMS DB 4
READFNUM DS 1
DA READBUF
REQCNT DW BUFSIZE
READCNT DS 2
* CLOSE PARAMETERS
CLOSPRMS DB 1
CLOSFNUM DS 1
* REST GOES HERE
* BUFFERS
* CONSUME ALL BYTES UP TO THE NEXT PAGE BOUNDRY
FILLER DS \,$00
* MUST START ON PAGE BOUNDRY
OPENBUF DS 1024
READBUF DS BUFSIZE
: