CPU-Z80-Disassembler
view release on metacpan or search on metacpan
t/data/zx81_version_2_rom_source.asm view on Meta::CPAN
; --------------------------
; THE 'SAVE COMMAND' ROUTINE
; --------------------------
;
;
;; SAVE
L02F6: CALL L03A8 ; routine NAME
JR C,L02F4 ; back with null name to REPORT-F above.
EX DE,HL ;
LD DE,$12CB ; five seconds timing value
;; HEADER
L02FF: CALL L0F46 ; routine BREAK-1
JR NC,L0332 ; to BREAK-2
;; DELAY-1
L0304: DJNZ L0304 ; to DELAY-1
DEC DE ;
LD A,D ;
OR E ;
JR NZ,L02FF ; back for delay to HEADER
;; OUT-NAME
L030B: CALL L031E ; routine OUT-BYTE
BIT 7,(HL) ; test for inverted bit.
INC HL ; address next character of name.
JR Z,L030B ; back if not inverted to OUT-NAME
; now start saving the system variables onwards.
LD HL,$4009 ; set start of area to VERSN thereby
; preserving RAMTOP etc.
;; OUT-PROG
L0316: CALL L031E ; routine OUT-BYTE
CALL L01FC ; routine LOAD/SAVE >>
JR L0316 ; loop back to OUT-PROG
; -------------------------
; THE 'OUT-BYTE' SUBROUTINE
; -------------------------
; This subroutine outputs a byte a bit at a time to a domestic tape recorder.
;; OUT-BYTE
L031E: LD E,(HL) ; fetch byte to be saved.
SCF ; set carry flag - as a marker.
;; EACH-BIT
L0320: RL E ; C < 76543210 < C
RET Z ; return when the marker bit has passed
; right through. >>
SBC A,A ; $FF if set bit or $00 with no carry.
AND $05 ; $05 $00
ADD A,$04 ; $09 $04
LD C,A ; transfer timer to C. a set bit has a longer
; pulse than a reset bit.
;; PULSES
L0329: OUT ($FF),A ; pulse to cassette.
LD B,$23 ; set timing constant
;; DELAY-2
L032D: DJNZ L032D ; self-loop to DELAY-2
CALL L0F46 ; routine BREAK-1 test for BREAK key.
;; BREAK-2
L0332: JR NC,L03A6 ; forward with break to REPORT-D
LD B,$1E ; set timing value.
;; DELAY-3
L0336: DJNZ L0336 ; self-loop to DELAY-3
DEC C ; decrement counter
JR NZ,L0329 ; loop back to PULSES
;; DELAY-4
L033B: AND A ; clear carry for next bit test.
DJNZ L033B ; self loop to DELAY-4 (B is zero - 256)
JR L0320 ; loop back to EACH-BIT
; --------------------------
; THE 'LOAD COMMAND' ROUTINE
; --------------------------
;
;
;; LOAD
L0340: CALL L03A8 ; routine NAME
; DE points to start of name in RAM.
RL D ; pick up carry
RRC D ; carry now in bit 7.
;; NEXT-PROG
L0347: CALL L034C ; routine IN-BYTE
JR L0347 ; loop to NEXT-PROG
; ------------------------
; THE 'IN-BYTE' SUBROUTINE
; ------------------------
;; IN-BYTE
L034C: LD C,$01 ; prepare an eight counter 00000001.
;; NEXT-BIT
L034E: LD B,$00 ; set counter to 256
;; BREAK-3
L0350: LD A,$7F ; read the keyboard row
IN A,($FE) ; with the SPACE key.
t/data/zx81_version_2_rom_source.asm view on Meta::CPAN
CP D ; ugh.
;; RESTART
L0361: JP NC,L03E5 ; jump forward to INITIAL if D is zero
; to reset the system
; if the tape signal has timed out for example
; if the tape is stopped. Not just a simple
; report as some system variables will have
; been overwritten.
LD H,D ; else transfer the start of name
LD L,E ; to the HL register
;; IN-NAME
L0366: CALL L034C ; routine IN-BYTE is sort of recursion for name
; part. received byte in C.
BIT 7,D ; is name the null string ?
LD A,C ; transfer byte to A.
JR NZ,L0371 ; forward with null string to MATCHING
CP (HL) ; else compare with string in memory.
JR NZ,L0347 ; back with mis-match to NEXT-PROG
; (seemingly out of subroutine but return
; address has been dropped).
;; MATCHING
L0371: INC HL ; address next character of name
RLA ; test for inverted bit.
JR NC,L0366 ; back if not to IN-NAME
; the name has been matched in full.
; proceed to load the data but first increment the high byte of E_LINE, which
; is one of the system variables to be loaded in. Since the low byte is loaded
; before the high byte, it is possible that, at the in-between stage, a false
; value could cause the load to end prematurely - see LOAD/SAVE check.
INC (IY+$15) ; increment system variable E_LINE_hi.
LD HL,$4009 ; start loading at system variable VERSN.
;; IN-PROG
L037B: LD D,B ; set D to zero as indicator.
CALL L034C ; routine IN-BYTE loads a byte
LD (HL),C ; insert assembled byte in memory.
CALL L01FC ; routine LOAD/SAVE >>
JR L037B ; loop back to IN-PROG
; ---
; this branch assembles a full byte before exiting normally
; from the IN-BYTE subroutine.
;; GET-BIT
L0385: PUSH DE ; save the
LD E,$94 ; timing value.
;; TRAILER
L0388: LD B,$1A ; counter to twenty six.
;; COUNTER
L038A: DEC E ; decrement the measuring timer.
IN A,($FE) ; read the
RLA ;
BIT 7,E ;
LD A,E ;
JR C,L0388 ; loop back with carry to TRAILER
DJNZ L038A ; to COUNTER
POP DE ;
JR NZ,L039C ; to BIT-DONE
CP $56 ;
JR NC,L034E ; to NEXT-BIT
;; BIT-DONE
L039C: CCF ; complement carry flag
RL C ;
JR NC,L034E ; to NEXT-BIT
RET ; return with full byte.
; ---
; if break is pressed while loading data then perform a reset.
; if break pressed while waiting for program on tape then OK to break.
;; BREAK-4
L03A2: LD A,D ; transfer indicator to A.
AND A ; test for zero.
JR Z,L0361 ; back if so to RESTART
;; REPORT-D
L03A6: RST 08H ; ERROR-1
DEFB $0C ; Error Report: BREAK - CONT repeats
; -----------------------------
; THE 'PROGRAM NAME' SUBROUTINE
; -----------------------------
;
;
;; NAME
L03A8: CALL L0F55 ; routine SCANNING
LD A,($4001) ; sv FLAGS
ADD A,A ;
JP M,L0D9A ; to REPORT-C
POP HL ;
RET NC ;
PUSH HL ;
CALL L02E7 ; routine SET-FAST
CALL L13F8 ; routine STK-FETCH
LD H,D ;
LD L,E ;
DEC C ;
RET M ;
ADD HL,BC ;
( run in 0.809 second using v1.01-cache-2.11-cpan-39bf76dae61 )