Files
erkyrath.infocom-zcode-terps/c-128/xzip/machine.asm
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

729 lines
16 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
PAGE
STTL "--- MACHINE-DEPENDENT I/O: CBM64 ---"
; ----------------------------
; FETCH ASCII KEYCODE INTO [A]
; ----------------------------
; EXIT: ASCII IN [A] & [IOCHAR]
GETKEY:
JSR STCUR ; start the cursor please
GK1:
JSR GETIN ; do we have a key?
CMP #0 ; 1 is yes
BNE GK2
JSR TOGCUR ; toggle the cursor?
JMP GK1 ; check again!
GK2:
STA IOCHAR ; save the char
JSR OFFCUR ; turn off cursor, if necessary
; CONVERT & MASK KEYCODE IN [A]
LDA IOCHAR
JSR GOTKEY ; parse the ol key
CMP #0 ; 0 RETURN MEANS BAD KEY
BEQ GK1 ; no goodnik key, try again!
RTS ; AND RETURN IT
;
; parse the key, returning it in (A), with 0 = bad key
;
GOTKEY:
CMP #'0' ; check for numbers
BCC GOTK1 ; nope, let it go
CMP #'9'+1 ; how about more than nine?
BCS GOTK1 ; ayyup
;
; must be a number, see if it was the numeric keypad
;
LDY SFDX ; get keyboard coordinate
CPY #$41 ; check against lowest keypad coord
BCC NCHK ; it was normal number
;
; pretend these ones are functions keys
;
CLC ; get ready for translate
ADC #97 ; keypads range from 145-154
NCHK:
JMP GOTDNE ; no need for further checking
GOTK1:
CMP #'A' ; CONVERT UNSHIFTED ALPHA
BCC GKA ; TO ASCII LOWER CASE
CMP #'Z'+1
BCS GKA
ADC #$20
JMP GOTDNE
GKA:
CMP #133 ; LET FCN KEYS THRU, ALREADY CORRECT
BCC MASK
CMP #141
BCC GOTDNE
CMP #143
BEQ GOTDNE
;
; CHECK FOR "ARROWS", CONVERT FOR USE (EZIP)
; ALSO : CHANGE < > TO , .
;
MASK: LDX #ENDKEY ; GET LENGTH OF LIST
MASK0: CMP HAVE,X ; CHECK AGAINST LIST OF UNWANTED KEYS
BEQ MASK1 ; FOUND IT
DEX
BPL MASK0 ; CHECK THEM ALL
BMI MASK3 ; NOT FOUND, CONTINUE OTHER CHECKS
MASK1: LDA WANT,X ; GET KEY TO USE INSTEAD
BNE GOTDNE ; JMP
MASK3:
AND #%01111111 ; SCREEN OUT SHIFTS
CMP #EOL ; EOL?
BEQ GOTDNE
CMP #BACKSP
BEQ GOTDNE
CMP #SPACE ; ANYTHING ELSE < "SPACE"
BCC BADKEY ; IS BAD
LDX #BLISTL ; IGNORE OBSTINATE NON ALLOWED KEYS
BADL: CMP BADLIST,X
BEQ BADKEY
DEX
BNE BADL
GKCMP1:
CMP #'Z'+1 ; PASS U-C ALPHA
BCC GOTDNE ; AND OTHER ASCII CHARS
BADKEY: JSR BOOP ; REJECT BAD KEYPRESS
LDA #0 ; O MEANS BAD KEYPRESS
GOTDNE:
STA IOCHAR ; save char
ADC RNUM1 ; FUTZ WITH RANDOM
STA RNUM1
EOR RNUM2
STA RNUM2
LDA IOCHAR ; go get it back
RTS
; ARROW AND FUNCTION KEYS FOR XZIP ARE:
; FOUR ARROW KEYS (BOTH SETS MATCH) PLUS EXTRA UP ARROW KEY
; FUNCTION KEYS ARE F1 - F8, F9 = ESC, F10 = TAB, F11 = HELP
; F12 = LINE FEED
; Also, numberic keypad 0-9 turns into 145-154
;
HAVE: DB '<','>',$91,$11,$9D,$1D,$5E
DB $1B,$09,$0A
WANT: DB ',','.',129,130,131,132,129
DB 141,142,144
ENDKEY EQU $-WANT-1
BADLIST: DB '%','&','=','@'
BLISTL EQU $-BADLIST-1
; -------------------------
; OUTPUT AN ASCII CHARACTER
; -------------------------
LETTER: CMP #'a' ; LOWER-CASE?
BCC LET0 ; NO, CONTINUE
CMP #'z'+1
BCS LETEX ; CTRL CHARS
AND #%01011111 ; ELSE MASK FOR LOWER-CASE
JMP CHROUT
LET0: CMP #'A' ; UPPER-CASE?
BCC LETEX
CMP #'Z'+1
BCS LETEX
ORA #%00100000 ; MAKE UPPER
LETEX:
STA IOCHAR ; just in case we need it
JSR CHROUT ; goodbye, cruel char
RTS
FONTFLAG: DB 0 ; 0 = font1/1 = not font 1, for current
; output character
; -----------------
; PRINT CHAR IN [A]
; -----------------
CHAR: STA IOCHAR ; SAVE HERE
TXA
PHA ; SAVE [X] AND [Y]
TYA
PHA
LDA IOCHAR ; RESTORE CHAR
CMP #$0E ; change to font 1?
BNE CH1 ; nope
LDX #0 ; set font1 flag showing font 1
STX FONTFLAG ; 0 = font 1
BEQ CH2
CH1:
CMP #$8E ; font 3/4 ?
BNE CH2 ; nope
LDX #1
STX FONTFLAG ; 1 = not font 1
CH2:
CMP #$22
BNE NOQUOT
JSR LETTER ; QUOTE MARKS SCREW
LDA #0 ; UP SYSTEM, SO
STA QUOTMOD ; TURN OFF QUOTE MODE FLAG
BEQ CHDUN
NOQUOT: LDX FONTFLAG ; IF FONT 3 OR 4 DO DIRECT CHROUT
BNE NOLETR ; LETTER CONVERTS CHARS
JSR LETTER ; OFF TO THE SCREEN!
CHDUN:
LDA IOCHAR ; go get char
CMP #EOL ; did we just send a <CR>?
BNE LETJ ; nope, continue
;
; move cursor back to left margin
;
SEC
JSR PLOT ; first, get where cursor is
LDY ZBEGIN+ZLMRG+1 ; set left margin
CLC ; and then send the
JSR PLOT ; cursor back there
LDA #0 ; and then show no more chars in [LBUFF]
STA CHRCNT ; none more
LDA RVFLAG ; is rvideo on?
BEQ LETJ ; nope
LDA #$12 ; turn it back on
JSR CHROUT ; okay
LETJ:
PLA
TAY ; RESTORE [X] AND [Y]
PLA
TAX
RTS
NOLETR:
JSR CHROUT
JMP CHDUN
; -----------------------
; DIRECT PRINT LINE [X/A]
; -----------------------
; ENTRY: STRING ADDRESS IN [X/A] (LSB/MSB)
; STRING LENGTH IN [Y]
DLINE: STX STRING+LO ; DROP STRING ADDRESS
STA STRING+HI ; INTO DUMMY BYTES
STY MTEMP ; COUNTER
LDA TOP ; RETAIN STATUS LINE(S)
STA WTOP
LDX #0 ; INIT CHAR-FETCH INDEX
DOUT: DB $BD ; 6502 "LDA nnnn,X" OPCODE
STRING: DW $0000 ; DUMMY OPERAND BYTES
JSR CHAR
INX
DEC MTEMP ; LOOP TILL
BNE DOUT ; OUT OF CHARS
LDA #0
STA WTOP
RTS
; -----------------------
; SEND [LBUFF] TO PRINTER
; -----------------------
; ENTRY: LENTH OF LINE IN [PRLEN]
; NOW WITH IMPROVED ERROR PROTECTION! (BM 11/24/84)
PPRINT: LDA SCRIPT ; SCRIPTING INTERNALLY ENABLED?
BEQ PEX ; NO, SCRAM IMMEDIATELY
LDA ZBEGIN+ZSCRIP+1 ; CHECK SCRIPT FLAG
AND #%00000001 ; SCRIPTING ON?
BEQ PP3 ; NO, CHECK FOR "UNSCRIPT"
LDA PSTAT ; CHECK PRINTER STATUS
BMI PEX ; CAN'T OPEN IF NEGATIVE
BNE PP1 ; ALREADY OPEN, SCRIPT THE LINE
; OPEN THE PRINTER FOR OUTPUT
PP0: LDX #1
STX PSTAT ; SET STATUS TO "PRINTER OPENED" (1)
LDA #4 ; LOGICAL FILE #4
TAX ; DEVICE #4
LDY #7 ; ALLOW UPPER/LOWER CASE
JSR SETLFS ; SET UP LOGICAL FILE
LDA #0
JSR SETNAM ; NO FILENAME REQUIRED
JSR OPEN ; OPEN THE CHANNEL
BCC PP1 ; OPEN OKAY IF CARRY CLEAR
PPERR:
LDA #$FF ; ELSE SET PRINTER STATUS
STA PSTAT ; TO "CAN'T OPEN"
BNE PP5 ; AND SIMULATE AN "UNSCRIPT"
PP1:
LDX #4 ; SET PRINTER CHANNEL
JSR CHKOUT ; TO "OUTPUT"
BCS PPERR ; ERROR IF CARRY SET
LDY #0 ; INIT INDEX
PP2: LDA LBUFF,Y
CMP #$0D
BEQ PP6
AND #%01111111
CMP #$20
BCC PP4 ; NO CONTROLS
PP6: JSR LETTER
BCS PPERR ; ERROR IF CARRY SET
PP4: INY
DEC PRLEN
BNE PP2
BEQ PEX ; RESET & RETURN
; CHECK FOR "UNSCRIPT"
PP3: LDA PSTAT ; CHECK PRINTER STATUS
BEQ PEX ; EXIT IF PRINTER WAS OFF
BMI PEX ; OR UNOPENABLE
PCLOSE: LDA #0 ; RESET PRINTER STATUS FLAG
STA PSTAT ; TO "CLOSED"
; ENTRY FOR PRINTER ERROR
PP5: LDA #4
JSR CLOSE ; CLOSE THE PRINTER CHANNEL
PEX: JMP CLRCHN
PSTAT: DB 0 ; HERE SO RESTART WON'T ALTER
; ------------
; SPLIT SCREEN
; ------------
; SPLIT SCREEN AT LINE [ARG1]
; DISABLE SPLIT IF [ARG1] = 0
; IGNORE IF SPLIT ALREADY ENABLED OR [ARG1] >= 23
; ON C-128, I AM USING KERNAL RTNS TO ACCESS SCREEN MEMORY
; AS SCREEN MEMORY IS IN ITS OWN WORLD. IN ORDER NOT TO
; SCROLL THE TOP WINDOW WHEN SCREEN IS SPLIT, THE C-128
; TOP OF SCREEN INDICATOR MUST BE USED, BUT: NO ACCESS IS
; ALLOWED ABOVE THAT INDICATOR. THAT INDICATOR (WTOP) WILL
; THEREFORE BE SET ONLY WHEN SCROLLING MIGHT OCCUR, LEAVING
; [WTOP] SET TO #0 OTHERWISE. THE SPLIT LINE IS KEPT TRACK
; OF IN [TOP].
ZSPLIT: LDA TOP ; HOLD A SEC
STA I
LDA ARG1+LO ; GET # OF LINES FOR SCREEN
BEQ NORL ; IF 0 THEN RESTORE SCREEN
CMP #24 ; IS SPLIT REALLY = WHOLE SCREEN
BCS ZSPOUT ; YES, IGNORE
CMP TOP ; IF SCREEN 1 SHRINKING
BCS ZSLVIT ; SET LINCNT - (TOP - [A])
PHA ; HOLD IT
SEC
SBC TOP
ADC LINCNT
STA LINCNT
PLA
ZSLVIT: STA TOP ; SET THE TOP OF THE SECOND SCREEN
STA SPSTAT ; NON ZERO = SCREEN IS SPLIT
CMP LINCNT ; IS SCROLLING SCREEN NOW MORE THAN LINCNT?
BCC ZSPL3 ; NO
STA LINCNT ; YES, RESET LINCNT
ZSPL3: LDA #0 ; ALIGN TOP CURSOR FOR NEW SPLIT
STA OLD1Y
STA OLD1X
SEC
JSR PLOT ; FIND WHERE WE ARE NOW
CPX I
BCC ZSPL5 ; TOP SCREEN, GO TO 0,0
CPX TOP ; STAYING W/IN BOTTOM SCREEN
BCS ZSPOUT ; YUP
LDX TOP ; WERE IN TOP, NOW IN BOTTOM SCREEN
LDY ZBEGIN+ZLMRG+1 ; SO GO TO TOP LEFT OF IT
CLC
JMP PLOT
ZSPL5: LDX #0
LDY #0
CLC
JMP PLOT
NORL: ;RESTORE SCREEN TO FULL SCREEN MODE
LDA #0 ; PUT CURSOR AT TOP OF SCREEN
STA WTOP ; RESTORE FULL SCREEN ALIGNMENT
STA TOP ; JIC
STA LINCNT
STA SPSTAT ; FLAG NOT SPLIT
ZSPOUT: RTS
; ------
; SCREEN
; ------
; GO TO TOP WINDOW (TOP OF SCREEN) IF [ARG1] = 1
; GO TO BOTTOM OF SCREEN IF [ARG1] = 0
; IGNORE IF SPLIT NOT ENABLED OR [ARG1] <> 0 OR 1
; FLAG SPLITF WILL BE SET FOR OUTPUT TO DETERMINE
; IF AND WHICH WINDOW TO DISPLAY TO
; (0=BOTTOM 1=TOP)
ZSCRN:
LDA SPSTAT ; CHECK IF SCREEN IS SPLIT
BEQ ZSPOUT ; NO, SO JUST LEAVE
JSR CLRBUF ; EMPTY OUTPUT BUFFER BEFORE MOVING
SEC ; GET CURSOR LOC
JSR PLOT
TXA
LDX SPLITF ; SAVE CURSOR OF SCREEN NOW IN
SCRSAV: STA OLD0X,X
TYA
STA OLD0Y,X
LDA ARG1+LO ; CHECK WHICH WINDOW
BNE SCRN1 ; TOP SCREEN
SCRN0: LDA #$FF ; SCROLLING SCREEN SO
STA SCRIPT ; ALLOW SCRIPTING
LDA OLDWD ; RESET MARGINS
STA XSIZE
LDA #0
STA SPLITF ; SET FLAG TO BOTTOM SCREEN (0)
JMP SCRNP ; JMP TO <CR> RTN
SCRN1: CMP #01
BNE ZSPOUT ; INVALID SCREEN ID
STA SPLITF ; SET FLAG TO UNSCROLLING SCREEN (1)
LDA XSIZE ; SAVE MARGINS
STA OLDWD
LDA #0
STA SCRIPT ; SET SCRIPTNG OFF, NOT ALLOWED THIS SCREEN
LDA #79
STA XSIZE ; SET FOR TOP SCREEN USING WHOLE WIDTH
SCRNP:
LDX SPLITF ; WHICH SCREEN
LDA FONT,X ; get screens font
CMP #1 ; to font 1?
BNE SCF1 ; nope
LDX FONTFLAG ; 1 means we weren't in font 1 before
BEQ SCF2 ; here we don't need to change it
BNE SCF3 ; so we need to change it
SCF1:
LDX FONTFLAG ; 0 means we are already in font 1
BNE SCF2 ; so don't change a thing
SCF3:
JSR CHFONT ; and change to it
SCF2:
LDX SPLITF ; WHICH SCREEN
LDA OLD0Y,X ; SET CURSOR TO WHERE IT WAS IN THAT WINDOW
TAY
LDA OLD0X,X
TAX
CLC
JMP PLOT ; SET CURSOR (+ LEAVE)
; ------
; MARGIN
; ------
ZMARG: JSR CLRBUF ; CLEAR LBUFF BEFORE RESETTING LINE MARGINS
LDA ARG2+LO ; SET RIGHT MARGIN
STA ZBEGIN+ZRMRG+1
LDA ARG1+LO
STA ZBEGIN+ZLMRG+1
LDA #79 ; FULL WIDTH
SEC
SBC ARG2+LO ; SUBTRACT BOTH MARGINS
SBC ARG1+LO ; TO GET NEW WIDTH
STA XSIZE
STA OLDWD ; JIC
SEC
JSR PLOT
LDY ARG1+LO ; SET CURSOR AT NEW LEFT MARGIN
CLC
JMP PLOT
; -----
; SOUND
; -----
; ARG1 = BOOP (2) BEEP (1) ALL OTHERS INVALID
; (EZIP)
ZSOUND: LDX ARG1+LO ; GET SOUND WANTED
DEX
BNE ZSO1
JMP BEEP
ZSO1: DEX
BNE ZSOEX ; INVALID
JMP BOOP ; DOWN IN COMMON MEMORY
ZSOEX: RTS
; -----
; COLOR
; -----
; ARG1 IS FOREGROUND, ARG2 BACKGROUND
; TRANSLATES GAME COLOR CODE TO MACHINE CODE
; ONLY AVAILABLE IF USER ASKED FOR COLOR
; (MONOCHROME MONITOR POSSIBLE)
ZCOLOR: ; SET BACKGROUND COLOR IN REGISTER 26 BITS 3-0 OF 80 COL CHIP
LDA ZBEGIN+ZMODE
AND #$01
BEQ ZCNO ; WE'RE NOT ON
JSR CLRBUF ; MAKE SURE ANYTHING WAITING IS DISPLAYED
LDX ARG2+LO ; GO SET BACKGROUND COLOR
BEQ ZFORE ; BACK SET TO NO CHANGE, CHECK FORE
LDA BAKCOL,X
JSR COLOR ; RTN IN SHARED MEMORY
ZFORE: LDX ARG1+LO ; AND FOREGROUND COLOR
BEQ ZCNO ; NO CHANGE
LDA FORCOL,X
JSR ADDBUF ; add unprinting char to buffer
ZCNO: RTS
FORCOL: DB 00,$9F,$90,$1C,$1E,$9E,$1F,$81,$97,$05
BAKCOL: DB 0,0,0,8,4,$0D,2,$0A,6,$0F
ZDISPL:
ZDCLR: RTS
ZPICNF: JMP PREDF ; SET AS BAD
;********SET A FLAG SO RESTARTS DON'T DO THIS
;********
; ALLOWS FOR 2 FONTS, 3 & 4, THAT ARE LOCATED AT TRACK 32, SECTOR 0
; AND TRACK 33, SECTOR 0 AND HAVE A MAX LENGTH OF 4 SECTORS (1K)
; AFTER READING IN THE 4 SECTORS A CHECK IS MADE TO SEE IF THERE
; IS A FONT FILE THERE, IF NOT A FLAG IS SET SO THAT THE FONT OPCODE
; RETURNS A FAIL IF THE GAME TRIES TO USE THAT FONT
; A CHECK IS ALSO MADE TO MAKE SURE THAT CHARACTERS WITH A VALUE LESS
; THAN 32 ARE NOT USED AND THAT ALL CHARS ARE 8*8 IN SIZE. (GOFF
; LESS THAN 32, OR GSIZE IS NOT 8*8) THE ZIP
; WILL HALT WITH ERROR CODE 17 IF EITHER OF THESE OCCUR. OTHERWISE
; THE CHAR DEFINITIONS ARE LOADED INTO THE 80 COL CHIP CHARACTER
; DEFINITION RAM. THE SETUP THERE IS 8 BYTES OF CHAR DEFINITION
; FOLLOWED BY 8 BYTES OF NULLS. ALSO CHARS ARE LOADED IN AS SUCH:
; CHAR ASCII VALUE ADDRESS IN CHAR DEF RAM
; @ - <- $40 - $5F $3000 - $31FF
; SPACE - ? $20 - $3F $3200 - $33FF
; A - Z $61 - $7A $3410 - $35xx
; THIS IS FOR UPPER/LOWER CHARS, INVERSE STARTS AT $3800
; AND UPPER/GRAPHICS DEFS ARE AT $2000, THIS SECTION AT $2000 IS
; WHAT IS BEING USED FOR THE 2 ALTERNATE CHAR SETS.
; @ = 3C 66 6E 6E 60 62 3C 00 00 00 00 00 00 00 00 00
LDFNTS:
LDA RESFLG ; is this a restart?
BEQ LDFj ; nope, so check it out
JMP DONE ; okay, so done it
LDFj:
LDA #FONT3T ; FONT 1 TRACK
STA TRACK
LDA #FONT3S ; AND ITS FIRST SECTOR
STA SECTOR
LDA #$20
STA STRT
LDA #$24
STA STRT96
JSR MOVFNT
BCC FONT4
LDA #1 ; SET SO WON'T USE FONT 3
STA F3FLG
; FALL THRU TO DO FONT4 ALSO
FONT4: LDA #FONT4T ; FONT 1 TRACK
STA TRACK
LDA #FONT4S ; AND ITS FIRST SECTOR
STA SECTOR
LDA #$28
STA STRT
LDA #$2C
STA STRT96
JSR MOVFNT
BCC F4EX
LDA #1 ; SET SO WON'T USE FONT 3
STA F4FLG ; FLAG STARTS = 0
F4EX: LDX #>ZBEGIN ; RESET POINTERS TO LOAD
INX ; IN REST OF GAME NOW
STX DBUFF+HI ; STARTING WITH 2ND PAGE
LDX #00 ; (1ST ALREADY IN)
STX DBLOCK+HI
INX
STX DBLOCK+LO
LDA #MAIN
STA DSKBNK ; JIC
RTS
; READ FONT FILE IN AT ZBEGIN + 1
; AND MOVE ITS CONTENTS INTO 80 COL CHAR DEFINITION RAM
MOVFNT: LDX #>ZBEGIN ; READ FONT FILE IN AT PAGE AFTER ZBEGIN
INX ; AS 1ST PAGE OF GAME ALREADY IN
STX DBUFF+HI
STX I+HI ; SET FOR COPY
LDX #0 ; PAGE ALIGNED!
STX I+LO
LDA #MAIN
STA DSKBNK
LDA #4 ; 4 PAGES LONG
STA L
F1LP: JSR GETRES
BCC F1OK
JMP DSKERR ; BAD READ
F1OK: DEC L
BNE F1LP
LDY #5
ISFILE: LDA (I),Y ; CHECK IF THERE IS A FONT FILE
BNE CHKFLE ; IF <> 0, then must be something there
DEY
BPL ISFILE
SEC ; NO FONT FILE PRESENT
RTS ; SET SO THAT DON'T TRY TO USE THAT FONT
CHKFLE: LDY #GOFF
LDA (I),Y ; CHECK HIGH BYTE SB. 0
BNE BADGR
INY
LDA (I),Y
CMP #32
BCC BADGR
STA GCHAR ; SET STARTING CHAR
LDY #GSIZE
LDA (I),Y
CMP #8
BNE BADGR ; CHAR SIZE MUST BE 8*8
INY
LDA (I),Y ; OR I DON'T KNOW THE ALIGNMENT TO USE
CMP #8
BEQ GOODGR
; *** ERROR #17: ALTERNATE CHAR SET FILE NOT USABLE ***
BADGR: LDA #17
JMP ZERROR
; OK, THIS ALTERNATE CHARACTER SET CAN BE USED ON THE C128
; SO LOAD IT INTO THE 80-COL CHIP CHAR DEFINITION RAM
GOODGR: LDY #GCOUNT ; CHAR MAX IS 96, SKIP ANY MORE THAN THIS
LDA (I),Y
BNE SETMAX
INY
LDA (I),Y
CMP #97
BCC GOK
SETMAX: LDA #96
GOK: CLC
ADC GCHAR
STA GEND ; SET JUST BEYOND LAST CHAR TO DO
LDA #CSTART ; SET I TO WHERE CHAR DEFS START
STA I+LO ; (JUST SET CAUSE PAGE STARTED AT 0)
LDA GCHAR
LDX #0
STX J+HI
LDY #4
GLP: ASL A ; MULTIPLY START CHAR BY 16 TO GET OFFSET
ROL J+HI ; INTO 80-COL CHAR RAM
DEY
BNE GLP
STA J+LO
LDA STRT ; ADD IN START OF CHAR RAM
CLC
ADC J+HI
STA J+HI
LDA GCHAR ; IF STARTING IN 64 - 95 RANGE
CMP #$40 ; MUST BRING IT DOWN TO WHERE
BCC BIGLP ; IT BELONGS AT $2000
CMP #$60 ; (MULTIPLIES IN AT $2300 RANGE)
BCS BIGLP
LDA J+HI
SEC
SBC #3
STA J+HI
BIGLP: LDA #8
STA K
SMLOOP: LDY #0 ;GET ADDR & VALUE
LDA (I),Y
LDX J+HI
LDY J+LO
JSR WRTCHR ; AND WRITE IT OUT
INC J+LO
BNE INCI
INC J+HI
INCI: INC I+LO
BNE CHKCNT
INC I+HI
CHKCNT: DEC K
BNE SMLOOP
LDA #8 ; SKIP 8 NULL BYTES OF CHAR DEFINITION
CLC ; IN 80 COL CHAR DEF RAM
ADC J+LO
STA J+LO
BCC NXTCHR ; ON TO NEXT CHAR
INC J+HI
NXTCHR: INC GCHAR ; NEXT CHAR TO DO
LDA GCHAR
CMP GEND ; DONE THEM ALL?
BCS DONE ; NOPE
CMP #$40 ; 64 AND 96 ARE BORDER CHARACTERS
BNE CHK60
LDA STRT ; 64 - 95 LOAD IN AT $2000
STA J+HI
LDA #0
STA J+LO
BEQ BIGLP ; JMP
CHK60: CMP #$60 ; 96 - 127 LOAD IN AT $2400
BNE BIGLP
LDA STRT96
STA J+HI
LDA #0
STA J+LO
BEQ BIGLP ; JMP
DONE: CLC ; TELL CALLING RTN THE FONT IS LOADED
RTS
END