The Past Master Club

ZX81 SAVE CODE 02F6:
02F4 CF 0E       ,->RST 8    RET to DOS ==>
02F6 CD A8 03  |  CALL 03A8 Check name,
02F9 38 F9    '-<JR c 02F4 quit if no good.
02FB EB      EX DE HL Exchange DE with HL
02FC 11 CB 12  LD DE 12CB DE=count.
02FF CD 46 0F  ,->CALL 0F46 5 second
0302 30 2E   ,---+-<JR nc 0332 silent
0304 10 FE   | |  DJNZ 0302 peiod.
0306 1B     | |  DEC DE   Quit if
0307 7A     | |  LD A D BREAK key
0308 B3     | |  OR E   pressed.
0309 20 F4   | '-<JR nz 02FF  
030B CD 1E 03 | ,->CALL 031E Write name
030E CB 7E   | |  BIT 7 (HL) to tape,
0310 23     | |  INC HL   last char has
0311 28 F8   | '-<JR z 030B BIT 7 set to 1 high
0313 21 09 40 | LD HL 4009 Write RAM contents
0316 CD 1E 03 | ,->CALL 031E from 4009
0319 CD FC 01 | |  CALL 01FC to E-line - 1
031C 18 F8   | '-<JR 0316 to tape.
        |        
031E 5E     | LD E (HL) E=peek HL: Get next
031F 57     | SCF  Set carryflag=1: BYTE.
0320 CB 13   | ,--->RL E   Quit if
0322 C8     | | RET z   last BIT or RET to DOS ==>
0323 9F     | | SBC A A makes A equal;
0324 E6 05   | | AND 05   4 if BIT is 0 low
0326 C6 04   | | ADD 04   9 if BIT is 1 high
0328 4F     | | ,->LD C A Send 4/9 pulses.
0329 D3 77   | | |  OUT (FF) A Send
032B 06 23   | | |  LD B 23 one
032D 10 FE   | | |  DJNZ 032D pulse.
032F CD 46 0F | | |  CALL 0F46 Quit if
0332 30 72   '-+-+->JR nc 03A6 BREAK or RET to DOS ==>
0334 06 1E    | |  LD B 1E pause
0336 10 FE    | |  DJNZ 0336 between
0338 0D      | |  DEC C   pulses.
0339 20 EE    | '-<JR nz 0329  
033B A7      | ,->AND A   Pause
033C 10 FD    | '-<DJNZ 033B between BITS.
033E 18 E0    '---<JR 0320   To next BIT
 
01FC 23      INC HL   Point
01FD EB      EX DE HL HL to
01FE 2A 14 40  LD HL (4014) next BYTE
0201 37      SCF     then
0202 ED 52    SBC HL DE return
0204 EB      EX DE HL if not yet
0205 D0      RET nc   equal to E-line or END of CALL ==>
0206 E1      POP HL   Clear stack and go to
 display routine. or END of LOAD ==>

QSAVE uses 1 / 2 instead of 4 / 9 pulses!

1