mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-17 15:06:29 +00:00
120 lines
3.8 KiB
NASM
120 lines
3.8 KiB
NASM
; c02 Program Initialization Code for Unexpanded VIC-20
|
|
|
|
;ASCII Control Codes Equivalents
|
|
CR EQU $0D ;Carriage Return
|
|
LF EQU $11 ;Line Feed (Cursor Down)
|
|
DEL EQU $14 ;Delete
|
|
HT EQU $1D ;Horizontal Tab (Cursor Right)
|
|
VT EQU $91 ;Vertical Tab (Cursor Up)
|
|
FF EQU $93 ;Form Feed (Clear Screen)
|
|
BS EQU $9D ;Backspace (Cursor Left)
|
|
|
|
;PETSCII Key Mappings
|
|
DELKEY EQU $14 ;Delete/Backspace Key (Delete)
|
|
ESCKEY EQU $03 ;Escape/Stop Key (RUN/STOP)
|
|
RTNKEY EQU $0D ;Return/Enter Key (RETURN)
|
|
|
|
;Zero Page Locations
|
|
strlo EQU $FB ;String Pointer (stdio.asm)
|
|
strhi EQU $FC ;Free Byte for User Programs
|
|
usrzp3 EQU $FD ;Free Byte for User Programs
|
|
usrzp4 EQU $FE ;Free Byte for User Programs
|
|
|
|
;Other RAM Locations
|
|
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 $1001 ;Start
|
|
basic: DC $0C, $10 ; Pointer to Next Line (4108)
|
|
DC $00, $00 ; Line Number (0)
|
|
DC $9E ; SYS
|
|
DC $20 ; ' '
|
|
DC $34, $31, $31 ,$30 ; "4110"
|
|
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 ;
|
|
|
|
;Delete Previous Character
|
|
delchr: LDA #$9D ;Load Cursor Left into Accumulator
|
|
JSR prchr ; and Print it
|
|
LDA #$14 ;Load Delete into Accumulater
|
|
JMP prchr ; and Print it
|
|
|
|
;Advance Character to Next line
|
|
newlin: LDA #$0D ;Load C/R into Accumulator
|
|
JMP prchr ; and Print it
|
|
|
|
;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
|
|
|