mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-19 21:30:37 +00:00
470 lines
17 KiB
NASM
470 lines
17 KiB
NASM
*``````````````````````````````*
|
|
* LRCHAR (NATHAN RIGGS) *
|
|
* *
|
|
* THIS SUBROUTINE PLACES A *
|
|
* LORES CHARACTER AT A GIVEN *
|
|
* POSITION AND COLOR. ALL OF *
|
|
* THE CHARACTERS ARE 4*6 IN *
|
|
* ORDER TO ALLOW EIGHT LETTERS *
|
|
* BOTH HORIZONTALLY AND ALSO *
|
|
* VERTICALLY. *
|
|
* *
|
|
* INPUT: *
|
|
* *
|
|
* ZPB1 = X POSITION OF CHAR *
|
|
* ZPB2 = Y POSITION OF CHAR *
|
|
* ZPW1 = ADDRESS OF CHAR DEF *
|
|
* ZPB3 = COLOR *
|
|
* *
|
|
* DESTROY: NZCIDV *
|
|
* ^^^ ^ *
|
|
* *
|
|
* CYCLES: 397+ *
|
|
* SIZE: 409 BYTES *
|
|
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
*
|
|
]ORGX EQU ZPB1 ; X POSITION OF CHAR
|
|
]ORGY EQU ZPB2 ; Y POSITION OF CHAR
|
|
]CADDR EQU ZPW1 ; ADDRESS OF 3-BYTE CHAR DEFINITION
|
|
]CBYTE1 EQU VARTAB ; COPY OF 1ST BYTE
|
|
]CBYTE2 EQU VARTAB+1 ; COPY OF SECOND
|
|
]CBYTE3 EQU VARTAB+2 ; COPY OF THIRD
|
|
]CX EQU ZPW2 ; PLOTTING X POSITION
|
|
]CY EQU ZPW3 ; PLOTTING Y POSITION
|
|
]CNT EQU VARTAB+5 ; COUNTER
|
|
]COLOR EQU ZPB3 ; CHARACTER COLOR
|
|
]TMPBYTE EQU VARTAB+11 ; WORKING BYTE TO READ
|
|
]OFFSET EQU VARTAB+12 ; CHARACTER BYTE OFFSET
|
|
]NIBBLE EQU VARTAB+13 ; FLAG TO INDICATE 1ST OR 2ND NIBBLE
|
|
*
|
|
LRCHAR
|
|
LDA #0 ; {4C3B} RESET NIBBLE AND OFFSET
|
|
STA ]NIBBLE ; {4C3B}
|
|
STA ]OFFSET ; {4C3B}
|
|
*
|
|
LDA ]ORGX ; {4C3B} COPY ORGX TO X TO START
|
|
STA ]CX ; {4C3B} PLOTTING CHAR FROM LEFT TOP
|
|
LDA ]ORGY ; {4C3B} DO THE SAME WITH ORGY AND Y
|
|
STA ]CY ; {4C3B}
|
|
LDA ]CX ; {4C3B}
|
|
LDY #0 ; {3C2B} RESET BYTE INDEX
|
|
LDA (]CADDR),Y ; {6C2B} GET APPROPRIATE BYTE
|
|
STA ]CBYTE1 ; {4C3B} STORE IN DEDICATED VAR
|
|
INY ; {2C1B} NOW DO SECOND BYTE
|
|
LDA (]CADDR),Y ; {6C2B}
|
|
STA ]CBYTE2 ; {4C3B}
|
|
INY ; {2C1B} AND THE THIRD
|
|
LDA (]CADDR),Y ; {6C2B}
|
|
STA ]CBYTE3 ; {4C3B}
|
|
*
|
|
LDA #0 ; {3C2B} RESET COUNTER
|
|
STA ]CNT ; {4C3B} FOR BITS
|
|
:PRELOOP
|
|
LDY ]OFFSET
|
|
*LDA ]OFFSET ; {4C3B} GET CHAR BYTE OFFSET
|
|
LDA ]CBYTE1,Y ; {5C3B} LOAD APPROPRIATE BYTE
|
|
STA ]TMPBYTE ; {4C3B} STORE IN WORKING EMORY
|
|
:LP1
|
|
SEC ; {2C1B} SET CARRY
|
|
LDA ]TMPBYTE ; {4C3B} LOAD WORKING BYTE
|
|
ASL ; {2C1B} SHIFT LEFT BYTE INTO CARRY
|
|
STA ]TMPBYTE ; {4C3B} STORE NEW WORKING BYTE
|
|
BCC :NOPLOT ; {3C2B} IF CARRY HOLDS A 0, DON'T PLOT
|
|
LDA ]COLOR ; {4C3B} OTHERWISE, PLOT
|
|
LDY ]CY ; {4C3B}
|
|
LDX ]CX ; {4C3B}
|
|
JSR LOCPLOT ; {174C112B}
|
|
:NOPLOT
|
|
INC ]CX ; {5C2B} INCREASE X, WHETHER PLOTTED
|
|
LDA ]CNT ; {4C3B} OR NOT
|
|
CMP #3 ; {3C2B} IF # OF BITS = 4, THEN
|
|
BEQ :NEXTLP ; {3C2B} WE'RE DONE WITH THIS NIBBLE
|
|
INC ]CNT ; {5C2B} INCREASE THE BIT COUNTER
|
|
JMP :LP1 ; {3C3B} LOOP AGAIN UNTIL NIBBLE DONE
|
|
:NEXTLP
|
|
INC ]NIBBLE ; {5C2B} NOW INCREASE TO 2ND NIBBLE
|
|
INC ]CY ; {5C2B} INCREASE Y PLOT POS, SINCE
|
|
LDA #0 ; {3C2B} EACH LINE IS 4 BITS LONG
|
|
STA ]CNT ; {4C3B} RESET COUNTER
|
|
LDA ]ORGX ; {4C3B} RESET X POSITION
|
|
STA ]CX ; {4C3B}
|
|
LDA ]NIBBLE ; {4C3B} CHECK IF NIBBLE 2 IS DONE
|
|
CMP #2 ; {3C2B} AND IF SO,
|
|
BEQ :NEXTLP2 ; {3C2B} GET OUT OF ANOTHER LOOP
|
|
JMP :LP1 ; {3C3B} ELSE, LOOP FOR 2ND NIBBLE
|
|
:NEXTLP2
|
|
INC ]OFFSET ; {5C2B} NOW INC CHAR BYTE OFFSET
|
|
LDA #0 ; {3C2B} RESET NIBBLE TO FIRST NIBBLE
|
|
STA ]NIBBLE ; {4C3B}
|
|
LDA ]ORGX ; {4C3B} RESET X POSITION
|
|
STA ]CX ; {4C3B}
|
|
LDA #0 ; {3C2B} RESET THE BIT COUNTER
|
|
STA ]CNT ; {4C3B}
|
|
LDA ]OFFSET ; {4C3B} IF OFFSET IS MORE THAN 2,
|
|
CMP #3 ; {3C2B} THEN DONE WITH THIS LOOP
|
|
BEQ :NEXT3 ; {3C2B} ELSE START OVER FOR NEXT BYTE
|
|
JMP :PRELOOP ; {3C3B}
|
|
*
|
|
:NEXT3
|
|
RTS ; {6C1B}
|
|
*
|
|
** WHAT FOLLOWS ARE THE BINARY REPRESENTATIONS OF EACH
|
|
** CHARACTER AVAILABLE.
|
|
*
|
|
LR_A DFB %01101001 ; {OC1B} ".XX."
|
|
; "X..X"
|
|
DFB %11111001 ; {OC1B} "XXXX"
|
|
; "X..X"
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_B
|
|
DFB %11101001 ; {0C1B} "XXX."
|
|
; "X..X"
|
|
DFB %11101001 ; {0C1B} "XXX."
|
|
; "X..X"
|
|
DFB %11100000 ; {0C1B} "XXX."
|
|
; "...."
|
|
LR_C
|
|
DFB %11111000 ; {0C1B} "XXXX"
|
|
; "X..."
|
|
DFB %10001000 ; {0C1B} "X..."
|
|
; "X..."
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_D
|
|
DFB %11101001 ; {0C1B} "XXX."
|
|
; "X..X"
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %11100000 ; {0C1B} "XXX."
|
|
; "...."
|
|
LR_E
|
|
DFB %11111000 ; {0C1B} "XXXX"
|
|
; "X..."
|
|
DFB %11101000 ; {0C1B} "XXX."
|
|
; "X..."
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_F
|
|
DFB %11111000 ; {0C1B} "XXXX"
|
|
; "X..."
|
|
DFB %11101000 ; {0C1B} "XXX."
|
|
; "X..."
|
|
DFB %10000000 ; {0C1B} "X..."
|
|
; "...."
|
|
LR_G
|
|
DFB %11111000 ; {0C1B} "XXXX"
|
|
; "X..."
|
|
DFB %10111001 ; {0C1B} "X.XX"
|
|
; "X..X"
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_H
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %11111001 ; {0C1B} "XXXX"
|
|
; "X..X"
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_I
|
|
DFB %11110110 ; {0C1B} "XXXX"
|
|
; ".XX."
|
|
DFB %01100110 ; {0C1B} ".XX."
|
|
; ".XX."
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_J
|
|
DFB %00010001 ; {0C1B} "...X"
|
|
; "...X"
|
|
DFB %00011001 ; {0C1B} "...X"
|
|
; "X..X"
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_K
|
|
DFB %10011010 ; {0C1B} "X..X"
|
|
; "X.X."
|
|
DFB %11001010 ; {0C1B} "XX.."
|
|
; "X.X."
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_L
|
|
DFB %10001000 ; {0C1B} "X..."
|
|
; "X..."
|
|
DFB %10001000 ; {0C1B} "X..."
|
|
; "X..."
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_M
|
|
DFB %10111101 ; {0C1B} "X.XX"
|
|
; "XX.X"
|
|
DFB %11011001 ; {0C1B} "XX.X"
|
|
; "X..X"
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_N
|
|
DFB %10011101 ; {0C1B} "X..X"
|
|
; "XX.X"
|
|
DFB %11011011 ; {0C1B} "XX.X"
|
|
; "X.XX"
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_O
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_P
|
|
DFB %11101001 ; {0C1B} "XXX."
|
|
; "X..X"
|
|
DFB %11101000 ; {0C1B} "XXX."
|
|
; "X..."
|
|
DFB %10000000 ; {0C1B} "X..."
|
|
; "...."
|
|
LR_Q
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %10011011 ; {0C1B} "X..X"
|
|
; "X.XX"
|
|
DFB %01100001 ; {0C1B} ".XX."
|
|
; "...X"
|
|
LR_R
|
|
DFB %11101001 ; {0C1B} "XXX."
|
|
; "X..X"
|
|
DFB %11101010 ; {0C1B} "XXX."
|
|
; "X.X."
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_S
|
|
DFB %01111000 ; {0C1B} ".XXX"
|
|
; "X..."
|
|
DFB %01100001 ; {0C1B} ".XX."
|
|
; "...X"
|
|
DFB %11100000 ; {0C1B} "XXX."
|
|
; "...."
|
|
LR_T
|
|
DFB %11110110 ; {0C1B} "XXXX"
|
|
; ".XX."
|
|
DFB %01100110 ; {0C1B} ".XX."
|
|
; ".XX."
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_U
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_V
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %10101010 ; {0C1B} "X.X."
|
|
; "X.X."
|
|
DFB %01000000 ; {0C1B} ".X.."
|
|
; "...."
|
|
LR_W
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %10111011 ; {0C1B} "XX.X"
|
|
; "XX.X"
|
|
DFB %11010000 ; {0C1B} "X.XX"
|
|
; "...."
|
|
LR_X
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %10010000 ; {0C1B} "X..X"
|
|
; "...."
|
|
LR_Y
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %01100110 ; {0C1B} ".XX."
|
|
; ".XX."
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_Z
|
|
DFB %11110001 ; {0C1B} "XXXX"
|
|
; "...X"
|
|
DFB %01101000 ; {0C1B} "..X."
|
|
; ".X.."
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_0
|
|
DFB %11111001 ; {0C1B} "XXXX"
|
|
; "X..X"
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_1
|
|
DFB %01100110 ; {0C1B} ".XX."
|
|
; ".XX."
|
|
DFB %01100110 ; {0C1B} ".XX."
|
|
; ".XX."
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_2
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %00100100 ; {0C1B} "..X."
|
|
; ".X.."
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_3
|
|
DFB %11100001 ; {0C1B} "XXX."
|
|
; "...X"
|
|
DFB %01100001 ; {0C1B} ".XX."
|
|
; "...X"
|
|
DFB %11100000 ; {0C1B} "XXX."
|
|
; "...."
|
|
LR_4
|
|
DFB %10011001 ; {0C1B} "X..X"
|
|
; "X..X"
|
|
DFB %11110001 ; {0C1B} "XXXX"
|
|
; "...X"
|
|
DFB %00010000 ; {0C1B} "...X"
|
|
; "...."
|
|
LR_5
|
|
DFB %11111000 ; {0C1B} "XXXX"
|
|
; "X..."
|
|
DFB %11110001 ; {0C1B} "XXXX"
|
|
; "...X"
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_6
|
|
DFB %01101000 ; {0C1B} ".XX."
|
|
; "X..."
|
|
DFB %11101001 ; {0C1B} "XXX."
|
|
; "X..X"
|
|
DFB %11110000 ; {0C1B} "XXXX"
|
|
; "...."
|
|
LR_7
|
|
DFB %11110001 ; {0C1B} "XXXX"
|
|
; "...X"
|
|
DFB %00100100 ; {0C1B} "..X."
|
|
; ".X.."
|
|
DFB %10000000 ; {0C1B} "X..."
|
|
; "...."
|
|
LR_8
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_9
|
|
DFB %01111001 ; {0C1B} ".XXX"
|
|
; "X..X"
|
|
DFB %01110001 ; {0C1B} ".XXX"
|
|
; "...X"
|
|
DFB %00010000 ; {0C1B} "...X"
|
|
; "...."
|
|
LR_EXC
|
|
DFB %01100110 ; {0C1B} ".XX."
|
|
; ".XX."
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_QUEST
|
|
DFB %01101001 ; {0C1B} ".XX."
|
|
; "X..X"
|
|
DFB %00100000 ; {0C1B} "..X."
|
|
; "...."
|
|
DFB %00100000 ; {0C1B} "..X."
|
|
; "...."
|
|
LR_PRD
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
DFB %00001100 ; {0C1B} "...."
|
|
; "XX.."
|
|
DFB %11000000 ; {0C1B} "XX.."
|
|
; "...."
|
|
LR_CMA
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
DFB %00000100 ; {0C1B} "...."
|
|
; ".X.."
|
|
DFB %01001000 ; {0C1B} ".X.."
|
|
; "X..."
|
|
LR_APOST
|
|
DFB %00010001 ; {0C1B} "...X"
|
|
; "...X"
|
|
DFB %00100000 ; {0C1B} "..X."
|
|
; "...."
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
LR_QUOT
|
|
DFB %10101010 ; {0C1B} "X.X."
|
|
; "X.X."
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
LR_COLON
|
|
DFB %00000100 ; {0C1B} "...."
|
|
; ".X.."
|
|
DFB %00000100 ; {0C1B} "...."
|
|
; ".X.."
|
|
DFB %00000000 ; {OC1B} "...."
|
|
; "...."
|
|
LR_SEMI
|
|
DFB %00000100 ; {0C1B} "...."
|
|
; ".X.."
|
|
DFB %00000100 ; {0C1B} "...."
|
|
; ".X.."
|
|
DFB %10000000 ; {0C1B} "X..."
|
|
; "...."
|
|
LR_MINUS
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
DFB %11111111 ; {0C1B} "XXXX"
|
|
; "XXXX"
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
LR_PLUS
|
|
DFB %00000110 ; {0C1B} "...."
|
|
; ".XX."
|
|
DFB %11111111 ; {0C1B} "XXXX"
|
|
; "XXXX"
|
|
DFB %01100000 ; {0C1B} ".XX."
|
|
; "...."
|
|
LR_EQUAL
|
|
DFB %00001111 ; {0C1B} "...."
|
|
; "XXXX"
|
|
DFB %00001111 ; {0C1B} "...."
|
|
; "XXXX"
|
|
DFB %00000000 ; {0C1B} "...."
|
|
; "...."
|
|
LR_FSLASH
|
|
DFB %00010010 ; {0C1B} "...X"
|
|
; "..X."
|
|
DFB %00100100 ; {0C1B} "..X."
|
|
; ".X.."
|
|
DFB %01001000 ; {0C1B} ".X.."
|
|
; "X..."
|
|
LR_BSLASH
|
|
DFB %10000100 ; {0C1B} "X..."
|
|
; ".X.."
|
|
DFB %01000010 ; {0C1B} ".X.."
|
|
; "..X."
|
|
DFB %00100001 ; {0C1B} "..X."
|
|
; "...X"
|
|
LR_LPAR
|
|
DFB %00010010 ; {0C1B} "...X"
|
|
; "..X."
|
|
DFB %01000100 ; {0C1B} ".X.."
|
|
; ".X.."
|
|
DFB %00100001 ; {0C1B} "..X."
|
|
; "...X"
|
|
LR_RPAR
|
|
DFB %10000100 ; {0C1B} "X..."
|
|
; ".X.."
|
|
DFB %00100010 ; {0C1B} "..X."
|
|
; "..X."
|
|
DFB %01001000 ; {0C1B} ".X.."
|
|
; "X..."
|