term equ $f00001 base address of 68681 on 68010SBC ESC equ $1b MRA equ 0 SRA equ 2 CSRA equ 2 CRA equ 4 RTXA equ 6 ACR equ 8 ISR equ 10 CTUR equ 12 CTLR equ 14 OPRC equ 26 OPC equ 28 stack equ $1400 data equ $1400 totram equ data+$40 brkadr equ data+$44 userpc equ data+$48 usersr equ data+$4c run equ data+$4e cputyp equ data+$50 buf equ $1480 rambeg equ $2400 rombeg equ $800000 romend equ $900000 os9 equ $801000 org 0 entry dc.l $1400 dc.l rombeg+main dc.l 0 dc.l 0 main move #$2700,sr * move.l #stack,sp move.l #0,(brkadr) move #0,(run) move sr,(usersr) move #0,(cputyp) default 68000 lea.l cpuok(pc),a0 move.l a0,$10 setup ill instr vector move ccr,d0 illegal on 68000 move #10,(cputyp) appears to be 68010 cpuok lea.l memok(pc),a1 move.l a1,$8 setup buserr vector move.l #0,a1 memchk move.l a1,a0 adda.l #$fffc,a1 check every 64k block move.l (a1),d0 move.l #$5aa55aa5,(a1) nop nop cmp.l #$5aa55aa5,(a1) bne.s memok move.l #$a55aa55a,(a1) nop nop cmp.l #$a55aa55a,(a1) bne.s memok move.l d0,(a1)+ bra.s memchk memok move.l a0,d0 move.l d0,(totram) move.l #stack,sp bsr init now init serial bsr vectors and the vector table lea.l trap(pc),a0 move.l a0,$24 set trace vector move.l (totram),d0 lea.l mess(pc),a0 now show startup message bsr printf lea.l mess00(pc),a0 print cpu type tst (cputyp) beq.s prtyp lea.l mess10(pc),a0 prtyp bsr printf loop lea.l prompt(pc),a0 main loop bsr printf bsr readln cmpi.b #ESC,d0 beq.s loopesc tst d1 no chars in buf beq.s loop bsr docmd get cmd pointer bra.s loop loopesc lea.l escstr(pc),a0 bsr printf bra.s loop docmd clr d0 move d0,d2 lea.l cmdstr(pc),a1 do3 lea.l buf,a0 do2 move.b (a1)+,d0 beq.s do1 cmp.b (a0)+,d0 beq.s do2 do4 tst.b (a1)+ bne.s do4 addq #1,d2 bra.s do3 do1 cmp cmdcnt(pc),d2 bmi.s do5 lea.l errstr(pc),a0 bra printf do5 bsr skipsp bsr getpar d1=#chars lsl #1,d2 move cmdtbl(pc,d2.w),d2 jmp cmdtbl(pc,d2.w) cmdcnt dc.w 11 cmdstr dc.b 'du',$0 dc.b 'go',$0 dc.b 'gb',$0 dc.b 'tr',$0 dc.b 'he',$0 dc.b 'li',$0 dc.b 'lo',$0 dc.b 'mm',$0 dc.b 'bo',$0 dc.b 'br',$0 dc.b 'kb',$0 dc.b $0 cmdtbl dc.w dump-cmdtbl dc.w go-cmdtbl dc.w gb-cmdtbl dc.w tr-cmdtbl dc.w help-cmdtbl dc.w list-cmdtbl dc.w load-cmdtbl dc.w modify-cmdtbl dc.w boot-cmdtbl dc.w setbrk-cmdtbl dc.w kilbrk-cmdtbl vectors movem.l d0/a0-a2,-(sp) lea.l $400,a1 lea.l excptn(pc),a0 move.l #8,a2 move #$fd,d0 vec1 move.l a1,(a2) move #$4878,(a1)+ pea.w move a2,(a1)+ move #$4ef9,(a1)+ jmp.l excptn move.l a0,(a1)+ addq #4,a2 dbf d0,vec1 movem.l (sp)+,d0/a0-a2 rts excptn movem.l d0-d7/a0-a7,(data) moveq #0,d0 move (sp)+,d0 ? move (sp)+,d0 pop vectornr move (sp)+,(usersr) pop sr move.l (sp)+,(userpc) pop pc tst (cputyp) beq.s ex1 adda #2,sp ex1 lea.l oeps(pc),a0 bsr printf move.l (userpc),d0 lea.l oeps2(pc),a0 bsr printf bsr dumpreg bra loop readln lea.l buf,a0 moveq #0,d0 moveq #0,d1 rdl1 bsr getch cmpi.b #ESC,d0 bne rdl4 rts rdl4 cmp.b #$0d,d0 bne.s rdl2 bsr putch move.b #$a,d0 bsr putch move.b #0,(a0)+ end of inputline rts rdl2 cmpi.b #8,d0 bne.s rdl3 tst d1 beq.s rdl1 bsr putch move.b #$20,d0 bsr putch move.b #8,d0 bsr putch suba.l #1,a0 subq #1,d1 bra.s rdl1 rdl3 bsr putch move.b d0,(a0)+ addq #1,d1 d1=#chars in buf bra.s rdl1 skipsp move.b (a0),d0 cmpi.b #' ',d0 bne.s skip9 adda #1,a0 bra.s skipsp skip9 rts getbyte movem.l d5/d7,-(sp) moveq #2,d7 get 2 digits bra.s geth0 getpar movem.l d5/d7,-(sp) moveq #8,d7 get up to 8 chars geth0 moveq #0,d0 init hex move d0,d1 count geth1 move.b (a0)+,d5 get char from buf subi.b #'0',d5 make digit bmi.s geth9 <0 so end of word/line cmpi.b #9,d5 ble.s geth2 char<=9? andi.b #$df,d5 no, is char, convert to upper subi.b #7,d5 cmpi.b #$a,d5 bmi.s geth9 cmpi.b #$f,d5 bgt.s geth9 geth2 lsl.l #4,d0 or.b d5,d0 addq #1,d1 cmp d1,d7 bne.s geth1 geth9 movem.l (sp)+,d5/d7 rts ************************************************* * dump memory ************************************************* dump move.l d0,a1 dmp0 lea.l dmptxt1(pc),a0 bsr printf move #15,d7 16 regels dmp1 move.l a1,d0 bsr prhex move.b #' ',d0 bsr putch move.l a1,-(sp) move #15,d6 16 bytes/regel dmp2 move.b #' ',d0 bsr putch move.b (a1)+,d0 bsr prbyt dbra d6,dmp2 move.l (sp)+,a1 move.b #' ',d0 bsr putch bsr putch move #15,d6 and character print dmp3 move.b (a1)+,d0 cmpi.b #$20,d0 bcs.s dmp4 cmpi.b #$7f,d0 bcs.s dmp5 dmp4 move.b #'.',d0 dmp5 bsr putch dbra d6,dmp3 bsr crlf dbra d7,dmp1 bsr readln cmpi.b #ESC,d0 beq.s dmp9 tst d1 beq dmp0 dmp9 rts dmptxt1 dc.b 'Address 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E',$d,$a dc.b '---------------------------------------------------------------------------',$d,$a,$0 * '00001000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ************************************************* * modify memory ************************************************* modify move.l d0,a1 mod0 move.l a1,d0 lea.l modtxt1(pc),a0 bsr printf move.b (a1),d0 bsr prbyt move.b #' ',d0 bsr putch move.b #'?',d0 bsr putch bsr readln cmpi.b #ESC,d0 beq.s mod9 tst d1 bne.s mod1 addq #1,a1 bra.s mod0 mod1 lea.l buf,a0 bsr skipsp bsr getpar move.b d0,(a1)+ bra.s mod0 mod9 bsr crlf rts modtxt1 dc.b '%x: ',$0,$0 ************************************************* * set breakpoint ************************************************* setbrk tst.l d0 beq.s setb1 move.l d0,(brkadr) setb1 lea.l brkstr(pc),a0 move.l (brkadr),d0 bne.s setb2 lea.l nobrks(pc),a0 setb2 bsr printf rts kilbrk move.l #0,(brkadr) rts ************************************************* * trace instruction ************************************************* tr clr (run) bra.s gb1 ************************************************* * run until breakpoint ************************************************* gb move #1,(run) gb1 move sr,(usersr) bset #7,(usersr) bra.s go1 ************************************************* * run ************************************************* go move sr,(usersr) go1 move.l #stack,sp init stack to top tst d1 # chars from getpar beq.s step move.l d0,(userpc) startaddr step tst (cputyp) 68000 or 68010 processor? beq.s step1 move #0,-(sp) push format (68010) step1 move.l (userpc),-(sp) push pc move (usersr),-(sp) push sr movem.l (data),d0-d7/a0-a6 restore regs rte continue at pc trap move (sp)+,(usersr) get sr move.l (sp)+,(userpc) get pc tst (cputyp) beq.s trap1 adda #2,sp ignore format (68010) trap1 movem.l d0-d7/a0-a7,(data) save all regs move.l (userpc),a0 check if pc is in monitor cmpa.l #rombeg,a0 a0 ',$0 dbgpr dc.b ':> ',$0 escstr dc.b $d,$a,$a,'Escape',$d,$a,$0 hlpstr dc.b 'du [] - dump',$d,$a dc.b 'go [] - go no tracing',$d,$a dc.b 'gb [] - go until breakpoint',$d,$a dc.b 'tr [] - trace instruction',$d,$a dc.b 'he - help',$d,$a dc.b 'li - search for OS-9 modules',$d,$a dc.b 'lo [] - load S-records',$d,$a dc.b 'mm [] - modify memory',$d,$a dc.b 'bo [] - boot OS-9',$d,$a dc.b 'br [] - set breakpoint',$d,$a dc.b 'kb - kill breakpoint',$d,$a,$0 brkstr dc.b 'Breakpoint set at $%x',$d,$a,$0 nobrks dc.b 'No breakpoints',$d,$a,$0 srecerr dc.b $d,$a,'Load error',$d,$a,$0 errstr dc.b $d,$a,'Error',$d,$a,$0 lenerr dc.b $d,$a,'Error; zero length of OS9Boot',$d,$a,$0 kertxt dc.b $d,$a,'OS9Boot loaded at address $%x',$d,$a dc.b 'Booting...',$d,$a,$0 nokern dc.b $d,$a,'Error: No kernel found',$d,$a,$0