CODELOAD: EQU $4000 ORG CODELOAD ; ------------------------------------------- ; CODE HEADER ; ------------------------------------------- CODESTART: JMP >CODEENTRY FCB 0,0,0 FCB $63 ; Code+Address+6809 FCB COPYMSG-CODESTART FCB 3 CODETITLE: FCC "6809 Test Program" COPYMSG: FCB 0 FCC "(C)2014-7 J.G.Harston" FCB 0 FCB CODELOAD % 256 ; Must be little-endian FCB CODELOAD / 256 FCB 0,0 ; ------------------------------------------- CODEENTRY: pshs cc,a,b,dp,x,y,u ldx #CODETITLE jsr PRSTRING0 jsr OSNEWL jsr PRTEXT fcc " A=" fcb 0 lda 1,s jsr PRHEX jsr PRTEXT fcc " X=" fcb 0 ldx 4,s jsr PR2HEX jsr PRTEXT fcc " U=" fcb 0 ldx 8,s jsr PR2HEX jsr PRTEXT fcc " DP=" fcb 0 lda 3,s jsr PRHEX jsr PRTEXT fcb 13 fcc " B=" fcb 0 lda 2,s jsr PRHEX jsr PRTEXT fcc " Y=" fcb 0 ldx 6,s jsr PR2HEX jsr PRTEXT fcc " S=" fcb 0 leax 10,s jsr PR2HEX jsr PRTEXT fcc " CC=" fcb 0 lda 0,s jsr PRHEX puls cc,a,b,dp,x,y,u pshs x jsr PRTEXT fcb 13 fcc "MEMBOT=&" fcb 0 lda #$83 jsr [OSBYTE+1] ; jsr OSBYTE bypassing emulator jsr PR2HEX jsr PRTEXT fcc " MEMTOP=&" fcb 0 lda #$84 jsr [OSBYTE+1] ; jsr OSBYTE bypassing emulator jsr PR2HEX jsr PRTEXT fcc " ADDRHI=&" fcb 0 lda #$82 jsr [OSBYTE+1] ; jsr OSBYTE bypassing emulator jsr PR2HEX jsr PRTEXT fcb 13 fcc "CMD=>" fcb 0 puls x TXTLP: lda ,x+ cmpa #32 bcs TXT2 jsr OSWRCH bra TXTLP TXT2: jsr PRTEXT fcc "<" fcb 13,13 fcc "6809 BIOS entries:" fcb 13,0 ldd COLD cmpd OSCOLD+1 beq BIOSTEST jsr PRTEXT fcc " none" fcb 13,13,0 jmp MOSTEST BIOSTEST: fcc "INCH (press a key): " fcb 0 jsr [INCH] jsr PRHEX jsr PRTEXT fcb 13 fcc "INCHE (press a key): " fcb 0 jsr [INCHE] pshs a jsr PRSPACE puls a jsr PRHEX jsr OSNEWL CHKLP: jsr OSWRCR jsr PRTEXT fcc "INCHK (press a key): " fcb 0 jsr [INCHECK] pshs cc lda ,s jsr PRHEX puls cc beq CHKLP jsr [INCH] jsr PRTEXT fcb 13 fcc "OUTCH: " fcb 0 LDX #$40 OUTLP: TFR X,D TFR B,A JSR [OUTCH] LEAX 1,X CMPX #$60 BNE OUTLP jsr PRTEXT fcb 13 fcc "PDATA: " fcb 0 ldx #DATA1 jsr [PDATA] jsr PRTEXT fcb 13 fcc "PCRLF: (move to next line)" fcb 0 jsr [PCRLF] jsr PRTEXT fcc "PSTRG: (print on next line)" fcb 0 ldx #DATA2 jsr [PSTRG] MOSTEST: jsr PRKEY jsr PRTEXT fcc "BBC MOS entries:" fcb 13 fcc "PRHEX: " fcb 0 clrb HEX1LP: tfr b,a jsr PRHEX addb #1 cmpb #14 bne HEX1LP jsr PRTEXT fcb 13 fcc "PR2HEX: " fcb 0 ldx #0 HEX2LP: jsr PR2HEX jsr PRSPACE leax $10E,X cmpx #$0600 bcs HEX2LP jsr PRTEXT fcb 13 fcc "PRTEXT: This is using PRTEXT" fcb 0 jsr PRTEXT fcb 13 fcc "PRSTRING: " fcb 0 ldx #DATA3 jsr PRSTRING0 jsr PRTEXT fcc "OSINIT: BRKV=&" fcb 0 lda #$ff jsr OSINIT pshs cc jsr PR2HEX jsr PRTEXT fcc " ERRFLG=&" fcb 0 tfr y,x jsr PR2HEX jsr PRTEXT fcb 13 fcc " " fcb 0 ldx #DATA5 puls cc bne ENDIAN ldx #DATA6 ENDIAN: jsr PRSTRING0 jsr PRTEXT fcb 13 fcc "ERRJMP: save BRKV" fcb 0 lda #$FF ; Read BRKV/ESCFLG jsr OSINIT ; X=>BRKV ldy ,x pshs y ; Save old BKRV pshs x ; Save =>BRKV jsr PRTEXT fcc ", claim BRKV" fcb 0 puls x ; Get =>BRKV pshs x ldy #MYERR sty ,x jsr PRTEXT fcc ", generate error" fcb 0 ldx #DATA4 pshs x JMP ERRJMP MYERR: pshs x ; X=>error jsr PRTEXT fcb 13 fcc "ERRJMP: caught error: " fcb 0 puls x ; X=>error lda ,x+ jsr PRHEX jsr PRSPACE jsr PRSTRING0 jsr PRTEXT fcb 13 fcc "ERRJMP: restore BRKV" fcb 0 puls x ; =>BRKV puls y ; old BRKV sty ,x jsr PRKEY ; jsr PRTEXT ; fcb 13 ; fcc "OSFIND:" ; fcb 13 ; fcc "OSGBPB:" ; fcb 13 ; fcc "OSBGET:" ; fcb 13 ; fcc "OSBPUT:" ; fcb 13 ; fcc "OSARGS:" ; fcb 13 ; fcc "OSFILE:" ; fcb 13 ; fcc "OSRDCH:" ; fcb 13 ; fcc "OSASCI:" ; fcb 13 ; fcc "OSNEWL:" ; fcb 13 ; fcc "OSWRCR:" ; fcb 13 ; fcc "OSWRCH:" ; fcb 13 ; fcc "OSWORD:" ; fcb 13 ; fcc "OSBYTE:" jsr PRTEXT fcc "OS_CLI: *" HELP: fcc "help tube" fcb 13,0 ldx #HELP jsr OS_CLI jsr PRTEXT fcc "(Q)uit or (R)eturn? " fcb 0 QUITLP: jsr OSRDCH anda #$df cmpa #'Q' beq QUIT cmpa #'R' bne QUITLP jsr OSWRCH jmp OSNEWL QUIT: jsr PRTEXT fcb 'Q',13 fcc "OSQUIT" fcb 13,0 jmp OSQUIT PRSPACE: LDA #32 JMP OSWRCH PRKEY: JSR PRTEXT fcb 13,13 fcc "Press a key..." fcb 0 jsr OSRDCH jmp OSWRCR PRSTRING0: LDD PRSTRING+1 CMPD PRSTRING+4 LBNE PRSTRING JMP PRSTR0 PRSTR0: EQU $FFC5 ; Legacy equate DATA1: fcc "PDATA text" fcb 4 DATA2: fcc "PSTRG text" fcb 4 DATA3: fcc "PRSTRING text" fcb 13,0 DATA4: fcb 255 fcc "Test error message" fcb 0 DATA5: fcc "Old little-endian addresses" fcb 0 DATA6: fcc "Big-endian file addresses" fcb 0 ; ========================================================= ; 6809 BIOS Equates ; ========================================================= COLD: EQU $F800 ; cold start WARM: EQU $F802 ; warm start INCH: EQU $F804 ; char input INCHE: EQU $F806 ; char input with echo INCHECK: EQU $F808 ; test for char input OUTCH: EQU $F80A ; char output PDATA: EQU $F80C ; output string until EOT PCRLF: EQU $F80E ; output CR/LF PSTRG: EQU $F810 ; output CR/LF then string until EOT LRA: EQU $F812 ; Load Real Address ; ========================================================= ; ========================================================= ; 6809 BBC MOS Equates ; ========================================================= OSCOLD: EQU $FF98 PRSTRING: EQU $FF9B ; Print text at X SCANHEX: EQU $FFA1 ; Read hex PRHEX: EQU $FFAA ; Print A as 8-bit hex 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 program 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 ; =========================================================