TIM can write MOS Technology papertape format. Not the whole format as defined in the KIM-1 manaul, the last end record is not written, as you can see in this example session.
.WH 7000 7100 ;18700085F9A923D055A9168D036EA208BDF7739DF7FFCAD0F786EA0F19 ;18701886E786E8CA9A4C5070E3AD026E4A90FA8E046EAD056E10040BF3 ;187030E6EAD0F4984D026E2901F0EF8810ECAD046E49FF4A46EA900D9F ;187048020980C8F0F685EB580085F968482910F0270A85FED84A860C84 ;187060FA84FB6885F86869FF85F66869FF85F7BA86FC208A72A6FE10D9 ;187078A92A20C072A952D016A5F96CF8FFA90085E785E4208A72A90E4A ;1870902E20C67220E972A206DD0671D019A5FD85E986FDA97185ED0E1D ;1870A8BD0D7185ECE003B0032074736CEC00CA10DFA93F20C672900C5A ;1870C0C538A5F0E5EE85E5A5F1E5EFA805E560A5EE85F6A5EF85F71291 ;1870D860A90095EE95EF6020B3739010A20081EEC1EEF00568684C0D87 ;1170F0BA70207C72209773C6FE60A9F885EEA9000AB4 .
The format is similar to what the KIM-1 reads and writes.
A record is made up of:
‘;’ XX YYYY D..D CCCC
where
XX is number of databytes
YYYY is load address
D..D are XX databytes
CCCC is checksum, sum of XX YYYY and D.D)
The Jolt Simulator end Convert8bits utility know this format as ‘TIM’ file.
0421 71C2 20 E9 72 WO JSR RDOC ; RD 2ND CMD CHAR 0422 71C5 85 FE STA TMPC 0423 71C7 20 77 73 JSR SPACE 0424 71CA 20 A4 73 JSR RDOA 0425 71CD 20 87 73 JSR T2T2 ; SA TO TMP2 0426 71D0 20 77 73 JSR SPACE ; SPACE BEFORE NEXT ADDRESS 0427 71D3 20 A4 73 JSR RDOA 0428 71D6 20 87 73 JSR T2T2 ; SA TO TMP0, EA TO TMP2 0429 71D9 20 E9 72 JSR RDOC ; DELAY FOR FINAL CR 0430 71DC A5 FE LDA TMPC 0431 71DE ; 0432 71DE C9 48 CMP #'H' 0433 71E0 D0 59 BNE WB
WO
What is happening here?
- character after the W is read INTO tmpc(421-422
- a space is printed (423)
- Start address is read into TMP0 (424-425)
- End address address is read into TMP2 (428-429)
- Any character is read to end the commandline (429)
- if second character in TMPC is B then goto WB (write BNPF format) (432-433)
- else continue with WH0
Helper subroutines with arguments in TMP0 locations
0707 7387 A2 02 T2T2 LDX #2 0708 7389 B5 ED T2T21 LDA TMP0-1,X 0709 738B 48 PHA 0710 738C B5 EF LDA TMP2-1,X 0711 738E 95 ED STA TMP0-1,X 0712 7390 68 PLA 0713 7391 95 EF STA TMP2-1,X 0714 7393 CA DEX 0715 7394 D0 F3 BNE T2T21 0716 7396 60 RTS 0717 7397 ; 0718 7397 ;INCREMENT (TMP0,TMP0+1) BY 1 0719 7397 E6 EE INCTMP INC TMP0 ;LOW BYTE 0720 7399 F0 01 BEQ INCT1 0721 739B 60 RTS 0722 739C ; 0723 739C E6 EF INCT1 INC TMP0+1 ;HIGH BYTE 0724 739E F0 01 BEQ SETWRP 0725 73A0 60 RTS 0726 73A1 ; 0727 73A1 E6 E4 SETWRP INC WRAP ;POINTER HAS WRAPPED AROUND - SET FLAG 0728 73A3 60 RTS 0729 73A4 ; 0262 70C1 38 DCMP SEC ; TMP2-TMP0 DOUBLE SUBTRACT 0263 70C2 A5 F0 LDA TMP2 0264 70C4 E5 EE SBC TMP0 0265 70C6 85 E5 STA DIFF 0266 70C8 A5 F1 LDA TMP2+1 0267 70CA E5 EF SBC TMP0+1 0268 70CC A8 TAY ; RETURN HIGH ORDER PART IN Y 0269 70CD 05 E5 ORA DIFF ; OR LO FOR EQU TEST 0270 70CF 60 RTS 0278 70D9 A9 00 ZTMP LDA #0 ; CLEAR REGS 0279 70DB 95 EE STA TMP0,X 0280 70DD 95 EF STA TMP0+1,X 0281 70DF 60 RTS 0518 727C 48 CADD PHA ; SAVE A 0519 727D 18 CLC 0520 727E 65 F2 ADC TMP4 0521 7280 85 F2 STA TMP4 0522 7282 A5 F3 LDA TMP4+1 0523 7284 69 00 ADC #0 0524 7286 85 F3 STA TMP4+1 0525 7288 68 PLA ; RESTORE A 0526 7289 60 RTS
T2T2
– exchange TMP0 and TMP2 addresses
INCTMP
Increment address in TMP0 (low) and TMP0+1 (high) with 1
– increment low part of address TMP0
– if wrapped over then increment high part of address TMP0+1
– if high part wrapped over to 0000 the set WRAP flag to true
ZTMP
-zero TMP0+X an TMP0+1 locations
CADD
– add byte in A to 16 bit checksum in TMP4 and TMP4+1, A saved
DCMP
– subtract TMP2-TMP0 and leave result in DIFF and Y
WH
0434 71E2 ; 0435 71E2 A6 E4 WH0 LDX WRAP ;IF ADDR HAS WRAPPED AROUND 0436 71E4 D0 52 BNE BCCST ;THEN TERMINATE WRITE OPERATION 0437 71E6 ; 0438 71E6 20 8A 72 JSR CRLF 0439 71E9 A2 18 LDX #24 0440 71EB 86 FE STX RCNT ; RCNT=24 0441 71ED A2 04 LDX #4 ; CLEAR CKSUM 0442 71EF 20 D9 70 JSR ZTMP 0443 71F2 ; 0444 71F2 A9 3B LDA #59 ; ';' 0445 71F4 20 C6 72 JSR WROC ; WR RCD MARK 0446 71F7 ; 0447 71F7 20 C1 70 JSR DCMP ; EA-SA (TMP0+2-TMP0) DIFF IN LOC DIFF,+1 0448 71FA 98 TYA ; MS BYTE OF DIFF 0449 71FB D0 0A BNE WH1 0450 71FD A5 E5 LDA DIFF 0451 71FF C9 17 CMP #23 0452 7201 B0 04 BCS WH1 ; DIFF GT 24 0453 7203 85 FE STA RCNT ; INCR LAST RCNT 0454 7205 E6 FE INC RCNT 0455 7207 A5 FE WH1 LDA RCNT 0456 7209 20 7C 72 JSR CADD ; ADD TO CKSUM 0457 720C 20 B1 72 JSR WROB ; RCC CNT IN A 0458 720F A5 EF LDA TMP0+1 ; SA HO 0459 7211 20 7C 72 JSR CADD 0460 7214 20 B1 72 JSR WROB 0461 7217 A5 EE LDA TMP0 ; SA LO 0462 7219 20 7C 72 JSR CADD 0463 721C 20 B1 72 JSR WROB 0464 721F ; 0465 721F A0 00 WH2 LDY #0 0466 7221 B1 EE LDA (TMP0),Y 0467 7223 ; 0468 7223 20 7C 72 JSR CADD ; INC CKSUM, PRESERVES A 0469 7226 20 B1 72 JSR WROB 0470 7229 20 97 73 JSR INCTMP ; INC SA 0471 722C C6 FE DEC RCNT 0472 722E D0 EF BNE WH2 ; LOOP FOR OP TO 24 BYTE 0473 7230 ; 0474 7230 20 9E 72 JSR WROA4 ; WRITE CKSUM 0475 7233 ; 0476 7233 20 C1 70 JSR DCMP 0477 7236 B0 AA BCS WH0 ; LOOP WHILE EA GT OR = SA 0478 7238 4C 86 70 BCCST JMP START
What is happening here?
WH0