; Program initialization code for C02 programs ; Template for System Specific Code ;System Specific ASCII Key Mappings DELKEY EQU $7F ;Delete/Backspace Key ($08=Backspace, $7F=Delete) ESCKEY EQU $1B ;Escape/Stop Key ($03=Ctrl-C, $1B=Escape) RTNKEY EQU $0D ;Return/Enter Key ($0D=Carriage Return) NULKEY EQU $00 ;No Key was Pressed ($00=Null) ;Zero Page Locations SRCLO EQU $00 ;Source String/Array Pointer SRCHI EQU $01 DSTLO EQU $02 ;Destination String/Array Pointer DSTHI EQU $03 BFRLO EQU $04 ;Work Buffer Pointer BFRHI EQU $05 STKSAV EQU $0D ;Stack Pointer Storage RDSEED EQU $0E ;Pseudo-RANDOM Seed RANDOM EQU $0F ;Pseudo-RANDOM Number Storage TEMP0 EQU $10 ;Temporary Storage TEMP1 EQU $11 TEMP2 EQU $12 TEMP3 EQU $12 BLKSLO EQU $20 ;Block Start Address BLKSHI EQU $21 BLKELO EQU $22 ;Block End Address BLKEHI EQU $23 BLKLO EQU $24 ;Block Pointer BLKHI EQU $25 STKSLO EQU $28 ;Stack Start Address STKSHI EQU $29 STKELO EQU $2A ;Stack End Address STKEHI EQU $2B STKLO EQU $2C ;Stack Pointer STKHI EQU $2D ORG $0200 ;Program Start Address START: NOP ;System specific initialization code TXS ;If an RTS is used to return to the Operating System, STX STKSAV ; the Stack Pointer should be preserved JMP MAIN ;Execute Program ;Exit Program and Return to Operating System or Monitor EXIT: BRK ;Usually BRK if returning to Monitor LDX STKSAV ;If an RTS is used to return to the Operating System, TXS ; the Stack Pointer should be restored to original state RTS ; in case program exits in the middle of a Function JMP WSTART ;Or it may just execute the BASIC Warm Start Routine ;Poll Character from Keyboard PLKEY: INC RDSEED ;Cycle the Random Seed (if not provided by system) NOP ;Code Read from Keyboad RTS ;Read Character from Console GETKEY; ;Usually Drops into RDKEY, but may need to call RDKEY ; then clean/convert returned value (e.g. Apple-1) ;Wait for Character from Console GETCHR: JSR POLKEY ;Usually calls POLKEY BEQ GETCHR ; until a non-zero is returned RTS ;Delete Previous Character DELCHR: RTS ;Code to move Cursor to left and clear that position ;May work differently on systems that don't support this ;Advance Cursor to Next line NEWLIN: RTS ;Code to move Cursor to beginning of next line ;May emit Carriage Return, Line Feed, or both ;Print Character to Screen PUTCHR RTS ;Code to write ASCII character to Screen ;Clear the Screen CLRSCR: RTS ;Code to Clear Screen ;Move Cursor to Specified Coordinates SETPOS: RTS ;Move Cursor to Column A, Row Y ;Get Cursor Position GETPOS: RTS ;Return Cursor Column in A, Row in Y ;Get Screen Size GETSIZ: RTS ;Return Screen Width in A, Height in Y ;Note: The following two functions replicate calls available ;in the Apple-1 monitor and are included for test purposes ;They will likely be removed before the final release ;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 ;Alternate Code for Systems with Interrupts that don't CLD 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 PUTCHR ;Print Hex Digit and Return