; > Test11.src ORG &4000 .HeaderStart BR HeaderCode ; Allows entry at first byte EQUB 0 EQUB &60,&00,&00 EQUB &67 ; Code+Tube+PDP11 EQUB HeaderCopyright-HeaderStart EQUB 0 ; Version byte .HeaderTitle EQUS "PDP11 Tube test program" ; ROM title .HeaderCopyright EQUB 0,"(C)J.G.Harston",0 ; Copyright message EQUD HeaderStart ; Tube transfer address EQUD HeaderCode-HeaderStart ; Offset to Tube execution address ; ; .HeaderCode #ifdef UNIX ORG 0 ; Position independent code EQUW &0107 ; Magic number &o000407, also branch to Startup EQUW CodeEnd-Startup ; size of text EQUW 0 ; size of initialised data EQUW 0 ; size of uninitialised data EQUW 0 ; size of symbol data EQUW Startup-Startup ; entry point EQUW 0 ; not used EQUW 1 ; no relocation info ORG 0 ; Position independent code #endif ; .Startup mov r1,-(sp) mov r0,-(sp) adr HeaderTitle,r1 jsr pc,IO_WrString jsr pc,IO_NEWL mov (sp)+,r0 mov (sp),r1 mov r7,-(sp) mov r6,-(sp) mov r5,-(sp) mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) mov r1,-(sp) mov r0,-(sp) ; mov #ASC"0",r1 .PrRegs mov r1,-(sp) mov #ASC"R",r0 jsr pc,IO_WRCH mov (sp),R0 jsr pc,IO_WRCH mov #ASC"=",r0 jsr pc,IO_WRCH mov #ASC"&",r0 jsr pc,IO_WRCH mov (sp)+,r1 mov (sp)+,r0 jsr pc,PrHex2 mov #ASC" ",r0 jsr pc,IO_WRCH inc r1 cmp r1,#ASC"8" bne PrRegs ; mov #&83,r0 adr txtMEMBOT,r1 jsr pc,PrOsbyte ; mov #&84,r0 adr txtMEMTOP,r1 jsr pc,PrOsbyte ; mov #&82,r0 adr txtADDRHI,r1 jsr pc,PrOsbyte ; ;adr txtPROG,r1 ;jsr pc,IO_WrString ;adr HeaderStart,r0 ;jsr pc,PrHex2 ; adr txtCMD1,r1 jsr pc,IO_WrString mov (sp)+,r1 beq txtdone .txtlp movb (r1)+,r0 cmp r0,#13 beq txtdone jsr pc,IO_WRCH br txtlp .txtdone adr txtCMD2,r1 jsr pc,IO_WrString ; adr txtBreak1,r1 jsr pc,IO_WrString jsr pc,PressKey ; Hacky direct memory peeking for test purposes ; Do not do in production code mov &F5FC,r2 ; get current PROG adr Startup,r0 mov r0,&F5FC ; make me into current program adr txtBreak2,r1 jsr pc,IO_WrString jsr pc,PressKey mov r2,&F5FC ; restore previous program adr txtBreak3,r1 jsr pc,IO_WrString #ifdef UNIX adr txtQuit,r1 jsr pc,IO_WrString clr r0 emt OSQUIT #else clr r0 rts pc #endif ; ; .PressKey adr txtPress,r1 jsr pc,IO_WrString jsr pc,IO_RDCH jmp IO_WRCR ; .PrOsbyte mov r0,-(sp) jsr pc,IO_WrString mov (sp)+,r0 emt OSBYTE mov r1,r0 ; .PrHex2 mov r0,-(sp) swab r0 jsr pc,PrHex1 mov (sp)+,r0 .PrHex1 mov r0,-(sp) ror r0 ror r0 ror r0 ror r0 jsr pc,PrNybble mov (sp)+,r0 .PrNybble bic #&FFF0,r0 cmp #9,r0 bcc PrDigit add #7,r0 .PrDigit add #ASC"0",r0 jmp IO_WRCH ; .txtPress equs "Press a key",0 .txtMEMBOT equs 13,"MEMBOT=&",0 .txtMEMTOP equs " MEMTOP=&",0 .txtADDRHI equs " ADDRHI=&",0 ;.txtPROG equs " PROG=&",0 .txtCMD1 equs 13,"CMD=>",0 .txtCMD2 equs "<",13,0 .txtBreak1 equs "Currently a transient command.",13,"If you press Break the caller will be re-entered.",13,0 .txtBreak2 equs "Now we are the current program.",13,"If you press Break we will be re-entered.",13,0 .txtBreak3 equs "Returned back to being a transient program.",13,0 .txtQuit equs "OS_QUIT",13,0 align ; ========================================================= ; PDP11 BBC MOS Equates ; ========================================================= OSERROR: EQU 15 ; Generate error OSHAND: EQU 14 ; Read/Write environment handlers OSSYST: EQU 13 ; System functions OSFIND: EQU 12 ; Open/Close file OSGBPB: EQU 11 ; Read/Write bytes OSBPUT: EQU 10 ; Write single byte OSBGET: EQU 9 ; Read single byte OSARGS: EQU 8 ; Read/Write open file info OSFILE: EQU 7 ; Load/Save/Info on file OSRDCH: EQU 6 ; Wait for character input OSNEWL: EQU 5 ; Output newline sequence OSWRCH: EQU 4 ; Output character OSWORD: EQU 3 ; System info via control block OSBYTE: EQU 2 ; System info via registers OS_CLI: EQU 1 ; Execute command OSQUIT: EQU 0 ; Quit current process ; ========================================================= ; Routines from TubeIO.mac ;#include "..\..\PDP11\Assembler\TubeIO.mac" .IO_WrStrLp jsr pc,IO_ASCI .IO_WrString ; Print text pointed to by R1, terminated by &00 movb (r1)+,r0 ; Get byte from r1, inc r1 bne IO_WrStrLp ; Not final byte, print it rts pc ; and exit ; .IO_ASCI ; Print ASCII character cmp r0,#13 bne IO_WRCH .IO_NEWL ; Print NEWL mov #10,R0 jsr pc,IO_WRCH .IO_WRCR ; Print CR mov #13,r0 .IO_WRCH emt 4 ; OSWRCH r0=char rts pc .IO_RDCH emt 6 ; OSRDCH rts pc .CodeEnd