sTART UP SCREEN: ------------------------------- |VIDEO TECHNOLOGY | |BASIC VER 2.0 | | | |READY | | | | | | | | | | | | | | | ------------------------------- If CTRL is held down while vz is turned on (bootup), background colour goes darkish green, else is yellow background. # = HEX $ = DECIMAL -------+-----------------------+--------- DECIMAL|Z80 OPCODE |COMMENTS LINE # | | -------+-----------------------+--------- 0 DI INTERRUPTS DISABLED 1 XOR A ZERO THE ACCUMULATOR 2 LD (#6800), A RAM LOCATION #6800 = 26624; IS ZEROED 5 JP #0674 #674=1652; JMP TO CONTINUE IPL SEQUENCE 1652 NOP 1653 NOP 1654 LD HL, #06D2 SET UP COPYING ROM FROM #06D2 1657 LD DE, #7800 TO RAM COMMUNICATIONS AREA #7800=30720 1660 LD BC, #0036 OF 54 BYTES 1663 LDIR 1665 DEC A A = 255 WHEN DECREMENTED 1666 DEC A FROM ZERO:DECREMENT TWICE 1667 JR NZ,$ -15 JUMP TO 1654 AND REPEAT COPY IF REGISTER A NOT 0 1669 LD B,#27 COPY REPEATED 128 TIMES. 39 LOCATIONS FROM #7836 WILL BE 1671 LD (DE), A ZEROED IN COMMS REGION. 1672 INC DE 1673 DJNZ $ -4 JUMP TO 1671. ZERO #7836 TO #785C 1675 JP #0075 #0075=117; JUMP AND CONTINUE IPL SEQUENCE 117 LD DE, #7880 #7880=30848: START LOC IN COMMS REGION FOR ANOTHER COPY 120 LD HL,#18F7 FROM ROM AT #18F7 = 6391 123 LD BC, #0027 OF 39 BYTES: WILL COPY INITIALISATION DATA IN ROM FROM #18F7 TO #191D 126 LDIR TO COMMS REGION #7880 TO #78A6 128 LD HL, #79E5 CONTINUE INIT OF COMS REGION. #79E5 = 31205 131 LD (HL),#3A PUT ASCII CODE FOR COLON IN LOCATION 31205 133 INC HL HL=31206 134 LD (HL),B PUT ZERO IN 31206 135 INC HL 136 LD (HL), #2C PUT ASCII CODE FOR COMMA IN LOCA. 31207 138 INC HL HL=31208 139 LD (#78A7), HL #78A7=30887: KEBOARD BUFFER POINTER SET TO START OF INPUT BUFFER 142 LD DE, #012D #012D=301: IS ADDRESS FIELD FOR JP #12D, 28 JUMPS WILL BE SETUP 145 LD B, #1C IN COMMS REGION FROM 31058 TO 31131: JUMPS TO ERROR MESSAGE IF 147 LD HL, #7952 DISK COMMAND TOKENS USED #7952 = 31058: IS START OF DISK BASIC 150 LD (HL), #C3 IN COMMS REGION. #C3 = 195 IS MACHINE CODE FOR UNCONDITIONAL JMP 152 INC HL 153 LD (HL), E FOR UNCONDITIONAL JUMP 154 INC HL 155 LD (HL),D 156 INC HL 157 DJNZ $ -9 JMP TO 150, LOOP 28 TIMES 159 LD B, #15 21: LOOP COUNT FOR TRS-80 DOS EXIT RETURNS 161 LD (HL), #C9 STARTING AT 31142, INITIALISE 21 RETURNS 163 INC HL THE FIRST TWO RETURNS ARE FOR DISK BASIC EXITS 164 INC HL 165 INC HL DOS EXIT RETURNS BEGIN AT 31148 166 DJNZ $ -7 JMP TO 161: LOOP 21 TIMES 168 LD HL, #7AE8 #7AE8 = 31464: IS LAST LOCATION IN COM REGION. ZERO THIS LOC 171 LD (HL), B BECAUSE BASIC PROGRAMS REQUIRE 0 START TO RUN DURING IPL SEQ. 172 LD SP, #79F8 #79F8=31224: IS TEMP START OF STACK 175 CALL #1B8F #1B8F=7055: INITIALISE BASIC POINTERS/VARIABLES 178 CALL #01C9 #01C9=457: TO CLEAR THE SCREEN 181 NOP These nop instructions were the location of a trs-80 user input 182 NOP memory size routine that has been removed from the vz o/s 183 NOP 184 NOP 185 NOP 186 NOP 187 NOP 188 NOP 189 NOP 190 JR $ +4 JUMP TO 196 192 RST NOT PART OF VZ IPL 193 OR A NOT PART OF VZ IPL 194 JR NZ, $ +18 NOT PART OF VZ IPL 196 LD HL, #7B4C #7B4C=31564: SETTING UP FOR A ROUTINE TO DETERMINE MEM. SIZE 199 INC HL STARTING AT 31565 IN RAM AND WORKING TOWARD 65535 (MAX 200 LD A, H ADDRESSABLE MEM FOR VZ), TESTING FOR PRESENCE OF RAM 201 OR L 202 JR Z, $ +27 204 LD A, (HL) GET BYTE AT CURRENT LOCATION 205 LD B, A BEING TESTED AND SAVE IT 206 CPL COMPLEMENT IT & WRITE NEW 207 LD (HL), A BYTE TO TEST LOCATION 208 CP (HL) CHECK IF WRITE SUCCEEDED 209 LD (HL), B RESTORE ORIGINAL BYTE 210 JR Z, $ -13 IF TEST LOCATION EXISTS, JUMP TO 199 & TEST NEXT 212 JR $ +17 JUMP TO 231 BECAUSE CURRENT TEST LOC, ABSENT 231 DEC HL WE HAVE TOP OF RAM 232 LD DE, #7C14 #7C14=31764: USE THIS AS MINIMUM REQUIRED RAM AND GO TEST THAT 235 RST #18 MINIMUM RAM NOT LESS THAN 31764 236 JP C, #197A #197A = 6522: JUMP TO INSUFFICIENT MEMORY ROUTINE IF MINIMUM RAM 239 LD DE, #FFCE LESS ELSE CONTINUE IPL. #FFCE=65486: - DEFAULT SIZE (50) FOR 242 LD (#78B1), HL STRING SPACE (65536 - 50). #78B1=30897: SET TOP OF RAM POINTER 245 ADD HL, DE 246 LD (#78A0), HL #78A0=30880: SET LOWER BOUNDARY OF STRING SPACE IN POINTER 30880/1 249 CALL #1B4D #1B4D = 6989: GO AND INITIALISE ALL BASIC POINTERS AND VARIABLES 252 CALL #3484 #3484=13444: SEE DISASSEMBLY AT END OF LISTING 255 LD HL, #010F #010F=271: IS START OF "VIDEO TECHNOLOGY" MESSAGE 258 CALL #28A7 #28A7=10407: TO MESSAGE OUTPUT ROUTINE 261 IM 1 SET INTERRUPT MODE 1 CONDITION - A RST #38 EXECUTES IF AN INT OCCURS 263 JP #068E CONTINUE IPL SEQUNCE FROM #68E 1678 LD HL, #4000 #4000 = 16384 IS START OF DOS RAM ROM IF DISK DRIVE CONNECTED 1681 CALL #06A4 GO AND CHECK FOR PRESENCE OF DOS BY TESTING IDENTITY OF FIRST FOUR BYTES FROM 1638. IF TEST REVEALS PRESENCE OF DOS, THE CHECKING SUBROUTINE WILL NOT RETURN INSTEAD, A JUMP TO DOS IPL SEQUENCE WILL BE EXECUTED 1684 LD HL, #6000 NO DOS, SO RETURN HERE. #6000=24576 IS START OF THE 2K LOCATED ABOVE DOS RAM 1687 CALL #06A4 GO AND CHECK FOR PRESENCE OF FORU IDENTITY BYTES FROM 24576 IF ALL BYTES FOUND THEN CHECKING ROUTINE WILL NOT RETURN INSTEAD A JUMP TO 24580 WILL BE EXECUTED 1690 LD HL, #8000 #8000=32768 IS USUALLY AN ADDRESS IN PROGRAM (RAM) MEMORY 1693 CALL #06A4 GO AND CHECK FOR PRENCE OF FOUR IDENTITY BYTES FROM 32768 UNLESS ROM OR EPROM HAS BEEN INSTALLED FROM 32768 WITH THE FOUR ID BYTES, THE TEST WILL FAIL AND CHECKING SUBROUTINE WILL RETURN TO HE CALLER 1696 EI INTERRUPTS WILL BE ENABLED 1697 JP #1A19 AND THE IPL SEQUENCE WILL END WITH A JUMP TO READY ROUTINE THE VZ IS SET UP FOR USE. ---------------------------------------------------------- Test routine for presence of code sequence - four bytes. #6A4 1700 LD A, #AA 170 IS THE FIRST TEST BYTE 1702 CP (HL) IS BYTE AT ADDRESS IN HL REGISTER = 170? 1703 INC HL NEXT ADDRESS 1704 RET NZ RETURN IF <> 170 1705 CPL ELSE COMPLEMENT BYTE IN ACCUMULATOR 1706 CP (HL) IS BYTE AT SECOND ADDRESS IN HL REG = NEW BYTE IN ACCUMULATOR? 1707 INC HL NEXT ADDRESS 1708 RET NZ RETURN IF HL <> ACCUMULATOR 1709 LD A, #E7 231 IS THE THIRD TEST BYTE 1711 CP (HL) IS BYTE = 231? 1712 INC HL 1713 RET NZ RETURN IF HL <> 231 1714 CPL COMPLEMENT 1715 CP (HL) HL := A 1716 INC HL 1717 RET NZ RETURN IF HL <> A 1718 EI ENABLE INTERUPTS 1719 JP (HL) AND JMP TO ADDRESS IN HL REGISTERS - THE IPL SEQUENCE IS TERMINATED --------------------------------------------------------- CALLED FROM #F9 IN IPL #1B4D 6989 LD HL, (#78A4) ;30884. GET START OF PROGRAM FROM COM REGION POINTER 6992 CALL #1DF8 #1DF2=7672: TO TURN TRACE OFF 6995 LD (#78E1), A #78E1=30945: ZERO THE AUTO INPUT FLAG - NO AUTO 6998 LD (HL), A ZERO THE FIRST TWO CELLS OF PROGRAM MEMORY; 31465-466 6999 INC HL 7000 LD (HL), A 7001 INC HL SET POINTER TO START OF VARIBLE LIST TABLE #78F9=30969 TO 31467 7002 LD (#78F9), HL AS END OF PROGRAM 7005 LD HL, (#78A4) RECOVER START OF (NULL) PROGRAM FROM POINTER #78A4=30884 7008 DEC HL BACKSPACE TO 31464--LAST 7009 LD (#78DF), HL LOCATION IN COM REGION #78DF/E0 IS POINTER TO PROGRAM START WHEN RUN 7012 LD B, #1A LOAD 26 CELLS IN COM REGION FOR VARIABLE DECLARATION 7014 LD HL, #7901 TABLE, STARTING AT #7901=30977: WITH '4' CODE FOR SINGLE PRECISION 7017 LD (HL), #04 VARIABLE DECLARATION TABLE 7019 INC HL ONE ENTRY FOR EACH ALPHA CHARACTER 7020 DJNZ $ -5 LOOP UNTIL JUMP TO 7017 TABLE DONE 7022 XOR A ZERO ACCUM. 7023 LD (#78F2), A #78F2=30962; FLAG NO ERROR FOR RESUME 7026 LD L, A ZERO 7027 LD H, A HL REGISTERS 7028 LD (#78F0), HL #78F0=30960. ZERO ON ERROR ADDRESS IN #78F0/F1 OF COM REGION 7031 LD (#78F7), HL #78F7=30967: ZERO POINTER TO NEXT STATEMENT FOLLOWING BREAK, STOP, END 7034 LD HL, (#78B1) GET TOP OF MEMORY 7037 LD (#78D6), HL #78D6 = 30934; LOAD POINTER TO NEXT AVAILABLE PLACE IN STRING SPACE 7040 CALL #1D91 #1D91=7569; CALL RESTORE ROUTINE TO PUT 31464 IN DATA POINTERS 7043 LD HL, (#78F9) 30969; GET END OF BASIC PROGRAM, PREVIOUSLY SET TO 31467 7046 LD (#78FB), HL 30971; SET END; SIMPLE VARIABLES POINTER EQUAL TO END OF PROGRAM 7049 LD (#78FD), HL 30973; LIKEWISE WITH END OF ARRAY VARIABLES POINTER ---------------------------------------------------------- CALL FROM #FC IN IPL #3484 13444 CALL #3FA0 16288; CHECK IF CTRL KEY WAS HELD DOWN WHEN VZ WAS SWITCHED ON 13447 LD A, #20 32 IS GREEN SCREEN CODE 13449 LD (#7B3B), A 30779; LOAD GREEN SCREEN CODE IN TO 30779 13452 LD (#6800), A ALSO LOAD '32' INTO #6800=26624 13455 LD A, #3C 13457 LD (#783A), A 30778; LOAD WITH '60' 13460 LD A, #10 16 IS CURSOR FLASH COUNT 13462 LD (#7841), A 30785; PUT COUNT IN CURSOR FLASH COUNTER. RANGE 16 TO 1 13465 XOR A ZERO ACCUM 13466 LD (#7AAF), A 31407; ZERO THIS LOCATION IN COM. REGION. 13469 LD HL, #7AB2 31410 13472 LD (#7AB0), HL 31408; LOAD 31410 INTO 31408/409 13475 LD A, #C9 13477 JP #3E37 ----------------------------------------------------- FROM 13477 #3E37 15927 LD (#787D), A 30845; LOAD THE INTERRUPT EXIT IN THE COM REGION WITH RET CODE 15930 LD A, #10 16 IS CODE FOR YELLOW 15932 LD (#7846), A 30790; PUT YELLOW CODE IN GRAPHIC CHARACTER COLOR STORE 15935 RET RETURN TO #FF -------------------------------------------------------- FROM #1B50 #1DF8 7672 XOR A ZERO ACCUM 7673 LD (#791B), A 31003; SET TRACE FLAG IN COM REGION TO OFF -- TROFF 7676 RET RETURN TO #1BF3 --------------------------------------------------------- #1B8C 7052 CALL #79BB 31163; DOS EXIT IN COMMS REGION, IPL INITIALISED TO RET 7055 POP BC NO PREVIOUS PUSH 7056 LD (HL), #7B80 30880; GET LOWER BOUNDARY OF STRING SPACE 7059 DEC HL DECREMENT TWICE AND PUT RESULT IN BACKSPACED STACK ADDRESS STORE 7060 DEC HL 7061 LD (#78EB), HL 30952 7064 INC HL 7065 INC HL 7066 LD SP, HL INC TWICE TO RESTORE ORIGINAL AND PUT INTO Z80 SP REG. 7067 LD HL, #78B5 7070 LD (#78B3), HL 30899; THEN PUT IN POINTER TO LITERAL STRING POOL; INITIALISED 7073 CALL #038B 907; TO SET OUTPUT DEVICE TO VIDEO 7076 CALL #2169 8553; ALSO SETS OUTPUT DEVICE TO VIDEO SOME REDUNDANCY HERE 7079 XOR A ZERO ACCUM 7080 LD H, A THEN ZERO 7081 LD L, A HL REGISTERS 7082 LD (#78DC), A 30940; ZERO 'FOR' STATEMENT FLAG 7085 PUSH HL 7086 PUSH BC 7087 LD HL, (#78DF) 30943; GET START ADDRESS OF PROGRAM WHEN RUN (31464) 7090 RET RETURN TO #FC ------------------------------------------------------- CALLED FROM #3484: SUBROUTINETO CHECK IF WAS PRESSED WHEN VZ SWITCHED ON #3FA0 16288 LD A, (#68FD) 26877; GET BYTE FROM ROM ADDRESS NI KEYBOARD MATRIX THAT INCLUDES CTRL KEY 16291 BIT 2, A CHECK FOR PRESS OF WHILE VZ IS BEING SWITCHED ON 16293 LD A, #20 LOAD ACCUM WITH DARK SPACE CHARACTERS CODE -- DARK CHARACTER FOR LIGHT SCREEN THIS IS A PEEK/POKE CODE 16295 JR NZ, $ +8 JMP TO 16305 IF IS NOT BEING PRESSED. BIT 2 OF 26877 WIL BE ZERO IF IS PRESSED 16297 OR #40 PRESSED SO CHANGE TO '96' WHICH IS LIGHT SPACE CHARACTER CODE AND DARK SCREEN CODE 16299 LD (#7818), A 30744; LOCATIONS 30744/45 IN COMMS REGION WERE INITIALLY LOADED WITH ZERO BYTES AT START IF IPL SEQUENCE. CHANGE SCREEN FLAG TO DARK, SNICE WAS PRESSED 16302 LD (#7819), A 30745; CHANGE SCREEN CHARACTER FLAG TO LIGHT -- LIGHT CHARACTERS ON DARK SCREEN 16305 LD (#783C), A ...AND LOAD CURSOR CHARACTER STORE IN COMMS REGION WITH SPACE CHARACTER CODE #383C = 30780 16308 JP #01C9 457; JUMP TO ROUTINE TO CLEAR SCREEN, HOME CURSOR, AND SELECT MODE(0) (TEXT MODE) ----------------------------------------------------------