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