mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-29 16:51:10 +00:00
159 lines
6.4 KiB
NASM
159 lines
6.4 KiB
NASM
|
; c02 Program Initialization Code for VIC-20 with 3K Expansion
|
||
|
|
||
|
;System Specific ASCII Key Mappings
|
||
|
DELKEY EQU $7F ;Delete/Backspace Key (Delete)
|
||
|
ESCKEY EQU $03 ;Escape/Stop Key (RUN/STOP)
|
||
|
RTNKEY EQU $0D ;Return/Enter Key (RETURN)
|
||
|
|
||
|
;Zero Page Locations
|
||
|
usradd EQU $01 ;Address of USR Routine
|
||
|
linnum EQU $14 ;Integer Line Number Value
|
||
|
txttab EQU $2B ;Pointer to Start of BASIC Program Text
|
||
|
vartab EQU $2D ;Pointer to Start of BASIC Variable Storage Area
|
||
|
arytab EQU $2F ;Pointer to Start of BASIC Array Storage Area
|
||
|
strend EQU $31 ;Pointer to Start of Free RAM
|
||
|
fretop EQU $33 ;Pointer to Bottom of String Text Storage Area
|
||
|
memsiz EQU $37 ;Pointer to Highest Address Used by BASIC
|
||
|
inpptr EQU $43 ;Pointer to Source of GET, READ, or INPUT Information
|
||
|
facexp EQU $61 ;Floating Point Accumulator #1: Exponent
|
||
|
facho EQU $62 ;Floating Point Accumulator #1: Mantissa
|
||
|
facsgn EQU $66 ;Floating Point Accumulator #1: Sign
|
||
|
fac2 EQU $69 ;Floating Point Accumulator #2
|
||
|
argexp EQU $69 ;Floating Point Accumulator #2: Exponent
|
||
|
argho EQU $6E ;Floating Point Accumulator #2: Mantissa
|
||
|
argsgn EQU $6F ;Floating Point Accumulator #2: Sign
|
||
|
chrget EQU $73 ;Subroutine: Get Next BASIC Text Character
|
||
|
chrgot EQU $79 ;Entry Point: Get Current BASIC Text Character
|
||
|
txtptr EQU $7A ;Pointer to Current BASIC Text Character
|
||
|
pointb EQU $7C ;Entry Point: Test Character in Accumulator
|
||
|
exit EQU $8A ;RTS at end of CHRGET, CHRGOT, and POINTB Routines
|
||
|
status EQU $90 ;Kernal I/O Status Word
|
||
|
ldtnd EQU $98 ;Number of Open I/O Files, Index to End of File Tables
|
||
|
dfltn EQU $99 ;Default Input Device (Set to 0 for Keyboard)
|
||
|
dflto EQU $9A ;Default Output (CMD) Device (Set to 3 for Screen)
|
||
|
time EQU $A0 ;Software Jiffy Clock
|
||
|
tape1 EQU $B2 ;Pointer: Start of Tape Buffer
|
||
|
fnlen EQU $B7 ;Length of Current Filename
|
||
|
la EQU $B8 ;Current Logical File Number
|
||
|
sa EQU $B9 ;Current Secondary Address
|
||
|
fa EQU $BA ;Current Device Number
|
||
|
fnadr EQU $BB ;Pointer: Current Filename
|
||
|
lste EQU $C5 ;Matrix Coordinate of Last Key Pressed
|
||
|
ndx EQU $C6 ;Number of Characters in Keyboard Buffer
|
||
|
rvs EQU $C7 ;Flag: Print Reverse Characters
|
||
|
sfdx EQU $CB ;Matrix Coordinate of Current Key Pressed
|
||
|
pnt EQU $D1 ;Pointer to Address of Current Screen Line
|
||
|
pntr EQU $D3 ;Cursor Column on Current Line
|
||
|
lnmx EQU $D5 ;Maximum Length of Physical Screen Line
|
||
|
tblx EQU $D6 ;Current Cursor Physical Line Number
|
||
|
insrt EQU $D8 ;Insert Mode (Number of Inserts)
|
||
|
ldtb1 EQU $D9 ;Screen Line Link Table
|
||
|
pntc EQU $F3 ;Pointer to Address of Current Screen Color RAM Location
|
||
|
usrzp1 EQU $FB ;Free Byte for User Programs
|
||
|
usrzp2 EQU $FC ;Free Byte for User Programs
|
||
|
usrzp3 EQU $FD ;Free Byte for User Programs
|
||
|
usrzp4 EQU $FE ;Free Byte for User Programs
|
||
|
|
||
|
;Basic and Kernal Working Storage
|
||
|
buf EQU $0200 ;BASIC Line Editor Input Buffer
|
||
|
lat EQU $0259 ;Kernal Table of Active Logical File Numbers
|
||
|
fat EQU $0263 ;Kernal Table of Device Numbers for Each Logical File
|
||
|
sat EQU $026D ;Kernal Table of Secondary Addressed for Each Logical File
|
||
|
keyd EQU $0277 ;Keyboard Buffer (Queue)
|
||
|
memstr EQU $0281 ;Pointer: Operating System Start of Memory
|
||
|
memsiz EQU $0283 ;Pointer: Operating System End of Memory
|
||
|
color EQU $0286 ;Current Foreground Color Text
|
||
|
hibase EQU $0288 ;Top Page of Screen Memory
|
||
|
xmax EQU $0289 ;Maximum Keyboard Buffer Size
|
||
|
rptflg EQU $028A ;Flag: Which Key Will Repeat?
|
||
|
kount EQU $028B ;Counter for Timing Delay Between Key Repeats
|
||
|
shflag EQU $028D ;Flag: SHIFT/CTRL/Logo Keypress
|
||
|
mode EQU $0291 ;Flag: Change Character Sets with SHIFT/Logo Keypress
|
||
|
|
||
|
user0 EQU $0310 ;Free Byte for User Programs
|
||
|
user1 EQU $0311 ;Free Byte for User Programs
|
||
|
user2 EQU $0312 ;Free Byte for User Programs
|
||
|
user3 EQU $0313 ;Free Byte for User Programs
|
||
|
user4 EQU $0334 ;Free Byte for User Programs
|
||
|
user5 EQU $0335 ;Free Byte for User Programs
|
||
|
user6 EQU $0336 ;Free Byte for User Programs
|
||
|
user7 EQU $0337 ;Free Byte for User Programs
|
||
|
user8 EQU $0338 ;Free Byte for User Programs
|
||
|
user9 EQU $0339 ;Free Byte for User Programs
|
||
|
user10 EQU $033A ;Free Byte for User Programs
|
||
|
user11 EQU $033B ;Free Byte for User Programs
|
||
|
tbffr EQU $033C ;Cassette I/O Buffer
|
||
|
user12 EQU $03FC ;Free Byte for User Programs
|
||
|
user13 EQU $03FD ;Free Byte for User Programs
|
||
|
user14 EQU $03FE ;Free Byte for User Programs
|
||
|
user15 EQU $03FF ;Free Byte for User Programs
|
||
|
|
||
|
;Video RAM and ROM
|
||
|
vicscn EQU $1E00 ;Video Screen Memory Area (Unexpanded)
|
||
|
chrrom EQU $8000 ;Character Generator ROM
|
||
|
vicclr EQU $9600 ;Color RAM (Unexpanded)
|
||
|
|
||
|
;Kernal Routines
|
||
|
chrin EQU $FFCF ;Input Character to Channel
|
||
|
chrout EQU $FFD2 ;Output Character to Channel
|
||
|
getin EQU $FFE4 ;Read Character from Keyboard Buffer
|
||
|
|
||
|
;Machine Language Basic Stub
|
||
|
ORG $0401 ;Start
|
||
|
basic: DC $0C, $04 ; Pointer to Next Line (1036)
|
||
|
DC $00, $00 ; Line Number (0)
|
||
|
DC $9E ; SYS
|
||
|
DC $20 ; ' '
|
||
|
DC $31, $30, $33 ,$38 ; "1038"
|
||
|
DC $00 ;End of Line Marker
|
||
|
DC $00, $00 ;End of Basic Program
|
||
|
|
||
|
start: TSX ;Get Stack Pointer
|
||
|
STX user15 ;and Save for Exit
|
||
|
JMP main ;Execute Program
|
||
|
|
||
|
exit: LDX user15 ;Retrieve Saved Stack Pointer
|
||
|
TXS ;and Restore It
|
||
|
RTS ;Return to BASIC
|
||
|
|
||
|
;Poll Keyboard for Character
|
||
|
plkey EQU getin ;Read Character from Keyboard Buffer
|
||
|
|
||
|
;Get Character from Keyboard
|
||
|
getkey:
|
||
|
|
||
|
;Wait for Character from Keyboard
|
||
|
rdkey: JSR plkey ;Poll Keyboard
|
||
|
BEQ getkey ;If No Key, Loop
|
||
|
RTS
|
||
|
|
||
|
;Delete Previous Character
|
||
|
delchr: RTS
|
||
|
|
||
|
;Advance Character to Next line
|
||
|
newlin: LDA #$0D ;Load C/R into Accumulator
|
||
|
|
||
|
;Print Character to Console
|
||
|
prchr EQU chrout ;
|
||
|
|
||
|
;Print Byte as Two-Digit Hex Number to Console
|
||
|
prbyte: PHA ;Save Accumulater
|
||
|
LSR ;Shift Hi Nybble to Low Nybble
|
||
|
LSR
|
||
|
LSR
|
||
|
LSR
|
||
|
JSR prhex ; and Print it
|
||
|
PLA ;Restore Accumulator
|
||
|
; and fall into prhex
|
||
|
|
||
|
;Print Low Nybble as Hex Digit to Console
|
||
|
prhex: AND #$0F ;Strip High Nybble
|
||
|
CMP #$0A ;If Low Nybble >= 10
|
||
|
BCC prhexc ;
|
||
|
ADC #$06 ; Convert ':' to 'A'...
|
||
|
prhexc: ADC #$30 ;Convert to ASCII Character
|
||
|
JMP prchr ;Print Hex Digit and Return
|
||
|
|
||
|
exit: RTS ;Return to Monitor
|
||
|
|