WB write MOS papertape

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