; > bbc09/src - Demo BBC BASIC startup code for the 6809 ; Example 6809 application startup code with simple command loop ; ; =================== ; BASIC WORKSPACE ; =================== ; ZERO PAGE WORKSPACE ; ------------------- zpLOMEM EQU $00 zpVAREND EQU $02 zpSTACK EQU $04 zpHIMEM EQU $06 zpERL EQU $08 zpTOP EQU $12 zpPAGE EQU $18 ; ; assigned arbitarily for this demo: zpCONTROL EQU $30 ; Control block zpESCADDR EQU $50 zpERRADDR EQU $52 ; ; ------------------- ; MAIN WORKSPACE ; ------------------- INPUTBUF EQU $100 ; Input buffer MEMBASE EQU INPUTBUF+$100 ; Lowest non-workspace memory ; =================== ORG $A000 ; DIRECT $00 CODESTART ; Code header FCB $7E ; CODE+0: entry point FDB CODEENTRY ; Use JMP >ext to label as absolute code FCB $60,0,0 ; CODE+3: Null service entry FCB $63 ; CODE+6: type=CODE+TUBE+6809 FCB COPYRIGHT-CODESTART ; CODE+7: offset to 0,"(C)" FCB 0 ; CODE+8: version byte CODETITLE FCC "6809 DEMO" ; CODE+9: title string FCB 0 FCC "0.00 (01 Jan 2015)" ; version string COPYRIGHT FCB 0 FCC "(C)J.G.Harston" ; Copyright string FCB 0 FCB CODESTART % 256, CODESTART / 256, 0, 0 ; Little-endian load address ; CODEENTRY ADCA #0 ; Print title if not entered from RESET CMPA #1 BEQ STARTUP LDX #CODETITLE JSR PRSTRING JSR OSNEWL JSR OSNEWL STARTUP LDA #$00 TFR A,DP ; Direct Page is $00xx JSR OSINIT ; Set up program environment STY zpESCADDR ; Save ESCFLG address LDD #ERRORS STD ,X ; Claim BRKV ; LDA #$83 ; OSBYTE $83 - bottom of user memory JSR OSBYTE ; X=bottom of user memory CMPX #MEMBASE ; Amount of workspace needed BHS STARTUP1 LDX #MEMBASE STARTUP1 STX zpPAGE ; LDA #$84 ; OSBYTE $84 - top of user memory JSR OSBYTE ; X=top of user memory STX zpHIMEM ; $06/7=top of memory STX zpSTACK ; $04/5=bottom of BASIC stack TFR X,S ; Put stack at top of memory ; ; LOOP LDA #'>' JSR OSWRCH LDD #INPUTBUF STD zpCONTROL+0 ; Input buffer LDA #$F7 STA zpCONTROL+2 ; MaxLen LDD #$20FF STD zpCONTROL+3 ; CharMin, CharMax LDX #zpCONTROL LDA #0 JSR OSWORD ; Read input line BCS ESCAPE LDX #INPUTBUF LDA ,X+ CMPA #'*' ; Allow *commands BNE LOOP JSR OS_CLI JMP LOOP ESCAPE LDA #$7E JSR OSBYTE ; Acknowledge Escape SWI FCB 17 FCC "Escape" FCB 0 ERRORS STX zpERRADDR ; Store address of error LDA ,X+ ; Get error number and step past JSR OSNEWL JSR PRSTRING JSR OSNEWL JMP LOOP ; ========================================================= ; 6809 BBC MOS Equates ; ========================================================= PRSTRING EQU $FF9B ; Print text at X SCANHEX EQU $FFA1 ; Read hex PRHEX EQU $FFAA ; Print A as 8-bit hex PR1HEX EQU $FFAA ; Print A as 8-bit hex (alias) PR2HEX EQU $FFAD ; Print X as 16-bit hex PRTEXT EQU $FFB3 ; Print inline text OSQUIT EQU $FFB9 ; Quit current process OSERROR EQU $FFBC ; Generate an error OSINIT EQU $FFBF ; Initialise default environment OSFIND EQU $FFCE ; Open/Close file OSGBPB EQU $FFD1 ; Read/Write bytes OSBPUT EQU $FFD4 ; Write single byte OSBGET EQU $FFD7 ; Read single byte OSARGS EQU $FFDA ; Read/Write open file info OSFILE EQU $FFDD ; Load/Save/Info on file OSRDCH EQU $FFE0 ; Wait for character input OSASCI EQU $FFE3 ; Output ASCII character OSNEWL EQU $FFE7 ; Output newline sequence OSWRCR EQU $FFEC ; Output OSWRCH EQU $FFEE ; Output character OSWORD EQU $FFF1 ; System info via control block OSBYTE EQU $FFF4 ; System info via registers OS_CLI EQU $FFF7 ; Execute command ; =========================================================