robotron/RRTEXT.ASM

551 lines
15 KiB
NASM
Executable File

OPT NOL
LIB RRFRED INCLUDE THE TEMP GUY
OPT LIS
* SPECIAL CHARACTER NAMES
SPACE EQU $3A
EXPT EQU $3B
COMMA EQU $3C
PERIOD EQU $3D
ARROW EQU $3E
BLANKR EQU ARROW BLOCK OF FF'S FOR BLANKING
COLON EQU $3F
HYPHEN EQU $40
LPAREN EQU $5B
RPAREN EQU $5C
FROB EQU $5D
SLASH EQU $5E
LASCAR EQU $5E LAST CHARACTER
CLRDEF EQU $11 COLOR 1 IS DEFAULT
ORG TXORG
JMP PRNT35
JMP PRNT57
JMP WORD35
JMP WORD57
JMP PRINIT
JMP EUGSCR
PRINIT PSHS A BE NICE TO THE CALLER
LDA #CLRDEF DEFAULT COLOR
STA TEXCOL PUT IT DOWN
PULS A
PRRST PSHS A
LDA #$7
STA TXFONT
CLR TXFLAV NO FLAVORS NOW
CLR TEXMFL LEFT MARGIN FLAVOR
CLR TXCLIP
LDA #1
STA TXLEAD LEAD ZERO BLANKING ON
STX TEXMAR SET CURRENT CURSOR POSITION AS LEFT MARGIN
PULS A,PC AND RETURN FOR NOW
PRNT35 PSHS D,Y,U
LDB #WDATA IN CASE OF LONG PHRASE AT START OR OTHER
STB WDOG
LDB #5
STB TXFONT
CMPA #$20 REAL SPACE
BNE PR3501 NO
LDA #SPACE THEN USE OUR RENDITION
PR3501 LDY TAB35
CMPA #LASCAR INVALID CALL
BHI PRNOPR THEN ABORT
SUBA #$30 GET A NICE OFFSET
BCS PRNOPR OUT OF RANGE
ASLA WORDS BABY.
LDY A,Y LOAD ADDRESS OF CHARACTER START.
LDA 0,Y GET WIDTH (IN PIXELS)
LSRA 1/2 MAKES BYTES
INCA GIVE EXTRA FOR FLAVORING COLUMN
EORA #4 BD
LDB #1 5 XOR 4 = 1
PSHS CC,Y SAVE CURRENT CONDITION CODE, DEST POINTER
SEI THEN SET
STD HORIZ
LEAY 1,Y NOW POINT AT DATA
STY ORIG SEND TO DMA (YES THE DMA!)
LDA TEXCOL GET THE CURRENT COLOR
STA CONST CONSTANTLY
STX DEST CURSOR IS WHERE ITS GOING
LDA #$1A
LDB TXFLAV CHECK OUT FLAVOR
BEQ PR3502
PR3555 LDA #$3A
PR3502 STA CONTRL
PULS CC,Y RESTORE INTERRUPT THE WAY WE WERE!
LDA 0,Y GET WIDTH BACK
INCA ADD THE SPACE
CLRB
LSRA BACK TO BYTES
LEAX D,X KICK X BYTES
BCC PRNOPR FLAVOR IS UNCHANGED
LDA TXFLAV CHECK FLAVOR
BEQ PRNOP1 IT WAS EVEN
LEAX $100,X EXTRA FOR FLAVOR OVER FLOW
CLRB
BRA PRNOP2
PRNOP1 LDB #$FF
PRNOP2 STB TXFLAV
PRNOPR PULS D,Y,U,PC
PRNT57 PSHS D,Y,U
LDB #WDATA
STB WDOG BONE ME
LDB #7
STB TXFONT
CMPA #$20 REAL SPACE
BNE PR570Z NO
LDA #SPACE THEN USE OUR RENDITION
PR570Z LDY TAB57
CMPA #LASCAR INVALID CALL
BHI PRNOPR THEN ABORT
SUBA #$30 GET A NICE OFFSET
BCS PRNOPR OUT OF RANGE
ASLA WORDS BABY.
LDY A,Y LOAD ADDRESS OF CHARACTER START.
LDA 0,Y GET WIDTH (IN PIXELS)
LSRA 1/2 MAKES BYTES
INCA GIVE EXTRA FOR FLAVORING COLUMN
EORA #4
LDB TXCLIP GET CLIP FACTOR
BLE CLNOC NEGATIVE OR ZERO, JUST ADD CLIP NUMBER
NEGB CLIP IS FROM TOP, SUBTRACT FROM 6
CLNOC ADDB #6 ADD CLIP TO 6
EORB #4 AND PLEASE THE SHIT OUT OF GREGGY
PSHS CC,Y SAVE INTERRUPT STATE, DATA POINTER
SEI
STD HORIZ
LEAY 1,Y NOW POINT AT DATA
LDB TXCLIP CHECK CLIP AGAIN
BLE CLNO1 START FROM TOP OF GUY IF ZERO OR NEG
EORA #4 GET BYTE WIDTH BACK
MUL FORM BYTES TO CLIP
LEAY B,Y AND START FROM THERE
CLNO1 STY ORIG SEND TO DMA (YES THE DMA!)
LDA TEXCOL GET THE CURRENT COLOR
STA CONST CONSTANTLY
STX DEST CURSOR IS WHERE ITS GOING
LDA #$1A
LDB TXFLAV CHECK OUT FLAVOR
BEQ PR3502
BRA PR3555 DO ODD FLAVOR AND REST LIKE 35
* PRNUM5, PRNUM7 - THESE ROUTINES WILL PRINT NUMBERS AT THE CURRENT
* CURSOR POSITION (BASED ON X AND TXFLAV) IN THE HEIGHT INDICATE
* BY THE ENTRYPOINT. THE NUMBERS ARE TO BE PASSED IN D.
* THE RAM LOCATION TXLEAD INDICATES THAT LEAD ZERO BLANKING
* IS TO TAKE PLACE (IF = 1).
PRNM25 CLR TXFLAV
PSHS D,Y,U
LDA #5
CLRB
BRA PRNM3
PRN25L CLR TXFLAV
PSHS D,Y,U
LDA #5
LDB #1
BRA PRNM3
PRN27L CLR TXFLAV
PSHS D,Y,U
LDA #7
LDB #1
BRA PRNM3
EUGSCR CLR TXFLAV
PSHS D,Y,U
LDB #7
STB TXFONT
LDB #2 BLANKING TYPE
STB TXLEAD
BSR PNUMHI
LDA ,S RESTORE A
BSR PNUMLO
PULS D,Y,U,PC
PRNM27 CLR TXFLAV
PSHS D,Y,U
LDA #7
CLRB
PRNM3 STA TXFONT
STB TXLEAD
LDA 0,S RESTORE A
BRA PRNM4
PRNUM2 PSHS D,Y,U
PRNM4 CLR TEXTP3 LEAD ZERO GUY
PRNM44 BSR PNUMHI HIGH HALF
INC TEXTP3
LDA 0,S
BSR PNUMLO
PULS D,Y,U,PC
PRNUM5 CLR TXFLAV
PSHS D,Y,U
LDA #5
CLRB
BRA PRNM0
PRNM5L CLR TXFLAV
PSHS D,Y,U
LDA #5
LDB #1
BRA PRNM0
PRNM7L CLR TXFLAV
PSHS D,Y,U
LDA #7
LDB #1
BRA PRNM0
PRNUM7 CLR TXFLAV
PSHS D,Y,U
LDA #7
CLRB
PRNM0 STA TXFONT
STB TXLEAD
LDA 0,S RESTORE A
BRA PRNM1
PRNUM PSHS D,Y,U
PRNM1 CLR TEXTP3 INDICATE THAT LEAD ZERO IN EFFECT
BSR PNUMHI HIGH HALF OF A
LDA 0,S
BSR PNUMLO LOW HALF OF A
LDA 1,S GET B
BSR PNUMHI HIGH HALF OF B
INC TEXTP3 KILL ZERO BLANKING
LDA 1,S GET B BACK
BSR PNUMLO
PULS D,Y,U,PC RESTORE AND RETURN
PNUMHI LSRA SHIFT HIGH HALF TO LOW
LSRA
LSRA
LSRA
PNUMLO ANDA #$0F KILL HIGH HALF FOR THIS ENTRYPOINT
BNE PRNTIM NOT ZERO....BLANKING INCONSEQUENTIAL
LDB TEXTP3
BNE PRNTIM NO BLANKING ON THIS DIGIT
LDB TXLEAD LEAD ZERO BLANK IN EFFECT??
BNE BLANZZ YEP....DON'T DO THIS DIGIT!
PRNTIM INC TEXTP3 TIME TO PRINT...NO MORE BLANKING
ADDA #$30 BASE OF FIRST NUMBER
LDB TXFONT FONT??
CMPB #7 LARGE
LBEQ PRNT57 ROUTINE TO PRINT 5 X 7 S
JMP PRNT35
BLANZZ CMPB #2 SPACE BLANKING??
BNE BLANZ1 YEP
LEAX $200,X PUSH FOR SMALL CHARACTER
LDB TXFONT
CMPB #5
BEQ BLANZ1
LEAX $100,X
BLANZ1 RTS
*****
* STRING PROCESSING
*****
* CONTROL CHARACTERS :
* NEWLINE - $1 WORTHLESS...DOES NOTHING .
* RETURN - $2 SAME AS NEWLINE
* LINE FEED - $3 SAME AS NEWLINE
* SET COLOR - $4 THIS WILL CAUSE THE PRINTING COLOR TO BE
* CHANGED TO THE BYTE FOLLOWING THIS
* HYPER CURSOR - $5 THIS WILL SET THE CURSOR TO THE -THREE-
* BYTE IMMEDIATE POSITION (CURSOR,FLAVOR) (RELATIVE)
* SET LEFT MARGIN - $6 THIS WILL SET THE LEFT MARGIN TO THE -THREE-
* BYTE IMMEDIATE POSITION (CURSOR,FLAVOR) (RELATIVE)
* SET LARGE FONT - $7 THIS WILL SET NEW FONT HEIGHT TO SEVEN PIXEL.
* SET SMALL FONT - $8 THIS WILL SET NEW FONT HEIGHT TO FIVE PIXEL.
* LEAD ZERO BLANK ON - $9
* LEAD ZERO BLANK OFF - $A
* 4 DIGIT NUMBER IMM. - $B FOLLOWED BY TWO BYTE NUMBER TO BE PRINTED
* 4 DIGIT NUMBER IND. - $C 4 DIGIT NUMBER STORED AT TWO BYTE SUPPLIED ADDR
* 2 DIGIT NUMBER IND. - $D 2 DIGIT NUMBER STORED IMMEDIATELY
* 2 DIGIT NUMBER IND. - $E 4 DIGIT ADDRESS OF 2 DIGIT NUMBER STORED
* SUBROUTINE - $F INVOKE A NEW PHRASE..2 BYTE ADDRESS IMMEDIATE
* 2 DIGIT NUMBER IN B - $10 PRINT THE 2 DIGIT NUMBER CONTAINED IN B.
* 4 DIGIT NUMBER IN Y - $11 PRINT THE 4 DIGIT NUMBER CONTAINED IN Y.
* CURSAB - $12 SET CURSOR AND FLAVOR TO THE IMMEDIATE OPERAND
* SET COLOR INDIRECT - $13 2 BYTE IMMEDIATE POINTS AT NEW COLOR
* CALL SUB, COND. - $14 CALL SUBROUTINE (2 BYTE IMM) IF COCKTAIL.
* SBLANK - $15 LEAD ZERO BLANK WITH SPACING FOR BLANKS
* CLIPB - $16 SET CLIP FACTOR TO WHATS PASSED IN B
* POSITIVE NUMBER CLIPS TOP [B] ROWS
* NEGATIVE NUMBER CLIPS BOTTOM -NEGB- ROWS
* ZERO KILLS CLIPPING
* MNEMONICS:
NEWLIN EQU 1
RETURN EQU 2
LINEFD EQU 3
COLOR EQU 4
CURSOR EQU 5
MARGIN EQU 6
LFONT EQU 7
SFONT EQU 8
ZBLANK EQU 9
NBLANK EQU $A
NUMIMM EQU $B
NUMIND EQU $C
NM2IMM EQU $D
NM2IND EQU $E
SUB EQU $F
NUMB EQU $10
NUMY EQU $11
CURSAB EQU $12
COLIND EQU $13
COKSUB EQU $14
SBLANK EQU $15
CLIPB EQU $16
* WORD35 - X GETS CURSOR POINTER. A GETS PHRASE NUMBER.
* TEXT WILL BE IN 3 X 5 FORMAT UNLESS
* CHANGED BY CONTROL COMMAND.
WRDENT PSHS D,U,Y ENTRYPOINT FOR NO SIZE DETERMINATION
BRA WORDZ
WORD35 CLR TXFLAV SAVE OPTIONAL COLOR
PSHS D,U,Y
LDB #5
BRA WRD571
WORD57 CLR TXFLAV
PSHS D,U,Y
LDB #7
WRD571 STB TXFONT
CLR TXCLIP KILL ANY CLIPPING AT START OF MESSAGE
IFNC &A,NO
WORDZ PSHS U,A
LDU #HCK1+88
LDB #$37
TST STATUS
BMI WRDZZ1
CMPB -88,U
BEQ WRDZZ1
LDA HSEED
CMPA #$30
BHI WRDZZ1
LDB SEED
LDA #$98
TFR D,U
COM ,U
WRDZZ1 PULS U,A
ELSE
WORDZ EQU *
ENDIF
TFR A,B MAKE 16 BITS
CLRA
ASLB
ROLA
LDY #PHRTAB PHRASE TABLE
LDY D,Y Y NOW HAS POINTER TO FIRST LETTER OF PHRASE
WRD572 LDA ,Y+
BEQ WRDRTS DONE
CMPA #$17 RANGE OF CONTROL CHARATERS (0-$16)
BCC WRD573 NORMAL TEXT CHARACTER
DECA TAKE ONE AWAY
ASLA DOUBLE THE SIZE
LDU #CCTAB CONTROL CHARACTER TABLE
LDU A,U GET THE ROUTINE
JSR ,U AND DO THE ROUTINE
BRA WRD572 NOW GET NEXT CHARACTER
WRD573 LDB TXFONT GET FONT SIZE
CMPB #7 7 PIXEL??
BNE WRD574 NOPE
JSR PRNT57 5 X 7
BRA WRD572
WRD574 JSR PRNT35 3 X 5
BRA WRD572
WRDRTS PULS D,U,Y,PC TIME TO RETURN
CCTAB FDB NEWLN
FDB RETRN
FDB LINFD
FDB COLRR
FDB CURSR
FDB MARGN
FDB LFONTT
FDB SFONTT
FDB ZBLNK
FDB NBLNK
FDB NMIMM
FDB NMIND
FDB NUM2IM
FDB NUM2IN
FDB SUBBER
FDB NUMBB
FDB NUMYY
FDB CURAB
FDB CLIND
FDB COCKSB
FDB SBLNK
FDB CLIPME
COCKSB LDA PIA3 COCKTAIL??
LBMI SUBBER THEN JUST HANDLE AS A SUBROUTINE
LDD ,Y++ ELSE JUST REMOVE ARG
RTS AND RETURN
NEWLN EQU * DUMMY....THESE ARE GARBAGE, AND NOT
* BROUGHT TO DATE FOR VERTICAL MOUNT
RETRN EQU *
LINFD EQU *
RTS
COLRR LDA ,Y+ PULL A CHARACTER FROM STREAM
STA TEXCOL AND MAKE IT THE CURRENT COLOR
RTS
CURSR TFR X,D WE NEED TO OPERATE ON CURSOR
ADDA ,Y
ADDB 1,Y
TFR D,X PUT IT BACK
TST 2,Y CHECK FLAVOR DELTA
BEQ CURSR3 NONE....BYE
TST ,Y TEST THE SIGN OF THE X PART OF THE CURSOR DELTA
BMI CURSR4
LDA TXFLAV
BEQ CURSR2
LEAX $100,X BUMP ONE MORE COLUMN
LDA #$FF
CURSR2 INCA
STA TXFLAV
BRA CURSR3
CURSR4 LDA TXFLAV
CMPA #1
BEQ CURSR5
LEAX -$100,X MOVE ONE TO THE LEFT
LDA #2
CURSR5 DECA
STA TXFLAV
CURSR3 LEAY 3,Y
RTS
CURAB LDX ,Y++ GET THE NEW ABSOLUTE CURSOR
LDA ,Y+ AND THE FLAVOR
STA TXFLAV
RTS AND RETURN
MARGN LDB TXFLAV
STB TEXMFL MAKE THE CURRENT FLAVOR THE MARGIN FLAVOR
STX TEXMAR AND THE CURSOR BECOMES THE POINTER
RTS
LFONTT LDA TXFONT GET NEW FONT
CMPA #7 ALREADY LARGE??
BEQ FNTRTS K-BYE
LDA #7
STA TXFONT MAKE LARGE FONT
LEAX -1,X AND BOTTOM ADJUST
FNTRTS RTS AND RETURN
SFONTT LDA TXFONT
CMPA #5
BEQ FNTRTS
LDA #5
STA TXFONT
LEAX 1,X
RTS
ZBLNK LDA #1
STA TXLEAD REQUEST LEAD ZERO BLANKING
RTS
NBLNK CLR TXLEAD KILL LEAD ZERO BLANKING
RTS
SBLNK LDA #2 BLANKING WITH SPACING
STA TXLEAD
RTS
NMIMM LDD ,Y++ FETCH THE NUMBER
JMP PRNUM PRINT THE NUMBER
NMIND LDD [,Y++] GET THE NUMBER
JMP PRNUM AND PRINT IT (AND RETURN)
NUM2IM LDA ,Y+
JMP PRNUM2 PRINT THE 2 DIGIT NUMBER
NUM2IN LDA [,Y++]
JMP PRNUM2
NUMBB LDA 3,S GET WHAT WAS PASSED IN B.
JMP PRNUM2
CLIPME LDA 3,S GET WHAT WAS PASSED IN B.
CMPA #5 CLIP OF 5 IS HIGHEST ALLOWED
BLS CLOK
CMPA #-5 CLIP OF -5 IS OK TOO
BHS CLOK
CLRA
CLOK STA TXCLIP
RTS
NUMYY LDD 4,S GET THE PASSED Y INTO D
JMP PRNUM
CLIND LDA [,Y++] GET THE COLOR
STA TEXCOL AND STORE IT
RTS
SUBBER LEAS -8,S
LDB 11,S GET ORIGINAL B
STB 1,S
LDD 12,S
STD 2,S
LDD #SUBRET
STD 6,S PUT DOWN RETURN ADDRESS
LDD ,Y++ GRAB ADDRESS..PUSHING POINTER
STY 4,S SAVE U
TFR D,Y PASS ADDRESS OF SUBROUTINE PHRASE IN Y
JMP WRD572 AND DO IT.
SUBRET TFR U,Y
RTS
LIB RRET
END