From 1fbb9f7c5f698c660cd0360831ed5ac57f30f324 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Sat, 3 Feb 2024 19:26:06 -0500 Subject: [PATCH 1/7] Improve error handling --- .gitignore | 5 +- Makefile | 11 +- more.S | 112 ++++++------- prodos-2.0.3-boot.dsk => prodos-2.0.3.dsk | Bin 143360 -> 143360 bytes test.txt | 195 ++++++++++++++++++++++ 5 files changed, 258 insertions(+), 65 deletions(-) rename prodos-2.0.3-boot.dsk => prodos-2.0.3.dsk (98%) create mode 100644 test.txt diff --git a/.gitignore b/.gitignore index 1377554..70196dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -*.swp +MORE +MORE.dsk +_FileInformation.txt + diff --git a/Makefile b/Makefile index fd1f62f..b2e6ded 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ endif # the PowerBook G4 and iBook G3. This version only requires Java 1.3. AC=java -jar AppleCommander-1.3.5-ac.jar SRC=more.s -PGM=more -BASE_DSK=prodos-2.0.3-boot.dsk +PGM=MORE +BASE_DSK=prodos-2.0.3.dsk VOL=$(PGM) DSK=$(PGM).dsk @@ -35,12 +35,13 @@ DSK=$(PGM).dsk # disk instead. #$(AC) -pro140 $(DSK) $(VOL) -$(DSK): $(PGM) +$(DSK): $(PGM) test.txt $(COPY) $(BASE_DSK) $(DSK) - $(AC) -p $(DSK) $(PGM) BIN 0x8000 < $(PGM) + $(AC) -p $(DSK) $(PGM) BIN 0x2000 < $(PGM) + cat test.txt | tr '\n' '\r' | $(AC) -p $(DSK) TEST TXT $(PGM): $(SRC) Makefile - merlin32 --verbose $(SRC) + merlin32 $(SRC) clean: $(RM) $(DSK) $(PGM) *.zip _FileInformation.txt $(PGM)_Output.txt diff --git a/more.S b/more.S index d46c68f..4b67277 100644 --- a/more.S +++ b/more.S @@ -23,14 +23,16 @@ COUT .EQ $FDED PRBYTE .EQ $FDDA * * SUBROUTINES IN BASIC.SYSTEM ROM: -* -GETBUFR .EQ $BEF5 ;ALLOCATE BUFFER, DESTROYS X & Y -FREEBUFR .EQ $BEF8 ;FREE BUFFER -* + +GETBUFR EQU $BEF5 ;BCC=OKAY & A=HIBYTE OF BUF + ;BCS=FAIL & A=ERRCODE + ;X & Y ARE DESTROYED +FREEBUFR EQU $BEF8 ;FREE BUFFER + * PRODOS ENTRY POINT -* -MLI .EQ $BF00 -* + +PRODOS EQU $BF00 ;MACHINE LANG IFACE (MLI) + * MEMORY LOCATIONS * OURCH .EQ $057B ;80-COL HORIZ CURSOR POSITION @@ -174,21 +176,20 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH * LDA #4 ;FOUR 256 BYTE PAGES = 1KB JSR GETBUFR ;GET BUF FROM BASIC.SYSTEM - BCS ERRFWDR ;CARRY SET INDICATES AN ERROR + BCS :OBUFERR ;CARRY CLEAR MEANS NO ERROR STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A LDA #0 ;PREPARE STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE -* -* OPEN FILE -* - JSR MLI +:OPENFILE JSR PRODOS DB OPENCMD DA OPENPRMS - BNE ERRFWDR + BEQ :OPEN_OK + JSR ERRPROC + JMP :FREEOBUF * * COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE * - LDA OPENFNUM +:OPEN_OK LDA OPENFNUM STA READFNUM STA CLOSFNUM * @@ -196,47 +197,30 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH * LDA #1 ;ONE 256 BYTE BUFFER JSR GETBUFR ;CALL BASIC.SYSTEM SUB - BCS ERRFWDR ;CARRY SET MEANS ERROR - STA RBADDR+1 ;STORE HI-BYTE - STA ZP.A1H ;AGAIN, FOR 0-PAGE INDIRECTION + BCC :RBUF_OK ;CARRY CLR MEANS NO ERROR + JSR ERRPROC + JMP :CLOSFILE +:RBUF_OK STA RBADDR+1 ;STORE HI-BYTE LDA #0 ;0 FOR LO-BYTE STA RBADDR ;STORE IT STA ZP.A1L ;AGAIN, FOR 0-PAGE INDIRECTION * * PRINT THE FILE * - JSR VIEWFILE ;MUST CLOSE BEFORE ERR HANDLING + JSR VIEWFILE * -* FREE READ BUFFER +* CLEANUP * - JSR FREEBUFR -* -* CLOSE FILE -* - JSR MLI +:FREERBUF JSR FREEBUFR ;FREE READ BUFFER +:CLOSFILE JSR PRODOS ;CLOSE THE FILE DB CLOSCMD DA CLOSPRMS - STA CLOSERR -* -* FREE FILE BUFFER USED IN OPEN CALL -* - JSR FREEBUFR -* -* 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 + BCC FREEOBUF +:OPENERR JSR ERRPROC +:FREEOBUF JSR FREEBUFR ;FREE OPEN I/O BUFFER + JMP :END +:OBUFERR JSR ERRPROC +:END NOP RTS ******************************** @@ -250,18 +234,18 @@ VIEWFILE >PUTS ENVIEW FIN - >SET1 LINENUM ;INIT LINE NUMBER -.1 JSR MLI ;CALL PRODOS TO READ FILE + SET1 LINENUM ;INIT LINE NUMBER +:LOOP JSR PRODOS ;CALL PRODOS TO READ FILE DB READCMD ;SPECIFY PRODOS READ COMMAND DA READPRMS ;READ PARAMETERS - STA READERR ;SAVE RESULT OF READ OPERATION - BNE .2 ;IF ERROR THEN END SUB + BNE :READERR JSR WRITEBUF ;WRITE TO SCREEN WHAT WAS READ LDA #1 ;PREPARE FOR NEXT OP CMP USRQUIT ;IF USER WANTS TO QUIT, THEN - BEQ .2 ;EXIT THE LOOP - JMP .1 ;ELSE, GET THE NEXT BUFFER -.2 NOP + BEQ :ENDLOOP ;EXIT THE LOOP + JMP :LOOP ;ELSE, GET THE NEXT BUFFER +:READERR JSR ERRPROC +:ENDLOOP NOP RTS ******************************** @@ -387,14 +371,22 @@ ERASEBAR ******************************** * * * ERROR HANDLER * +* INPUT PARAM: ERRCODE * * * ******************************** -ERRPROC STA ERRCODE - >PUTS ERRTXT - JSR PRBYTE - JSR CROUT - RTS +ERRPROC + LDA ERRCODE + CMP #0 + BEQ :NOERR + CMP #EOFERR + BEQ :NOERR + PUTS ERRTXT + LDA ERRCODE + JSR PRBYTE + JSR CROUT +:NOERR NOP + RTS ******************************** * * @@ -452,5 +444,7 @@ CLOSFNUM .BS 1 * CONSUME ALL BYTES UP TO THE NEXT PAGE BOUNDRY *FILLER DS \,$00 * MUST START ON PAGE BOUNDRY -*OPENBUF .BS 1024 -*READBUF .BS BUFSIZE +*OPENBUF DS 1024 +*READBUF DS BUFSIZE + +: diff --git a/prodos-2.0.3-boot.dsk b/prodos-2.0.3.dsk similarity index 98% rename from prodos-2.0.3-boot.dsk rename to prodos-2.0.3.dsk index 3425d20e1b47072a04ba12c4d87562d8167b9f2b..68443432a2677baaf7546f69e1f9fcdcb6030235 100644 GIT binary patch delta 702 zcmZ9IPiWIn9LHb!XSR)Vn+)bjUf%Pf2c3UTGQnD&ZCuuMX;z10*puus6fYh;v=hco zDMAl+cqs^C)@4k0T5%mRBdt`8VF#-S6>mi)2L&%>{*tyk_#ok%@B94zf={kvU)ODujrbPwlp@UshBD;Q7l-R)< zJ>%%P3r^q8+2sAdxlF7OE28>3u|w6Zb%KAkCBHEL3?FXSie^CLRGml{g_;U_q^m!g z-@tDWd>O!WA*LbqzQ5BWs1>0@RT2f)gllz`xC532XTY-H47de#`YOSn+c-DSPW#`~ z>PETGu&fVOInR0SW?2#qQ|q@6RabI? zbP^EFhyPSIrqpo?ZLU#_cB)ZohINUmajK@M#yR(A)dXF-1jHm=8pDq<{#yaEK26oN z41o{5L=4Fus39|;uMyKLtzdjpXrI(RUD#KZD!2vt#I!F!%|jO2R}gM~o^;^}=iweKJYC>+{{gL~ B5h(xw delta 439 zcmY+9y-UMT6vgi=3elpIv(&UjT@*jSs*}=sZZJErZdu#sL)piIRj*a+m6_ej zCZzMT2n<#MHi}CldH7&PdOUn($M!EdD~%e%a8oV>pHqv|P&CG%Q7){S>osewoa=*3 zSTV-otTeYgzjB|OO|V;4tA5Th?W(|*P>zpoECjS{j;+{rNu$lVrZ5B^2f}mgi11m7 zxI-{GHB;H#+1)!dPt6O{HQ&u|b0nY3C$!h23`|b+K9+We1j#0l){f%TgiiQmbKQg> z#iA{{=u;OXg^rSuCu4$G`cl0}Od?7rGN%TD;oYjf0-T;bhfu00%}8=0;=sMo$MD6A zoHp_O2D+Xg3?oknQ~^m;$wuv@P-=vJhve2tTIp^N=Bik7NU=5sT5%QrGpGM)b;U9) RGq>=-27lSf!Sw-i{s3~u><|C| diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..9f32bb3 --- /dev/null +++ b/test.txt @@ -0,0 +1,195 @@ +MORE(1) User Commands MORE(1) + +NAME + more - display the contents of a file in a terminal + +SYNOPSIS + more [options] file ... + +DESCRIPTION + more is a filter for paging through text one screenful at a time. This + version is especially primitive. Users should realize that less(1) + provides more(1) emulation plus extensive enhancements. + +OPTIONS + Options are also taken from the environment variable MORE (make sure to + precede them with a dash (-)) but command-line options will override + those. + + -d, --silent + Prompt with "[Press space to continue, 'q' to quit.]", and display + "[Press 'h' for instructions.]" instead of ringing the bell when an + illegal key is pressed. + + -l, --logical + Do not pause after any line containing a ^L (form feed). + + -e, --exit-on-eof + Exit on End-Of-File, enabled by default if POSIXLY_CORRECT + environment variable is not set or if not executed on terminal. + + -f, --no-pause + Count logical lines, rather than screen lines (i.e., long lines are + not folded). + + -p, --print-over + Do not scroll. Instead, clear the whole screen and then display the + text. Notice that this option is switched on automatically if the + executable is named page. + + -c, --clean-print + Do not scroll. Instead, paint each screen from the top, clearing + the remainder of each line as it is displayed. + + -s, --squeeze + Squeeze multiple blank lines into one. + + -u, --plain + Suppress underlining. This option is silently ignored as backwards + compatibility. + + -n, --lines number + Specify the number of lines per screenful. The number argument is a + positive decimal integer. The --lines option shall override any + values obtained from any other source, such as number of lines + reported by terminal. + + -number + A numeric option means the same as --lines option argument. + + +number + Start displaying each file at line number. + + +/string + The string to be searched in each file before starting to display + it. + + -h, --help + Display help text and exit. + + -V, --version + Print version and exit. + +COMMANDS + Interactive commands for more are based on vi(1). Some commands may be + preceded by a decimal number, called k in the descriptions below. In + the following descriptions, ^X means control-X. + + h or ? + Help; display a summary of these commands. If you forget all other + commands, remember this one. + + SPACE + Display next k lines of text. Defaults to current screen size. + + z + Display next k lines of text. Defaults to current screen size. + Argument becomes new default. + + RETURN + Display next k lines of text. Defaults to 1. Argument becomes new + default. + + d or ^D + Scroll k lines. Default is current scroll size, initially 11. + Argument becomes new default. + + q or Q or INTERRUPT + Exit. + + s + Skip forward k lines of text. Defaults to 1. + + f + Skip forward k screenfuls of text. Defaults to 1. + + b or ^B + Skip backwards k screenfuls of text. Defaults to 1. Only works with + files, not pipes. + + ' + Go to the place where the last search started. + + = + Display current line number. + + /pattern + Search for kth occurrence of regular expression. Defaults to 1. + + n + Search for kth occurrence of last regular expression. Defaults to + 1. + + !command or :!command + Execute command in a subshell. + + v + Start up an editor at current line. The editor is taken from the + environment variable VISUAL if defined, or EDITOR if VISUAL is not + defined, or defaults to vi(1) if neither VISUAL nor EDITOR is + defined. + + ^L + Redraw screen. + + :n + Go to kth next file. Defaults to 1. + + :p + Go to kth previous file. Defaults to 1. + + :f + Display current file name and line number. + + . + Repeat previous command. + +ENVIRONMENT + The more command respects the following environment variables, if they + exist: + + MORE + This variable may be set with favored options to more. + + SHELL + Current shell in use (normally set by the shell at login time). + + TERM + The terminal type used by more to get the terminal characteristics + necessary to manipulate the screen. + + VISUAL + The editor the user prefers. Invoked when command key v is pressed. + + EDITOR + The editor of choice when VISUAL is not specified. + + POSIXLY_CORRECT + Disable exit-on-eof (see option -e for more details). + +HISTORY + The more command appeared in 3.0BSD. This man page documents more + version 5.19 (Berkeley 6/29/88), which is currently in use in the Linux + community. Documentation was produced using several other versions of + the man page, and extensive inspection of the source code. + +AUTHORS + Eric Shienbrood, UC Berkeley. + + Modified by Geoff Peck, UCB to add underlining, single spacing. + + Modified by John Foderaro, UCB to add -c and MORE environment variable. + +SEE ALSO + less(1), vi(1) + +REPORTING BUGS + For bug reports, use the issue tracker at + https://github.com/util-linux/util-linux/issues. + +AVAILABILITY + The more command is part of the util-linux package which can be + downloaded from Linux Kernel Archive + . + +util-linux 2.39.3 2023-11-21 MORE(1) From 2d2bae6f9605ed2d6a99a3068415b13367e2a37f Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Sun, 4 Feb 2024 02:33:02 -0500 Subject: [PATCH 2/7] Finish err handling code --- more.S | 62 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/more.S b/more.S index 4b67277..68281ef 100644 --- a/more.S +++ b/more.S @@ -180,16 +180,17 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A LDA #0 ;PREPARE STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE -:OPENFILE JSR PRODOS +* +* OPEN FILE +* + JSR PRODOS DB OPENCMD DA OPENPRMS - BEQ :OPEN_OK - JSR ERRPROC - JMP :FREEOBUF + BNE :OPENERR * * COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE * -:OPEN_OK LDA OPENFNUM + LDA OPENFNUM STA READFNUM STA CLOSFNUM * @@ -197,10 +198,8 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH * LDA #1 ;ONE 256 BYTE BUFFER JSR GETBUFR ;CALL BASIC.SYSTEM SUB - BCC :RBUF_OK ;CARRY CLR MEANS NO ERROR - JSR ERRPROC - JMP :CLOSFILE -:RBUF_OK STA RBADDR+1 ;STORE HI-BYTE + BCS :RBUFERR ;CARRY CLR MEANS NO ERROR + STA RBADDR+1 ;STORE HI-BYTE LDA #0 ;0 FOR LO-BYTE STA RBADDR ;STORE IT STA ZP.A1L ;AGAIN, FOR 0-PAGE INDIRECTION @@ -211,11 +210,16 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH * * CLEANUP * -:FREERBUF JSR FREEBUFR ;FREE READ BUFFER + JSR FREEBUFR ;FREE READ BUFFER + JMP :CLOSFILE ;SKIP OVER READ BUF ERR HANDLER + +:RBUFERR JSR ERRPROC ;HANDLE ERR GETTING READ BUF + :CLOSFILE JSR PRODOS ;CLOSE THE FILE DB CLOSCMD DA CLOSPRMS - BCC FREEOBUF + BEQ :FREEOBUF + :OPENERR JSR ERRPROC :FREEOBUF JSR FREEBUFR ;FREE OPEN I/O BUFFER JMP :END @@ -371,12 +375,12 @@ ERASEBAR ******************************** * * * ERROR HANDLER * -* INPUT PARAM: ERRCODE * +* INPUT PARAM: A HOLDS ERRCODE * * * ******************************** ERRPROC - LDA ERRCODE + STA ERRCODE CMP #0 BEQ :NOERR CMP #EOFERR @@ -394,23 +398,21 @@ ERRPROC * * ******************************** -PROMPT .DA #5 ;LENGTH BYTE - .AS "FILE:" - -ERRTXT .DA #6 ;LENGTH BYTE - .AS "ERROR:" - -BAR .DA #42 - .AS '[RET] NEXT LINE / [SPC] NEXT PAGE / [Q]UIT' - -FILENAME .BS $FF -ERRCODE .BS 1 -READERR .BS 1 -CLOSERR .BS 1 -LINENUM .BS 1 -USRQUIT .BS 1 -BUFCHAR .BS 1 -USRCHAR .BS 1 +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] LINE [SPC] PAGE [Q]UIT' +USRQUIT DS 1 +BUFCHAR DS 1 +USRCHAR DS 1 ENVIEW STR 'ENTERING VIEWFILE' EXVIEW STR 'EXITING VIEWFILE' From d564d8d7dd21412b53992c8aaba94d91e2997539 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Sun, 4 Feb 2024 16:54:44 -0500 Subject: [PATCH 3/7] Fix runtime errors --- more.S | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/more.S b/more.S index 68281ef..4581638 100644 --- a/more.S +++ b/more.S @@ -169,15 +169,17 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH >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 + BNE CONT1 ;USER JUST PRESSED RETURN + JMP :END +CONT1 CPIN FILENAME ;COPY "IN" BUF TO FILENAME * * GET FILE I/O BUFFER FOR OPEN CALL * LDA #4 ;FOUR 256 BYTE PAGES = 1KB JSR GETBUFR ;GET BUF FROM BASIC.SYSTEM - BCS :OBUFERR ;CARRY CLEAR MEANS NO ERROR - STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A + BCC CONT2 + JMP :OBUFERR ;CARRY CLEAR MEANS NO ERROR +CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A LDA #0 ;PREPARE STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE * @@ -198,8 +200,9 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH * LDA #1 ;ONE 256 BYTE BUFFER JSR GETBUFR ;CALL BASIC.SYSTEM SUB - BCS :RBUFERR ;CARRY CLR MEANS NO ERROR + BCS :RBUFERR ;CARRY SET MEANS ERROR STA RBADDR+1 ;STORE HI-BYTE + STA ZP_A1H ;FOR 0-PAGE INDIRECTION LDA #0 ;0 FOR LO-BYTE STA RBADDR ;STORE IT STA ZP.A1L ;AGAIN, FOR 0-PAGE INDIRECTION @@ -220,7 +223,15 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH DA CLOSPRMS BEQ :FREEOBUF -:OPENERR JSR ERRPROC +:OPENERR STA ERRCODE + PUTS OERRMSG + PUTS FILENAME + LDA #"'" + JSR COUT + LDA #":" + JSR COUT + LDA ERRCODE + JSR ERRPROC :FREEOBUF JSR FREEBUFR ;FREE OPEN I/O BUFFER JMP :END :OBUFERR JSR ERRPROC @@ -414,6 +425,8 @@ USRQUIT DS 1 BUFCHAR DS 1 USRCHAR DS 1 +OERRMSG STR "FAILED TO OPEN FILE '" + ENVIEW STR 'ENTERING VIEWFILE' EXVIEW STR 'EXITING VIEWFILE' ENSTATB STR 'ENTERING STATUSBAR' @@ -448,5 +461,3 @@ CLOSFNUM .BS 1 * MUST START ON PAGE BOUNDRY *OPENBUF DS 1024 *READBUF DS BUFSIZE - -: From 903b810f1b3808a7ee07bb8336c86c9f36f90ed9 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Mon, 5 Feb 2024 13:14:58 -0500 Subject: [PATCH 4/7] Added error messages --- .gitignore | 2 +- more.S | 312 ++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 274 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index 70196dc..d20a2e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ MORE MORE.dsk _FileInformation.txt - +*.swp diff --git a/more.S b/more.S index 4581638..36e7ec5 100644 --- a/more.S +++ b/more.S @@ -31,7 +31,7 @@ FREEBUFR EQU $BEF8 ;FREE BUFFER * PRODOS ENTRY POINT -PRODOS EQU $BF00 ;MACHINE LANG IFACE (MLI) +PRODOS_MLI EQU $BF00 ;MACHINE LANG IFACE (MLI) * MEMORY LOCATIONS * @@ -60,8 +60,8 @@ BUFSIZE .EQ $00FF SCR.HGHT .EQ 24 ;SCREEN HEIGHT * * DEBUGGING -* -TRACE .EQ 0 + +TRACE EQU 1 ******************************** * * @@ -169,30 +169,38 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH >PUTS PROMPT JSR GETLN1 ;LENGTH IN X, CR AT END CPX #0 ;IS THE LENGTH ZERO? - BNE CONT1 ;USER JUST PRESSED RETURN - JMP :END -CONT1 CPIN FILENAME ;COPY "IN" BUF TO FILENAME + BNE :CONT1 ;USER JUST PRESSED RETURN + JMP END +:CONT1 CPIN FILENAME ;COPY "IN" BUF TO FILENAME + + DO TRACE + JSR PRSTRBYTES + JSR GETLN + FIN * * GET FILE I/O BUFFER FOR OPEN CALL * LDA #4 ;FOUR 256 BYTE PAGES = 1KB JSR GETBUFR ;GET BUF FROM BASIC.SYSTEM - BCC CONT2 - JMP :OBUFERR ;CARRY CLEAR MEANS NO ERROR -CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A + BCC :CONT2 ;CARRY CLEAR MEANS NO ERROR + JSR OBUFERR + JMP END +:CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A LDA #0 ;PREPARE STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE * * OPEN FILE * - JSR PRODOS + JSR PRODOS_MLI DB OPENCMD DA OPENPRMS - BNE :OPENERR + BEQ CONT3 + JSR OPENERR + JMP :FREEOBUF * * COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE * - LDA OPENFNUM +CONT3 LDA OPENFNUM STA READFNUM STA CLOSFNUM * @@ -200,8 +208,10 @@ CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A * LDA #1 ;ONE 256 BYTE BUFFER JSR GETBUFR ;CALL BASIC.SYSTEM SUB - BCS :RBUFERR ;CARRY SET MEANS ERROR - STA RBADDR+1 ;STORE HI-BYTE + BCC CONT4 + JSR RBUFERR ;CARRY SET MEANS ERROR + JMP :CLOSFILE +CONT4 STA RBADDR+1 ;STORE HI-BYTE STA ZP_A1H ;FOR 0-PAGE INDIRECTION LDA #0 ;0 FOR LO-BYTE STA RBADDR ;STORE IT @@ -214,16 +224,30 @@ CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A * CLEANUP * JSR FREEBUFR ;FREE READ BUFFER - JMP :CLOSFILE ;SKIP OVER READ BUF ERR HANDLER -:RBUFERR JSR ERRPROC ;HANDLE ERR GETTING READ BUF - -:CLOSFILE JSR PRODOS ;CLOSE THE FILE +:CLOSFILE JSR PRODOS_MLI ;CLOSE THE FILE DB CLOSCMD DA CLOSPRMS BEQ :FREEOBUF + JSR CLOSERR -:OPENERR STA ERRCODE +:FREEOBUF JSR FREEBUFR ;FREE OPEN I/O BUFFER +END NOP + RTS + +******************************** +* * +* END OF MAIN - PROGRAM EXIT * +* * +******************************** + +******************************** +* * +* HANDLE ERROR WHEN OPENING * +* FILE * +* * +******************************** +OPENERR STA ERRCODE PUTS OERRMSG PUTS FILENAME LDA #"'" @@ -232,12 +256,101 @@ CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A JSR COUT LDA ERRCODE JSR ERRPROC -:FREEOBUF JSR FREEBUFR ;FREE OPEN I/O BUFFER - JMP :END -:OBUFERR JSR ERRPROC -:END NOP RTS +******************************** +* * +* HANDLE ERROR WHEN CLOSING * +* FILE * +* * +******************************** +CLOSERR STA ERRCODE + PUTS CERRMSG + PUTS FILENAME + LDA #"'" + JSR COUT + LDA #":" + JSR COUT + LDA ERRCODE + JSR ERRPROC + RTS + +******************************** +* * +* HANDLE ERROR WHEN REQUESTING * +* READ BUFFER * +* * +******************************** +RBUFERR STA ERRCODE + PUTS RBERRMSG + LDA #":" + JSR COUT + LDA ERRCODE + JSR ERRPROC + RTS + +******************************** +* * +* HANDLE ERROR WHEN REQUESTING * +* READ BUFFER * +* * +******************************** +OBUFERR STA ERRCODE + PUTS OBERRMSG + LDA #":" + JSR COUT + LDA ERRCODE + JSR ERRPROC + RTS + +******************************** +* * +* PRINT "IN" BUFFER * +* * +******************************** +PRINT_IN + PUSHY + LDA #"X" + JSR COUT + LDA #"=" + JSR COUT + TXA + JSR PRBYTE + JSR CROUT + + LDY #0 +:LOOP CPY #255 + BEQ :ENDLOOP + LDA IN,Y + JSR PRBYTE + LDA #" " + JSR COUT + INY + JMP :LOOP +:ENDLOOP JSR CROUT + POPY + RTS + +******************************** +* * +* PRINT STRING BYTES * +* * +******************************** +PRSTRBYTES + PUSHY + LDY #0 +:LOOP CPY #255 + BEQ :ENDLOOP + LDA FILENAME,Y + JSR PRBYTE + LDA #" " + JSR COUT + INY + JMP :LOOP +:ENDLOOP JSR CROUT + POPY + RTS + ******************************** * * * VIEW FILE SUB * @@ -250,7 +363,7 @@ VIEWFILE FIN SET1 LINENUM ;INIT LINE NUMBER -:LOOP JSR PRODOS ;CALL PRODOS TO READ FILE +:LOOP JSR PRODOS_MLI ;CALL PRODOS TO READ FILE DB READCMD ;SPECIFY PRODOS READ COMMAND DA READPRMS ;READ PARAMETERS BNE :READERR @@ -298,7 +411,7 @@ WRITEBUF .3 >POPY DO TRACE - >PUTS EXVIEW + PUTS EXWRITEBUF FIN RTS @@ -393,14 +506,105 @@ ERASEBAR ERRPROC STA ERRCODE CMP #0 - BEQ :NOERR - CMP #EOFERR - BEQ :NOERR - PUTS ERRTXT + BNE :EEOF + JMP :END +:EEOF CMP #EOFERR + BNE :E01 + JMP :END +:E01 CMP #1 + BNE :E04 + PUTS E01MSG +:E04 CMP #4 + BNE :E25 + PUTS E04MSG +:E25 CMP #$25 + BNE :E27 + PUTS E25MSG +:E27 CMP #$27 + BNE :E28 + PUTS E27MSG +:E28 CMP #$28 + BNE :E2B + PUTS E28MSG +:E2B CMP #$2B + BNE :E2E + PUTS E2BMSG +:E2E CMP #$2E + BNE :E40 + PUTS E2EMSG +:E40 CMP #$40 + BNE :E42 + PUTS E40MSG +:E42 CMP #$42 + BNE :E43 + PUTS E42MSG +:E43 CMP #$43 + BNE :E44 + PUTS E43MSG +:E44 CMP #$44 + BNE :E45 + PUTS E44MSG +:E45 CMP #$45 + BNE :E46 + PUTS E45MSG +:E46 CMP #$46 + BNE :E47 + PUTS E46MSG +:E47 CMP #$47 + BNE :E48 + PUTS E47MSG +:E48 CMP #$48 + BNE :E49 + PUTS E48MSG +:E49 CMP #$49 + BNE :E4A + PUTS E49MSG +:E4A CMP #$4A + BNE :E4B + PUTS E4AMSG +:E4B CMP #$4B + BNE :E4C + PUTS E4BMSG +:E4C CMP #$4C + BNE :E4D + PUTS E4CMSG +:E4D CMP #$4D + BNE :E4E + PUTS E4DMSG +:E4E CMP #$4E + BNE :E50 + PUTS E4EMSG +:E50 CMP #$50 + BNE :E51 + PUTS E50MSG +:E51 CMP #$51 + BNE :E52 + PUTS E51MSG +:E52 CMP #$52 + BNE :E53 + PUTS E52MSG +:E53 CMP #$53 + BNE :E55 + PUTS E53MSG +:E55 CMP #$55 + BNE :E56 + PUTS E55MSG +:E56 CMP #$56 + BNE :E57 + PUTS E56MSG +:E57 CMP #$57 + BNE :E5A + PUTS E57MSG +:E5A CMP #$5A + BNE :E_UNK + PUTS E5AMSG + JMP :END +:E_UNK PUTS E_UNK_MSG + LDA #":" + JSR COUT LDA ERRCODE - JSR PRBYTE - JSR CROUT -:NOERR NOP + JSR PRBYTE +:END JSR CROUT RTS ******************************** @@ -412,23 +616,53 @@ ERRPROC 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] LINE [SPC] PAGE [Q]UIT' USRQUIT DS 1 BUFCHAR DS 1 USRCHAR DS 1 -OERRMSG STR "FAILED TO OPEN FILE '" +OERRMSG STR "FAILED TO OPEN FILE '" +CERRMSG STR "FAILED TO CLOSE FILE '" +RBERRMSG STR "REQUEST FOR READ BUFFER FAILED" +OBERRMSG STR "REQUEST FOR OPEN BUFFER FAILED" + +E00MSG STR "NO ERROR" +E01MSG STR "BAD SYSTEM CALL NUMBER" +E04MSG STR "BAD SYSTEM CALL PARAMETER COUNT" +E25MSG STR "INTERRUPT TABLE FULL" +E27MSG STR "I/O ERROR" +E28MSG STR "NO DEVICE CONNECTED" +E2BMSG STR "DISK WRITE PROTECTED" +E2EMSG STR "DISK SWITCHED" +E40MSG STR "INVALID PATHNAME" +E42MSG STR "MAXIMUM NUMBER OF FILES OPEN" +E43MSG STR "INVALID REFERENCE NUMBER" +E44MSG STR "DIRECTORY NOT FOUND" +E45MSG STR "VOLUME NOT FOUND" +E46MSG STR "FILE NOT FOUND" +E47MSG STR "DUPLICATE FILENAME" +E48MSG STR "VOLUME FULL" +E49MSG STR "VOLUME DIRECTORY FULL" +E4AMSG STR "INCOMPATIBLE FILE FORMAT OR PRODOS DIRECTORY" +E4BMSG STR "UNSUPPORTED STORAGE TYPE" +E4CMSG STR "END OF FILE ENCOUNTERED" +E4DMSG STR "POSITION OUT OF RANGE" +E4EMSG STR "FILE ACCESS ERROR OR FILE LOCKED" +E50MSG STR "FILE IS OPEN" +E51MSG STR "DIRECTORY STRUCTURE DAMAGED" +E52MSG STR "NOT A PRODOS VOLUME" +E53MSG STR "INVALID SYSTEM CALL PARAMETER" +E55MSG STR "VOLUME CONTROL BLOCK TABLE FULL" +E56MSG STR "BAD BUFFER ADDRESS" +E57MSG STR "DUPLICATE VOLUME" +E5AMSG STR "FILE STRUCTURE DAMAGED" +E_UNK_MSG STR "UNKNOWN ERROR CODE" ENVIEW STR 'ENTERING VIEWFILE' EXVIEW STR 'EXITING VIEWFILE' +EXWRITEBUF STR 'EXITING WRITEBUF' ENSTATB STR 'ENTERING STATUSBAR' EXSTATB STR 'EXITING STATUSBAR' ENERASEB STR 'ENTERING ERASEBAR' From 7c803937dab832697f36695a03a646eac81ed125 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Wed, 7 Feb 2024 03:15:27 -0500 Subject: [PATCH 5/7] Add breaks to switch statement --- more.S | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/more.S b/more.S index 36e7ec5..6d9294a 100644 --- a/more.S +++ b/more.S @@ -61,7 +61,7 @@ SCR.HGHT .EQ 24 ;SCREEN HEIGHT * * DEBUGGING -TRACE EQU 1 +TRACE EQU 0 ******************************** * * @@ -508,97 +508,156 @@ ERRPROC CMP #0 BNE :EEOF JMP :END + :EEOF CMP #EOFERR BNE :E01 JMP :END + :E01 CMP #1 BNE :E04 PUTS E01MSG + JMP :END + :E04 CMP #4 BNE :E25 PUTS E04MSG + JMP :END + :E25 CMP #$25 BNE :E27 PUTS E25MSG + JMP :END + :E27 CMP #$27 BNE :E28 PUTS E27MSG + JMP :END + :E28 CMP #$28 BNE :E2B PUTS E28MSG + JMP :END + :E2B CMP #$2B BNE :E2E PUTS E2BMSG + JMP :END + :E2E CMP #$2E BNE :E40 PUTS E2EMSG + JMP :END + :E40 CMP #$40 BNE :E42 PUTS E40MSG + JMP :END + :E42 CMP #$42 BNE :E43 PUTS E42MSG + JMP :END + :E43 CMP #$43 BNE :E44 PUTS E43MSG + JMP :END + :E44 CMP #$44 BNE :E45 PUTS E44MSG + JMP :END + :E45 CMP #$45 BNE :E46 PUTS E45MSG + JMP :END + :E46 CMP #$46 BNE :E47 PUTS E46MSG + JMP :END + :E47 CMP #$47 BNE :E48 PUTS E47MSG + JMP :END + :E48 CMP #$48 BNE :E49 PUTS E48MSG + JMP :END + :E49 CMP #$49 BNE :E4A PUTS E49MSG + JMP :END + :E4A CMP #$4A BNE :E4B PUTS E4AMSG + JMP :END + :E4B CMP #$4B BNE :E4C PUTS E4BMSG + JMP :END + :E4C CMP #$4C BNE :E4D PUTS E4CMSG + JMP :END + :E4D CMP #$4D BNE :E4E PUTS E4DMSG + JMP :END + :E4E CMP #$4E BNE :E50 PUTS E4EMSG + JMP :END + :E50 CMP #$50 BNE :E51 PUTS E50MSG + JMP :END + :E51 CMP #$51 BNE :E52 PUTS E51MSG + JMP :END + :E52 CMP #$52 BNE :E53 PUTS E52MSG + JMP :END + :E53 CMP #$53 BNE :E55 PUTS E53MSG + JMP :END + :E55 CMP #$55 BNE :E56 PUTS E55MSG + JMP :END + :E56 CMP #$56 BNE :E57 PUTS E56MSG + JMP :END + :E57 CMP #$57 BNE :E5A PUTS E57MSG + JMP :END + :E5A CMP #$5A BNE :E_UNK PUTS E5AMSG JMP :END + :E_UNK PUTS E_UNK_MSG LDA #":" JSR COUT From 7291a3bf3d7e7c2f683a9425c6b8a3fda15de808 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Sat, 10 Feb 2024 11:26:12 -0500 Subject: [PATCH 6/7] Added copyright & license --- more.S | 85 +++++++++++++++++++++++++++++++++++------------ prodos-2.0.3.dsk | Bin 143360 -> 143360 bytes 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/more.S b/more.S index 6d9294a..62630be 100644 --- a/more.S +++ b/more.S @@ -32,12 +32,17 @@ FREEBUFR EQU $BEF8 ;FREE BUFFER * PRODOS ENTRY POINT PRODOS_MLI EQU $BF00 ;MACHINE LANG IFACE (MLI) +* +* MEMORY MAPPED I/O: $C000 - $CFFF +* +RD80VID EQU $C01F ;<=128->40COL, >128->80COL +* +* SLOT 3 SCRATCHPAD RAM - TEXT PAGE 0 SCREEN HOLE +* http://yesterbits.com/media/books/apple/heiserman-1983-intermediate-level-apple-ii-handbook.pdf +* +OURCH EQU $057B ;80-COL HORIZ CURSOR POSITION +OURCV EQU $05FB ;VERTICAL CURSOR POSITION -* MEMORY LOCATIONS -* -OURCH .EQ $057B ;80-COL HORIZ CURSOR POSITION -OURCV .EQ $05FB ;VERTICAL CURSOR POSITION -* * ZERO-PAGE ADDRESSES * ZP.A1L .EQ $3C ;MONITOR GENERAL PURPOSE @@ -166,11 +171,21 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH * * GET FILE NAME * - >PUTS PROMPT + PUTS INFOLINE + JSR CROUT +:ASKFILE PUTS PROMPT JSR GETLN1 ;LENGTH IN X, CR AT END CPX #0 ;IS THE LENGTH ZERO? - BNE :CONT1 ;USER JUST PRESSED RETURN - JMP END + BNE :CONT0 ;USER JUST PRESSED RETURN + JMP :END + +:CONT0 CPX #1 + BNE :CONT1 + LDA #"?" + CMP IN + BNE :CONT1 + JSR HELPINFO + JMP :ASKFILE :CONT1 CPIN FILENAME ;COPY "IN" BUF TO FILENAME DO TRACE @@ -184,7 +199,7 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH JSR GETBUFR ;GET BUF FROM BASIC.SYSTEM BCC :CONT2 ;CARRY CLEAR MEANS NO ERROR JSR OBUFERR - JMP END + JMP :END :CONT2 STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A LDA #0 ;PREPARE STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE @@ -194,13 +209,14 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH JSR PRODOS_MLI DB OPENCMD DA OPENPRMS - BEQ CONT3 + BEQ :CONT3 JSR OPENERR - JMP :FREEOBUF + JSR FREEBUFR ;CLEAN UP BEFORE TRY AGAIN + JMP :ASKFILE * * COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE * -CONT3 LDA OPENFNUM +:CONT3 LDA OPENFNUM STA READFNUM STA CLOSFNUM * @@ -208,10 +224,10 @@ CONT3 LDA OPENFNUM * LDA #1 ;ONE 256 BYTE BUFFER JSR GETBUFR ;CALL BASIC.SYSTEM SUB - BCC CONT4 + BCC :CONT4 JSR RBUFERR ;CARRY SET MEANS ERROR JMP :CLOSFILE -CONT4 STA RBADDR+1 ;STORE HI-BYTE +:CONT4 STA RBADDR+1 ;STORE HI-BYTE STA ZP_A1H ;FOR 0-PAGE INDIRECTION LDA #0 ;0 FOR LO-BYTE STA RBADDR ;STORE IT @@ -224,7 +240,9 @@ CONT4 STA RBADDR+1 ;STORE HI-BYTE * CLEANUP * JSR FREEBUFR ;FREE READ BUFFER - +* +* Close file +* :CLOSFILE JSR PRODOS_MLI ;CLOSE THE FILE DB CLOSCMD DA CLOSPRMS @@ -232,7 +250,7 @@ CONT4 STA RBADDR+1 ;STORE HI-BYTE JSR CLOSERR :FREEOBUF JSR FREEBUFR ;FREE OPEN I/O BUFFER -END NOP +:END NOP RTS ******************************** @@ -241,6 +259,25 @@ END NOP * * ******************************** +******************************** +* * +* PROGRAM INFO AND HELP * +* * +******************************** +HELPINFO JSR CROUT + PUTS INFO0 + JSR CROUT + PUTS INFO1 + JSR CROUT + PUTS INFO2 + JSR CROUT + PUTS INFO3 + JSR CROUT + PUTS INFO4 + JSR CROUT + JSR CROUT + RTS + ******************************** * * * HANDLE ERROR WHEN OPENING * @@ -250,8 +287,6 @@ END NOP OPENERR STA ERRCODE PUTS OERRMSG PUTS FILENAME - LDA #"'" - JSR COUT LDA #":" JSR COUT LDA ERRCODE @@ -672,6 +707,12 @@ ERRPROC * * ******************************** +INFOLINE STR "ENTER [?] FOR PROGRAM INFO AND HELP" +INFO0 STR "MORE - PAGES THROUGH TEXT FILE" +INFO1 STR "COPYRIGHT (C) 2024 BILL CHATFIELD" +INFO2 STR "DISTRIBUTED UNDER THE GPL VERSION 3" +INFO3 STR "https://github.com/gungwald/prodos-more" +INFO4 STR "PRESS RETURN TO QUIT" PROMPT STR "FILE:" ERRTXT STR "ERROR:" FILENAME DS $FF @@ -682,10 +723,10 @@ USRQUIT DS 1 BUFCHAR DS 1 USRCHAR DS 1 -OERRMSG STR "FAILED TO OPEN FILE '" -CERRMSG STR "FAILED TO CLOSE FILE '" -RBERRMSG STR "REQUEST FOR READ BUFFER FAILED" -OBERRMSG STR "REQUEST FOR OPEN BUFFER FAILED" +OERRMSG STR "CANNOT OPEN " +CERRMSG STR "CANNOT CLOSE " +RBERRMSG STR "CANNOT CREATE READ BUFFER" +OBERRMSG STR "CANNOT CREATE FILE BUFFER" E00MSG STR "NO ERROR" E01MSG STR "BAD SYSTEM CALL NUMBER" diff --git a/prodos-2.0.3.dsk b/prodos-2.0.3.dsk index 68443432a2677baaf7546f69e1f9fcdcb6030235..770279bd742e4c8a22f5214c3c7615f75ded620a 100644 GIT binary patch delta 34670 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 delta 15434 zcma)j3tUrIw)aUw!bu1a2xtVv4TyqN#YZcnj<1$!?2Ua{`>>yFFrWcN#77_4&PiJi zavcwoj-4tNZH&ZnlrX_QuCb*sTAYMYdhFCY#d}+w)>5Z4WzMv9+B$9d{`(w2Y-fJo zmq^ZjtiAWzYpuOr`{=pIdM>gdRu?ze#Uu`@pO>w=zw38twcl~643o#aew1G9h$Jw5`K;0jqy!(cP7 zfhB2T7(PY?yAP|r;tEZp(=9K)=bojv-@1GV(vYIjFcxNHI^EE8H{WsR1Jjlj56|~) zD!?X=fN5B{ZB~MImquH#OBGxlmMmVr^yX>H zA6R}*@iNRdxb`K@vl^{GVY%O_Nx5-O(NE^ioBz`V3l}Y3a`P?4KfBew^kt3yuNwc| z+FiG7v}+r(b~S9=w9BGBdq+&9`<-q*{W;3M)BW4G-syg~Ln)l>eYb<+Ipx8-i|<)Q zZZE$79^zPfdoh_#9$bFs%|k7BF1}T1xog#mrS|}OSK`JTUGmJ?SnhibXWwJ@F{j(I zWm6>FmQ6nU&Y{n8w-EDpQJ=($8X=hNn41+9P#!x}J}dnR?S0u~5dfWg>>?v<)2nkB zMIUB}IF@E9jp!B*XDbVA&!P)#&!P*g!MNbzY;yiP(y*(ybS5@=2lpOE^r^5o| zuqFazs=m9($dB%^H#B5norWwqA^34qn|966_bzR`mXf?6p9 z!R%l#J8F|mWN-*LCgOOLdVFbnuAjTs#BKO- z+k-!Dvj4d0#veCj|F|jf`X-yx$Fx5|Nfy`s^FGEXaWN6;Z%%N!?cMvx$;o~TSPOoE z@~@YYKi(H;l2cmel-BPtdW5N^kZ8{vrJ*b@OGO5yvB5c|QLU5^{B5aZ40h47mVe0R z?0vmddh5s1)cn|+f1s;~S^Pw?*;h&&lR1oP{cS0Uo8(WXqLv~jkA@;|ml!D)4c!`<6$kglmhT%^-edWsf$h4#|A;dr7LWsyZF~qMIWB5mX%+3Y(?Ob@DpKV`vo6HU@xKGjz zEWEEr`aB~2rGNdYN2QN#PMkX7z0&X@H-8}fnw$5BPr3Pn;W{^87k=K&Zx8>&&2I?z zyN!jyg_(Go@M(Lm^dcBz^zh9b_`g&4aG2?AWZsBKU$xEX?3me^zcE@UEkmJjOdt@| zNK*obqy<6JDU9h1W_1cn)lZ32SK29OV){6K0p?8mE_VoN5?~=hCc-S z^p%34l1@^)R~?;C*vjU;q3qzo`_33Dy=jsuxZu7s`bw`wPN?0FGKQcJqv|cc59%x9 z4VBRP7uR9d=KU1sr4NMUW@XVB5u!#{bu6wddu&VDhSIW9!c~@4R#kTiv6TV3dO(Aj z#FacF26zpOMs?RArdgvBPG8A0K|>|4fjHiOaiyHs6_6*k&gcxQ{E{cuTfX#J!e6Wh zaq2B!4a8Os5lF^q+TdsE0(FOAi1-)i09iP=uC|)2=N<^%8a%iz8j>u{)xrFgQfx49 zWz^$+rN0Jb5VehK+#vry++tzlBW`px9&!V!@il1S##8jC&MkH}KJOkVbCb^dDdiNp z$rI`={|LrbN_u}L`6L^(5BL(r!A7>cF|8cPIrkjyDV)-=#?664|L8bH4df#gP$JCM ziqL(2ZSa>B@9(OR^*xra3+)#*AnEfJ!EF`sPgKM|S<$?=%OcO;K~ZCXTJVtyircmd zirW(vz%BS>1&|BW0=WPW_PhJ{4m?tE>QV6CPysvB`!J)^)KqA6aKy%O8WR(E zi5`vojY5CL@F6(UUm?v_R+|ALtZ`#8oCz#;ZQr5|tDYdZe>~y+Rp`W$lZ# zJ}^jTai~rGKFQGkV(p&V#>nY1xAcjR5k36#9KV~gP$OBPSqj;}^A=O>^O7O3+oG-A ztpHv`IVSKtzuP%T2AM(KAY=0lwpW+y_}aiGo~K;gSP_a1_CCx%Drp|6TEDfjj7(?l zEZOWTSx<)Q%q@2;C$px_BBkY<*O7bga1dtehIJdN9-X~GX<`(ALb%%^mwS8HO0uJ4txpeUqVMgs(i~9KuK_r~Vkua3nrw*{dM8BZ zdfDh=@7U;rA*(vnz)Jrs&PDk$CJ^g6I4Hm%bVE?XMw6u6pq7m$N|`|eD^$((F+|Gs zYt?zjF>;bJh4iIghbGdow#X?iM3YGNt-lj$v+_=x6YMwOuWob4-`5KLYdfy26+T(( zXF3>JHqb?-E6#6>wkd1fZugy=s&2W1TTZGrY$@NcwQL$8c@ql@^O^X?gesX$kCQbe za`PWW$E4E%C153F71LahHt@8X7>#HxQ<> z1iyDLUN(&>+4@-d`tlM?u2i>h7_oTc#`R@nnYw22V;f60Y%Z@Ff{(wwijguv2K0khN_L#n>KIR z`pBb?JzfLl^4Ttpb8t8)h*P|rHpB^<;i$mue-lB1hKs)GH3r^~$~Z{RB@VD=$P z?YL~Z&6^~~pbafWWgn`Lo>H;ZRyo$({gG53`0&gav-c@SXF^NV0q2op&9c$Q1hKHz z=Wz4yyZI0HIBE6Mz=wjt9Qa6xH3O|5uhyfi_SW!fp5ws^v$Q*CG)E<`*VEcWSl=MI znCJ{zsRoP-Cb3bi_c8gw(5+FeY>evUtZ0m^;hbc=IhblJ`m>q!Z@=N?Wf0^Z5UNf2RX$h{Cx2q#EMVz3-DYh*78fl zIR0iENjlk98z)YGzcx;ez1&b6x34y?)o+p$TD#-w<;=eBIEnjuXLlST!tS_G+~r8P zn}Rr=NdW8)n=|l%J&peW1PHuu2Q8XdbCc1GZOUdbW{CFtFPlIbAI^uzo_nJa7we2{9q=nMUs65UK1 z6Xe*aL*D9WkB1-t1FRi1nECgEv1a~*qwnV@wiHzw%s|Jh8;CW7T(IcU+OmXRn@|;^ITIoN85E=dT=HN#rIhSY?yd;#4 zO}1qiJ2L1xi}2Xj9oK^;PRE0l?eXL*bErTal?x*8TxFDvkfp{|#(L>1aZmvIM}an- zP)BAY3{%sFg9dTbIS$6RQ4MkLwkLnid7gUunOeSXd;Ndz_{C14;g{ZLf3@qmUq8Ql zPvhPfn)dB~(RaXqusLw(r55q_ovVFzAc^oFQl@TX%`2+w+9C8*n57WsU_TJ;=d1{H}QiPVU%VVR{Nf51SxgkKa${wUV8KQN#VaI z*~1?swYafF^QB0aRl4j;@iSs7U6QW5(oUMbb=N3m<%fh)$)m{*b5e|fe&}z(RD9@9 zj3Jgan&J~J=tL>rl9Z^Yg=v?WYrbjJq+!M7k2Bubi*8zuHcoEOv@($zQCF+mkJt6%)!P@DpB| zz*vlNrubC0aK_A8vv0gN+XJ=;MOU0dG;xqM{ z$(hqK=V#h788+3F8aq^7kjcaX)AZ>Jn=&b8H(LFf8}QA}F{HAodS+SX-I@O$Kd=4!t7%-?=joV#RJFtOHJ{P|Bxni>a+y2}@Zq(|P<$*k>9n$Xh#rUmt zZ`O7m4ji`+uNF&1LF>!xViEr;#hCDC14 z=1`fwJ=vopVrJkt|IWm7g=vRQoIiB(eA{2f*PUql>-ajX{p^XWbtkXZaVOmTaVNM; z`Mm^R`g~Y@S~JA&1Pd!NcJfeZ(>S&%jV01Xa$wFVIff6NE!y}TC%G+yyjv}nk;qsQ zy9x9&26|*YS&?CL7C8@n-{8zRG}us*;cRne)P3Jpl2JEER~5O;;~C=6-+MPKn#!h| zCR6Q6ZJlc095rO5A(TzI(HhD|e<*uMb&F>HgsA6FLRUq_TlgNrjBx_VK&Ra%rtnnW z`#Wv;b*J&l^HeAKHiI4jN@q?iP$=$a#YIJA+RxzAXdqOj=bWv5u3Aaw$V`vM<58M! zC;P1Ks9x37un%=tI44Zf2=QFti&YZFUgK{uO7Qc)TI?tSxScAV1(AJ4_|<7mXj{m zOILggSBgdqy1<|CSa-;mR)S!AY~`rJO+rW8Hhpt0`M$UY-p~bOb1v#sG5X@kAIApH z(TxOpus%d*toQ^v&@VoTCsZWan;NX5w+%YS)%0LxHi=Yub&ikH$wz6*UPuigzs*OI zc4`LN0kSSzNMeKQvxQ_9;DVJ6Zpao=s5>((Kqyva2MH@#f>|tP?oNYfTe+x4zJ>fV zO_>GMI_!u^qjcS!Mah?^PM*R_g`_@%_y}_UyEBmcH-H&fR@jhD?#lMkA{}HMHAvKf z&tKVL`=rmo?5EmT%#AMs{8>DiotK9W^Q_h@1IiVg?@` zSe@ZB_^sm2WZHO;Q0K5_K(dskwJHTK2i}p=VHH3KaT1#RQ^h>`_=%X0hiCFiAcigi zCYhiEI3{rR*%Og)ohzTi^R2VqFXhi`z%+7oin6jCPd?tLlt^*8C(*A#6qCb}G3%5z z6hUipv`Rgg#GZ@8PZc9}Sd|Sq1BDQh2%nNcyej$tbkXC`MYrQ`gKVU_8h2zKt*EiDZ0>n;qb`W4q;Rmd-;ews@6yd9M6vlX&aek8Ff@sn6_KZuX>;REd{(fS4Pop+&U_ADicCo=epI^ z+%--y6NUv=B?dY|;|zYs%7p_nI+0ct>AgVkdzM}o46?%HPW3uK)FC(y@i!yMa*Oy1 zUrf%8f%m%Py)nYmT?1e0P%hi*a;~4mbuzOUW)VZ(R)3-|PRzj8S2iDSe~rp9_76{3 z<$F!Bf);ppt~hWSh$(0*C^w&KKY^?1osrs8p6%FG_Zc}>>F|86j3HZ6gR4rVF^5j~ z=Qihx>Xs?1jgWX`)$7-A3YM-Lm@dmdgG?8S z`J7WscK}@*ex8{9?Nob_`KJq(94M&1;l{!(wuL#yNl)fIz4#BQ+!*pMSMAf({@y>P z?zFg!KLaz`D?$Xw(iCjHG=gIZUml3K-EdK9hm&@onR*Qat4jG^2o&5Nk>!66V|!Yh zhe<}@pfh4&J+Ih2nj%G=V^q_sQfKL@KrhbDM=SUfT=>!o{$%M}rQMFrDN6g{j>^sa ziH;4M`IBgZ+%^CH&}mSoR4x+E2(a zVA2(gww1lzea5SIi-R6c>yH=%hR{`#;>__hOo?F( zE#ckn5r&MKMjT^AGvGRf5_ZuT`)mT zHdt>@zB{?E_?hA(siD+;)=&)StEI|?9w+-AQ%j`%*x~y2V@h~Nmva`;{X=sekX^B3OA}@2IX)6@xbx9-R)j&>G7gvSl1WwTtR?`Xz67dE!{NSHXKFG zjkbGZ>vzsp+K;KQLv1ST%V=Y|jGjZ>aVaT!47Pm9glI_q22qQ{V2!@))p|Zd{m+O| zupGQmh{ZX0YS13rpgr2CXGi@$YR2F!pnkdGmFni)ov&6qVbSf1HJ2u|?lV z#>S1=NYbOpW_#)&o!+?4lU2IBCKdcvlaVy3wKzPiR%fZpFp0#r4!xgi^k&AEmB@HDbQdZNh=?RG*?pjW7yjb*8?oxiaHA7e=I z$AN_6$f!uXFoMKE6^UvU31Xs15L0wIN3kF#6$xTekk~YW#E_S!AVEymkSL55+o2y2 zksigvozLBdk1^!`36v2U$d}UtQF+FxsN<$-G+aV9MEt2b>1EZ!h7LV2$BBe77kesN z$Wpj{R?oZe+GZ9~J2kB^^t<4!LSc5H=s^?OXAQUihW6(ahF%KJF1*&-7@S%tKZmHN_DR_ob-uPi*cXug~$%f>l2N zG;Ja&V=xg@rr|Z%OYhV|sm)O^JyUKQ#TiNo#Vr4 zQM_8P`f)63b51;kZO}J%?y3{Rp#Xy^5 zYqhv1qwG0XOefYzW&4%I63U4JpJ|^?(u>E@hVp3ADBgTArf8006ZUK8AdMay z0MEr-DUPpi2(B`=Abic|8qd2Bris&q^DeZd34Ja^o`@I7Q&Su*@Zgj}rvlTQOU4%=$V~(AH3NXL z2JvZ(b^K+DO03Y7&MDz3uTN2kxLQOc__~S68 zN>QT}hj~&*XD-aama7WrJEh|x29DNzHTKn^M2s{PZ_P(OLygK?^JNpF^3cy|NNz?* z&JD%np-OD;x`4brA9<3{OvK$tp@eQZFUE|VfU6cWaysJl2$C~MISd~NPd<4s-xGyD zs3g;dVjgPmJg?9nFk{wl&qr(XRF;|KHrA4DeeT*XN z&AV$BXp*=u@`j}S7b82nmd?69b4dlBC_#Q}K9xw_FxL*u!RvI}^gaW^4Ke~_yIvq4bRK@ia?-~YgPl;%7pdl_dE+Z$Vp|T2w*pdN#NV@vnUn>QoloR7 zY|Hb+Dfu|Ha(<(wSqKSF=3i?raaeI+KzfOdyXvqF{w>d|X&XwlDP|<|6a%u;*>9Nb<)E4YFHHKoIUr7|?`)LlWCZ^Ehz1$csvU80xg3vmTvF z(p0)6Y7X_#m+l;86CKY@q=)bS^X!RFVG;>_K^yCSZ~M zh!GjZyQyV`35Y;-UCTMzTGBLMzpK4NUO0>camBwojBH+f+w? zMY%}9=>@b zcBO_6M&|eH9OW`~NSXb7L~Q=w%Ivv`PCw}Yy?ZR*AYuL^7YA;yuE?XYvB;v=_!;;7 zeHQle#VqevEAyPVZq{VurDAP1lJBCQRtPFidk>O0F|rAghuaUG+vXIlpuW3k_zk(O zoTBgN15Y(JOQ1O)a&iv!_#Fr4z@<7chnWt`oyfdG?Kcu`_>9n6Tz4IX|BWl-EgYi9 zkX^ws8m32r5>1WxGP|E&pt2r^^X)Fhm;W5T{B{@I`GG!H|5=Y^6hxik>MLO}T?lWD(UlaR^?sFu zm+_wk-nE}!8GP4HZ<=bZhL*xJ{u}gqp9>*wi>ldQG%9hx=MWk@)uz|Q=F~^fUG>D1 ztc7mUKf}u+zd}z^k+b>iPIyu36c0g|7G0rDi1LSL#kOb*UKvqaE>eke3fpGFaN|+{ zE2RN#xMWg{IJU?cK9r@=XL5+rKWM~!(%%t2?g~9GTxeUzwlMhPxI@D#UTL&clH23sN$MbYGO>kU05MAP$RoSTT!g zja~E9SY%|jA#D9t80QF#AQC(Ld4zwWL2=zhR(Yu4h!Hl-_r}plR3x~0Bv!>n6(;(| zm;U@p$Go{p2=Fto9-$w97QJ&NTmM-_fX@3Z9rT5fef6#$%ayAhLdWW)+X82!tTzV7 z=IjW>b_D{8L75)jDV3ojk3o#Z)5f|v;l#Y)iFx)sMXnUFQfLFox;z(G&ot|XsIym{7Q%)4Oc05Jx2QQeo=GP?Zk927vS2IBo^tJu)3|G%68PN$(m?}Z z=d+jbf28~0@l9OJar5|a(RDKvAyTa$N>EtEVyc=j;C~=*V(!qC zeRRq~vSp6qh^fXBM6L+Mh|l6!ZKa%h%GLU`>v|CJ5p?_@qoce;u@~>9D7Uo`7hLQh zy@R;$I<-UFKzPq5c2QCj7H&VQBr8PHC%GhD#PYSD2}`bhlIwB=Zw`Ff@V3h-jvbm6 zT-*PxbEQ(Np~bnj@&|#8Q{-a#T&#NS?SxdX?1ZKn$%{;6TXR{z9&7n$HNd+al^ro) z=c@Q!OL~}mF~|prIOU2GqX#Rd#!)o~7q^8jMG$4HEjW>_e8wd_;|k_-Y-O!WsCCug zy;jUN2}+6>ipcI#^4^?CSE?Mha)8J72I^d%HW1-@b5SJe91qTc$@sg-Qjd>a={bwc z{EtYd9)Q%MAm{q*DP>)c>$9invL0?MPLEaT0Y*=`g6IK4PrJmo;TgF2lR@6qT1Od4 zjlIfhaSLVeGp^QJ*EvZ?X5FX+z%(AAz9vm+Mf_Sdr=`BDq-MDMvuK;MiE}l1Tuo28 znjjys+>OJI*AI-0a!vgpr5o&w0e4vYtWMC4qL|A9Kd35!b3s!Hn2dKd)w!CUaW&Nr z(Rdto^)L6Uq{cMzMCckqQ)G)Ai8mprHp5Kg%9|>=2kAEAXfQp?Zvw|v;#rlHmu&Xw z5Z&OWgeJaxIw%+TLQilbXZYWTUSmgvUe~e=S7(nt>Nu|Szde}jII2rE74C|a!Z)*r z{!@v3=9}4aLcQe+F^6iP;5W02ob=b`WJJ9NEDzB4136@?m6X6J@uN1$7Th*dcw{Eh zKc1~Ky*j+E*7}gKYr2$#RL?_n2z|%R`(^JcqiW7+x(gMWjx);8a~r*=5i^RX1I8Xu4MOe*w!heMSHP From 7b76c77080cc1eb35f85f1579851d4bf41210885 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Thu, 15 Feb 2024 10:29:51 -0500 Subject: [PATCH 7/7] Added memory map comments --- more.S | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/more.S b/more.S index 62630be..3124f3c 100644 --- a/more.S +++ b/more.S @@ -5,10 +5,26 @@ * * ******************************** -* DSK MORE ;WRITE ASSEMBLED FILE TO DISK -* TYP $06 ;$FF=SYSTEM, $06=BINARY - .OR $2000 ;ASSEMBLE START ADDRESS +* Memory Map * +* $0000 - $00FF Zero Page +* $0100 - $01FF Stack +* $0200 - $03FF Mostly Free, Input Buffer, Interrupt Vectors +* $0400 - $07FF Lo-res/Text Page1 +* $0800 - $0BFF Lo-res/Text Page2 (BASIC programs load here) +* $0C00 - $1FFF Free +* $2000 - $3FFF Hi-res Page1 +* $4000 - $5FFF Hi-res Page2 +* $6000 - $95FF Free +* $9600 - $BFFF DOS3.3 and Buffers +* $C000 - $CFFF Soft Switches, Expansion Card I/O and ROM +* $D000 - $F7FF BASIC ROM (can be bankswitched later models) +* $F800 - $FFFF Machine Language Monitor ROM (also can be bankswitched) + + DSK MORE ;WRITE ASSEMBLED FILE TO DISK + TYP $06 ;$FF=SYSTEM, $06=BINARY + ORG $2000 ;ASSEMBLE START ADDRESS + * SYSTEM VARIABLES * IN .EQ $200 ;256-CHAR INPUT BUF