Mercurial > hg > Members > kono > nitros9-code
diff level1/cmds/disasm.asm @ 968:69757400b240
Added to std CMDS
author | boisy |
---|---|
date | Fri, 31 Jan 2003 17:58:38 +0000 |
parents | |
children | 6d4a60e7ecf0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/disasm.asm Fri Jan 31 17:58:38 2003 +0000 @@ -0,0 +1,3707 @@ + nam Disasm + ttl Os9 disassembler by Ron Lammardo + +* Disasm v1.5 (c) 1988 by Ron Lammardo +* 6309 additions by L. Curtis Boyle Jan. 1993 +******** +* +* 03/12/87 (#2) - added code for line,address,obj display +* added options 'o' and 'x' +* +* 04/02/87 (#3) - added code to provide commented disassembly +* of device descriptors +* +* 11/16/87 (#4) - fixed restart link failure +* added code to display direct page addresses +* +* 02/22/88 (#5) - added code to display dp/u offsets +* added code to display fcb bytes preceding eom +* added code for z option (hex input disassembly) +* added code to display date/time run +* +* 01/23/93 - added code to handle 6309 instruction set additions +******** + + ifp1 + use defsfile + endc + +typ set prgrm+objct +attrev set reent+revision +revision set 1 +edtn set 5 edition +edition equ $30+edtn ascii edition + + mod eom,mname,typ,attrev,start,datend + +pcrzero equ *-$0D module start + +mname fcs /Disasm/ + fcb edtn + +dfltdrv fcc /dd/ +cr set C$CR +**** start of data area **** +stackhld rmb 2 +ureghold rmb 2 +xreghold rmb 2 +xsave rmb 2 +dsave rmb 2 +startadr rmb 2 +modadr rmb 2 +address rmb 2 +addrsave rmb 2 +lineadr rmb 2 +objadr rmb 2 +crntadr rmb 2 +modend rmb 2 +nameadr rmb 2 +size rmb 2 +temp rmb 2 +readpos rmb 2 +readcnt rmb 1 +readclr rmb 1 +byte rmb 1 +TFMFlag rmb 1 Flag to indicate processing TFM +bitcom rmb 1 Flag to indicate processing bit instruction +indirct rmb 1 +hexstrng rmb 4 +decstrng rmb 5 +testbyte rmb 1 +register rmb 1 +labladr rmb 2 +highadr rmb 2 +utabend rmb 2 +pass rmb 1 +path rmb 1 +diskio rmb 1 +objcnt rmb 1 +tylghold rmb 1 +atrvhold rmb 1 +revshold rmb 1 +m.opt rmb 1 +o.opt rmb 1 +x.opt rmb 1 +z.opt rmb 1 +u.opt rmb 1 +op.cnt rmb 1 +descript rmb 1 +mgradr rmb 2 +drvadr rmb 2 +desctype rmb 1 +printadr rmb 2 +initsize rmb 2 +counter rmb 1 +countdec rmb 2 +numline rmb 2 +runtime rmb 6 +* start of output line +linenum rmb 8 +holdadr rmb 5 +holdobj rmb 11 +holdline rmb 56 +* end of output line +holdname rmb 32 +namehold rmb 32 +hldtylg rmb 40 +hldatrv rmb 40 +hldrev rmb 40 +hldttl rmb 40 +pathlist rmb 80 +readbuff rmb 20 +labeltab rmb 6742 +lbtblend rmb 1 + rmb 255 +datend equ . + +***************************************** +** os9 call tables ** +** (sequence = $10,$3f,..) ** +***************************************** +os9f$tab equ * + fcc /F$Link / + fcc /F$Load / + fcc /F$UnLink/ + fcc /F$Fork / + fcc /F$Wait / + fcc /F$Chain / + fcc /F$Exit / + fcc /F$Mem / + fcc /F$Send / + fcc /F$Icpt / + fcc /F$Sleep / + fcc /F$SSpd / + fcc /F$ID / + fcc /F$SPrior/ + fcc /F$SSWi / + fcc /F$PErr / + fcc /F$PrsNam/ + fcc /F$CmpNam/ + fcc /F$SchBit/ + fcc /F$AllBit/ + fcc /F$DelBit/ + fcc /F$Time / + fcc /F$STime / + fcc /F$CRC / + fcc /F$GPrDsc/ + fcc /F$GBlkMp/ + fcc /F$GModDr/ + fcc /F$CpyMem/ + fcc /F$SUser / + fcc /F$UnLoad/ + fcc /F$Alarm / + fcc /????????/ + fcc /????????/ + fcc /F$NMLink/ + fcc /F$NMLoad/ + fcc /F$Ctime / + fcc /F$Cstime/ + fcc /F$CTswi2/ + fcc /????????/ + fcc /F$VIRQ / + fcc /F$SRqMem/ + fcc /F$SRtMem/ + fcc /F$IRQ / + fcc /F$IOQu / + fcc /F$AProc / + fcc /F$NProc / + fcc /F$VModul/ + fcc /F$Find64/ + fcc /F$All64 / + fcc /F$Ret64 / + fcc /F$SSvc / + fcc /F$IODel / + fcc /F$SLink / + fcc /F$Boot / + fcc /F$BtMem / + fcc /F$GProcP/ + fcc /F$Move / + fcc /F$AllRAM/ + fcc /F$AllImg/ + fcc /F$DelImg/ + fcc /F$SetImg/ + fcc /F$FreeLB/ + fcc /F$FreeHB/ + fcc /F$AllTsk/ + fcc /F$DelTsk/ + fcc /F$SetTsk/ + fcc /F$ResTsk/ + fcc /F$RelTsk/ + fcc /F$DATLog/ + fcc /F$DATTmp/ + fcc /F$LDAXY / + fcc /F$LDAXYP/ + fcc /F$LDDDXY/ + fcc /F$LDABX / + fcc /F$STABX / + fcc /F$AllPrc/ + fcc /F$DelPrc/ + fcc /F$ELink / + fcc /F$FModul/ + fcc /F$MapBlk/ + fcc /F$ClrBlk/ + fcc /F$DelRAM/ + fcc /F$GCMDir/ + fcc /F$AlHRAM/ + +os9i$tab equ * + fcc /I$Attach/ + fcc /I$Detach/ + fcc /I$Dup / + fcc /I$Create/ + fcc /I$Open / + fcc /I$MakDir/ + fcc /I$ChgDir/ + fcc /I$Delete/ + fcc /I$Seek / + fcc /I$Read / + fcc /I$Write / + fcc /I$ReadLn/ + fcc /I$WritLn/ + fcc /I$GetStt/ + fcc /I$SetStt/ + fcc /I$Close / + fcc /I$DeletX/ +bados9op fcc /????????/ + +* Mnemonic table: 1st byte =Opcode +* 2nd byte =Flags to indicate mode type of opcode +* Bytes 3-7 =Mnemonic name of opcode +***************************************** +** 2 byte table - ** +** $10 is first byte of op code ** +***************************************** +get10tab equ * + fcb $21 + fcb $fc + fcc /lbrn / + fcb $22 + fcb $fc + fcc /lbhi / + fcb $23 + fcb $fc + fcc /lbls / + fcb $24 + fcb $fc + fcc /lbcc / + fcb $25 + fcb $fc + fcc /lbcs / + fcb $26 + fcb $fc + fcc /lbne / + fcb $27 + fcb $fc + fcc /lbeq / + fcb $28 + fcb $fc + fcc /lbvc / + fcb $29 + fcb $fc + fcc /lbvs / + fcb $2a + fcb $fc + fcc /lbpl / + fcb $2b + fcb $fc + fcc /lbmi / + fcb $2c + fcb $fc + fcc /lbge / + fcb $2d + fcb $fc + fcc /lblt / + fcb $2e + fcb $fc + fcc /lbgt / + fcb $2f + fcb $fc + fcc /lble / +* Test of 6309 codes + fcb $30 + fcb $fa + fcc /addr / + fcb $31 + fcb $fa + fcc /adcr / + fcb $32 + fcb $fa + fcc /subr / + fcb $33 + fcb $fa + fcc /sbcr / + fcb $34 + fcb $fa + fcc /andr / + fcb $35 + fcb $fa + fcc /orr / + fcb $36 + fcb $fa + fcc /eorr / + fcb $37 + fcb $fa + fcc /cmpr / + fcb $38 + fcb $fd + fcc /pshsw/ + fcb $39 + fcb $fd + fcc /pulsw/ + fcb $3a + fcb $fd + fcc /pshuw/ + fcb $3b + fcb $fd + fcc /puluw/ + fcb $40 + fcb $fd + fcc /negd / + fcb $43 + fcb $fd + fcc /comd / + fcb $44 + fcb $fd + fcc /lsrd / + fcb $46 + fcb $fd + fcc /rord / + fcb $47 + fcb $fd + fcc /asrd / + fcb $48 + fcb $fd + fcc /asld / + fcb $49 + fcb $fd + fcc /rold / + fcb $4a + fcb $fd + fcc /decd / + fcb $4c + fcb $fd + fcc /incd / + fcb $4d + fcb $fd + fcc /tstd / + fcb $4f + fcb $fd + fcc /clrd / + fcb $53 + fcb $fd + fcc /comw / + fcb $54 + fcb $fd + fcc /lsrw / + fcb $56 + fcb $fd + fcc /rorw / + fcb $59 + fcb $fd + fcc /rolw / + fcb $5a + fcb $fd + fcc /decw / + fcb $5c + fcb $fd + fcc /incw / + fcb $5d + fcb $fd + fcc /tstw / + fcb $5f + fcb $fd + fcc /clrw / + fcb $80 + fcb $f3 + fcc /subw / + fcb $81 + fcb $f3 + fcc /cmpw / + fcb $82 + fcb $f3 + fcc /sbcd / + fcb $83 + fcb $f3 + fcc /cmpd / + fcb $84 + fcb $f3 + fcc /andd / + fcb $85 + fcb $f3 + fcc /bitd / + fcb $86 + fcb $f3 + fcc /ldw / + fcb $88 + fcb $f3 + fcc /eord / + fcb $89 + fcb $f3 + fcc /adcd / + fcb $8a + fcb $f3 + fcc /ord / + fcb $8b + fcb $f3 + fcc /addw / + fcb $8c + fcb $f3 + fcc /cmpy / + fcb $8e + fcb $f3 + fcc /ldy / + fcb $90 + fcb $ff + fcc /subw / + fcb $91 + fcb $ff + fcc /cmpw / + fcb $92 + fcb $ff + fcc /sbcd / + fcb $93 + fcb $ff + fcc /cmpd / + fcb $94 + fcb $ff + fcc /andd / + fcb $95 + fcb $ff + fcc /bitd / + fcb $96 + fcb $ff + fcc /ldw / + fcb $97 + fcb $ff + fcc /stw / + fcb $98 + fcb $ff + fcc /eord / + fcb $99 + fcb $ff + fcc /adcd / + fcb $9a + fcb $ff + fcc /ord / + fcb $9b + fcb $ff + fcc /addw / + fcb $9c + fcb $ff + fcc /cmpy / + fcb $9e + fcb $ff + fcc /ldy / + fcb $9f + fcb $ff + fcc /sty / + fcb $a0 + fcb $f8 + fcc /subw / + fcb $a1 + fcb $f8 + fcc /cmpw / + fcb $a2 + fcb $f8 + fcc /sbcd / + fcb $a3 + fcb $f8 + fcc /cmpd / + fcb $a4 + fcb $f8 + fcc /andd / + fcb $a5 + fcb $f8 + fcc /bitd / + fcb $a6 + fcb $f8 + fcc /ldw / + fcb $a7 + fcb $f8 + fcc /stw / + fcb $a8 + fcb $f8 + fcc /eord / + fcb $a9 + fcb $f8 + fcc /adcd / + fcb $aa + fcb $f8 + fcc /ord / + fcb $ab + fcb $f8 + fcc /addw / + fcb $ac + fcb $f8 + fcc /cmpy / + fcb $ae + fcb $f8 + fcc /ldy / + fcb $af + fcb $f8 + fcc /sty / + fcb $b0 + fcb $f4 + fcc /subw / + fcb $b1 + fcb $f4 + fcc /cmpw / + fcb $b2 + fcb $f4 + fcc /sbcd / + fcb $b3 + fcb $f4 + fcc /cmpd / + fcb $b4 + fcb $f4 + fcc /andd / + fcb $b5 + fcb $f4 + fcc /bitd / + fcb $b6 + fcb $f4 + fcc /ldw / + fcb $b7 + fcb $f4 + fcc /stw / + fcb $b8 + fcb $f4 + fcc /eord / + fcb $b9 + fcb $f4 + fcc /adcd / + fcb $ba + fcb $f4 + fcc /ord / + fcb $bb + fcb $f4 + fcc /addw / + fcb $bc + fcb $f4 + fcc /cmpy / + fcb $be + fcb $f4 + fcc /ldy / + fcb $bf + fcb $f4 + fcc /sty / + fcb $ce + fcb $f3 + fcc /lds / + fcb $dc + fcb $ff + fcc /ldq / + fcb $dd + fcb $ff + fcc /stq / + fcb $de + fcb $ff + fcc /lds / + fcb $df + fcb $ff + fcc /sts / + fcb $ec + fcb $f8 + fcc /ldq / + fcb $ed + fcb $f8 + fcc /stq / + fcb $ee + fcb $f8 + fcc /lds / + fcb $ef + fcb $f8 + fcc /sts / + fcb $fc + fcb $f4 + fcc /ldq / + fcb $fd + fcb $f4 + fcc /stq / + fcb $fe + fcb $f4 + fcc /lds / + fcb $ff + fcb $f4 + fcc /sts / + fcb $00 + fcb $fe + fcc /fcb / + pag +***************************************** +** 2 byte table - ** +** $11 is first byte of op code ** +***************************************** +get11tab equ * + fcb $30 + fcb $f0 + fcc /band / + fcb $31 + fcb $f0 + fcc /biand/ + fcb $32 + fcb $f0 + fcc /bor / + fcb $33 + fcb $f0 + fcc /bior / + fcb $34 + fcb $f0 + fcc /beor / + fcb $35 + fcb $f0 + fcc /bieor/ + fcb $36 + fcb $f0 + fcc /ldbt / + fcb $37 + fcb $f0 + fcc /stbt / + fcb $38 + fcb $fa + fcc /tfm / + fcb $39 + fcb $fa + fcc /tfm / + fcb $3a + fcb $fa + fcc /tfm / + fcb $3b + fcb $fa + fcc /tfm / + fcb $3c + fcb $fb + fcc /bitmd/ + fcb $3d + fcb $fb + fcc /ldmd / + fcb $3f + fcb $fd + fcc /swi3 / + fcb $43 + fcb $fd + fcc /come / + fcb $4a + fcb $fd + fcc /dece / + fcb $4c + fcb $fd + fcc /ince / + fcb $4d + fcb $fd + fcc /tste / + fcb $4f + fcb $fd + fcc /clre / + fcb $53 + fcb $fd + fcc /comf / + fcb $5a + fcb $fd + fcc /decf / + fcb $5c + fcb $fd + fcc /incf / + fcb $5d + fcb $fd + fcc /tstf / + fcb $5f + fcb $fd + fcc /clrf / + fcb $80 + fcb $fb + fcc /sube / + fcb $81 + fcb $fb + fcc /cmpe / + fcb $83 + fcb $f3 + fcc /cmpu / + fcb $86 + fcb $fb + fcc /lde / + fcb $8b + fcb $fb + fcc /adde / + fcb $8c + fcb $f3 + fcc /cmps / + fcb $8d + fcb $fb + fcc /divd / + fcb $8e + fcb $f3 + fcc /divq / + fcb $8f + fcb $f3 + fcc /muld / + fcb $90 + fcb $ff + fcc /sube / + fcb $91 + fcb $ff + fcc /cmpe / + fcb $93 + fcb $ff + fcc /cmpu / + fcb $96 + fcb $ff + fcc /lde / + fcb $97 + fcb $ff + fcc /ste / + fcb $9b + fcb $ff + fcc /adde / + fcb $9c + fcb $ff + fcc /cmps / + fcb $9d + fcb $ff + fcc /divd / + fcb $9e + fcb $ff + fcc /divq / + fcb $9f + fcb $ff + fcc /muld / + fcb $a0 + fcb $f8 + fcc /sube / + fcb $a1 + fcb $f8 + fcc /cmpe / + fcb $a3 + fcb $f8 + fcc /cmpu / + fcb $a6 + fcb $f8 + fcc /lde / + fcb $a7 + fcb $f8 + fcc /ste / + fcb $ab + fcb $f8 + fcc /adde / + fcb $ac + fcb $f8 + fcc /cmps / + fcb $ad + fcb $f8 + fcc /divd / + fcb $ae + fcb $f8 + fcc /divq / + fcb $af + fcb $f8 + fcc /muld / + fcb $b0 + fcb $f4 + fcc /sube / + fcb $b1 + fcb $f4 + fcc /cmpe / + fcb $b3 + fcb $f4 + fcc /cmpu / + fcb $b6 + fcb $f4 + fcc /lde / + fcb $b7 + fcb $f4 + fcc /ste / + fcb $bb + fcb $f4 + fcc /adde / + fcb $bc + fcb $f4 + fcc /cmps / + fcb $bd + fcb $f4 + fcc /divd / + fcb $be + fcb $f4 + fcc /divq / + fcb $bf + fcb $f4 + fcc /muld / + fcb $c0 + fcb $fb + fcc /subf / + fcb $c1 + fcb $fb + fcc /cmpf / + fcb $c6 + fcb $fb + fcc /ldf / + fcb $cb + fcb $fb + fcc /addf / + fcb $d0 + fcb $ff + fcc /subf / + fcb $d1 + fcb $ff + fcc /cmpf / + fcb $d6 + fcb $ff + fcc /ldf / + fcb $d7 + fcb $ff + fcc /stf / + fcb $db + fcb $ff + fcc /addf / + fcb $e0 + fcb $f8 + fcc /subf / + fcb $e1 + fcb $f8 + fcc /cmpf / + fcb $e6 + fcb $f8 + fcc /ldf / + fcb $e7 + fcb $f8 + fcc /stf / + fcb $eb + fcb $f8 + fcc /addf / + fcb $f0 + fcb $f4 + fcc /subf / + fcb $f1 + fcb $f4 + fcc /cmpf / + fcb $f6 + fcb $f4 + fcc /ldf / + fcb $f7 + fcb $f4 + fcc /stf / + fcb $fb + fcb $f4 + fcc /addf / + fcb $00 Unknown gets FCB's + fcb $fe + fcc /fcb / + pag +***************************************** +** 1 byte op code table ** +***************************************** +* Position in table is opcode, byte stored there is how to interpret it +* Interpreter bytes are: +* $FF: Direct page mode (1 byte address) +* $FE: FCB (unknown single byte) +* $FD: Implied (single byte by itself) +* $FC: 2 byte relative +* $FB: 1 byte immediate +* $FA: Dual register (EXG/TFR) +* $F9: 1 byte relative +* $F8: Indexed (1 or more post bytes) +* $F7: Stack (PSH/PUL) register post-byte +* $F6: ??? (internal use?) +* $F5: SWI??? +* $F4: Extended (2 byte address) +* $F3: 2 byte immediate +* $F2: 4 byte immediate +* $F1: In memory (AIM, etc.) +* $F0: Bit commands (LDBT, etc.) +optable fcb $00 +tab0x equ * + fcb $ff =00 + fcc /neg / + fcb $f1 =01 + fcc /oim / + fcb $f1 =02 + fcc /aim / + fcb $ff =03 + fcc /com / + fcb $ff =04 + fcc /lsr / + fcb $f1 =05 + fcc /eim / + fcb $ff =06 + fcc /ror / + fcb $ff =07 + fcc /asr / + fcb $ff =08 + fcc /lsl / + fcb $ff =09 + fcc /rol / + fcb $ff =0a + fcc /dec / + fcb $f1 =0b + fcc /tim / + fcb $ff =0c + fcc /inc / + fcb $ff =0d + fcc /tst / + fcb $ff =0e + fcc /jmp / + fcb $ff =0f + fcc /clr / +tab1x equ * + fcb $fe =10 Unused entry; pre-byte + fcc /fcb / + fcb $fe =11 Unused entry; pre-byte + fcc /fcb / + fcb $fd =12 + fcc /nop / + fcb $fd =13 + fcc /sync / + fcb $fd =14 + fcc /sexw / + fcb $fe =15 + fcc /fcb / + fcb $fc =16 + fcc /lbra / + fcb $fc =17 + fcc /lbsr / + fcb $fe =18 + fcc /fcb / + fcb $fd =19 + fcc /daa / + fcb $fb =1a + fcc /orcc / + fcb $fe =1b + fcc /fcb / + fcb $fb =1c + fcc /andcc/ + fcb $fd =1d + fcc /sex / + fcb $fa =1e + fcc /exg / + fcb $fa =1f + fcc /tfr / +tab2x equ * + fcb $f9 =20 + fcc /bra / + fcb $f9 =21 + fcc /brn / + fcb $f9 =22 + fcc /bhi / + fcb $f9 =23 + fcc /bls / + fcb $f9 =24 + fcc /bcc / + fcb $f9 =25 + fcc /bcs / + fcb $f9 =26 + fcc /bne / + fcb $f9 =27 + fcc /beq / + fcb $f9 =28 + fcc /bvc / + fcb $f9 =29 + fcc /bvs / + fcb $f9 =2a + fcc /bpl / + fcb $f9 =2b + fcc /bmi / + fcb $f9 =2c + fcc /bge / + fcb $f9 =2d + fcc /blt / + fcb $f9 =2e + fcc /bgt / + fcb $f9 =2f + fcc /ble / +tab3x equ * + fcb $f8 =30 + fcc /leax / + fcb $f8 =31 + fcc /leay / + fcb $f8 =32 + fcc /leas / + fcb $f8 =33 + fcc /leau / + fcb $f7 =34 + fcc /pshs / + fcb $f7 =35 + fcc /puls / + fcb $f7 =36 + fcc /pshu / + fcb $f7 =37 + fcc /pulu / + fcb $fe =38 + fcc /fcb / + fcb $fd =39 + fcc /rts / + fcb $fd =3a + fcc /abx / + fcb $fd =3b + fcc /rti / + fcb $fb =3c + fcc /cwai / + fcb $fd =3d + fcc /mul / + fcb $fe =3e + fcc /fcb / + fcb $f5 =3f + fcc /swi / +tab4x equ * + fcb $fd =40 + fcc /nega / + fcb $fe =41 + fcc /fcb / + fcb $fe =42 + fcc /fcb / + fcb $fd =43 + fcc /coma / + fcb $fd =44 + fcc /lsra / + fcb $fe =45 + fcc /fcb / + fcb $fd =46 + fcc /rora / + fcb $fd =47 + fcc /asra / + fcb $fd =48 + fcc /lsla / + fcb $fd =49 + fcc /rola / + fcb $fd =4a + fcc /deca / + fcb $fe =4b + fcc /fcb / + fcb $fd =4c + fcc /inca / + fcb $fd =4d + fcc /tsta / + fcb $fe =4e + fcc /fcb / + fcb $fd =4f + fcc /clra / +tab5x equ * + fcb $fd =50 + fcc /negb / + fcb $fe =51 + fcc /fcb / + fcb $fe =52 + fcc /fcb / + fcb $fd =53 + fcc /comb / + fcb $fd =54 + fcc /lsrb / + fcb $fe =55 + fcc /fcb / + fcb $fd =56 + fcc /rorb / + fcb $fd =57 + fcc /asrb / + fcb $fd =58 + fcc /lslb / + fcb $fd =59 + fcc /rolb / + fcb $fd =5a + fcc /decb / + fcb $fe =5b + fcc /fcb / + fcb $fd =5c + fcc /incb / + fcb $fd =5d + fcc /tstb / + fcb $fe =5e + fcc /fcb / + fcb $fd =5f + fcc /clrb / +tab6x equ * + fcb $f8 =60 + fcc /neg / + fcb $f1 =61 + fcc /oim / + fcb $f1 =62 + fcc /aim / + fcb $f8 =63 + fcc /com / + fcb $f8 =64 + fcc /lsr / + fcb $f1 =65 + fcc /eim / + fcb $f8 =66 + fcc /ror / + fcb $f8 =67 + fcc /asr / + fcb $f8 =68 + fcc /lsl / + fcb $f8 =69 + fcc /rol / + fcb $f8 =6a + fcc /dec / + fcb $f1 =6b + fcc /tim / + fcb $f8 =6c + fcc /inc / + fcb $f8 =6d + fcc /tst / + fcb $f8 =6e + fcc /jmp / + fcb $f8 =6f + fcc /clr / +tab7x equ * + fcb $f4 =70 + fcc /neg / + fcb $f1 =71 + fcc /oim / + fcb $f1 =72 + fcc /aim / + fcb $f4 =73 + fcc /com / + fcb $f4 =74 + fcc /lsr / + fcb $f1 =75 + fcc /eim / + fcb $f4 =76 + fcc /ror / + fcb $f4 =77 + fcc /asr / + fcb $f4 =78 + fcc /lsl / + fcb $f4 =79 + fcc /rol / + fcb $f4 =7a + fcc /dec / + fcb $f1 =7b + fcc /tim / + fcb $f4 =7c + fcc /inc / + fcb $f4 =7d + fcc /tst / + fcb $f4 =7e + fcc /jmp / + fcb $f4 =7f + fcc /clr / +tab8x equ * + fcb $fb =80 + fcc /suba / + fcb $fb =81 + fcc /cmpa / + fcb $fb =82 + fcc /sbca / + fcb $f3 =83 + fcc /subd / + fcb $fb =84 + fcc /anda / + fcb $fb =85 + fcc /bita / + fcb $fb =86 + fcc /lda / + fcb $fe =87 + fcc /fcb / + fcb $fb =88 + fcc /eora / + fcb $fb =89 + fcc /adca / + fcb $fb =8a + fcc /ora / + fcb $fb =8b + fcc /adda / + fcb $f3 =8c + fcc /cmpx / + fcb $f9 =8d + fcc /bsr / + fcb $f3 =8e + fcc /ldx / + fcb $fe =8f + fcc /fcb / +tab9x equ * + fcb $ff =90 + fcc /suba / + fcb $ff =91 + fcc /cmpa / + fcb $ff =92 + fcc /sbca / + fcb $ff =93 + fcc /subd / + fcb $ff =94 + fcc /anda / + fcb $ff =95 + fcc /bita / + fcb $ff =96 + fcc /lda / + fcb $ff =97 + fcc /sta / + fcb $ff =98 + fcc /eora / + fcb $ff =99 + fcc /adca / + fcb $ff =9a + fcc /ora / + fcb $ff =9b + fcc /adda / + fcb $ff =9c + fcc /cmpx / + fcb $ff =9d + fcc /jsr / + fcb $ff =9e + fcc /ldx / + fcb $ff =9f + fcc /stx / +tabax equ * + fcb $f8 =a0 + fcc /suba / + fcb $f8 =a1 + fcc /cmpa / + fcb $f8 =a2 + fcc /sbca / + fcb $f8 =a3 + fcc /subd / + fcb $f8 =a4 + fcc /anda / + fcb $f8 =a5 + fcc /bita / + fcb $f8 =a6 + fcc /lda / + fcb $f8 =a7 + fcc /sta / + fcb $f8 =a8 + fcc /eora / + fcb $f8 =a9 + fcc /adca / + fcb $f8 =aa + fcc /ora / + fcb $f8 =ab + fcc /adda / + fcb $f8 =ac + fcc /cmpx / + fcb $f8 =ad + fcc /jsr / + fcb $f8 =ae + fcc /ldx / + fcb $f8 =af + fcc /stx / +tabbx equ * + fcb $f4 =b0 + fcc /suba / + fcb $f4 =b1 + fcc /cmpa / + fcb $f4 =b2 + fcc /sbca / + fcb $f4 =b3 + fcc /subd / + fcb $f4 =b4 + fcc /anda / + fcb $f4 =b5 + fcc /bita / + fcb $f4 =b6 + fcc /lda / + fcb $f4 =b7 + fcc /sta / + fcb $f4 =b8 + fcc /eora / + fcb $f4 =b9 + fcc /adca / + fcb $f4 =ba + fcc /ora / + fcb $f4 =bb + fcc /adda / + fcb $f4 =bc + fcc /cmpx / + fcb $f4 =bd + fcc /jsr / + fcb $f4 =be + fcc /ldx / + fcb $f4 =bf + fcc /stx / +tabcx equ * + fcb $fb =c0 + fcc /subb / + fcb $fb =c1 + fcc /cmpb / + fcb $fb =c2 + fcc /sbcb / + fcb $f3 =c3 + fcc /addd / + fcb $fb =c4 + fcc /andb / + fcb $fb =c5 + fcc /bitb / + fcb $fb =c6 + fcc /ldb / + fcb $fe =c7 + fcc /fcb / + fcb $fb =c8 + fcc /eorb / + fcb $fb =c9 + fcc /adcb / + fcb $fb =ca + fcc /orb / + fcb $fb =cb + fcc /addb / + fcb $f3 =cc + fcc /ldd / + fcb $f2 =cd + fcc /ldq / + fcb $f3 =ce + fcc /ldu / + fcb $fe =cf + fcc /fcb / +tabdx equ * + fcb $ff =d0 + fcc /subb / + fcb $ff =d1 + fcc /cmpb / + fcb $ff =d2 + fcc /sbcb / + fcb $ff =d3 + fcc /addd / + fcb $ff =d4 + fcc /andb / + fcb $ff =d5 + fcc /bitb / + fcb $ff =d6 + fcc /ldb / + fcb $ff =d7 + fcc /stb / + fcb $ff =d8 + fcc /eorb / + fcb $ff =d9 + fcc /adcb / + fcb $ff =da + fcc /orb / + fcb $ff =db + fcc /addb / + fcb $ff =dc + fcc /ldd / + fcb $ff =dd + fcc /std / + fcb $ff =de + fcc /ldu / + fcb $ff =df + fcc /stu / +tabex equ * + fcb $f8 =e0 + fcc /subb / + fcb $f8 =e1 + fcc /cmpb / + fcb $f8 =e2 + fcc /sbcb / + fcb $f8 =e3 + fcc /addd / + fcb $f8 =e4 + fcc /andb / + fcb $f8 =e5 + fcc /bitb / + fcb $f8 =e6 + fcc /ldb / + fcb $f8 =e7 + fcc /stb / + fcb $f8 =e8 + fcc /eorb / + fcb $f8 =e9 + fcc /adcb / + fcb $f8 =ea + fcc /orb / + fcb $f8 =eb + fcc /addb / + fcb $f8 =ec + fcc /ldd / + fcb $f8 =ed + fcc /std / + fcb $f8 =ee + fcc /ldu / + fcb $f8 =ef + fcc /stu / +tabfx equ * + fcb $f4 =f0 + fcc /subb / + fcb $f4 =f1 + fcc /cmpb / + fcb $f4 =f2 + fcc /sbcb / + fcb $f4 =f3 + fcc /addd / + fcb $f4 =f4 + fcc /andb / + fcb $f4 =f5 + fcc /bitb / + fcb $f4 =f6 + fcc /ldb / + fcb $f4 =f7 + fcc /stb / + fcb $f4 =f8 + fcc /eorb / + fcb $f4 =f9 + fcc /adcb / + fcb $f4 =fa + fcc /orb / + fcb $f4 =fb + fcc /addb / + fcb $f4 =fc + fcc /ldd / + fcb $f4 =fd + fcc /std / + fcb $f4 =fe + fcc /ldu / + fcb $f4 =ff + fcc /stu / + pag + + +testing equ 0 (0=no,1=yes) +regtab fcc /d x y u s pcw v a b ccdp0 0 e f / +stackreg fcc /pcu y x dpb a cc/ +timesplt fcc '// :: ' +title equ * + fcc /program module / + fcc /subroutine module / + fcc /multi-module / + fcc /data module / + fcc /os9 system module / + fcc /os9 file manager / + fcc /os9 device driver / + fcc /os9 device descriptor/ +badindx fcc /?????????????????????/ +devtype equ * + fcc /Prgrm/ + fcc /Sbrtn/ + fcc /Multi/ + fcc /Data / + fcc /Systm/ + fcc /FlMgr/ + fcc /Drivr/ + fcc /Devic/ + fcc /?????/ +language equ * + fcc /Objct / + fcc /ICode / + fcc /PCode / + fcc /CCode / + fcc /CblCode / + fcc /FrtnCode/ + fcc /???????? / +reent. fcc /ReEnt / +modprot. fcc /Modprot / +line010 fcc / ifp1/ +line011 fcb $0d +ln010sz equ *-line010 +line020 fcc % use /% +ln020sz equ *-line020 +line025 fcc %/defs/os9defs% + fcb $0d +ln025sz equ *-line025 +line030 fcc / endc/ + fcb $0d +ln030sz equ *-line030 +line040 fcc / / + fcc / / + fcc / / + fcc / / + +line050 fcc / mod / + fcc /eom,name,tylg,/ + fcc /atrv,start,size/ + fcb $0d +ln050sz equ *-line050 +line060 fcc %fcs /% +ln060sz equ *-line060 +line070 fcc /u0000 rmb / +ln070sz equ *-line070 +line080 fcc /<u/ +line085 fcc /<$/ +line090 fcc /fcb $/ +ln090sz equ *-line090 +line100 fcc /name equ */ +ln100sz equ *-line100 +line110 fcc / rmb / +ln110sz equ *-line110 +line120 fcc /size equ ./ + fcb $0d +ln120sz equ *-line120 +line130 fcc /start equ */ + fcb $0d +ln130sz equ *-line130 +line140 fcc /swi2/ +ln140sz equ *-line140 +line150 fcc /os9 / +ln150sz equ *-line150 +line160 fcc / ttl / +ln160sz equ *-line160 +line170 fcc / emod/ + fcb $0d +ln170sz equ *-line170 +line180 fcc /eom equ */ + fcb $0d +ln180sz equ *-line180 +line190 fcc /equ */ +ln190sz equ *-line190 +line200 fcb $0a + fcc /error: can't link to module/ + fcb $0d +ln200sz equ *-line200 +line210 fcc /* Disassembled / +ln210sz equ *-line210 +line215 fcc /by Disasm v1./ + fcb edition + fcc / (C) 1988 by RML/ +ln215sz equ *-line215 +line220 fcc /,pcr/ +ln220sz equ *-line220 +line230 fcb $0a + fcc /* entries in symbol table :$/ +ln230sz equ *-line230 +line240 fcb $0a + fcb $0a + fcc /error: symbol table full/ + fdb $070d +ln240sz equ *-line240 +line250 fcb $0a + fcb $0a + fcc /error: illegal option/ + fdb $070d +ln250sz equ *-line250 +line260 fcb $0a + fcc %error: no module/path name found% + fcb $0a + fcc /use Disasm -? for help/ + fdb $070d +ln260sz equ *-line260 +line270 fcb $0a + fcc / Disasm v1./ + fcb edition + fcc / (for 6809 & 6309 code) options:/ + fcb $0a + fcc / Disasm -m modname/ + fcb $0a + fcc / will link to module 'modname' -/ + fcc / if not found,will load module/ + fcb $0a + fcb $0a + fcc / Disasm modname/ + fcb $0a + fcc / will 'read' the module from the/ + fcc / specified path without loading/ + fcb $0a,$0a + fcc / Disasm -z {hex data}/ + fcb $0a + fcc / will disassemble the data input on the comand line/ + fcb $0a + fcc / as if it were part of a module in memory/ + fcb $0a,$0a + fcc / other options:/ + fcb $0a + fcc / o = display line number,address,object code & source code/ + fcb $0a + fcc / x = take modules from execution directory/ + fcb $0a + fcc ' u = do not convert u/dp offsets to symbolic labels' + fcb $0a,$0a + fcc / any combination of options is allowed (lower or upper case)/ + fcb $0a + fcc / but they must immediately follow the '-' and there must be/ + fcb $0a + fcc / no spaces separating options./ + fcb $0a +ln270sz equ *-line270 +line280 fcc / nam / +ln280sz equ *-line280 +line290 fcc /tylg set / +ln290sz equ *-line290 +line300 fcc /atrv set / +ln300sz equ *-line300 +line310 fcc /rev set $/ +ln310sz equ *-line310 +line320 fcc /+rev/ +ln320sz equ *-line320 +line330 fcc / mod / + fcc /eom,name,tylg,/ + fcc /atrv,mgrnam,drvnam/ + fcb $0d +ln330sz equ *-line330 + +line340 fcc /mode byte/ +ln340sz equ *-line340 +line350 fcc /extended controller address/ +ln350sz equ *-line350 +line360 fcc / physical controller address/ +ln360sz equ *-line360 +line370 fcc /fdb $/ +ln370sz equ *-line370 +line380 fcc /fcb initsize-*-1 initilization table size/ +ln380sz equ *-line380 +line390 fcc /device type:0=scf,1=rbf,2=pipe,3=scf/ +ln390sz equ *-line390 +line400 fcc /initsize equ */ +ln400sz equ *-line400 +line410 fcc /mgrnam equ */ +ln410sz equ *-line410 +line420 fcc /drvnam equ */ +ln420sz equ *-line420 +line430 fcc /fdb name copy of descriptor name address/ +ln430sz equ *-line430 +rbfprint fcc /1drive number/ + fcb cr + fcc /1step rate/ + fcb cr + fcc /1drive device type/ + fcb cr + fcc /1media density:0=single,1=double/ + fcb cr + fcc /2number of cylinders (tracks)/ + fcb cr + fcc /1number of sides/ + fcb cr + fcc /1verify disk writes:0=on/ + fcb cr + fcc /2# of sectors per track/ + fcb cr + fcc /2# of sectors per track (track 0)/ + fcb cr + fcc /1sector interleave factor/ + fcb cr + fcc /1minimum size of sector allocation/ + fcb cr + fcc /1?/ + fcb cr + +scfprint equ * + fcc /1case:0=up&lower,1=upper only/ + fcb cr + fcc /1backspace:0=bsp,1=bsp then sp & bsp/ + fcb cr + fcc /1delete:0=bsp over line,1=return/ + fcb cr + fcc /1echo:0=no echo/ + fcb cr + fcc /1auto line feed:0=off/ + fcb cr +* + fcc /1end of line null count/ + fcb cr + fcc /1pause:0=no end of page pause/ + fcb cr + fcc /1lines per page/ + fcb cr + fcc /1backspace character/ + fcb cr + fcc /1delete line character/ + fcb cr + fcc /1end of record character/ + fcb cr + fcc /1end of file character/ + fcb cr + fcc /1reprint line character/ + fcb cr + fcc /1duplicate last line character/ + fcb cr + fcc /1pause character/ + fcb cr + fcc /1interrupt character/ + fcb cr + fcc /1quit character/ + fcb cr + fcc /1backspace echo character/ + fcb cr + fcc /1line overflow character (bell)/ + fcb cr + fcc /1init value for dev ctl reg/ + fcb cr + fcc /1baud rate/ + fcb cr + fcc /3/ + fcc /1acia xon char/ + fcb cr + fcc /1acia xoff char/ + fcb cr + fcc /1(szx) number of columns for display/ + fcb cr + fcc /1(szy) number of rows for display/ + fcb cr + fcc /1window number/ + fcb cr + fcc /1data in rest of descriptor valid/ + fcb cr + fcc /1(sty) window type/ + fcb cr + fcc /1(cpx) x cursor position/ + fcb cr + fcc /1(cpy) y cursor position/ + fcb cr + fcc /1(prn1) foreground color/ + fcb cr + fcc /1(prn2) background color/ + fcb cr + fcc /1(prn3) border color/ + fcb cr +scfpend fcc /1?/ + fcb cr +* use /dd/defs/usr/usrall + +start equ * + sts <stackhld save the stack address for later + stx <xreghold + stu <ureghold + cmpd #2 + bhs pathok + leax line260,pcr + ldy #ln260sz + lbra prterror +pathok equ * + leax labeltab,u + stx <labladr + clra + sta ,x+ + sta ,x+ + leax -500,s +* leax labeltab+40,u + stx <utabend + ldd #$ffff + std ,x + leax -2,x + stx <highadr + ldd #0 + std ,x + clr <pass + clr <diskio + clr <m.opt + clr <o.opt + clr <x.opt + clr <z.opt + clr <u.opt + clr <op.cnt + clr <descript + lbsr clrline + +restart equ * + clr <readcnt + clr <readclr + leax readbuff,u + stx <readpos + ldd #0 + std <numline + ldx #$ffff + stx <modend + ldx <xreghold + tst <pass + lbeq getprm + lbsr clrline + leay line280,pcr + ldb #ln280sz + lbsr mergline + leay holdname,u + ldb #$44 + lbsr mergline + lbsr writline + leay hldttl,u + ldb #40 + lbsr mergline + lbsr writline + lbsr writline + leax holdobj,u + tst <o.opt + bne time010 + leax holdline,u +time010 + stx <lineadr + leay line210,pcr + ldb #ln210sz + lbsr mergline + leax runtime,u + os9 F$Time get time + lbcs exit + lda #6 + sta <temp + leay timesplt,pcr +time020 + ldb ,x+ + clra + pshs x + pshs y + leay decstrng,u + lbsr getdec + leay decstrng+3,u + ldb #2 + lbsr mergline + puls y + lda ,y+ + lbsr movechar + puls x + dec <temp + bne time020 + leay line215,pcr + ldb #ln215sz + lbsr mergline + lbsr writline + lbsr writline + + leay line010,pcr + ldb #ln010sz + lbsr mergline + lbsr writline + leay line020,pcr + ldb #ln020sz + lbsr mergline + leay dfltdrv,pcr + ldb #2 + lbsr mergline + leay line025,pcr + ldb #ln025sz + lbsr mergline + lbsr writline + leay line030,pcr + ldb #ln030sz + lbsr mergline + lbsr writline + ldb <tylghold + bsr movehdr + leay hldtylg,u + ldb #$50 + lbsr mergline + lbsr writline + ldb <atrvhold + bsr movehdr + leay hldatrv,u + ldb #$50 + lbsr mergline + lbsr writline + ldb <revshold + bsr movehdr + leay hldrev,u + ldb #$50 + lbsr mergline + lbsr writline + ldx <xreghold + tst <diskio + lbne diskmod + lbra mem020 + +movehdr equ * + clra + lbsr gethex + leax holdadr,u + leay hexstrng,u + ldb #4 + lbsr merge + rts + +getprm lda ,x+ + cmpa #$20 + beq getprm + leax -1,x + stx <xreghold + cmpa #'- + lbne diskmod + leax 1,x +getopt equ * + lda ,x+ + sta <byte + anda #$df + cmpa #'M + bne gtopt010 + inc <m.opt + inc <op.cnt + bra getopt +gtopt010 cmpa #'O + bne gtopt020 + inc <o.opt + inc <op.cnt + bra getopt +gtopt020 equ * + cmpa #'X + bne gtopt030 + inc <x.opt + inc <op.cnt + bra getopt + +gtopt030 equ * + cmpa #'Z + bne gtopt040 + inc <z.opt + inc <op.cnt + bra getopt + +gtopt040 equ * + cmpa #'U + bne gtopt050 + inc <u.opt + inc <op.cnt + bra getopt + +gtopt050 equ * + lda <byte + cmpa #'? + bne chkopt + leax line270,pcr + ldy #ln270sz + lbra prterror +chkopt equ * + tst <z.opt + beq optest + lbsr u$hexin convert hex chars to binary + leay 3,y + sty <modend + leax -1,x + stx <crntadr + ldd #$FFFF + std <address + lda #1 + sta <pass + leax line011,pcr + ldy #1 + lda #1 + os9 I$WritLn + lbcs exit + lbra readbyte go start doing it!!! + +optest tst <op.cnt + bne memmod +badopt equ * + leax line250,pcr + ldy #ln250sz + lbra prterror +diskmod equ * + inc <diskio + lda #read. + tst <x.opt + beq open + ora #exec. +open os9 i$open + lbcs exit + sta <path + lbsr getbyte + bra gotmod +memmod equ * +mem010 lda ,x+ + cmpa #$20 + beq mem010 + leax -1,x + stx <xreghold + tst <m.opt + beq diskmod + +mem020 equ * + clra + os9 f$link + bcc gotmod + clra + ldx <xreghold + os9 f$load + lbcs nolink +gotmod equ * + stu <modadr + stu <crntadr + ldu <ureghold + ldx #0 + stx <address + lbsr getbyte + lbsr getbyte2 + std <modend + lbsr clrline + lda #$87 + lbsr moveobj + lda #$cd + lbsr moveobj + ldd <modend + lbsr moveobj + ldd <modend + tfr b,a + lbsr moveobj + leay holdadr,u + lda #$30 + sta ,y+ + sta ,y+ + sta ,y+ + sta ,y+ + leay line050,pcr + ldb #ln050sz + tst <descript + beq prtmod + leay line330,pcr + ldb #ln330sz +prtmod equ * + lbsr mergline + lbsr writline + lbsr getbyte2 + std <nameadr + leay hldtylg,u + lbsr clrhld + leay line290,pcr + ldb #ln290sz + lbsr mergline + lbsr getbyte + stb <tylghold + andb #typemask + tstb + beq badtype + cmpb #$40 + bls goodtype + cmpb #$c0 + bhs goodtype +badtype equ * + lbsr mvchr005 + lbsr merghex + bra chklang +goodtype equ * + lsrb + lsrb + lsrb + lsrb + cmpb #$0c + blo type010 + subb #$7 + cmpb #8 + bne type010 + inc <descript +type010 subb #1 + stb <testbyte + lda #$5 + mul + leay devtype,pcr + leay d,y + ldb #5 + lbsr mergline +chklang equ * + lbsr mvchr008 + ldb <byte + andb #langmask + tstb + beq badlang + cmpb #6 + bls goodlang +badlang equ * + lbsr mvchr005 + lbsr merghex + bra lang010 +goodlang equ * + subb #1 + leay language,pcr + lda #8 + mul + leay d,y + ldb #8 + lbsr mergline +lang010 equ * + lda #$0d + lbsr movechar +chkattr equ * + leay hldttl,u + lbsr clrhld + leay line160,pcr + ldb #ln160sz + lbsr mergline + ldb <testbyte + lda #$15 + mul + leay title,pcr + leay d,y + ldb #$15 + lbsr mergline + lda #$0d + lbsr movechar + leay hldatrv,u + lbsr clrhld + leay line300,pcr + ldb #ln300sz + lbsr mergline + lbsr getbyte + stb <atrvhold + andb #attrmask + cmpb #reent + beq attr.r + cmpb #modprot + beq attr.m + lbsr mvchr005 + lbsr merghex + bra chkrevs +attr.r equ * + leay reent.,pcr + ldb #5 + bra moveattr +attr.m equ * + leay modprot.,pcr + ldb #7 +moveattr lbsr mergline +chkrevs leay line320,pcr + ldb #ln320sz + lbsr mergline + lda #$0d + lbsr movechar + leay hldrev,u + lbsr clrhld + leay line310,pcr + ldb #ln310sz + lbsr mergline + ldb <byte + andb #revsmask + stb revshold + lbsr merghex + lda #$0d + lbsr movechar + lbsr getbyte + tst <descript + lbne descrhdr + lbsr getbyte2 + std <startadr + lbsr getbyte2 + std <size + ldx <utabend + std ,x + lbsr clrline + tst <pass +* lbra findname + + ldx <address + stx <addrsave + ldx <highadr + tst <u.opt + beq movedp + ldx <utabend + leax -2,x + clra + clrb + std ,x + +movedp equ * + ldd ,x++ + pshs x + std <address + lbsr adrmove + leay line070,pcr + ldb #ln070sz + lbsr mergline + leay linenum,u + lda #'D + sta 6,y + leax holdadr,u + leay 25,y + ldb #4 + exg x,y + lbsr merge + puls x + ldd ,x + subd -2,x + pshs x + lbsr mergdec + lbsr writline + puls x + ldd ,x + cmpd <size + bne movedp + + ldd <size + lbsr gethex + leay hexstrng,u + leax holdadr,u + ldb #4 + lbsr merge + leay linenum,u + leay 6,y + lda #'D + sta ,y + leay line120,pcr + ldb #ln120sz + lbsr mergline + lbsr writline + ldx <addrsave + stx <address + +findname equ * + lbsr getbyte + ldx <nameadr + cmpx <address + beq getname + lbsr fcbline + bra findname + +getname equ * + lbsr clrline + lbsr adrmove + leay line100,pcr + ldb #ln100sz + lbsr mergline + lbsr writline + leay holdname,u + lbsr movename +getstart lbsr getbyte + ldx <address + cmpx <startadr + beq gotstart + lbsr fcbline + bra getstart +gotstart equ * + lbsr clrline + lbsr adrmove + leay line130,pcr + ldb #ln130sz + lbsr mergline + lbsr writline + lda <byte + lbsr moveobj + bra testop +readbyte lbsr getbyte +* Check opcodes +testop equ * + clr <bitcom Clear bit instruction processing flag + lbsr moveadr Go bump address up? + lda <byte Get next byte + cmpa #$10 Is it a $10? + bne test11 No, check for next special one + lbsr getbyte Is $10, get next byte + cmpb #$3f OS9 System call? + bne test10 No, do rest of check for $10 pre-byte + lbsr getbyte Get function code + tfr b,a Move to A + ldb #$3f Go get proper mnemonic for System call + lbsr getop + cmpa #'? Unknown one? + bne os9ok No, print out regular system call + leax holdobj,u Unknown, deal with it + stx <objadr + clr <objcnt + lda #$10 + lbsr moveobj + lda #$3f + lbsr moveobj + ldx <objadr + ldd #$2020 + std ,x + ldx <lineadr + leax -15,x + stx <lineadr + leay line140,pcr Print SWI2 message + ldb #ln140sz + lbsr mergline + lbsr writline + lda <testbyte + sta <byte + lbsr fcbline And FCB byte following it + bra readbyte + +* Got recognizable OS9 System call... print it +os9ok lbsr writline + bra readbyte +* $10 Pre-byte OTHER than SWI2 (system calls) + +test10 tfr b,a Put opcode part into A + ldb #$10 Go get proper mnemonic type for $10xx code + lbsr getop + cmpb #$fe Unknown opcode? + bne chkreslt No, deal with result + lda #$10 Unknown, convert to FCB line + bra tst11.1 +test11 cmpa #$11 $11 pre-byte? + bne onebyte No, must be normal + lbsr getbyte Get opcode part of $11xx command + tfr b,a Put into A + ldb #$11 $11 pre-byte + lbsr getop Go get proper mnemonic type for $11xxx code + cmpb #$fe Unknown opcode? + bne chkreslt No, deal with result + lda #$11 Make FCB line +tst11.1 ldb <byte + pshs b + sta <byte + ldx <address + leax -1,x + stx <address + lbsr fcbline + puls b + stb <byte + tfr b,a + lbsr moveobj + ldx <address + leax 1,x + stx <address + lbra testop + +* Opcode type branch table +rslttab fdb chk.ff Direct page (1 byte address) + fdb dofcb FCB (Unknown type... should never get here!) + fdb chk.fd Implied (single byte by itself) + fdb chk.fc 2 byte relative (long branches) + fdb chk.fb 1 byte immediate value + fdb chk.fa Dual register spec (EXG/TFR) + fdb chk.f9 1 byte relative (short branches) + fdb chk.f8 Indexed (1 or more post bytes) + fdb chk.f7 Stack (PSH/PUL) register post-byte + fdb chk.f6 ??? + fdb chk.f5 SWI + fdb chk.f4 Extended (2 byte address) + fdb chk.f3 2 byte immediate value + fdb chk.f2 4 byte immediate + fdb chk.f1 in memory (AIM, etc.) + fdb chk.f0 Bit commands (LDBT, etc.) + +onebyte clrb Clear $10/$11/Syscall flag + lbsr getop Get type into B/Code in <testbyte + +chkreslt cmpb #$f0 Check legal limit of opcode type + blo dofcb If <$F0, assume FCB + comb Flip bits + lslb 2 bytes per entry + leax rslttab,pcr Point to opcode type table + ldd b,x Get offset to proper routine + leax pcrzero,pcr Point to start of module + jmp d,x Go process proper type + +* Illegal opcode-FCB it +dofcb lbsr fcbline + lbra readbyte + +* Direct Page Addr - 1 byte +chk.ff leay line080,pc + tst <u.opt User wants Symbolic labels? + beq ff.010 Yes, do so + leay line085,pcr No, use <$00xx instead +ff.010 ldb #2 In both cases, 2 chars to merge + lbsr mergline Merge onto current output line + lbsr getbyte Get direct page address byte + clra Make for 4 digit hex number + lbsr merghex2 Merge 4 digit hex result onto output line + tst <u.opt Direct page currently @ 0? + lbeq indx046 put address in u table & write out line + +* Inherent Addr - 0 bytes (also exit point when line is completed) +chk.fd lbsr writline Flush line out & continue processing + lbra readbyte + +* Relative Addr - 2 bytes +chk.fc lbsr getbyte2 Get 2 byte relative offset + lbsr reladr.2 Calculate relative address & append it + bra chk.fd Write out line + +* Immediate Addr - 1 byte +chk.fb lbsr mvchr004 Add '#' to line + lbsr mvchr005 Add '$' to line + lbsr getbyte Get immediate value + lbsr merghex Add hex version to line + bra chk.fd Write it out + +* Dual register field +* (used only for TFR/EXG/TFM & register to register operations) +chk.fa lda <testbyte Get original opcode + clr <TFMFlag Clear TFM flag + cmpa #$38 TFM? + blo normtf No, skip ahead + cmpa #$3b + bhi normtf + inc <TFMFlag Set TFM flag +normtf lbsr getbyte Get register field byte + pshs b Preserve + lsrb Move source reg. into proper pos. + lsrb + lsrb + lsrb + bsr fa.020 Add it to line + lda <testbyte Get original opcode + cmpa #$38 Is it a TFM? + blo notTFM Too low + cmpa #$3B + bhs notTFM Too high (or is r1,r2+ and doesn't need sign) + cmpa #$39 TFM r1-,r2-? + bne Tplus1 + lbsr mvchr009 Add '-' + bra notTFM +Tplus1 lbsr mvchr008 Add '+' +notTFM lda #', Add comma to line + lbsr movechar + puls b Get back field byte + andb #$0f Just destination reg. + bsr fa.020 Add it to line + lda <testbyte Get original opcode + cmpa #$38 Is it a TFM? + blo notTFM2 Too low + cmpa #$3B + bhi notTFM2 Too high + cmpa #$3A TFM r1+,r2? + beq notTFM2 Yes, don't need to add anything + cmpa #$39 TFM r1-,r2-? + bne Tplus2 + lbsr mvchr009 Add '-' + bra notTFM2 +Tplus2 lbsr mvchr008 Add '+' +notTFM2 lbsr writline Write line & leave + lbra readbyte + +fa.020 lslb 2 bytes/entry + leax regtab,pc Point to register field table + ldd b,x Get register name + tst <TFMFlag Is this a TFM command? + beq normreg No, allow all register names + cmpb #$20 2 char. register name? + bne badreg Yes, illegal in TFM + cmpa #'s Lower than S register? + blo badreg + cmpa #'w W register? + bne normreg No, all others are legal +badreg ldd #'?*256+'? Illegal register, use question marks +normreg bsr movereg Add to end of line (eating spaces) + rts + +movereg lbsr movechar Add first char of reg. name to line + cmpb #$20 2nd char a space? + beq mvreg010 Yes, exit + tfr b,a Move to proper reg. + lbsr movechar And add 2nd char of reg. name to line +mvreg010 rts + +* Relative Addr - 1 byte +chk.f9 lbsr getbyte Get relative offset byte + lbsr reladr.1 Calculate & add it to line + lbra chk.fd Print line + +indxregs fcb %00000000,'x + fcb %00100000,'y + fcb %01000000,'u + fcb %01100000,'s +* Index table routine list for both normal & indirect modes +indxjmp fcb %10000100 Zero offset ($84) + fdb indx010 + fcb %10001000 8 bit offset ($88) + fdb indx.3 + fcb %10001001 16 bit offset ($89) + fdb indx.4 + fcb %10000110 A,R ($86) + fdb indx.5 + fcb %10000101 B,R ($85) + fdb indx.6 + fcb %10001011 D,R ($8B) + fdb indx.7 + fcb %10000111 E,R ($87) + fdb indx.E + fcb %10001010 F,R ($8a) + fdb indx.F + fcb %10001110 W,R ($8e) + fdb indx.W + fcb %10000000 ,R+ ($80) + fdb indx.8 + fcb %10000001 ,R++ ($81) + fdb indx.9 + fcb %10000010 ,-R ($82) + fdb indx.10 + fcb %10000011 ,--R ($83) + fdb indx.11 + fcb %10001100 8 bit,PC ($8C) + fdb indx.12 + fcb %10001101 16 bit,PC ($8D) + fdb indx.13 + fcb %10001111 Non-indirect W modes ($8f) + fdb indx.Wm + fcb 0 table end (any patterns not covered are illegal) + +* indexed addr - 1 or 2 bytes +chk.f8 clr <indirct Clear indirect flag + lbsr getbyte Get byte into B (and duplicate in <byte>) + andb #%10011111 Mask out register bits (mode bits for W) + cmpb #%10001111 W base (non-indirect)? + beq isw Yes, set register name + cmpb #%10010000 W base (indirect)? + beq isw Yes, set register name + ldb <byte Get original byte back + bra notw Do normal search +isw ldb #'w W register is base register + bra streg Store it as base register +notw andb #%01100000 Register mask + leax indxregs-2,pc Point to register offsets -2 for loop +f8.10 leax 2,x Point to next entry + cmpb ,x This the one we want? + bne f8.10 No, keep looking + ldb 1,x Get base register name +streg stb <register Preserve it + ldb <byte Get back original byte + andb #%10011111 Mask out the base register bits +* Main indexing type check here + cmpb #%00100000 5 bit offset indexing (special case)? + blo indx.2 Yes, go do + cmpb #%10010000 Non-indirect? + blo f8.15 Yes, skip ahead +* Indirect modes start here + lbsr mvchr001 Add '[' + inc <indirct Set indirect flag + cmpb #%10010000 W indirect indexing mode (since it shares pattern) + lbeq indx.Wm Yes, go process + cmpb #%10010010 Illegal? + lbeq indx.15 Yes, bad mode + cmpb #%10011111 Extended indirect? + lbeq indx.14 Yes, go do that + andb #%10001111 Mask out indirect bit for next routine +f8.15 leax indxjmp-3,pc Point to index jump table -3 for loop +f8.20 leax 3,x Point to next entry + cmpb ,x Bit mask we want? + beq f8.30 Yes, skip ahead + tst ,x No, is the end of table marker? + lbeq indx.15 Yes, bad mode + bra f8.20 Otherwise, keep searching +f8.30 ldd 1,x Get vector + leax pcrzero,pc Set base address of vector + jmp d,x Go to proper routine + +* 5 bit offset +indx.2 andb #$1f Mask out upper 3 bits + pshs b Preserve it + cmpb #$0f Negative offset? + bls indx2.1 No, skip ahead + ldb #$20 Calculate negative offset & preserve + subb ,s + stb ,s + lbsr mvchr009 Add '-' +indx2.1 lbsr mvchr005 Add '$' + puls a Get offset value + bra indx3.1 Add it to the line in hex format + +* 8 bit offset +indx.3 lbsr getbyte Get next byte + lbsr mvchr006 Add '<' + cmpb #$7f Negative value? + bls indx3.0 No, skip ahead + clra Make it a 16 bit number + std <temp Store it + ldd #$0100 Calculate negative offset for 8 bit # + subd <temp + lbsr mvchr009 Add '-' +indx3.0 lbsr mvchr005 Add '$' +indx3.1 lbsr merghex Add LSB of D as a 2 digit hex byte + lbra indx010 + +* 16 bit offset +indx.4 lbsr mvchr007 Add '>' + lbsr getbyte2 Get 2 byte offset + pshs d Preserve it + cmpd #$7fff Is it negative? + bls indx4.1 No, skip ahead + puls d Get back value + std <temp Preserve it + ldd #$ffff Calculate negative offset + subd <temp + addd #1 + pshs d Preserve it + lbsr mvchr009 Add '-' +indx4.1 lbsr mvchr005 Add '$' + puls d Get back offset value + lbsr merghex2 Add 16 bit number in hex format + bra indx010 + +indx.5 lda #'a A,R +indx5.1 lbsr movechar + bra indx010 + +indx.6 lda #'b B,R + bra indx5.1 + +indx.7 lda #'d D,R + bra indx5.1 + +indx.E lda #'e E,R + bra indx5.1 + +indx.F lda #'f F,R + bra indx5.1 + +indx.W lda #'w W,R + bra indx5.1 + +* ,R+ +indx.8 lbsr isub010 Add ',' & register name +indx8.1 lbsr mvchr008 Add '+' + bra indx040 Continue + +* ,R++ +indx.9 lbsr isub010 Add ',' & register name + lbsr mvchr008 Add '+' + bra indx8.1 Add 2nd '+' and continue + +* ,-R +indx.10 lbsr mvchr003 Add ',' +indx10.1 lbsr isub020 '-' & register name + bra indx040 Continue + +* ,--R +indx.11 lbsr mvchr003 Add ',' + lbsr mvchr009 Add '-' + bra indx10.1 Add 2nd '-' & register name & continue + +* 8 bit,pc +indx.12 lbsr mvchr006 Add '<' + lbsr getbyte Get next byte + lbsr reladr.1 Calculate relative address label + bra indx030 Add ',pcr' + +* 16 bit,pc +indx.13 lbsr mvchr007 Add '>' + lbsr getbyte2 Get next 2 bytes + lbsr reladr.2 Calculate relative address label + bra indx030 Add ',pcr' + +* Extended indirect +indx.14 lbsr mvchr007 Add '>' + lbsr mvchr005 Add '$' + lbsr getbyte2 Get next 2 bytes + lbsr merghex2 Append hex version of 16 bit # + bra indx040 Continue +* W modes (<register=w and <indirct flag is set) +indx.Wm ldb <byte Get original byte again + andb #%01100000 Mask out all but W mode settings + cmpb #%00000000 Straight register? + beq indx010 Yes, do it + cmpb #%00100000 mmmm,W? + lbeq indx.4 Go do that + cmpb #%01000000 ,W++? + beq indx.9 Do that + bra indx.11 Must be ,--W +* Illegal indexing mode +indx.15 leay badindx,pcr Point to '?' + ldb #5 Add 5 of them + lbsr mergline + bra indx040 Continue + +indx010 lbsr isub010 Add ',R' + bra indx040 Continue + +indx030 leay line220,pc Add ',pcr' + ldb #ln220sz + lbsr mergline + +indx040 tst <indirct Is it an indirect mode? + beq indx041 No, skip ahead + lbsr mvchr002 Add ']' +indx041 lda <register Get register name + cmpa #'u U register offset? + bne indx090 No, skip ahead + tst <u.opt User wants uxxxx? + bne indx090 No, skip + ldd <dsave get the offset + cmpd <size is it > total data size ??? + bhi indx090 yes..skip this stuff + leax holdline+15,u start of mnemonic +* Calculating 'uxxxx' info +indx042 lda ,x+ + cmpa #'u done?? + beq indx090 yes..go send line as is + cmpa #'$ + bne indx042 + lda #'u + sta -1,x + lda 2,x + cmpa #', + bne indx046 + stx <xsave + ldx <lineadr + leax 1,x +indx044 lda ,-x + sta 2,x + cmpx <xsave + bne indx044 + ldd #$3030 + std ,x + ldx <lineadr + leax 2,x + stx <lineadr + +* put the offset in u table +indx046 tst <pass + bne indx090 + ldd <dsave get the u offset + ldx <highadr start of u table + leax -2,x back off for loop increment +indx050 leax 2,x + cmpd ,x + beq indx090 + bhi indx050 if >,go loop + leax -2,x this is where to insert it + stx <xsave + ldx <highadr + leax -2,x + stx <highadr + cmpx <labladr + lbls rladr2.3 +indx052 ldd 2,x + std ,x + leax 2,x + cmpx <xsave + bne indx052 + ldd <dsave + std ,x + +indx090 tst <bitcom We a bit operation and need to RTS? + beq notbit No, write line & exit + rts +notbit lbsr writline Send the line out + lbra readbyte and continue + +isub010 lbsr mvchr003 Add ',' + bra isub025 skip ahead +isub020 lbsr mvchr009 Add '-' +isub025 lda <register Get register name + lbsr movechar Add it too + rts + +chk.f7 equ * +* inherent addr - 1 byte +* (used for psh and pul only) + lbsr getbyte + lda #$80 + sta <testbyte + lda #8 + leay stackreg,pcr +f7.010 pshs a + ldx ,y++ + ldb <byte + andb <testbyte + beq f7.020 + tfr x,d + lbsr movereg + lbsr mvchr003 +f7.020 lda <testbyte + lsra + sta <testbyte + puls a + deca + bne f7.010 + ldx <lineadr + leax -1,x + stx <lineadr + lbra chk.fd + +chk.f6 lbsr getbyte Get 1 byte + clra Make into D + lbsr merghex Add hex value to output + lbra chk.fd continue + +chk.f5 lbsr writline Write line out + lbsr getbyte Get byte + lbsr fcbline Make fcb line + lbra readbyte continue? + +* extended addr - 2 bytes +chk.f4 lbsr mvchr007 Add '>' + lbsr mvchr005 Add '$' +f4.010 lbsr getbyte2 Get 2 bytes + lbsr merghex2 Print 4 digit hex value + lbra chk.fd continue + +* immediate addr - 2 bytes +chk.f3 lbsr mvchr004 Add '#' + lbsr mvchr005 Add '$' + bra f4.010 Add 4 digit hex value & leave + +* immediate mode - 4 bytes +chk.f2 lbsr mvchr004 Add '#' + lbsr mvchr005 Add '$' + lbsr getbyte2 Get 2 bytes + lbsr merghex2 Print 4 hex digits + bra f4.010 Print next 4 digits & continue + +* in memory mode (AIM, etc.) (opcode s/b in <testbyte) +chk.f1 lbsr mvchr004 Add '#' + lbsr mvchr005 Add '$' + lbsr getbyte Get the 1 byte immediate value + lbsr merghex Add it to output + lbsr mvchr003 Add ',' + ldb <testbyte Get back original opcode + andb #%11110000 Mask out all but mode nibble + lbeq chk.ff If Direct page mode, do that + cmpb #%01100000 Indexed? + lbeq chk.f8 Yes, do it + cmpb #%01110000 Extended? + beq chk.f4 yes, do it + lbsr mvchr010 Unknown, add '?' + lbra chk.fd & exit +* Bit commands (LDBT, etc.) +chk.f0 lbsr getbyte Get register/bit flags + andb #%11000000 Mask out all but register bits + beq iscc If CC, do that + cmpb #%01000000 A? + bne tryb No, try B + ldd #'a*256+32 Add 'a ' + bra gotregn +tryb cmpb #%10000000 B? + bne illeg No, illegal register name + ldd #'b*256+32 Add 'b ' + bra gotregn +illeg ldd #'?*256+'? Add '??' + bra gotregn +iscc ldd #'c*256+'c cc register +gotregn lbsr movereg Add register name + lbsr mvchr011 Add '.' + ldb <byte Get original byte again + andb #%00000111 Mask out all but register bit # + bsr getbit Get Bit # + lbsr movechar Add it to output + lbsr mvchr003 Add ', + ldb <byte Get original byte again + andb #%00111000 Mask out all but memory bit # + lsrb Shift for subroutine + lsrb + lsrb + bsr getbit Get ASCII value for memory bit # + pshs a Preserve until DP part is done + inc <bitcom Set bit command flag +* Dupe of direct page stuff + leay line080,pc Point to '<u' + tst <u.opt User wants Symbolic labels? + beq f0.010 Yes, do so + leay line085,pcr No, use <$00xx instead +f0.010 ldb #2 In both cases, 2 chars to merge + lbsr mergline Merge onto current output line + lbsr getbyte Get direct page address byte + clra Make for 4 digit hex number + lbsr merghex2 Merge 4 digit hex result onto output line + tst <u.opt Direct page currently @ 0? + bne nou No, skip u stuff + lbsr indx046 put address in u table & write out line +nou lbsr mvchr011 Add '.' + puls a Get back memory bit # + lbsr movechar Add it to output + lbra chk.fd Write it out & continue + +* Create ASCII of bit # +getbit lda #'0 Bit # to 0 + pshs b Put bit # onto stack + adda ,s+ Add to ASCII base + rts + +* 8 bit relative offset (bra) +reladr.1 lda #'L Add 'L' + lbsr movechar + clra D=8 bit relative address offset + ldb <byte + addd <address Add to current address pointer + addd #1 Adjust for current instruction + pshs a + lda <byte + cmpa #$7f Negative offset? + puls a + bls rladr2.1 No, skip ahead + subd #$0100 Calculate negative offset + bra rladr2.1 +* 16 bit relative offset (bra) +reladr.2 pshs a + lda #'L + lbsr movechar + puls a + addd <address + addd #1 +rladr2.1 tst <pass + bne rladr2.4 + leay labeltab,u +rladr2.2 cmpd ,y + beq rladr2.4 + leay 2,y + cmpy <labladr + blo rladr2.2 + ldx <labladr + std ,x++ + stx <labladr + leax 2,x + cmpx <highadr + blo rladr2.4 +rladr2.3 leax line240,pcr Error:symbol table full + ldy #ln240sz + lda #2 + os9 i$writln + lbra unlink +rladr2.4 lbsr merghex2 Add 4 hex digits & return + rts + +endit lds <stackhld restore stack +endit010 tst <pass + bne endit020 +* ldx <highadr +* ldd <utabend +* subd <highadr +* tfr d,y +* lda #2 +* os9 i$write +* lbcs exit +* lbra clrexit +endit015 inc <pass + lbsr close + lbra restart +endit020 ldb <readcnt + beq endit024 + inc <readclr + clra + std <temp + ldd <address + subd <temp + std <address + leax readbuff,u +endit022 ldb ,x+ + stx <readpos + stb <byte + lbsr fcbline + ldd <address + addd #1 + std <address + ldx <readpos + dec <readcnt + bne endit022 +endit024 tst <z.opt + lbne clrexit + clr <readclr + lbsr clrline + lbsr adrmove + ldx #$ffff + stx <modend + lbsr getbyte + lbsr getbyte + lbsr getbyte + leay line170,pcr + ldb #ln170sz + lbsr mergline + lbsr writline + lbsr adrmove + leay line180,pcr + ldb #ln180sz + lbsr mergline + lbsr writline + lbsr moveadr + leax holdline,u + lda ,x + cmpa #$20 + beq endit030 + leay line190,pcr + ldb #ln190sz + lbsr mergline + lbsr writline +endit030 bsr close + + ifeq testing-1 + lbsr clrline + lda #$20 + lbsr movechar + lbsr writline + leay labeltab,u +endit040 ldd ,y++ + pshs y + lda #'* + lbsr movechar + lda #$20 + lbsr movechar + lbsr merghex2 + lbsr writline + puls y + cmpy <labladr + bls endit040 + leay line230,pcr + ldb #ln230sz + lbsr mergline + ldd <labladr + leax labeltab,u + stx <labladr + subd <labladr + lsra + rorb + lbsr merghex2 + lbsr writline + endc + + tst <diskio + lbne clrexit + lda #2 + sta <byte + +unlink ldu <modadr + os9 f$unlink + lbcs exit + dec <byte + bne unlink + lbra clrexit + +close tst <diskio + beq close010 + lda <path + os9 i$close + lbcs exit +close010 rts + + + pag +* +******************** descriptor processing *************************** +descrhdr lbsr getbyte2 + std <mgradr + lbsr getbyte2 + std <drvadr + lbsr clrline + lbsr getbyte + lbsr fcbline + leay line340,pcr + ldb #ln340sz + lbsr mergline + lbsr writline + lbsr getbyte + lbsr fcbline + leay line350,pcr + ldb #ln350sz + lbsr mergline + lbsr writline + lbsr getbyte2 + lbsr fdbline + leay line360,pcr + ldb #ln360sz + lbsr mergline + lbsr writline + lbsr getbyte + lbsr moveadr + clra + ldb <byte + addd <address + addd #1 + std <initsize + leay line380,pcr + ldb #ln380sz + lbsr mergline + lbsr writline + lbsr getbyte + stb <desctype + lbsr fcbline + leay line390,pcr + ldb #ln390sz + lbsr mergline + lbsr writline + leax scfprint,pcr + stx <printadr + lda <desctype + cmpa #1 + bne getdescr + leax rbfprint,pcr + stx <printadr +getdescr ldx <printadr + lda ,x+ + pshs x + cmpa #'2 + lbeq descr2 + cmpa #'3 + lbeq descr3 + lbsr getbyte + ldd <address + cmpd <initsize + bne desc010 + lbsr clrline + lbsr adrmove + leay line400,pcr + ldb #ln400sz + lbsr mergline + lbsr writline +desc010 ldd <address + cmpd <nameadr + bne desc015 + leay line100,pcr + ldb #ln100sz + leax holdname,u + bra desc030 +desc015 cmpd <mgradr + bne desc020 + leay line410,pcr + ldb #ln410sz + leax namehold,u + bra desc030 +desc020 cmpd <drvadr + bne desc040 + leay line420,pcr + ldb #ln420sz + leax namehold,u +desc030 pshs x + pshs b + leax holdobj,u + ldd #$2020 + std ,x++ + std ,x++ + std ,x++ + std ,x++ + puls b + lbsr mergline + lbsr adrmove + lbsr writline + puls y + lbsr movename + lbsr getbyte + puls x + leax scfpend,pcr + leax 1,x + pshs x + stx <printadr + bra desc010 +desc040 lbsr fcbline + bra mergdesc +descr2 lbsr getbyte2 + lbsr fdbline + bra mergdesc +* descriptor name copy +descr3 stx <printadr + lbsr getbyte2 + lbsr moveadr + leay line430,pcr + ldb #ln430sz + lbsr mergline + lbsr writline + lbra getdescr + +mergdesc clrb + puls x + pshs x +desc050 lda ,x+ + cmpa #$0d + beq desc060 + incb + bra desc050 +desc060 stx <printadr + leax -2,x + lda ,x + cmpa #'? + bne desc070 + leax -1,x + stx <printadr +desc070 puls y + lbsr mergline + lbsr writline + lbra getdescr + +********************************************************************** +*###################################################################### +* subroutines +*###################################################################### + + +*********************************************************************** +* * +* U$hexin - converts hex characters to binary digits * +* * +* Entry: x=start address of digits to convert * +* * +* Exit: x=same as entry * +* y=# of converted bytes * +* * +*********************************************************************** + +u$hexin pshs a,b + pshs x + leay ,x move start addr for scan +hexin010 bsr hexin030 convert bytes + bcs hexin020 exit if done + stb ,x+ move the converted byte in + bra hexin010 go back & get more +hexin020 tfr x,d get current byte position + subd ,s subtract start position + tfr d,y move the length of the string + puls x + puls a,b,pc done + +hexin030 ldb ,y+ get char + cmpb #', was it a comma?? + bne hexin050 no..don't skip it +hexin040 ldb ,y+ get next char +hexin050 cmpb #$20 was it a space + beq hexin040 yes...skip it & get next char + leay -$01,y else back up to point to the char + bsr hexin080 convert it + bcs hexin070 done....exit + pshs b save the byte + bsr hexin080 convert next byte + bcs hexin060 exit if done + asl ,s shift saved char to put in high 4 bits + asl ,s + asl ,s + asl ,s + addb ,s and move in low 4 bits + stb ,s save the byte +hexin060 clrb clear the carry flag + puls b restore the saved flag +hexin070 rts return + +hexin080 ldb ,y get the char in + subb #$30 subtract bias for numbers + cmpb #$09 was it > 9 + bls hexin100 no...its good + cmpb #$31 was it 'a' + blo hexin090 if less than that..skip next + subb #$20 else make it upper case +hexin090 subb #$07 back off so 'A' = $0a + cmpb #$0F check if it was a 'F' + bhi hexin110 if >...error + cmpb #$0A was it a 'A' + bcs hexin110 if <...error +hexin100 andcc #$FE clear carry bit of cc + leay $01,y bump up pointer for next char + rts return +hexin110 comb set carry flag + rts return + + +* +* convert bytes in d to hex, output to hexstrng +* +gethex std <dsave + pshs y + leay hexstrng,u + pshs b + bsr gethx010 + puls a + bsr gethx010 + puls y,pc +gethx010 pshs a + lsra + lsra + lsra + lsra + bsr gethx020 + puls a + anda #$0f + bsr gethx020 + rts +gethx020 adda #$30 + cmpa #$3a + blt gethx030 + adda #$07 +gethx030 sta ,y+ + rts + +* +* get decimal value of bytes id d ,output in string pointed at by 'y' +* +getdec pshs x + ldx #10000 + bsr getdc010 + ldx #01000 + bsr getdc010 + ldx #00100 + bsr getdc010 + ldx #00010 + bsr getdc010 + stb <counter + bsr getdc030 + puls x,pc +getdc010 stx <countdec + clr <counter +getdc020 cmpd <countdec + blo getdc030 + subd <countdec + inc <counter + bra getdc020 +getdc030 pshs b + ldb <counter + addb #$30 + stb ,y+ + puls b,pc + +* +* read next 2 bytes into 'd' +* +getbyte2 bsr getbyte + tfr b,a + bsr getbyte + rts + +* +* merge last 2 bytes of hexstrng with output line +* +merghex equ * + clra + bsr gethex + leay hexstrng,u + leay 2,y + ldb #2 + lbsr mergline + rts + +* +* merge all 4 hex chars to output line +* +merghex2 bsr gethex + leay hexstrng,u + ldb #4 + lbsr mergline + rts + + +* +* merge significant decimal characters +* +mergdec pshs a,b + leay decstrng,u + lda #$30 + sta ,y + puls a,b + cmpd #0 + bne mergd010 + ldb #1 + lbra mergline +mergd010 bsr getdec + leay decstrng,u + ldb #6 +chkdecln decb + lda ,y+ + cmpa #$30 + beq chkdecln + leay -1,y + lbra mergline + +* +* read 1 byte +* +getbyte pshs x,y,a + ldx <address + leax 1,x + stx <address + leax 3,x + cmpx <modend + lbhs endit + tst <diskio + bne getdisk + ldx <crntadr + leax 1,x + stx <crntadr + ldb ,x + stb <byte + bra gotbyte +* +* read byte from disk +* +getdisk leax byte,u + ldy #1 + lda <path + os9 i$read + lbcs endit + ldb <byte +gotbyte lda <byte + bsr moveobj + ldb <byte + ldx <readpos + stb ,x+ + stx <readpos + inc <readcnt + puls x,y,a,pc + +* +* convert 'a' to hex,merge with object code listing +* +moveobj pshs x,y,b + ldb <objcnt + cmpb #4 + bhs moverts + inc <objcnt + lbsr gethex + ldx <objadr + leay hexstrng,u + lda ,y+ + lbsr getupc + sta ,x+ + lda ,y + lbsr getupc + sta ,x+ + stx <objadr +moverts puls x,y,b,pc + +* +* clear one of the hold strings pointed to by 'y' +* +clrhld sty <lineadr + pshs x,b + tfr y,x + leay line040,pcr + ldb #40 + bsr merge + ldy <lineadr + puls x,b,pc + +* +* clear all parts of the output line +* +clrline pshs x,y,a,b + leax holdline,u + stx <lineadr + leax holdobj,u + stx <objadr + leax linenum,u + clr <objcnt + leay line040,pcr + ldb #80 + bsr merge + puls x,y,a,b,pc + +* +* merge the string pointed to by 'y' with the current line +* +mergline ldx <lineadr + bsr merge + stx <lineadr + rts + +* +* merge the sring pointed to by 'y' with the string pointed to by 'x' +* +merge pshs a +merge010 lda ,y+ + sta ,x+ + decb + bne merge010 + puls a,pc + +* +* write the output line to standard output path,then clear line +* +writline pshs x,y + tst <pass + beq wrtln010 + ldd <numline + addd #1 + std <numline + leay linenum,u + lbsr getdec + ldx <lineadr + lda #$0d + sta ,x+ + tfr x,d + leax linenum,u + tst <o.opt + bne wrtln005 + leax holdline,u +wrtln005 stx <temp + subd <temp + tfr d,y + lbsr send +wrtln010 bsr clrline + tst <readclr + bne wrtln020 + leax readbuff,u + stx <readpos + clr <readcnt +wrtln020 puls x,y,pc +* +* move the current address to holdadr of output line +* +adrmove pshs x + ldd <address + lbsr gethex + leax hexstrng,u + leay holdadr,u + ldb #4 +adrmv010 lda ,x+ + lbsr getupc + sta ,y+ + decb + bne adrmv010 + puls x,pc + +* +* move the current address if its second pass and its a referenced address +* +moveadr tst <pass + beq mvadr020 + bsr adrmove + leay labeltab,u + ldd <address +mvadr010 cmpy <labladr + beq mvadr020 + cmpd ,y + beq mvadr030 + leay 2,y + bra mvadr010 +mvadr020 leay line040,pcr + ldb #9 + lbsr mergline + rts +mvadr030 lda #'L + bsr movechar + ldd <address + lbsr merghex2 + leay line040,pcr + ldb #4 + lbsr mergline + rts + +* +* merge the char in 'a' with the output line +* +movechar ldx <lineadr + sta ,x+ + stx <lineadr + rts + +* +* merge predefined characters with the output line +* +mvchr001 lda #'[ + bra mvchr999 +mvchr002 lda #'] + bra mvchr999 +mvchr003 lda #', + bra mvchr999 +mvchr004 lda #'# + bra mvchr999 +mvchr005 lda #'$ + bra mvchr999 +mvchr006 lda #'< + bra mvchr999 +mvchr007 lda #'> + bra mvchr999 +mvchr008 lda #'+ + bra mvchr999 +mvchr009 lda #'- + bra mvchr999 +mvchr010 lda #'? + bra mvchr999 +mvchr011 lda #'. + bra mvchr999 + +mvchr999 bsr movechar + rts + +movename pshs y + lbsr clrline + bsr moveadr + leay line060,pcr + ldb #ln060sz + lbsr mergline + ldb <byte + tfr b,a + lbsr moveobj + puls y +getnm010 cmpb #$80 + bhs getnm020 + stb ,y+ + tfr b,a + bsr movechar + lbsr getbyte + bra getnm010 +getnm020 subb #$80 + stb ,y+ + tfr b,a + bsr movechar + ldb #$0d + stb ,y + lda #'/ + bsr movechar + lbsr writline + rts +* +* line type is fcb ...create all parts of fcb line +* +fcbline lbsr clrline + lbsr moveadr + leay line090,pcr + ldb #ln090sz + lbsr mergline + ldb <byte + lbsr merghex + leay hexstrng,u + leay 2,y + pshs x + + ldx <objadr + lda ,y+ + sta ,x+ + lda ,y + sta ,x+ + stx <objadr + puls x + lda #$20 + lbsr movechar + tst <descript + bne fcbl030 + lda <byte + cmpa #$20 + bls fcbl020 + cmpa #'z + bls fcbl010 + suba #$80 + cmpa #$20 + bls fcbl020 + cmpa #'z + bgt fcbl020 +fcbl010 lbsr movechar +fcbl020 lbsr writline +fcbl030 rts +fdbline pshs d + lbsr clrline + ldd <address + pshs d + subd #1 + std <address + lbsr moveadr + puls d + std <address + leay line370,pcr + ldb #ln370sz + lbsr mergline + puls d + lbsr merghex2 + leay hexstrng,u + ldb #4 + pshs x + ldx <objadr + ldd ,y++ + std ,x++ + ldd ,y++ + std ,x++ + stx <objadr + puls x + lda #$20 + lbsr movechar + rts + + +* +* convert 'a' to uppper case if its a letter +* +getupc cmpa #'z + bls getup010 + anda #$df +getup010 rts + + +* +* if its 2nd pass,write the line to standard output path +* +send tst <pass + beq send010 + lda #1 + os9 i$writln + lbcs exit +send010 lbsr clrline + rts +********* get op ****************** +* entry: opcode in a / a&b for 2 ops +* + +getop sta <testbyte + tstb + bne chkos9 + ldb #6 + mul + leay optable,pcr + leay d,y +getrest leay 1,y + lda ,y+ + tfr a,b + pshs b + ldb #5 +moveop lda ,y+ + lbsr movechar + decb + bne moveop + pshs a + lda #$20 + lbsr movechar + puls a + puls b,pc + +chkos9 cmpb #$3f + bne chk10 + leay line150,pcr + ldb #ln150sz + lbsr mergline + cmpa #$80 + bhs i$os9 + cmpa #$54 + bhs bados9 + leay os9f$tab,pcr + bra getos9 + +i$os9 cmpa #$91 + bhs bados9 + leay os9i$tab,pcr + suba #$80 + bra getos9 +bados9 leay bados9op,pcr + clra +getos9 ldb #8 + mul + leay d,y + pshs b + ldb #8 + bra moveop + +chk10 sta <testbyte + cmpb #$10 + beq load10 + cmpb #$11 + beq load11 + clr <testbyte +load11 leay get11tab,pcr + bra loop10 +load10 leay get10tab,pcr +loop10 lda ,y + tsta + beq getrest + cmpa <testbyte + beq getrest + leay 7,y + bra loop10 + +nolink lbsr clrline + leay line200,pcr + ldb #ln200sz + lbsr mergline + ldy <xreghold + ldb #$20 + lbsr mergline + lda #$0d + lbsr movechar + leax holdline,u + ldy #$50 + +* +* error encountered - print error to standard error path +* +prterror lda #2 + os9 i$writln +clrexit clrb +exit os9 f$exit + + emod +eom equ * + end +