10 REM SOURCE FOR *MDUMP
   20 REM *MDUMP <start> (<end>/+<length>)
   30 REM by J.G.Harston
   40 REM (C)
   50 OSWRCH=&FFEE:OSNEWL=&FFE7
   60 OSARGS=&FFDA:OSBYTE=&FFF4
   70 l_ptr=&A8:addr=&AA:rom=&AC
   80 end_ad=&AD
   90 mcode%=&900
  100 tempY=mcode%:buff=mcode%+2
  110 tube=&27A
  120 FOR P=0 TO 1
  130   P%=mcode%
  140   [OPT P*3
  150   LDA #1:LDY #0:LDX #l_ptr
  160   JSR OSARGS
  170   LDA (l_ptr),Y:CMP #13:BEQ syntax
  180   LDX #addr:JSR get_hex_addr
  190   JSR space2:BEQ mdump
  200   STA forever
  210   LDX #end_ad
  220   CMP #ASC"+":BEQ plus
  230   JSR get_hex_addr
  240   JMP mdump
  250   .syntax
  260   BRK
  270   OPT FNequs(CHR$220+"Syntax: MDump <start> (<end>/+<length>)")
  280   BRK
  290   .plus
  300   JSR skpspc:BEQ syntax
  310   JSR get_hex_addr
  320   CLC:LDA addr:ADC end_ad:STA end_ad
  330   LDA addr+1:ADC end_ad+1:STA end_ad+1
  340   .mdump
  350   LDA #0:LDX #255:JSR OSBYTE
  360   CPX #2:BCC mdump1:BEQ Bplus
  370   LDA &FE34:AND #&F3:STA acc1
  380   ORA #&0C:STA acc2:BNE set_acc
  390   .Bplus
  400   LDA #128:STA acc2
  410   .set_acc
  420   LDA #255:STA accflg
  430   .mdump1
  440   LDA end_ad:CLC:ADC #7:STA end_ad
  450   LDA end_ad+1:ADC #0:STA end_ad+1
  460   .loop
  470   JSR pr_addr
  480   JSR get_8_bytes
  490   LDX #0
  500   .loop1
  510   LDA #32:JSR OSWRCH
  520   LDA buff,X:JSR pr_hex
  530   INX:CPX #8:BNE loop1
  540   LDA #32:JSR OSWRCH
  550   LDX #0
  560   .loop2
  570   LDA buff,X:AND #127
  580   CMP #32:BCS pr_char
  590   .pr_dot LDA #ASC"."
  600   .pr_char CMP #127:BEQ pr_dot
  610   JSR OSWRCH
  620   INX:CPX #8:BNE loop2
  630   JSR OSNEWL
  640   LDA addr:CLC:ADC #8:STA addr
  650   LDA addr+1:ADC #0:STA addr+1
  660   LDA rom:ADC #0:STA rom
  670   BIT forever:BMI mdump2
  680   LDA addr:EOR end_ad:AND #&F8
  690   BNE mdump2
  700   LDA addr+1:EOR end_ad+1
  710   BEQ exit
  720   .mdump2
  730   BIT &FF:BPL loop
  740   LDA #124:JSR OSBYTE:\ Ack Esc
  750   .exit
  760   RTS
  770   .get_8_bytes
  780   LDX rom:BIT tube:BMI tubeget
  790   CPX #&FE:BCC getbyte4
  800   .getbyte1
  810   LDA &F4:PHA
  820   BIT accflg:BPL getbyte3
  830   LDA &FE34:PHA
  840   LDA acc1:CPX #&FE:BNE getbyte2:LDA acc2
  850   .getbyte2
  860   STA &FE34
  870   CPX #&F0:BCS getbyte3
  880   LDA #&8F:STA &F4:STA &FE30:BNE getbyte4
  890   .getbyte3
  900   LDA rom:AND #15:STA &F4:STA &FE30
  910   .getbyte4
  920   LDX #7:LDY #7
  930   .getbyteloop
  940   LDA (addr),Y:STA buff,X
  950   DEY:DEX:BPL getbyteloop
  960   LDA rom:CMP #&FE:BCC getbyte6
  970   BIT accflg:BPL getbyte5
  980   PLA:STA &FE34
  990   .getbyte5
 1000   PLA:STA &F4:STA &FE30
 1010   .getbyte6
 1020   RTS
 1030   .tubeget
 1040   CPX #&FE:BCS getbyte1
 1050   .tubeclaim \Claim tube hardware
 1060   LDA #&C0+&10:JSR &406:BCC tubeclaim
 1070   LDX #addr:LDY #0
 1080   LDA #0:JSR &406:LDX #0
 1090   .tubeloop
 1100   LDY #9:\ 24ish us delay
 1110   .tube_wait
 1120   DEY:BNE tube_wait
 1130   LDA &FEE5:STA buff,X
 1140   INX:CPX #8:BNE tubeloop
 1150   LDA #&80+&10:JSR &406:\ Release tube hardware
 1160   RTS
 1170   .pr_addr
 1180   LDA rom:JSR pr_hex
 1190   LDA addr+1:JSR pr_hex
 1200   LDA addr
 1210   .pr_hex
 1220   PHA:LSR A:LSR A:LSR A:LSR A
 1230   JSR h_first:PLA
 1240   .h_first
 1250   AND #15:CMP #10:BCC h_over
 1260   ADC #6:.h_over
 1270   ADC #48:JMP OSWRCH
 1280   .get_hex_addr
 1290   LDA #0
 1300   STA 0,X:STA 1,X:STA 2,X
 1310   .nextchar
 1320   LDA (l_ptr),Y:JSR asc_to_bin
 1330   BCS gh_exit
 1340   ASL A:ASL A:ASL A:ASL A
 1350   STY tempY:LDY #4
 1360   .gh_again
 1370   ASL A:ROL 0,X:ROL 1,X:ROL 2,X
 1380   DEY:BNE gh_again
 1390   LDY tempY
 1400   INY:BNE nextchar
 1410   .gh_exit
 1420   RTS
 1430   .asc_to_bin
 1440   CMP #48:BCC illegal
 1450   CMP #58:BCC zero_nine
 1460   SBC #7:BCC illegal
 1470   CMP #64:BCS illegal
 1480   .zero_nine
 1490   AND #&0F:RTS
 1500   .illegal
 1510   SEC:RTS
 1520   .skpspc INY
 1530   .space2 LDA (l_ptr),Y:CMP #32
 1540   BEQ skpspc
 1550   CMP #13:RTS
 1560   .accflg:BRK
 1570   .acc1:BRK
 1580   .acc2:BRK
 1590   .forever:OPT FNequs(CHR$255)
 1600   ]
 1610 NEXT
 1620 $&780="*SAVE MDUMP "+STR$~(mcode%OR&FFFF0000)+" "+STR$~(P%OR&FFFF0000)
 1630 X%=&80:Y%=7:CALL&FFF7
 1640 END
 1650 DEFFNequs(A$):$P%=A$:P%=P%+LENA$:=P*3