; py65mon program initialization code for c02 programs

;System Specific ASCII Key Mappings
DELKEY  EQU $08     ;Delete/Backspace Key (Backspace)
ESCKEY  EQU $1B     ;Escape/Stop Key      (Escape)
RTNKEY  EQU $0D     ;Return/Enter Key     (Carriage Return)

;Zero Page Locations
SRCPTR  EQU $30     ;Source Pointer 
DSTPTR  EQU $32     ;Destination Pointer
BFRLO   EQU $34     ;Work Buffer Pointer
BFRHI   EQU $35
BLKPTR  EQU $36     ;Block Segment Pointer (block.a02)
STKLO   EQU $36     ;Stack Pointer (stack.a02)
STKHI   EQU $37

RDSEED  EQU $3E     ;Pseudo-RANDOM Seed
RANDOM  EQU $3F     ;Pseudo-RANDOM Number Storage

TEMP0   EQU $40     ;Temporary Storage
TEMP1   EQU $41
TEMP2   EQU $42
TEMP3   EQU $43

BLKBGN  EQU $46     ;Block Start Address
BLKEND  EQU $48     ;Block End Address
BLKLEN  EQU $4A     ;Block Segment Length     

STKSLO  EQU $4C     ;Stack Start Address
STKSHI  EQU $4D
STKELO  EQU $4E     ;Stack End Address
STKEHI  EQU $4F

;Memory Mapped I/O 
PUTCON    EQU $F001   ;Write Character to Console
GETCON    EQU $F004   ;Read Character from Console

        ORG $0200   ;START Directly Above Stack

START:  JMP MAIN    ;Execute Program

;Poll Character from Keyboard
PLKEY:  INC RDSEED  ;Cycle the RANDOM Seed (if not provided by system)
        LDA GETCON  ;Read Character from Console
        CMP $E0     
        BNE PLKEYX  ;If E0 Extended Key 
        LDA GETCON  ;  Get Second Byte
        ORA $80     ;  and Set High Byte
PLKEYX: RTS

;Read Character from Console
GETKEY             ;Same As RDKEY

;Wait for Character from Console
GETCHR: JSR POLKEY  ;Read Character from Console
        BEQ GETCHR  ;  Loop if None Received
        RTS

;Delete Previous Character
DELCHR: LDA #$08    ;Load Backspace into Accumulator
        JSR PUTCHR  ;  and Print it
        LDA #$20    ;Load Space into Accumulater
        JSR PUTCHR  ;  and Print it
        LDA #$08    ;Load Backspace into Accumulator
        JMP PUTCHR  ;  and Print it

;Advance Character to Next line
NEWLIN: LDA #$0D    ;Load C/R into Accumulator
        JSR PUTCHR  ;  and Print it
        LDA #$0A    ;Load L/F into Accumulater
                    ;  and fall into PRCHR

;Print Character to Console
PUTCHR STA PUTCON  ;Write Character to Console
        RTS

EXIT:   BRK        ;Return to Monitor

;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 Nybb
        SED        ;Set Decimal Flag for 
        CLC        ;  Addition Wizardry
        ADC #$90   ;Convert to $90-$99,$00-$05
        ADC #$40   ;Convert to $30-$39,$41-$46
        CLD        ;Clear Decimal Flag
        JMP PUTCHR ;Print Hex Digit and Return
