; c02 Program Initialization Code for Commodore 64

;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 Variables
XMBANK  EQU $0A ;Extended Memory Bank [Load/Verify Flag]
XMADDR  EQU $0B ;Extended Memory Address [Array Index/Flags]
;           $16 ;[Temporary String Stack Pointer]
SRCPTR  EQU $17 ;Source Pointer [Temporary String Space Pointer]
DSTPTR  EQU $19 ;Destination Pointer [Temporary String Stack]
;           $21 ;[Temporary String Stack]
BLKPTR  EQU $22 ;Block Pointer [Temporary Pointers]
STKPTR  EQU $24 ;Stack Pointer [Temporary Pointers]
;       $26-$29 ;[Floating Point Work Area]
USRPTR  EQU $35 ;[Temporary String Pointer]
TEMP0   EQU $61 ;Temporary Variable [Floating Point Accumulator]
TEMP1   EQU $63 ;Temporary Variable [Floating Point Accumulator]
TEMP2   EQU $65 ;Temporary Variable [Floating Point Accumulator]
TEMP3   EQU $67 ;Temporary Variable [Floating Point Accumulator]
TMPPTR  EQU $69 ;Temporary Pointer [Floating Point Argument]
;       $6A-$70 ;[Floating Point Argument]
.STKEY  EQU $91 ;Stop Key flag
RDSEED  EQU $A2 ;Random Seed [Software Jiffy Clock (Low Byte)]
;       $FB-$FE ;Unused Zero Page for Applications

;System Variables
SYSBFL  EQU 88    ;System Buffer Size (88 Bytes)
SYSBFR  EQU $0200 ;System Buffer [Keyboard Buffer]
SYSBFP  EQU $0313 ;Position in System Buffer [Free Byte]

BLKBGN  EQU $0334 ;Block Start [Unused Byte]
BLKEND  EQU $0336 ;Block Start [Unused Byte]
BLKLEN  EQU $0338 ;Block Length [Unused Byte]

RANDOM  EQU $0339 ;Random Number Storage [Unused Byte]
.STKSAV EQU $033A ;Machine Stack Storage [Unused Byte]
;           $033B ;Free Byte for User Programs
TBFFR   EQU $033C ;Cassette I/O Buffer

STKBGN  EQU $03FC ;Stack Start     [Unused Byte]
STKEND  EQU $03FE ;Stack End       [Unused Byte]

;Video RAM and ROM 
VICSCN  EQU $0400 ;Video Screen Memory Area (Unexpanded)
CHRROM  EQU $D000 ;Character Generator ROM
VICCLR  EQU $D800 ;Color RAM (Unexpanded)

;ROM Routines
FSFLFA  EQU $F314 ;Find Logical File A

;Machine Language Basic Stub
        ORG $0801              ;Start of Basic Program 
BASIC:  DC  $0C, $08           ;Pointer to Next Line 
        DC  $00, $00           ;Line Number (0)
        DC  $9E                ;SYS 
        DC  $20                ;' '
        DC  $32, $30, $36 ,$32 ;"2062" 
        DC  $00                ;End of Line Marker
        DC  $00, $00           ;End of Basic Program

START:  TSX         ;Get Stack Pointer
        STX .STKSAV ;and Save for Exit
        JMP MAIN    ;Execute Program

EXIT:   LDA #0      ;Clear Stop Key Flag
        STA .STKEY   
        LDX .STKSAV ;Retrieve Saved Stack Pointer
        TXS         ;and Restore It
        RTS

;Poll Keyboard for Character
POLKEY  EQU $FFE4   ;Aliased to Kernal GETIN Routine

;Get Character from Keyboard
GETKEY  EQU POLKEY  ;Get Key From Keybord

;Wait for Character from Keyboard
GETCHR: JSR GETKEY  ;Poll Keyboard
        BEQ GETCHR  ;If No Key, Loop
        RTS

;Print Character to Console
;uses direct call to SCRNOUT instead of CHROUT 
PUTCHR  EQU $E716   ;Aliased to SRCNOUT Routine

;Delete Previous Character
DELCHR: LDA #DELKEY ;Load Delete Character
        JMP PUTCHR  ;Print and Return

;Advance Character to Next line
NEWLIN: LDX #0      ;Store 0
        STX $D3     ;in Cursor Column and
        JMP $E87C   ;Execute NXTLINE Routine

;Print Zero Delimited String to Screen
PUTSTR: TXA         ;Copy LSB to Accumulator
        JMP $AB1E   ;Execute STROUT

        INCLUDE "prbyte.a02" ;PRBYTE and PRHEX routine

