Start to convert to S-C assembler syntax

This commit is contained in:
Bill Chatfield 2024-01-31 23:49:58 -05:00
parent c7ca984275
commit 678c29acd3
2 changed files with 110 additions and 116 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.swp

View File

@ -1,69 +1,65 @@
pr#1
:p
******************************** ********************************
* * * *
* MORE - UN*X MORE COMMAND * * MORE - UN*X MORE COMMAND *
* ASSEMBLES WITH MERLIN * * ASSEMBLES WITH S-C *
* * * *
******************************** ********************************
DSK MORE ;WRITE ASSEMBLED FILE TO DISK * DSK MORE ;WRITE ASSEMBLED FILE TO DISK
TYP $06 ;$FF=SYSTEM, $06=BINARY * TYP $06 ;$FF=SYSTEM, $06=BINARY
ORG $2000 ;ASSEMBLE START ADDRESS .OR $2000 ;ASSEMBLE START ADDRESS
*
* SYSTEM VARIABLES * SYSTEM VARIABLES
*
IN EQU $200 ;256-CHAR INPUT BUF IN .EQ $200 ;256-CHAR INPUT BUF
*
* SUBROUTINES IN MONITOR ROM: $F800 - $FFFF * SUBROUTINES IN MONITOR ROM: $F800 - $FFFF
*
RDKEY EQU $FD0C ;READS A CHARACTER RDKEY .EQ $FD0C ;READS A CHARACTER
GETLN EQU $FD6A ;READS A LINE, WITH PROMPT($33) GETLN .EQ $FD6A ;READS A LINE, WITH PROMPT($33)
GETLN1 EQU $FD6F ;READS A LINE, NO PROMPT GETLN1 .EQ $FD6F ;READS A LINE, NO PROMPT
CROUT EQU $FD8E CROUT .EQ $FD8E
COUT EQU $FDED COUT .EQ $FDED
PRBYTE EQU $FDDA PRBYTE .EQ $FDDA
*
* SUBROUTINES IN BASIC.SYSTEM ROM: * SUBROUTINES IN BASIC.SYSTEM ROM:
*
GETBUFR EQU $BEF5 ;ALLOCATE BUFFER, DESTROYS X & Y GETBUFR .EQ $BEF5 ;ALLOCATE BUFFER, DESTROYS X & Y
FREEBUFR EQU $BEF8 ;FREE BUFFER FREEBUFR .EQ $BEF8 ;FREE BUFFER
*
* PRODOS ENTRY POINT * PRODOS ENTRY POINT
*
MLI EQU $BF00 MLI .EQ $BF00
*
* MEMORY LOCATIONS * MEMORY LOCATIONS
*
OURCH EQU $057B ;80-COL HORIZ CURSOR POSITION OURCH .EQ $057B ;80-COL HORIZ CURSOR POSITION
OURCV EQU $05FB ;VERTICAL CURSOR POSITION OURCV .EQ $05FB ;VERTICAL CURSOR POSITION
*
* ZERO-PAGE ADDRESSES * ZERO-PAGE ADDRESSES
*
ZP_A1L EQU $3C ;MONITOR GENERAL PURPOSE ZP.A1L .EQ $3C ;MONITOR GENERAL PURPOSE
ZP_A1H EQU $3D ;MONITOR GENERAL PURPOSE ZP.A1H .EQ $3D ;MONITOR GENERAL PURPOSE
*
* PRODOS COMMAND CODES * PRODOS COMMAND CODES
*
OPENCMD EQU $C8 OPENCMD .EQ $C8
READCMD EQU $CA READCMD .EQ $CA
CLOSCMD EQU $CC CLOSCMD .EQ $CC
*
* CONSTANTS * CONSTANTS
*
EOFERR EQU $4C ;ERROR CODE FOR END-OF-FILE EOFERR .EQ $4C ;ERROR CODE FOR END-OF-FILE
PTR EQU $06 ;ONLY FREE 0-PAGE LOCATION PTR .EQ $06 ;ONLY FREE 0-PAGE LOCATION
MAXERCDE EQU $5A ;LARGEST ERROR CODE MAXERCDE .EQ $5A ;LARGEST ERROR CODE
CR EQU $0D ;ASCII CARRIAGE RETURN CR .EQ $0D ;ASCII CARRIAGE RETURN
CR_HIBIT EQU $8D ;CARRIAGE RET WITH HIGH BIT SET CR.HIBIT .EQ $8D ;CARRIAGE RET WITH HIGH BIT SET
BUFSIZE EQU $00FF BUFSIZE .EQ $00FF
SCR_HGHT EQU 24 ;SCREEN HEIGHT SCR.HGHT .EQ 24 ;SCREEN HEIGHT
*
* DEBUGGING * DEBUGGING
*
TRACE EQU 0 TRACE .EQ 0
******************************** ********************************
* * * *
@ -72,10 +68,10 @@ TRACE EQU 0
* * * *
******************************** ********************************
PUSHY MAC PUSHY .MA
TYA TYA
PHA PHA
<<< .EM
******************************** ********************************
* * * *
@ -84,10 +80,10 @@ PUSHY MAC
* * * *
******************************** ********************************
POPY MAC POPY .MA
PLA PLA
TAY TAY
<<< .EM
******************************** ********************************
* * * *
@ -99,20 +95,20 @@ POPY MAC
* * * *
******************************** ********************************
CPIN MAC CPIN .MA
PUSHY ;SAVE Y PUSHY ;SAVE Y
STX ]1 ;COPY LENGTH TO FIRST BYTE OF ]1 STX ]1 ;COPY LENGTH TO FIRST BYTE OF ]1
LDY #0 ;INIT Y TO ZERO LDY #0 ;INIT Y TO ZERO
LOOP CPY ]1 ;COMPARE Y WITH LENGTH BYTE :1 CPY ]1 ;COMPARE Y WITH LENGTH BYTE
BEQ ENDLOOP ;DONE IF LENGTH IS REACHED BEQ :2 ;DONE IF LENGTH IS REACHED
LDA IN,Y ;LOAD IN[Y] INTO ACCUMULATOR LDA IN,Y ;LOAD IN[Y] INTO ACCUMULATOR
CMP #CR ;COMPARE WITH CARRIAGE RETURN CMP #CR ;COMPARE WITH CARRIAGE RETURN
BEQ ENDLOOP ;STOP AT CARRIAGE RETURN BEQ :2 ;STOP AT CARRIAGE RETURN
INY ;DEST STR IS 1 AHEAD OF IN BUF INY ;DEST STR IS 1 AHEAD OF IN BUF
STA ]1,Y ;COPY CHAR TO DEST STR ]1 STA ]1,Y ;COPY CHAR TO DEST STR ]1
JMP LOOP ;LOOP TO NEXT CHAR JMP :1 ;LOOP TO NEXT CHAR
ENDLOOP POPY ;RESTORE Y :2 POPY ;RESTORE Y
<<< .EM
******************************** ********************************
* * * *
@ -122,17 +118,17 @@ ENDLOOP POPY ;RESTORE Y
* * * *
******************************** ********************************
PUTS MAC PUTS .MA
PUSHY PUSHY
LDY #0 ;INIT LOOP INDEX LDY #0 ;INIT LOOP INDEX
LOOP CPY ]1 ;HAS STR LENGTH BEEN REACHED :1 CPY ]1 ;HAS STR LENGTH BEEN REACHED
BEQ ENDLOOP ;IF SO THEN FINISH BEQ :2 ;IF SO THEN FINISH
INY ;MOVE TO INDEX OF NEXT CHAR INY ;MOVE TO INDEX OF NEXT CHAR
LDA ]1,Y ;GET THE CHAR TO BE WRITTEN LDA ]1,Y ;GET THE CHAR TO BE WRITTEN
JSR COUT ;WRITE THE CHARACTER JSR COUT ;WRITE THE CHARACTER
JMP LOOP ;LOOP JMP :1 ;LOOP
ENDLOOP POPY :2 POPY
<<< .EM
******************************** ********************************
* * * *
@ -142,20 +138,20 @@ ENDLOOP POPY
* * * *
******************************** ********************************
SET1 MAC SET1 .MA
LDA #1 LDA #1
STA ]1 STA ]1
<<< .EM
SET0 MAC SET0 .MA
LDA #0 LDA #0
STA ]1 STA ]1
<<< .EM
SET23 MAC SET23 .MA
LDA #23 LDA #23
STA ]1 STA ]1
<<< .EM
******************************** ********************************
* * * *
@ -171,14 +167,14 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH
PUTS PROMPT PUTS PROMPT
JSR GETLN1 ;LENGTH IN X, CR AT END JSR GETLN1 ;LENGTH IN X, CR AT END
CPX #0 ;IS THE LENGTH ZERO? CPX #0 ;IS THE LENGTH ZERO?
BEQ :END ;USER JUST PRESSED RETURN BEQ END ;USER JUST PRESSED RETURN
CPIN FILENAME ;COPY "IN" BUF TO FILENAME CPIN FILENAME ;COPY "IN" BUF TO FILENAME
* *
* GET FILE I/O BUFFER FOR OPEN CALL * GET FILE I/O BUFFER FOR OPEN CALL
* *
LDA #4 ;FOUR 256 BYTE PAGES = 1KB LDA #4 ;FOUR 256 BYTE PAGES = 1KB
JSR GETBUFR ;GET BUF FROM BASIC.SYSTEM JSR GETBUFR ;GET BUF FROM BASIC.SYSTEM
BCS :ERRFWDR ;CARRY SET INDICATES AN ERROR BCS ERRFWDR ;CARRY SET INDICATES AN ERROR
STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A STA OBUFADDR+1 ;GETBUFR RETURNS HIBYTE IN A
LDA #0 ;PREPARE LDA #0 ;PREPARE
STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE STA OBUFADDR ;LOBYTE IS 0 B/C ADDR OF PAGE
@ -188,7 +184,7 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH
JSR MLI JSR MLI
DB OPENCMD DB OPENCMD
DA OPENPRMS DA OPENPRMS
BNE :ERRFWDR BNE ERRFWDR
* *
* COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE * COPY FILE NUMBER FROM OPEN PARAMETERS TO READ AND CLOSE
* *
@ -200,12 +196,12 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH
* *
LDA #1 ;ONE 256 BYTE BUFFER LDA #1 ;ONE 256 BYTE BUFFER
JSR GETBUFR ;CALL BASIC.SYSTEM SUB JSR GETBUFR ;CALL BASIC.SYSTEM SUB
BCS :ERRFWDR ;CARRY SET MEANS ERROR BCS ERRFWDR ;CARRY SET MEANS ERROR
STA RBADDR+1 ;STORE HI-BYTE STA RBADDR+1 ;STORE HI-BYTE
STA ZP_A1H ;AGAIN, FOR 0-PAGE INDIRECTION STA ZP.A1H ;AGAIN, FOR 0-PAGE INDIRECTION
LDA #0 ;0 FOR LO-BYTE LDA #0 ;0 FOR LO-BYTE
STA RBADDR ;STORE IT STA RBADDR ;STORE IT
STA ZP_A1L ;AGAIN, FOR 0-PAGE INDIRECTION STA ZP.A1L ;AGAIN, FOR 0-PAGE INDIRECTION
* *
* PRINT THE FILE * PRINT THE FILE
* *
@ -230,17 +226,17 @@ MAIN CLD ;CLEAR DECIMAL FLG, AVOID CRASH
* *
LDA READERR ;RELOAD THE READ RESULT CODE LDA READERR ;RELOAD THE READ RESULT CODE
CMP EOFERR ;WAS IT AN EOF "ERROR" CMP EOFERR ;WAS IT AN EOF "ERROR"
BEQ :END ;EOF IS NOT REALLY AN ERROR BEQ END ;EOF IS NOT REALLY AN ERROR
CMP #0 CMP #0
BNE :ERRFWDR BNE ERRFWDR
LDA CLOSERR LDA CLOSERR
BNE :ERRFWDR BNE ERRFWDR
JMP :END JMP END
* *
* FINISH * FINISH
* *
:ERRFWDR JSR ERRPROC ERRFWDR JSR ERRPROC
:END NOP END NOP
RTS RTS
******************************** ********************************
@ -255,17 +251,17 @@ VIEWFILE
FIN FIN
SET1 LINENUM ;INIT LINE NUMBER SET1 LINENUM ;INIT LINE NUMBER
:LOOP JSR MLI ;CALL PRODOS TO READ FILE .1 JSR MLI ;CALL PRODOS TO READ FILE
DB READCMD ;SPECIFY PRODOS READ COMMAND DB READCMD ;SPECIFY PRODOS READ COMMAND
DA READPRMS ;READ PARAMETERS DA READPRMS ;READ PARAMETERS
STA READERR ;SAVE RESULT OF READ OPERATION STA READERR ;SAVE RESULT OF READ OPERATION
BNE :ENDLOOP ;IF ERROR THEN END SUB BNE .2 ;IF ERROR THEN END SUB
JSR WRITEBUF ;WRITE TO SCREEN WHAT WAS READ JSR WRITEBUF ;WRITE TO SCREEN WHAT WAS READ
LDA #1 ;PREPARE FOR NEXT OP LDA #1 ;PREPARE FOR NEXT OP
CMP USRQUIT ;IF USER WANTS TO QUIT, THEN CMP USRQUIT ;IF USER WANTS TO QUIT, THEN
BEQ :ENDLOOP ;EXIT THE LOOP BEQ .2 ;EXIT THE LOOP
JMP :LOOP ;ELSE, GET THE NEXT BUFFER JMP .1 ;ELSE, GET THE NEXT BUFFER
:ENDLOOP NOP .2 NOP
RTS RTS
******************************** ********************************
@ -277,8 +273,8 @@ VIEWFILE
WRITEBUF WRITEBUF
PUSHY PUSHY
LDY #0 ;INIT CHAR COUNTER VARIABLE LDY #0 ;INIT CHAR COUNTER VARIABLE
:LOOP CPY READCNT ;COMPARE TO MAX CHARS .1 CPY READCNT ;COMPARE TO MAX CHARS
BEQ :ENDLOOP BEQ .3
LDA (ZP_A1L),Y ;GET CHAR FROM BUFFER LDA (ZP_A1L),Y ;GET CHAR FROM BUFFER
ORA #%10000000 ;TURN ON HIGH BIT FOR PRINTING ORA #%10000000 ;TURN ON HIGH BIT FOR PRINTING
JSR COUT ;COUT PRESERVES ACCUM JSR COUT ;COUT PRESERVES ACCUM
@ -286,22 +282,21 @@ WRITEBUF
* CHECK END OF LINE * CHECK END OF LINE
* *
CMP #CR_HIBIT ;COMPARE TO CARRIAGE RETURN CMP #CR_HIBIT ;COMPARE TO CARRIAGE RETURN
BNE :CONT ;IF NOT END OF LINE, NEXT CHAR BNE .2 ;IF NOT END OF LINE, NEXT CHAR
INC LINENUM ;NEXT LINE HAS BEEN REACHED INC LINENUM ;NEXT LINE HAS BEEN REACHED
* *
* CHECK AT END OF PAGE * CHECK AT END OF PAGE
* *
LDA LINENUM LDA LINENUM
CMP #SCR_HGHT ;AT BOTTOM OF SCREEN? CMP #SCR_HGHT ;AT BOTTOM OF SCREEN?
BNE :CONT ;NO? THEN NEXT CHAR BNE .2 ;NO? THEN NEXT CHAR
JSR STATBAR ;YES? THEN SHOW THE STATUS BAR JSR STATBAR ;YES? THEN SHOW THE STATUS BAR
LDA #1 ;SETUP FOR NEXT LINE LDA #1 ;SETUP FOR NEXT LINE
CMP USRQUIT ;DID USER ASK TO QUIT CMP USRQUIT ;DID USER ASK TO QUIT
BEQ :ENDLOOP ;YES? THEN END SUB BEQ .3 ;YES? THEN END SUB
:CONT INY ;STATBAR HAS ADJUSTED LINENUM .2 INY ;STATBAR HAS ADJUSTED LINENUM
JMP :LOOP JMP .1
:ENDLOOP NOP .3 POPY
POPY
DO TRACE DO TRACE
PUTS EXVIEW PUTS EXVIEW
@ -339,19 +334,19 @@ STATBAR
PUSHY PUSHY
PUTS BAR PUTS BAR
:LOOP JSR RDKEY ;GET A KEY FROM THE USER .1 JSR RDKEY ;GET A KEY FROM THE USER
CMP #" " ;CHECK IF SPACE ENTERED CMP #" " ;CHECK IF SPACE ENTERED
BNE :CHKCR ;IF NOT FORWARD TO NEXT CHECK BNE .2 ;IF NOT FORWARD TO NEXT CHECK
SET1 LINENUM ;ADVANCE ONE PAGE, STORE 1 SET1 LINENUM ;ADVANCE ONE PAGE, STORE 1
JMP :ENDLOOP ;PROCESSED SPACE SO DONE JMP .4 ;PROCESSED SPACE SO DONE
:CHKCR CMP #CR_HIBIT ;CHECK FOR CARRIAGE RETURN .2 CMP #CR_HIBIT ;CHECK FOR CARRIAGE RETURN
BNE :CHKQUIT BNE .3
SET23 LINENUM SET23 LINENUM
JMP :ENDLOOP JMP .4
:CHKQUIT CMP #"Q" ;USER WANTS TO QUIT .3 CMP #"Q" ;USER WANTS TO QUIT
BNE :LOOP ;NO RECOGNIZED INPUT BNE .1 ;NO RECOGNIZED INPUT
SET1 USRQUIT SET1 USRQUIT
:ENDLOOP JSR ERASEBAR .4 JSR ERASEBAR
POPY POPY
DO TRACE DO TRACE
@ -374,13 +369,13 @@ ERASEBAR
PUSHY PUSHY
SET0 OURCH ;RESET CURSOR TO BEG OF LINE SET0 OURCH ;RESET CURSOR TO BEG OF LINE
LDY #0 ;INIT COUNTER FOR SPACES LDY #0 ;INIT COUNTER FOR SPACES
:LOOP CPY BAR ;FIRST BYTE IS LENGTH .1 CPY BAR ;FIRST BYTE IS LENGTH
BEQ :ENDLOOP ;IF Y=LEN THEN DONE BEQ .2 ;IF Y=LEN THEN DONE
LDA #" " ;LOAD SPACE LDA #" " ;LOAD SPACE
JSR COUT ;WRITE TO SCREEN JSR COUT ;WRITE TO SCREEN
INY ;MAKE PROGRESS INY ;MAKE PROGRESS
JMP :LOOP ;LOOP TO NEXT CHAR JMP .1 ;LOOP TO NEXT CHAR
:ENDLOOP SET0 OURCH ;RESET CURSON TO BEG OF LINE .2 SET0 OURCH ;RESET CURSON TO BEG OF LINE
POPY POPY
DO TRACE DO TRACE
@ -453,9 +448,7 @@ CLOSFNUM DS 1
* BUFFERS * BUFFERS
* *
* CONSUME ALL BYTES UP TO THE NEXT PAGE BOUNDRY * CONSUME ALL BYTES UP TO THE NEXT PAGE BOUNDRY
FILLER DS \,$00 *FILLER DS \,$00
* MUST START ON PAGE BOUNDRY * MUST START ON PAGE BOUNDRY
*OPENBUF DS 1024 *OPENBUF DS 1024
*READBUF DS BUFSIZE *READBUF DS BUFSIZE
: